diff -r 000000000000 -r 6474c204b198 layout/style/ImageLoader.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/layout/style/ImageLoader.h Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,120 @@ +/* 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/. */ + +// A class that handles style system image loads (other image loads are handled +// by the nodes in the content tree). + +#ifndef mozilla_css_ImageLoader_h___ +#define mozilla_css_ImageLoader_h___ + +#include "nsClassHashtable.h" +#include "nsHashKeys.h" +#include "nsCSSValue.h" +#include "imgIRequest.h" +#include "imgIOnloadBlocker.h" +#include "imgINotificationObserver.h" +#include "mozilla/Attributes.h" + +class nsIFrame; +class nsIDocument; +class nsPresContext; +class nsIURI; +class nsIPrincipal; + +namespace mozilla { +namespace css { + +class ImageLoader MOZ_FINAL : public imgINotificationObserver, + public imgIOnloadBlocker { +public: + typedef mozilla::css::ImageValue Image; + + ImageLoader(nsIDocument* aDocument) + : mDocument(aDocument), + mInClone(false) + { + MOZ_ASSERT(mDocument); + } + + NS_DECL_ISUPPORTS + NS_DECL_IMGIONLOADBLOCKER + NS_DECL_IMGINOTIFICATIONOBSERVER + + void DropDocumentReference(); + + void MaybeRegisterCSSImage(Image* aImage); + void DeregisterCSSImage(Image* aImage); + + void AssociateRequestToFrame(imgIRequest* aRequest, + nsIFrame* aFrame); + + void DisassociateRequestFromFrame(imgIRequest* aRequest, + nsIFrame* aFrame); + + void DropRequestsForFrame(nsIFrame* aFrame); + + void SetAnimationMode(uint16_t aMode); + + void ClearFrames(); + + void LoadImage(nsIURI* aURI, nsIPrincipal* aPrincipal, nsIURI* aReferrer, + Image* aCSSValue); + + void DestroyRequest(imgIRequest* aRequest); + +private: + // We need to be able to look up the frames associated with a request (for + // delivering notifications) and the requests associated with a frame (when + // the frame goes away). Thus we maintain hashtables going both ways. These + // should always be in sync. + + typedef nsTArray FrameSet; + typedef nsTArray > RequestSet; + typedef nsTHashtable > ImageHashSet; + typedef nsClassHashtable RequestToFrameMap; + typedef nsClassHashtable, + RequestSet> FrameToRequestMap; + + void AddImage(Image* aCSSImage); + void RemoveImage(Image* aCSSImage); + + nsPresContext* GetPresContext(); + + void DoRedraw(FrameSet* aFrameSet); + + static PLDHashOperator + SetAnimationModeEnumerator(nsISupports* aKey, FrameSet* aValue, + void* aClosure); + + nsresult OnStartContainer(imgIRequest *aRequest, imgIContainer* aImage); + nsresult OnStopFrame(imgIRequest *aRequest); + nsresult OnImageIsAnimated(imgIRequest *aRequest); + nsresult FrameChanged(imgIRequest* aRequest); + // Do not override OnDataAvailable since background images are not + // displayed incrementally; they are displayed after the entire image + // has been loaded. + + // A map of imgIRequests to the nsIFrames that are using them. + RequestToFrameMap mRequestToFrameMap; + + // A map of nsIFrames to the imgIRequests they use. + FrameToRequestMap mFrameToRequestMap; + + // A weak pointer to our document. Nulled out by DropDocumentReference. + nsIDocument* mDocument; + + // The set of all nsCSSValue::Images (whether they're associated a frame or + // not). We'll need this when we go away to remove any requests associated + // with our document from those Images. + ImageHashSet mImages; + + // Are we cloning? If so, ignore any notifications we get. + bool mInClone; +}; + +} // namespace css +} // namespace mozilla + +#endif /* mozilla_css_ImageLoader_h___ */