mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
8637eba4b3
- remove poisondata stuff (cf5b5d29e5) - Bug 1218488 - clarify buffer ownership for nsICanvasRenderingContextInternal::GetBuffer; r=Bas,baku (dba4272b73) - Bug 1167215 - Re-apply CompositeUntil calls when we get a new batch of textures. r=roc (d57a8ac9e9) - Bug 1220923 - Make nsIntRegion a typedef for IntRegionTyped<UnknownUnits>. r=nical (a5f4e1e283) - Bug 1220898 - Make nsIntMargin a typedef for mozilla::gfx::IntMargin. r=nical (8bdb2f191a) - Bug 1205913 - Differentiate YCbCr, NV12 and RGB textures when drawing layer borders. r=nical (ff5d3dc7df) - Bug 1203376 - Honor filter region settings for lighting filters. r=mstange (8d0565e99a) - Bug 1220512 - ensure next frame status is updated before notifying MediaDecoder::PlaybackEnded. See bug 1220512 comment 1 for the detail. r=cpearce. (c2f434b5d4) - Bug 1207964 - Remove workaround from bug 1080461. r=jwwang (19bff98c14) - Bug 1199904: Only start decoding ahead after explicitly requesting data. r=gerald (8712637b49) - Bug 1197664: Report the total number of decoded frames. CLOSED TREE r=kentuckyfriedtakahe (422827d1af) - Bug 1178596: Reset frame size queue after flushing. r=cpearce (dd40ac4e6b) - Bug 1205911: P1. Cancel pending demux request when searching for next keyframe. r=edwin (8a03e6904f) - Bug 1188313: P1. Attempt to seek audio near video. r=cpearce (a8b6465d97) - Bug 1205911: P2. Ensure demuxer is reset before performing a seek. r=edwin (e93534a1d1) - bit of Bug 1185886: P2 (c2e89be4a3) - bit of Bug 1211443 (98fbb4a4a2) - Bug 1089586: Abort pending seeks. r=jwwang (e81f453204) - Bug 1195094: P1. Properly detects SPS changes for decoders requiring Annex B. r=cpearce (976febcd7c) - Bug 1195094: P2. Ensure TrackInfo object passed to constructor is never modified. r=cpearce (d5c15b2368) - Bug 1218577: Use only Blank PDM if enabled. r=kamidphish (a7e06549cc) - Bug 1210231 - Enable unencrypted <video> playback using Adobe's GMP for decoding. r=jya (7f80702b89) - Bug 1214932 - Add media.wmf.enabled pref. r=jya (8c183c0dd1) - Bug 1213173: Always use FFmpeg regardless of version. r=kentuckyfriedtakahe (e5af2c0c91) - Bug 1211787 - Improve the accuracy of MediaDecoderStateMachine::GetDecodedAudioDuration(). r=roc. (16d755c555) - Bug 1193614 - Schedule State Machine when VideoQueue() is low. r=cpearce (fe608da5fd) - Bug 1219984. Part 1 - remove EventPassMode::Both. In order to support multiple arguments, all arguments must be either moved or copied. r=kinetik. (2ee049008c) - Bug 1219984. Part 2 - add support for multiple arguments. r=kinetik. (1c70d5d69b) - Bug 1219974 - Add DisconnectIfExists() to MediaEventListener. r=kinetik. (43f6ae90b0) - Bug 1192109 - Fix insufficient includes in MediaEventSource.h. r=kinetik. (09eca240a1) - mData, aData (5e87f70853) - Bug 1219330 - Handle PlanaYCbCrImage::SetData failure. r=jya, jesup (144f3c266f) - Bug 1222308. Assume frames that are very old will never be composited. r=nical (1da9be2527) - space (45b67caa85) - Bug 1182426 - Set PlanarYCbCrImage's size in VP8TrackEncoder GTest. r=roc (d70a4d20c4) - Bug 1217080. Move recycling functionality into RecyclingPlanarYCbCrImage. r=nical (e2b2f650d7) - Bug 1216644 - part 1 - simple s/nsAutoArrayPtr/UniquePtr/ changes in gfx/; r=jrmuizel (d19bc51f94) - Bug 1216644 - part 2 - make gfxFontEntry::mUVSData a UniquePtr; r=jrmuizel (605a1bc6b1) - Bug 1216644 - part 3 - make BufferRecycleBin store UniquePtrs; r=jrmuizel (7781281266) - Add an RAII class to lock and unlock textures. (bug 1222863 part 1, r=nical) (abdec485f3) - Use RAII for more TextureClient locking cases. (bug 1222863 part 2, r=nical) (b35486ed3d) - Bug 1212288 - Make ImageContainer::AllocateProducerID callable on all threads; r=roc (fc569b8e48) - Bug 1140947 - Correct some logging in SourceBufferResource.cpp. r=cajbir (fcbb38056c) - Bug 1199573: [MSE] Properly handle partial media header received prior a discontinuity. r=gerald (f1cda54fa3) - Bug 1213726 - Remove AbstractMediaDecoder::HasInitializationData(). r=kinetik. (62f09f816e) - Bug 1034081 - Never seek before startTime. r=rillian Only adjust seek target up to startTime (44139b20ec) - Bug 1196353 - Use standard Xiph extradata format to pass headers from demuxers to decoders. r=jya (41f8dee5af) - Bug 1202332 - XiphExtradataToHeaders miscalculates final header length. r=derf (eec20f90f0) - Bug 1208799: [webm] Use first track found. r=kinetik (7196355e31) - Bug 1190472 - part 1 - improve MediaRawDataQueue's reference-counting behavior; r=kinetik (47b066b8e8) - Bug 1190472 - part 2 - delete unused MediaRawDataQueue::Push method; r=kinetik (f8246efe1b) - Bug 1190472 - part 3 - optimize pushing an entire queue onto MediaRawDataQueue; r=kinetik (045b389bf8) - Bug 1213024 - Comment the structured clone reading and writing, r=fitzgen (1b64f9f502) - Bug 1201620 - Make SavedFrame stacks structured cloneable; r=sfink (87e9b0a04b) - Bug 1221456 - Avoid C4819 warning spam. r=glandium (3dde3cb10a) - Bug 1213752 - IonMonkey: MIPS: Enable MIPS64 support. r=glandium (36da4cbd99) - Bug 1214175 - Make hash table manipulation infallible in Shape::fixupGetterSetterForBarrier() r=terrence (98e5e601ec) - Bug 1215337 - Cache slotSpan(), r=terrence (3e992f9f06) - No Bug - Include jswin.h in jsobj.cpp to unbreak windows non-unified bustage. (r=terrence over IRC) (92cba3254f) - Bug 1052139 - Make prototype-setting first create Object.prototype so that subsequent prototype chain-splicing will work correctly. r=bz (34a8d00d9f) - Bug 1172076 - Improve js::DumpBacktrace to include raw frame pointers and types. r=jandem (f11eb1763b) - Bug 1052139 - Change the boolean constant controlling whether the global object prototype chain is immutable, to enable immutable-prototype enforcement generally. r=duh (b7a1124feb) - Bug 1215363 - Fix a couple of OOM handling issues and make JS_sprintf funcions crash when passed illegal format strings r=terrence (c778891dd3) - Bug 1211331 - Ensure that GC slices are terminated such that we can safely iterate the heap. r=terrence (440308a333) - Bug 1224048 - Use stable hashing for the temporary tables in the JSON parser; r=jonco (7d058f44c9) - Bug 1215678 - Nuke cross compartment wrappers if we fail to add them to the wrapper map r=terrence (8e9e535a11) - Bug 1200732 - Use stable hashing for AutoCycleDetectorSet; r=jonco (68237bdea4) - more poisondata removal (6479b20220) - Bug 1218488 - clarify buffer ownership for nsICanvasRenderingContextInternal::GetBuffer; r=Bas,baku (ae89d929b2) - Bug 1207378 (Part 1) - Add support for a frame rect to Downscaler. r=tn (234866c32f) - Bug 1207378 (Part 2) - Use Downscaler to remove first-frame padding when downscaling GIFs. r=tn (5e995bdca2) - Bug 1207378 - Add FrameRect to non-skia version of BeginFrame. r=seth (939f0510eb) - Bug 1204394 (part 1) - Using StreamingLexer in the BMP decoder. r=seth. (77eaa1e125) - Bug 1204394 (part 2) - Add bmpsuite to the BMP reftests. r=seth. (237a902461) - Bug 1214476 - Remove unused code for encoding BMPv2 files. r=seth. (b8382357d7) - Bug 1213613 (part 1) - Formatting cleanups for nsBMPEncoder.h. r=seth. (4ee65bc173) - Bug 1213613 (part 2) - Move some BMP-related structs. r=seth. (15289784ce) - Bug 1215156 - move SetPixel* functions into nsBMPDecoder.cpp; r=seth (a143c843d4) - Bug 1215763 - part 1 - remove unnecessary nsAutoPtr.h includes; r=seth (f8a3a1f6b0) - Bug 1180715 (1/4) - Track image LoadTime to compare with file mtime. review=seth (bdbd25752c) - Bug 1180715 (2/4) - Provide a nsIFileURL interface for thumbnails. review=ttaubert (24c506569d) - Bug 1147562 - Update remaining callsites of newChannel before landing the shim in toolkit/ (r=gijs) (f7f2ab798f) - Bug 1163866 - Set originalURI correctly for moz-page-thumb:// channels. r=adw (3c7c97928e) - Bug 1180715 (3/4) - Drop parseURI from newChannel2. review=ttaubert (5b409e7d4b) - Bug 1180715 (4/4) - Use nsIURL methods instead of RegExp. review=ttaubert (1f7a026e06) - Bug 1209705 - Propagate the DrawResult for temporary surfaces to the caller in ClippedImage. r=tn (c5be1c7df4) - Bug 1215763 - part 2 - s/nsAutoPtr/UniquePtr/ in image/; r=seth (58c5da3bd2) - Bug 1215763 - part 3 - s/nsAutoArrayPtr/UniquePtr/ in nsBMPEncoder; r=seth (62bc939286) - Bug 1213613 (part 3) - Fix color-scaling of 16bpp BMP images. r=seth. (d06d511564) - Bug 1214072 (part 1) - Read BMP bitfields during metadata decoding. r=seth. (56cc2c02cd) - Bug 1214072 (part 2) - Implement transparency properly for BMP images. r=seth. (b6b07c2d90) - Bug 1218823 - use UniquePtr<> in preference to delete[] in image/; r=seth (5cd21f89a2) - Bug 1215334 (part 1) - Avoid creating a fake header for BMP files in ICO files. r=seth. (67506fc53e) - Bug 1215334 (part 2) - Avoid creating a fake header for BMP files in ICO files. r=seth. (cf6c3f4553) - spacing (b91c58ec87) - Bug 1196494 - part 1: remove unnecessary GetClientBounds call in CompositorParent. r=jrmuziel (685f49ae9c) - Bug 1180008 - Define gtk_window_get_window_type in mozgtk. r=karlt (e7ca7db4d3) - Bug 863512 - Fixing xul dnd panels for linux. r=enndeakin (5d0faaf0dc) - Bug 1195002 - draw to MozContainer window to allow GTK to draw decorations, r=karlt (7a84272fe9) - Bug 1210249 - don't mess with toplevel widget when client side decorations are enabled. r=karlt (464e9ce3fb) - bug 1180008 use mGdkWindow instead of finding it from gtk_widget_get_window(mShell) r=acomminos (024f8bd5a7) - bug 1180008 don't measure size of decorations for override-redirect windows r=acomminos (416ffda363) - Bug 1026803 part 1 - Factor out a common utility class for converting wrapping native times to TimeStamps; r=karlt (915ecdfc40) - Bug 1026803 part 2 - Add an assertion that SystemTimeConverter's template parameter is unsigned; r=karlt (68ccf1569d) - Bug 1026803 part 3 - Make some simplifications to SystemTimeConverter; r=karlt (c38719b7de) - Bug 1026803 part 4 - Convert GTK native event times to timestamps; r=karlt (74ef903992) - Bug 1026803 part 5 - Convert CurrentXXXTimeGetter classes from functors to helper classes; r=karlt (06d49e5965) - Bug 1026803 part 6 - Make SystemTimeConverter detect clock skew; r=karlt (d663ab72b2) - Bug 1026803 part 7 - Store the CurrentX11TimeGetter as a member object on nsWindow; r=karlt (f6a04e6e9c) - Bug 1026803 part 8 - Add ability for CurrentX11TimeGetter to perform an asynchronous request of the current time; r=karlt (961dab1d91) - Bug 1026803 part 8b - Factor out an IsTimeNewerThanTimeStamp method; r=karlt (1afb9f511a) - Bug 1026803 part 9 - Return DOMHighResTimeStamp objects from Event.timeStamp on Linux for Nightly/Aurora builds; r=karlt (975432dbd8) - Fix bustage from changeset 5c5dc6f367ac (bug 1026803) r=bustage on CLOSED TREE (c0be358f84) - fix bustage (e5e97018b6) - Bug 1196494 - part 2: only update nsWindow client offset when _NET_FRAME_EXTENTS property actually changes. r=eihrul (dd7e913d49) - Bug 1170342 - Disable XInput2 by default on GTK3. r=karlt (6a52d65a98) - Bug 1208904 - Fix a condition in nsWindow::SetNonClientMargins; r=roc (fe8c7b3e77) - Bug 1199892 - "Mouse cursor flickers in Flash object with wmode opaque/transparent". r=roc (6d50037e14) - Bug 1171101 - Remove pointer events and gesture scrolling dependencies. r=smaug (3aa5c89ea4) - Bug 978679. Implement touch events for GTK3. r=karlt (adafe58640) - Bug 1209774 - Transform from GDK coords to layout device pixels before calling DispatchEvent. r=karlt (4c81cf74ea) - Bug 1191293. Remove harmless assertion that is triggered by GTK3. r=masayuki (e0b9eb2c80) - Bug 978679. Convert GDK touch event coordinates properly. r=karlt (dfeae08f47) - restore some XP vs Vista differences, Bug 925599 bits (88ff57f06f) - Bug 1220392 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in widget/; r=roc (35026aa4c9) - Bug 1214616 - Remove encoding conversion methods from nsPrimitiveHelpers. r=emk. (3a4bdbbc8e) - Bug 1216611 - add mozilla::MakeUniqueFallible and convert uses throughout the tree; r=Waldo (8672c2e3d9) - Bug 1216964 - remove nsAutoArrayPtr use from ActorsParent; r=khuey (ddff59241a) - Bug 1219903 - use UniquePtr<T[]> instead of delete[] calls in layout/generic/; r=dholbert (8b96067a6e) - Bug 1220190 - use UniquePtr<T[]> instead of delete[] calls in layout/xul/; r=dholbert (065b3c521c) - Bug 1220714 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in layout/; r=dholbert (6a8245751c) - Bug 1221550 - use UniquePtr<T[]> instead of nsAutoArrayPtr<T> in intl/; r=smontagu (67868889e2) - Bug 1232374 - remove nsAutoArrayPtr usages from toolkit/; r=froydnj (d65586df26) - Bug 1170522 - expose whether or not we're in tablet mode to xul/js/css, r=jimm,ted (5cb134a8d4) - bug 1163872 - Fix a unified build issue in nsXPLookAndFeel.cpp. r=jimm (925e38abed) - bug 1217602 - remove nsIPKIParamBlock r=Cykesiopka (b5f0fc8dfd) - missing bit of old bug (fdcb4fe143) - Bug 1221453 - Use ObjDirPaths for GENERATED_INCLUDES and merge with LOCAL_INCLUDES. r=gps (a0537fff83) - Bug 1194948 - Build gfx/ipc in unified mode and mark as FAIL_ON_WARNINGS. r=BenWa (c88b356ac8) - Bug 815952 - Stop clearing clipboard data originating from a private window after closing private windows. r=ehsan (b94fea061d) - Bug 943296 - widget/gtk/nsDragService.cpp should assume Gtk uses UTF-8. r=karlt. (3613e87354) - Bug 1186661 - Draw drag and drop alpha pixmap correctly on GTK3. r=karlt (ca884af03b) - Bug 983843 - Switch to GtkOffscreenWindow for drag source widget, fixing ghost tabs on some GTK versions. r=karlt (ab56f9d764) - bug 1216916 clean up when InvokeDragSession() fails r=roc (30c811c33e) - Bug 1198128 - Fix -Wshadow warnings in widget/gtk. r=karlt (06bc60349e) - Merge branch 'dev' of https://github.com/rmottola/Arctic-Fox into dev (c79378b7c9) - Bug 1206915 - Move dumping of compositor textures under its own environment variable. r=mattwoodrow (b8ba4f0fbf) - Bug 1213007 - Part 1. Implementing gfxCrash. r=dvander (e307f9d543) - Bug 1208661 - Show display list and layer textures in-line in the HTML paint dump. r=BenWa (7047c68964) - Relax the driver crash guard on nightly and e10s builds. (bug 1200825, r=jgilbert) (1dd81b1257) - Bug 1214802 - gfxEnv - consolidate environment variables used by the graphics code in one place. r=botond (afb61356c6) - Bug 1217192 - Use gfxCriticalNote where we're already using the non-default construction parameter. r=mchang (d04ca17de5) - addback some crash stuff (8a78973a71) - Fix layers.acceleration.force-enabled not working. (bug 1212659, r=jrmuizel) (5eb85d8f64) - Bug 1142516 - Improve assertions and logging on the compositor side. r=Bas (cca63735e5) - Bug 1194335. Use a StackArray for RECTS so we see them in the minidumps. r=mattwoodrow (1a83a134e8) - Bug 1192058 - For DXGI_PRESENT_PARAMETERS, set pDirtyRects to nullptr if DirtyRectsCount == 0. r=BenWa (f78ff0df24) - Bug 1204922 - More information about crashes. r=bas (53cbd02c12) - Bug 1222033 - Rename gfxCrash to gfxDevCrash. r=jrmuizel (32351d0bc7) - Bug 1209812 (part 1) - Remove casts between cairo_format_t and gfxImageFormat. r=nical. (c1bc5cd74c) - Bug 1209812 (part 2) - Remove gfxImageFormat::A1. r=nical. (99f665ad80) - Bug 1182426 - Sort includes in VP8TrackEncoder.cpp alphabetically. r=roc (5f10334ba8) - Bug 1182426 - Don't try to encode new frames of a size other than the initial in VP8TrackEncoder. r=roc (8fb0b8f0d9) - Bug 1182426 - Flatten YUV formats conversion code in VP8TrackEncoder. r=roc (0853d098f7) - Bug 1182426 - Convert non-PlanarYCbCRImages in VP8TrackEncoder. r=roc (d2d78fa94a) - Bug 1204106 - Use correct alpha blend modes for OVER in CompositorOGL. r=jrmuizel (5cc211b9d6) - Bug 1207326 - Part 1: Correct projection clipping rectangle,r=matt.woodrow (8329afb6a7) - Bug 1207326 - Part 2: Add reftest,r=jmuizelaar (d17d6c5d4f) - Bug 1209446 - Make sure mFrameInProgress flag is set to true only when we actually begin drawing new frame. r=nical (4ff48c4149) - Disable screen and multiply mix-blend-mode support in the D3D11 and OGL compositors. (bug 1135271, r=mattwoodrow) (9b4c11a289) - Bug 1210189 - Use nsScreenGonk in nsWindow::StartRemoteDrawing() r=mwu (2653a33972) - Bug 1210514 - Fix color inversion when BasicCompositor is used on gonk r=nical (141fee3bfb) - Bug 1209812 (part 3) - Rename SurfaceFormat::R5G6B5 as R5G6B5_UINT16. r=Bas. (915e7eaba3) - Bug 1209812 (part 4) - Add comments to SurfaceFormat. r=jrmuizel,Bas. (ef1977582f) - Bug 1209812 (part 5) - Add endian-neutral variants to SurfaceFormat. r=nical,Bas. (93c49df8c5) - Bug 1171671 - Simplify Boot Animation control r=mwu (94c4f89b45) - Bug 1210182 - Implement GrallocTextureHostBasic r=nical (4e5ea5b92c) - Bug 1209812 (follow-up) - Android bustage fix on a CLOSED TREE. r=me. (8b2fa6268d) - Bug 1178513 - Added RGBA8888 to RGB565 converter. r=mattwoodrow (8ba5dbd3c9) - Bug 1160689 - thumbnail image corruption on certain videos. r=sotaro (278a2e29f6) - Bug 1204922: When ResizeBuffers fails, make no attempt to do subsequent paints until it succeeds again. r=milan (0c040d8228) - Bug 1215027 - Fix EndFrameForExternalComposition() r=nical (bab4690e54) - Bug 1215364 - Implement BasicCOmpositor::EndFrameForExternalComposition r=nical (c8b9c7bfb9) - Bug 1213968 - Renew the surface on iOS when resuming the compositor r=kats (73489dc21c) - Bug 1201318 - Factor out AddFamily. r=jdaggett (3f2556b8b4) - Bug 1201318 - revise OSX system font handling. r=mstange (f8a8f5f562) - Bug 1163877 - Part 1: Add storage for other FontFaceSets a FontFace is in. r=jdaggett (ab3a16b597) - Bug 1163877 - Part 2: Allow FontFaces to be added to multiple FontFaceSets. r=jdaggett (9b2dd7e5c9) - Bug 1163877 - Part 3: Update state on, and reflow documents for, all FontFaceSets that contain a FontFace whose user font entry updated. r=jdaggett (215db30569) - Bug 1192986 Fix test_interfaces.html to expect Cache API and font loading to be released. r=ehsan (8db9ef1df8) - Bug 1193019 - Rename CSSFontFaceLoadEvent to FontFaceSetLoadEvent. r=khuey (53f373c53d) - Bug 1163877 - Part 4: Tests. r=jdaggett (c6053ca8b4) - Bug 1180415 - initialize downloadable font pattern from FTFace. r=karlt (04aa59ba79) - Bug 1163491 - map local fontnames to fontconfig patterns. r=karlt (ad10ebde2a) - Bug 543715 p1 - distinguish between italic and oblique. r=jfkthame (4c9a0abf64) - Bug 543715 p2 - italic/oblique reftests. r=jfkthame (90fb927148) - bug 1178733 - enable APZ for iOS. r=kats (e41702d9cd) - Bug 1169956. Backout bug 1073209 for tiled image regressions on OS X. r=jrmuizel (a80a29aaa3) - Bug 1073209 - Eliminate usage of CreateSamplingRestrictedDrawable on d2d backends. r=jrmuizel (9ac8781a52) - Bug 1204136 - Align DisplayPort on non-tiling platform. r=botond (1d8be17663) - Bug 1122918 - Put the logical values for 'float' and 'clear' behind a pref, and enable them only on nightly builds and for B2G. r=heycam (a428b34d66) - Bug 1183484 - Cycle collect FontFaceSetIterator. r=bzbarsky (dc49f3f098) - Bug 1027579 - Do not load fonts from the cache if LOAD_BYPASS_CACHE is set. r=jfkthame r=bz (6cf20c9119) - Bug 1201318 - Use nsAutoReleasePool from nsCocoaUtils.h. r=jdaggett (bfe5f05086) - Bug 1201403 - streamline MacOSFontEntry::HasFontTable implementation. r=jfkthame (da06064b86) - Bug 1165611 - fix font smoothing under Linux. r=karlt (166a96603b) - Bug 1160506 - support intra-family font fallback. r=heycam (f56f0507d0) - Bug 1165693 - Cache the result of calling FcConfigSubstitute for our sentinel font name, to make gfxFcPlatformFontList::FindFamily less expensive. r=jdaggett (09ace74bc1) - Bug 1165693 - patch 2 - Cache family-name lookups in gfxFcPlatformFontList::FindFamily, to avoid repeating expensive calls to FcConfigSubstitute. r=jdaggett (ab34bf45c0) - Bug 1174946 - Back out the (incorrectly-implemented) caching of sentinelFirstFamily from bug 1165693, which should be largely overshadowed by the mFcSubstituteCache anyway. r=jdaggett (9b7784b7a6) - Bug 1165766 - Crash in AddFontSetFamilies() r=jtd (13cba8e6c7) - Bug 1170421 - return first font suggested by fontconfig as the default font. r=karlt (426c6bd348) - Bug 1008169 - Font selection and font size dropdowns are reacting very slowly on press up/down,r=jaws (8e395026e1) - Bug 1166161 - Display available font from font.name-list.{family}.{lang} as fallback default font, instead of empty string. (045855761a) - Bug 1187680 - Use NSVisualEffectMaterialMenu for menus if it's available. r=smichaud (0cede2f295) - Bug 1190257. Use the previous vsync timestamp on windows 10. r=jrmuizel (7cf7e2644f) - Bug 1220699 - Add telemetry probe to measure vsync latency in the parent refresh driver. r=avih (347936dffb) - Bug 1221674 - Add telemetry probe in the content process to measure the time between refresh driver ticks. r=kats (1d1b885f10) - Bug 1198362 - Delete PreciseRefreshDriverTimer. r=roc (8fdcca758f) - Bug 1197898 - Delete vsync refresh driver preference. r=kats (eab85ba8dd) - Bug 1210250. Fallback to GDI fonts with a skia backend. r=jwatt (8c374b4bd3) - Bug 1208927 - Initialize queryD3DKMTStatistics so that it can't be accessed uninitialized; r=jrmuizel (69c6781a82) - Bug 1144946 - Delete PreciseRefreshDriverTimerWindowsDwmVsync refresh driver timer. r=roc (a78ccb3d42) - Bug 1187784 (part 4) - Replace nsBaseHashtable::EnumerateRead() calls in layout/ with iterators. r=heycam. (6a09016e6d) - Bug 1187784 (part 3) - Replace nsBaseHashtable::EnumerateRead() calls in layout/ with iterators. r=heycam. (1ce8abd863) - Bug 1187784 (part 2) - Replace nsBaseHashtable::EnumerateRead() calls in layout/ with iterators. r=heycam. (cd98be2f19) - Bug 1187784 (part 1) - Replace nsBaseHashtable::EnumerateRead() calls in layout/ with iterators. r=heycam. (09022514a9) - Bug 1217230 - Set mNeedToRecomputeVisibility true only when style or layout flush. r=seth (8f3edd57c0) - Bug 1167281 - sort scalable fonts first when resolving generic families under Linux. r=karlt (e2ecb89f31) - Bug 1186875 - check if FcFontSort returns non-null. r=jtd (087905da51) - Bug 1218617 - Invalidate whole widget area after external composition r=mattwoodrow (3901f416f5) - Bug 1153499 - Enable push and sw prefs. r=dougt,ehsan (ca0f3a105d) - Bug 1141415 - add expire setting of permission to SpecialPowers. r=jmaher (372bc0c930) - partial Bug 1196665 - Add originAttributes into SpecialPowers. r=bholley (b8407a1bcc) - Bug 1213151 - Part 1: Add a SpecialPowers API for cleaning up the STS data that works in both e10s and non-e10s modes; r=jdm (04bba17fd3) - Bug 1213151 - Part 2: Use SpecialPowers.cleanUpSTSData() in a few tests; r=jdm (cce5f23dac) - Bug 1214593 - Remove service worker periodic updater. r=ehsan (87cfebcd0d) - fix tests, fix spaces (9cba57e7ff) - Bug 1207499 - Part 10: Remove use of expression closure from testing/. r=jmaher (652faa8963) - Bug 1204154 - Clean up jar manifests that needlessly specify the source file. r=dao (f116e33bed) - Bug 1222943 (part 1) - Change Touch::mRadius from nsIntPoint to LayoutDeviceIntPoint. r=kats. (dcc6c15797) - Bug 1222943 (part 2) - Remove an unnecessary call to ToUnknownSize(). r=botond. (08f644f194) - Bug 1220925 - Event::GetScreenCoords should return CSSIntPoint instead of LayoutDevicePoint. r=botond (4e4f54e8e7) - Bug 943294 - Leave dealing with legacy codepages for clipboard data to Windows itself. r=jmathies. (124ecbfa3e) - Bug 1243507 - Reimplement non-Unicode clipboard formats as bug 943294 broke drag and drop between some Unicode-unaware apps. r=jimm (02edc31ed9) - ported Bug 1254980 - Ensure that text/html is still written to the clipboard. r=enndeakin a=sylvestre (9cd4c0e41a) - nsWindow: build fix (1c3e798a89)
1091 lines
28 KiB
C++
1091 lines
28 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
|
|
*
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
#include "ImageLogging.h"
|
|
#include "imgRequestProxy.h"
|
|
#include "imgIOnloadBlocker.h"
|
|
#include "imgLoader.h"
|
|
#include "Image.h"
|
|
#include "ImageOps.h"
|
|
#include "nsError.h"
|
|
#include "nsCRTGlue.h"
|
|
#include "imgINotificationObserver.h"
|
|
|
|
using namespace mozilla::image;
|
|
|
|
// The split of imgRequestProxy and imgRequestProxyStatic means that
|
|
// certain overridden functions need to be usable in the destructor.
|
|
// Since virtual functions can't be used in that way, this class
|
|
// provides a behavioural trait for each class to use instead.
|
|
class ProxyBehaviour
|
|
{
|
|
public:
|
|
virtual ~ProxyBehaviour() {}
|
|
|
|
virtual already_AddRefed<mozilla::image::Image> GetImage() const = 0;
|
|
virtual bool HasImage() const = 0;
|
|
virtual already_AddRefed<ProgressTracker> GetProgressTracker() const = 0;
|
|
virtual imgRequest* GetOwner() const = 0;
|
|
virtual void SetOwner(imgRequest* aOwner) = 0;
|
|
};
|
|
|
|
class RequestBehaviour : public ProxyBehaviour
|
|
{
|
|
public:
|
|
RequestBehaviour() : mOwner(nullptr), mOwnerHasImage(false) {}
|
|
|
|
virtual already_AddRefed<mozilla::image::Image>GetImage() const override;
|
|
virtual bool HasImage() const override;
|
|
virtual already_AddRefed<ProgressTracker> GetProgressTracker() const override;
|
|
|
|
virtual imgRequest* GetOwner() const override {
|
|
return mOwner;
|
|
}
|
|
|
|
virtual void SetOwner(imgRequest* aOwner) override {
|
|
mOwner = aOwner;
|
|
|
|
if (mOwner) {
|
|
RefPtr<ProgressTracker> ownerProgressTracker = GetProgressTracker();
|
|
mOwnerHasImage = ownerProgressTracker && ownerProgressTracker->HasImage();
|
|
} else {
|
|
mOwnerHasImage = false;
|
|
}
|
|
}
|
|
|
|
private:
|
|
// We maintain the following invariant:
|
|
// The proxy is registered at most with a single imgRequest as an observer,
|
|
// and whenever it is, mOwner points to that object. This helps ensure that
|
|
// imgRequestProxy::~imgRequestProxy unregisters the proxy as an observer
|
|
// from whatever request it was registered with (if any). This, in turn,
|
|
// means that imgRequest::mObservers will not have any stale pointers in it.
|
|
RefPtr<imgRequest> mOwner;
|
|
|
|
bool mOwnerHasImage;
|
|
};
|
|
|
|
already_AddRefed<mozilla::image::Image>
|
|
RequestBehaviour::GetImage() const
|
|
{
|
|
if (!mOwnerHasImage) {
|
|
return nullptr;
|
|
}
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
return progressTracker->GetImage();
|
|
}
|
|
|
|
already_AddRefed<ProgressTracker>
|
|
RequestBehaviour::GetProgressTracker() const
|
|
{
|
|
// NOTE: It's possible that our mOwner has an Image that it didn't notify
|
|
// us about, if we were Canceled before its Image was constructed.
|
|
// (Canceling removes us as an observer, so mOwner has no way to notify us).
|
|
// That's why this method uses mOwner->GetProgressTracker() instead of just
|
|
// mOwner->mProgressTracker -- we might have a null mImage and yet have an
|
|
// mOwner with a non-null mImage (and a null mProgressTracker pointer).
|
|
return mOwner->GetProgressTracker();
|
|
}
|
|
|
|
NS_IMPL_ADDREF(imgRequestProxy)
|
|
NS_IMPL_RELEASE(imgRequestProxy)
|
|
|
|
NS_INTERFACE_MAP_BEGIN(imgRequestProxy)
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, imgIRequest)
|
|
NS_INTERFACE_MAP_ENTRY(imgIRequest)
|
|
NS_INTERFACE_MAP_ENTRY(nsIRequest)
|
|
NS_INTERFACE_MAP_ENTRY(nsISupportsPriority)
|
|
NS_INTERFACE_MAP_ENTRY(nsISecurityInfoProvider)
|
|
NS_INTERFACE_MAP_ENTRY_CONDITIONAL(nsITimedChannel,
|
|
TimedChannel() != nullptr)
|
|
NS_INTERFACE_MAP_END
|
|
|
|
imgRequestProxy::imgRequestProxy() :
|
|
mBehaviour(new RequestBehaviour),
|
|
mURI(nullptr),
|
|
mListener(nullptr),
|
|
mLoadFlags(nsIRequest::LOAD_NORMAL),
|
|
mLockCount(0),
|
|
mAnimationConsumers(0),
|
|
mCanceled(false),
|
|
mIsInLoadGroup(false),
|
|
mListenerIsStrongRef(false),
|
|
mDecodeRequested(false),
|
|
mDeferNotifications(false)
|
|
{
|
|
/* member initializers and constructor code */
|
|
|
|
}
|
|
|
|
imgRequestProxy::~imgRequestProxy()
|
|
{
|
|
/* destructor code */
|
|
NS_PRECONDITION(!mListener,
|
|
"Someone forgot to properly cancel this request!");
|
|
|
|
// Unlock the image the proper number of times if we're holding locks on
|
|
// it. Note that UnlockImage() decrements mLockCount each time it's called.
|
|
while (mLockCount) {
|
|
UnlockImage();
|
|
}
|
|
|
|
ClearAnimationConsumers();
|
|
|
|
// Explicitly set mListener to null to ensure that the RemoveProxy
|
|
// call below can't send |this| to an arbitrary listener while |this|
|
|
// is being destroyed. This is all belt-and-suspenders in view of the
|
|
// above assert.
|
|
NullOutListener();
|
|
|
|
if (GetOwner()) {
|
|
/* Call RemoveProxy with a successful status. This will keep the
|
|
channel, if still downloading data, from being canceled if 'this' is
|
|
the last observer. This allows the image to continue to download and
|
|
be cached even if no one is using it currently.
|
|
*/
|
|
mCanceled = true;
|
|
GetOwner()->RemoveProxy(this, NS_OK);
|
|
}
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::Init(imgRequest* aOwner,
|
|
nsILoadGroup* aLoadGroup,
|
|
ImageURL* aURI,
|
|
imgINotificationObserver* aObserver)
|
|
{
|
|
NS_PRECONDITION(!GetOwner() && !mListener,
|
|
"imgRequestProxy is already initialized");
|
|
|
|
LOG_SCOPE_WITH_PARAM(GetImgLog(), "imgRequestProxy::Init", "request",
|
|
aOwner);
|
|
|
|
MOZ_ASSERT(mAnimationConsumers == 0, "Cannot have animation before Init");
|
|
|
|
mBehaviour->SetOwner(aOwner);
|
|
mListener = aObserver;
|
|
// Make sure to addref mListener before the AddProxy call below, since
|
|
// that call might well want to release it if the imgRequest has
|
|
// already seen OnStopRequest.
|
|
if (mListener) {
|
|
mListenerIsStrongRef = true;
|
|
NS_ADDREF(mListener);
|
|
}
|
|
mLoadGroup = aLoadGroup;
|
|
mURI = aURI;
|
|
|
|
// Note: AddProxy won't send all the On* notifications immediately
|
|
if (GetOwner()) {
|
|
GetOwner()->AddProxy(this);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::ChangeOwner(imgRequest* aNewOwner)
|
|
{
|
|
NS_PRECONDITION(GetOwner(),
|
|
"Cannot ChangeOwner on a proxy without an owner!");
|
|
|
|
if (mCanceled) {
|
|
// Ensure that this proxy has received all notifications to date
|
|
// before we clean it up when removing it from the old owner below.
|
|
SyncNotifyListener();
|
|
}
|
|
|
|
// If we're holding locks, unlock the old image.
|
|
// Note that UnlockImage decrements mLockCount each time it's called.
|
|
uint32_t oldLockCount = mLockCount;
|
|
while (mLockCount) {
|
|
UnlockImage();
|
|
}
|
|
|
|
// If we're holding animation requests, undo them.
|
|
uint32_t oldAnimationConsumers = mAnimationConsumers;
|
|
ClearAnimationConsumers();
|
|
|
|
GetOwner()->RemoveProxy(this, NS_IMAGELIB_CHANGING_OWNER);
|
|
|
|
mBehaviour->SetOwner(aNewOwner);
|
|
|
|
// If we were locked, apply the locks here
|
|
for (uint32_t i = 0; i < oldLockCount; i++) {
|
|
LockImage();
|
|
}
|
|
|
|
// If we had animation requests, restore them here. Note that we
|
|
// do this *after* RemoveProxy, which clears out animation consumers
|
|
// (see bug 601723).
|
|
for (uint32_t i = 0; i < oldAnimationConsumers; i++) {
|
|
IncrementAnimationConsumers();
|
|
}
|
|
|
|
GetOwner()->AddProxy(this);
|
|
|
|
// If we'd previously requested a synchronous decode, request a decode on the
|
|
// new image.
|
|
if (mDecodeRequested) {
|
|
StartDecoding();
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::AddToLoadGroup()
|
|
{
|
|
NS_ASSERTION(!mIsInLoadGroup, "Whaa, we're already in the loadgroup!");
|
|
|
|
if (!mIsInLoadGroup && mLoadGroup) {
|
|
mLoadGroup->AddRequest(this, nullptr);
|
|
mIsInLoadGroup = true;
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::RemoveFromLoadGroup(bool releaseLoadGroup)
|
|
{
|
|
if (!mIsInLoadGroup) {
|
|
return;
|
|
}
|
|
|
|
/* calling RemoveFromLoadGroup may cause the document to finish
|
|
loading, which could result in our death. We need to make sure
|
|
that we stay alive long enough to fight another battle... at
|
|
least until we exit this function.
|
|
*/
|
|
nsCOMPtr<imgIRequest> kungFuDeathGrip(this);
|
|
|
|
mLoadGroup->RemoveRequest(this, nullptr, NS_OK);
|
|
mIsInLoadGroup = false;
|
|
|
|
if (releaseLoadGroup) {
|
|
// We're done with the loadgroup, release it.
|
|
mLoadGroup = nullptr;
|
|
}
|
|
}
|
|
|
|
|
|
/** nsIRequest / imgIRequest methods **/
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetName(nsACString& aName)
|
|
{
|
|
aName.Truncate();
|
|
|
|
if (mURI) {
|
|
mURI->GetSpec(aName);
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::IsPending(bool* _retval)
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetStatus(nsresult* aStatus)
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::Cancel(nsresult status)
|
|
{
|
|
if (mCanceled) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
LOG_SCOPE(GetImgLog(), "imgRequestProxy::Cancel");
|
|
|
|
mCanceled = true;
|
|
|
|
nsCOMPtr<nsIRunnable> ev = new imgCancelRunnable(this, status);
|
|
return NS_DispatchToCurrentThread(ev);
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::DoCancel(nsresult status)
|
|
{
|
|
if (GetOwner()) {
|
|
GetOwner()->RemoveProxy(this, status);
|
|
}
|
|
|
|
NullOutListener();
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::CancelAndForgetObserver(nsresult aStatus)
|
|
{
|
|
// If mCanceled is true but mListener is non-null, that means
|
|
// someone called Cancel() on us but the imgCancelRunnable is still
|
|
// pending. We still need to null out mListener before returning
|
|
// from this function in this case. That means we want to do the
|
|
// RemoveProxy call right now, because we need to deliver the
|
|
// onStopRequest.
|
|
if (mCanceled && !mListener) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
LOG_SCOPE(GetImgLog(), "imgRequestProxy::CancelAndForgetObserver");
|
|
|
|
mCanceled = true;
|
|
|
|
// Now cheat and make sure our removal from loadgroup happens async
|
|
bool oldIsInLoadGroup = mIsInLoadGroup;
|
|
mIsInLoadGroup = false;
|
|
|
|
imgRequest* owner = GetOwner();
|
|
if (owner) {
|
|
imgCacheValidator* validator = owner->GetValidator();
|
|
if (validator) {
|
|
validator->RemoveProxy(this);
|
|
}
|
|
|
|
owner->RemoveProxy(this, aStatus);
|
|
}
|
|
mIsInLoadGroup = oldIsInLoadGroup;
|
|
|
|
if (mIsInLoadGroup) {
|
|
nsCOMPtr<nsIRunnable> ev =
|
|
NS_NewRunnableMethod(this, &imgRequestProxy::DoRemoveFromLoadGroup);
|
|
NS_DispatchToCurrentThread(ev);
|
|
}
|
|
|
|
NullOutListener();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::StartDecoding()
|
|
{
|
|
// Flag this, so we know to transfer the request if our owner changes
|
|
mDecodeRequested = true;
|
|
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
return image->StartDecoding();
|
|
}
|
|
|
|
if (GetOwner()) {
|
|
GetOwner()->StartDecoding();
|
|
}
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::LockImage()
|
|
{
|
|
mLockCount++;
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
return image->LockImage();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::UnlockImage()
|
|
{
|
|
MOZ_ASSERT(mLockCount > 0, "calling unlock but no locks!");
|
|
|
|
mLockCount--;
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
return image->UnlockImage();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::RequestDiscard()
|
|
{
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
return image->RequestDiscard();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::IncrementAnimationConsumers()
|
|
{
|
|
mAnimationConsumers++;
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
image->IncrementAnimationConsumers();
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::DecrementAnimationConsumers()
|
|
{
|
|
// We may get here if some responsible code called Increment,
|
|
// then called us, but we have meanwhile called ClearAnimationConsumers
|
|
// because we needed to get rid of them earlier (see
|
|
// imgRequest::RemoveProxy), and hence have nothing left to
|
|
// decrement. (In such a case we got rid of the animation consumers
|
|
// early, but not the observer.)
|
|
if (mAnimationConsumers > 0) {
|
|
mAnimationConsumers--;
|
|
RefPtr<Image> image = GetImage();
|
|
if (image) {
|
|
image->DecrementAnimationConsumers();
|
|
}
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::ClearAnimationConsumers()
|
|
{
|
|
while (mAnimationConsumers > 0) {
|
|
DecrementAnimationConsumers();
|
|
}
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::Suspend()
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::Resume()
|
|
{
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetLoadGroup(nsILoadGroup** loadGroup)
|
|
{
|
|
NS_IF_ADDREF(*loadGroup = mLoadGroup.get());
|
|
return NS_OK;
|
|
}
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::SetLoadGroup(nsILoadGroup* loadGroup)
|
|
{
|
|
mLoadGroup = loadGroup;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetLoadFlags(nsLoadFlags* flags)
|
|
{
|
|
*flags = mLoadFlags;
|
|
return NS_OK;
|
|
}
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::SetLoadFlags(nsLoadFlags flags)
|
|
{
|
|
mLoadFlags = flags;
|
|
return NS_OK;
|
|
}
|
|
|
|
/** imgIRequest methods **/
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetImage(imgIContainer** aImage)
|
|
{
|
|
NS_ENSURE_TRUE(aImage, NS_ERROR_NULL_POINTER);
|
|
// It's possible that our owner has an image but hasn't notified us of it -
|
|
// that'll happen if we get Canceled before the owner instantiates its image
|
|
// (because Canceling unregisters us as a listener on mOwner). If we're
|
|
// in that situation, just grab the image off of mOwner.
|
|
RefPtr<Image> image = GetImage();
|
|
nsCOMPtr<imgIContainer> imageToReturn;
|
|
if (image) {
|
|
imageToReturn = do_QueryInterface(image);
|
|
}
|
|
if (!imageToReturn && GetOwner()) {
|
|
imageToReturn = GetOwner()->GetImage();
|
|
}
|
|
if (!imageToReturn) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
imageToReturn.swap(*aImage);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetImageStatus(uint32_t* aStatus)
|
|
{
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
*aStatus = progressTracker->GetImageStatus();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetImageErrorCode(nsresult* aStatus)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aStatus = GetOwner()->GetImageErrorCode();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetURI(nsIURI** aURI)
|
|
{
|
|
MOZ_ASSERT(NS_IsMainThread(), "Must be on main thread to convert URI");
|
|
nsCOMPtr<nsIURI> uri = mURI->ToIURI();
|
|
uri.forget(aURI);
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::GetCurrentURI(nsIURI** aURI)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
return GetOwner()->GetCurrentURI(aURI);
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::GetURI(ImageURL** aURI)
|
|
{
|
|
if (!mURI) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_ADDREF(*aURI = mURI);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetNotificationObserver(imgINotificationObserver** aObserver)
|
|
{
|
|
*aObserver = mListener;
|
|
NS_IF_ADDREF(*aObserver);
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetMimeType(char** aMimeType)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
const char* type = GetOwner()->GetMimeType();
|
|
if (!type) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aMimeType = NS_strdup(type);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
static imgRequestProxy* NewProxy(imgRequestProxy* /*aThis*/)
|
|
{
|
|
return new imgRequestProxy();
|
|
}
|
|
|
|
imgRequestProxy* NewStaticProxy(imgRequestProxy* aThis)
|
|
{
|
|
nsCOMPtr<nsIPrincipal> currentPrincipal;
|
|
aThis->GetImagePrincipal(getter_AddRefs(currentPrincipal));
|
|
RefPtr<Image> image = aThis->GetImage();
|
|
return new imgRequestProxyStatic(image, currentPrincipal);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::Clone(imgINotificationObserver* aObserver,
|
|
imgIRequest** aClone)
|
|
{
|
|
nsresult result;
|
|
imgRequestProxy* proxy;
|
|
result = Clone(aObserver, &proxy);
|
|
*aClone = proxy;
|
|
return result;
|
|
}
|
|
|
|
nsresult imgRequestProxy::Clone(imgINotificationObserver* aObserver,
|
|
imgRequestProxy** aClone)
|
|
{
|
|
return PerformClone(aObserver, NewProxy, aClone);
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::PerformClone(imgINotificationObserver* aObserver,
|
|
imgRequestProxy* (aAllocFn)(imgRequestProxy*),
|
|
imgRequestProxy** aClone)
|
|
{
|
|
NS_PRECONDITION(aClone, "Null out param");
|
|
|
|
LOG_SCOPE(GetImgLog(), "imgRequestProxy::Clone");
|
|
|
|
*aClone = nullptr;
|
|
RefPtr<imgRequestProxy> clone = aAllocFn(this);
|
|
|
|
// It is important to call |SetLoadFlags()| before calling |Init()| because
|
|
// |Init()| adds the request to the loadgroup.
|
|
// When a request is added to a loadgroup, its load flags are merged
|
|
// with the load flags of the loadgroup.
|
|
// XXXldb That's not true anymore. Stuff from imgLoader adds the
|
|
// request to the loadgroup.
|
|
clone->SetLoadFlags(mLoadFlags);
|
|
nsresult rv = clone->Init(mBehaviour->GetOwner(), mLoadGroup,
|
|
mURI, aObserver);
|
|
if (NS_FAILED(rv)) {
|
|
return rv;
|
|
}
|
|
|
|
if (GetOwner() && GetOwner()->GetValidator()) {
|
|
clone->SetNotificationsDeferred(true);
|
|
GetOwner()->GetValidator()->AddProxy(clone);
|
|
}
|
|
|
|
// Assign to *aClone before calling Notify so that if the caller expects to
|
|
// only be notified for requests it's already holding pointers to it won't be
|
|
// surprised.
|
|
NS_ADDREF(*aClone = clone);
|
|
|
|
// This is wrong!!! We need to notify asynchronously, but there's code that
|
|
// assumes that we don't. This will be fixed in bug 580466.
|
|
clone->SyncNotifyListener();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetImagePrincipal(nsIPrincipal** aPrincipal)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_ADDREF(*aPrincipal = GetOwner()->GetPrincipal());
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetMultipart(bool* aMultipart)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aMultipart = GetOwner()->GetMultipart();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetCORSMode(int32_t* aCorsMode)
|
|
{
|
|
if (!GetOwner()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
*aCorsMode = GetOwner()->GetCORSMode();
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
/** nsISupportsPriority methods **/
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetPriority(int32_t* priority)
|
|
{
|
|
NS_ENSURE_STATE(GetOwner());
|
|
*priority = GetOwner()->Priority();
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::SetPriority(int32_t priority)
|
|
{
|
|
NS_ENSURE_STATE(GetOwner() && !mCanceled);
|
|
GetOwner()->AdjustPriority(this, priority - GetOwner()->Priority());
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::AdjustPriority(int32_t priority)
|
|
{
|
|
// We don't require |!mCanceled| here. This may be called even if we're
|
|
// cancelled, because it's invoked as part of the process of removing an image
|
|
// from the load group.
|
|
NS_ENSURE_STATE(GetOwner());
|
|
GetOwner()->AdjustPriority(this, priority);
|
|
return NS_OK;
|
|
}
|
|
|
|
/** nsISecurityInfoProvider methods **/
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetSecurityInfo(nsISupports** _retval)
|
|
{
|
|
if (GetOwner()) {
|
|
return GetOwner()->GetSecurityInfo(_retval);
|
|
}
|
|
|
|
*_retval = nullptr;
|
|
return NS_OK;
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetHasTransferredData(bool* hasData)
|
|
{
|
|
if (GetOwner()) {
|
|
*hasData = GetOwner()->HasTransferredData();
|
|
} else {
|
|
// The safe thing to do is to claim we have data
|
|
*hasData = true;
|
|
}
|
|
return NS_OK;
|
|
}
|
|
|
|
static const char*
|
|
NotificationTypeToString(int32_t aType)
|
|
{
|
|
switch(aType)
|
|
{
|
|
case imgINotificationObserver::SIZE_AVAILABLE: return "SIZE_AVAILABLE";
|
|
case imgINotificationObserver::FRAME_UPDATE: return "FRAME_UPDATE";
|
|
case imgINotificationObserver::FRAME_COMPLETE: return "FRAME_COMPLETE";
|
|
case imgINotificationObserver::LOAD_COMPLETE: return "LOAD_COMPLETE";
|
|
case imgINotificationObserver::DECODE_COMPLETE: return "DECODE_COMPLETE";
|
|
case imgINotificationObserver::DISCARD: return "DISCARD";
|
|
case imgINotificationObserver::UNLOCKED_DRAW: return "UNLOCKED_DRAW";
|
|
case imgINotificationObserver::IS_ANIMATED: return "IS_ANIMATED";
|
|
case imgINotificationObserver::HAS_TRANSPARENCY: return "HAS_TRANSPARENCY";
|
|
default:
|
|
NS_NOTREACHED("Notification list should be exhaustive");
|
|
return "(unknown notification)";
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::Notify(int32_t aType, const mozilla::gfx::IntRect* aRect)
|
|
{
|
|
MOZ_ASSERT(aType != imgINotificationObserver::LOAD_COMPLETE,
|
|
"Should call OnLoadComplete");
|
|
|
|
LOG_FUNC_WITH_PARAM(GetImgLog(), "imgRequestProxy::Notify", "type",
|
|
NotificationTypeToString(aType));
|
|
|
|
if (!mListener || mCanceled) {
|
|
return;
|
|
}
|
|
|
|
// Make sure the listener stays alive while we notify.
|
|
nsCOMPtr<imgINotificationObserver> listener(mListener);
|
|
|
|
mListener->Notify(this, aType, aRect);
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::OnLoadComplete(bool aLastPart)
|
|
{
|
|
if (MOZ_LOG_TEST(GetImgLog(), LogLevel::Debug)) {
|
|
nsAutoCString name;
|
|
GetName(name);
|
|
LOG_FUNC_WITH_PARAM(GetImgLog(), "imgRequestProxy::OnLoadComplete",
|
|
"name", name.get());
|
|
}
|
|
|
|
// There's all sorts of stuff here that could kill us (the OnStopRequest call
|
|
// on the listener, the removal from the loadgroup, the release of the
|
|
// listener, etc). Don't let them do it.
|
|
nsCOMPtr<imgIRequest> kungFuDeathGrip(this);
|
|
|
|
if (mListener && !mCanceled) {
|
|
// Hold a ref to the listener while we call it, just in case.
|
|
nsCOMPtr<imgINotificationObserver> kungFuDeathGrip(mListener);
|
|
mListener->Notify(this, imgINotificationObserver::LOAD_COMPLETE, nullptr);
|
|
}
|
|
|
|
// If we're expecting more data from a multipart channel, re-add ourself
|
|
// to the loadgroup so that the document doesn't lose track of the load.
|
|
// If the request is already a background request and there's more data
|
|
// coming, we can just leave the request in the loadgroup as-is.
|
|
if (aLastPart || (mLoadFlags & nsIRequest::LOAD_BACKGROUND) == 0) {
|
|
RemoveFromLoadGroup(aLastPart);
|
|
// More data is coming, so change the request to be a background request
|
|
// and put it back in the loadgroup.
|
|
if (!aLastPart) {
|
|
mLoadFlags |= nsIRequest::LOAD_BACKGROUND;
|
|
AddToLoadGroup();
|
|
}
|
|
}
|
|
|
|
if (mListenerIsStrongRef && aLastPart) {
|
|
NS_PRECONDITION(mListener, "How did that happen?");
|
|
// Drop our strong ref to the listener now that we're done with
|
|
// everything. Note that this can cancel us and other fun things
|
|
// like that. Don't add anything in this method after this point.
|
|
imgINotificationObserver* obs = mListener;
|
|
mListenerIsStrongRef = false;
|
|
NS_RELEASE(obs);
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::BlockOnload()
|
|
{
|
|
if (MOZ_LOG_TEST(GetImgLog(), LogLevel::Debug)) {
|
|
nsAutoCString name;
|
|
GetName(name);
|
|
LOG_FUNC_WITH_PARAM(GetImgLog(), "imgRequestProxy::BlockOnload",
|
|
"name", name.get());
|
|
}
|
|
|
|
nsCOMPtr<imgIOnloadBlocker> blocker = do_QueryInterface(mListener);
|
|
if (blocker) {
|
|
blocker->BlockOnload(this);
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::UnblockOnload()
|
|
{
|
|
if (MOZ_LOG_TEST(GetImgLog(), LogLevel::Debug)) {
|
|
nsAutoCString name;
|
|
GetName(name);
|
|
LOG_FUNC_WITH_PARAM(GetImgLog(), "imgRequestProxy::UnblockOnload",
|
|
"name", name.get());
|
|
}
|
|
|
|
nsCOMPtr<imgIOnloadBlocker> blocker = do_QueryInterface(mListener);
|
|
if (blocker) {
|
|
blocker->UnblockOnload(this);
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::NullOutListener()
|
|
{
|
|
// If we have animation consumers, then they don't matter anymore
|
|
if (mListener) {
|
|
ClearAnimationConsumers();
|
|
}
|
|
|
|
if (mListenerIsStrongRef) {
|
|
// Releasing could do weird reentery stuff, so just play it super-safe
|
|
nsCOMPtr<imgINotificationObserver> obs;
|
|
obs.swap(mListener);
|
|
mListenerIsStrongRef = false;
|
|
} else {
|
|
mListener = nullptr;
|
|
}
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxy::GetStaticRequest(imgIRequest** aReturn)
|
|
{
|
|
imgRequestProxy* proxy;
|
|
nsresult result = GetStaticRequest(&proxy);
|
|
*aReturn = proxy;
|
|
return result;
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxy::GetStaticRequest(imgRequestProxy** aReturn)
|
|
{
|
|
*aReturn = nullptr;
|
|
RefPtr<Image> image = GetImage();
|
|
|
|
bool animated;
|
|
if (!image || (NS_SUCCEEDED(image->GetAnimated(&animated)) && !animated)) {
|
|
// Early exit - we're not animated, so we don't have to do anything.
|
|
NS_ADDREF(*aReturn = this);
|
|
return NS_OK;
|
|
}
|
|
|
|
// Check for errors in the image. Callers code rely on GetStaticRequest
|
|
// failing in this case, though with FrozenImage there's no technical reason
|
|
// for it anymore.
|
|
if (image->HasError()) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
// We are animated. We need to create a frozen version of this image.
|
|
RefPtr<Image> frozenImage = ImageOps::Freeze(image);
|
|
|
|
// Create a static imgRequestProxy with our new extracted frame.
|
|
nsCOMPtr<nsIPrincipal> currentPrincipal;
|
|
GetImagePrincipal(getter_AddRefs(currentPrincipal));
|
|
RefPtr<imgRequestProxy> req = new imgRequestProxyStatic(frozenImage,
|
|
currentPrincipal);
|
|
req->Init(nullptr, nullptr, mURI, nullptr);
|
|
|
|
NS_ADDREF(*aReturn = req);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::NotifyListener()
|
|
{
|
|
// It would be nice to notify the observer directly in the status tracker
|
|
// instead of through the proxy, but there are several places we do extra
|
|
// processing when we receive notifications (like OnStopRequest()), and we
|
|
// need to check mCanceled everywhere too.
|
|
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
if (GetOwner()) {
|
|
// Send the notifications to our listener asynchronously.
|
|
progressTracker->Notify(this);
|
|
} else {
|
|
// We don't have an imgRequest, so we can only notify the clone of our
|
|
// current state, but we still have to do that asynchronously.
|
|
MOZ_ASSERT(HasImage(),
|
|
"if we have no imgRequest, we should have an Image");
|
|
progressTracker->NotifyCurrentState(this);
|
|
}
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::SyncNotifyListener()
|
|
{
|
|
// It would be nice to notify the observer directly in the status tracker
|
|
// instead of through the proxy, but there are several places we do extra
|
|
// processing when we receive notifications (like OnStopRequest()), and we
|
|
// need to check mCanceled everywhere too.
|
|
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
progressTracker->SyncNotify(this);
|
|
}
|
|
|
|
void
|
|
imgRequestProxy::SetHasImage()
|
|
{
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
MOZ_ASSERT(progressTracker);
|
|
RefPtr<Image> image = progressTracker->GetImage();
|
|
MOZ_ASSERT(image);
|
|
|
|
// Force any private status related to the owner to reflect
|
|
// the presence of an image;
|
|
mBehaviour->SetOwner(mBehaviour->GetOwner());
|
|
|
|
// Apply any locks we have
|
|
for (uint32_t i = 0; i < mLockCount; ++i) {
|
|
image->LockImage();
|
|
}
|
|
|
|
// Apply any animation consumers we have
|
|
for (uint32_t i = 0; i < mAnimationConsumers; i++) {
|
|
image->IncrementAnimationConsumers();
|
|
}
|
|
}
|
|
|
|
already_AddRefed<ProgressTracker>
|
|
imgRequestProxy::GetProgressTracker() const
|
|
{
|
|
return mBehaviour->GetProgressTracker();
|
|
}
|
|
|
|
already_AddRefed<mozilla::image::Image>
|
|
imgRequestProxy::GetImage() const
|
|
{
|
|
return mBehaviour->GetImage();
|
|
}
|
|
|
|
bool
|
|
RequestBehaviour::HasImage() const
|
|
{
|
|
if (!mOwnerHasImage) {
|
|
return false;
|
|
}
|
|
RefPtr<ProgressTracker> progressTracker = GetProgressTracker();
|
|
return progressTracker ? progressTracker->HasImage() : false;
|
|
}
|
|
|
|
bool
|
|
imgRequestProxy::HasImage() const
|
|
{
|
|
return mBehaviour->HasImage();
|
|
}
|
|
|
|
imgRequest*
|
|
imgRequestProxy::GetOwner() const
|
|
{
|
|
return mBehaviour->GetOwner();
|
|
}
|
|
|
|
////////////////// imgRequestProxyStatic methods
|
|
|
|
class StaticBehaviour : public ProxyBehaviour
|
|
{
|
|
public:
|
|
explicit StaticBehaviour(mozilla::image::Image* aImage) : mImage(aImage) {}
|
|
|
|
virtual already_AddRefed<mozilla::image::Image>
|
|
GetImage() const override {
|
|
RefPtr<mozilla::image::Image> image = mImage;
|
|
return image.forget();
|
|
}
|
|
|
|
virtual bool HasImage() const override {
|
|
return mImage;
|
|
}
|
|
|
|
virtual already_AddRefed<ProgressTracker> GetProgressTracker()
|
|
const override {
|
|
return mImage->GetProgressTracker();
|
|
}
|
|
|
|
virtual imgRequest* GetOwner() const override {
|
|
return nullptr;
|
|
}
|
|
|
|
virtual void SetOwner(imgRequest* aOwner) override {
|
|
MOZ_ASSERT(!aOwner,
|
|
"We shouldn't be giving static requests a non-null owner.");
|
|
}
|
|
|
|
private:
|
|
// Our image. We have to hold a strong reference here, because that's normally
|
|
// the job of the underlying request.
|
|
RefPtr<mozilla::image::Image> mImage;
|
|
};
|
|
|
|
imgRequestProxyStatic::imgRequestProxyStatic(mozilla::image::Image* aImage,
|
|
nsIPrincipal* aPrincipal)
|
|
: mPrincipal(aPrincipal)
|
|
{
|
|
mBehaviour = mozilla::MakeUnique<StaticBehaviour>(aImage);
|
|
}
|
|
|
|
NS_IMETHODIMP
|
|
imgRequestProxyStatic::GetImagePrincipal(nsIPrincipal** aPrincipal)
|
|
{
|
|
if (!mPrincipal) {
|
|
return NS_ERROR_FAILURE;
|
|
}
|
|
|
|
NS_ADDREF(*aPrincipal = mPrincipal);
|
|
|
|
return NS_OK;
|
|
}
|
|
|
|
nsresult
|
|
imgRequestProxyStatic::Clone(imgINotificationObserver* aObserver,
|
|
imgRequestProxy** aClone)
|
|
{
|
|
return PerformClone(aObserver, NewStaticProxy, aClone);
|
|
}
|