Files
palemoon27/image/imgRequestProxy.cpp
T
roytam1 8637eba4b3 import changes from `dev' branch of rmottola/Arctic-Fox:
- 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)
2022-12-16 11:12:33 +08:00

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);
}