123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- /* 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 "nsTArray.h"
- #include "imgIRequest.h"
- #include "imgIOnloadBlocker.h"
- #include "imgINotificationObserver.h"
- #include "mozilla/Attributes.h"
- class imgIContainer;
- class nsIFrame;
- class nsIDocument;
- class nsPresContext;
- class nsIURI;
- class nsIPrincipal;
- namespace mozilla {
- namespace css {
- struct ImageValue;
- class ImageLoader final : public imgINotificationObserver,
- public imgIOnloadBlocker
- {
- public:
- typedef mozilla::css::ImageValue Image;
- explicit 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);
- // The prescontext for this ImageLoader's document. We need it to be passed
- // in because this can be called during presentation destruction after the
- // presshell pointer on the document has been cleared.
- void ClearFrames(nsPresContext* aPresContext);
- void LoadImage(nsIURI* aURI, nsIPrincipal* aPrincipal, nsIURI* aReferrer,
- Image* aCSSValue);
- void DestroyRequest(imgIRequest* aRequest);
- void FlushUseCounters();
- private:
- ~ImageLoader() {}
- // 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<nsIFrame*> FrameSet;
- typedef nsTArray<nsCOMPtr<imgIRequest> > RequestSet;
- typedef nsTHashtable<nsPtrHashKey<Image> > ImageHashSet;
- typedef nsClassHashtable<nsISupportsHashKey,
- FrameSet> RequestToFrameMap;
- typedef nsClassHashtable<nsPtrHashKey<nsIFrame>,
- RequestSet> FrameToRequestMap;
- void AddImage(Image* aCSSImage);
- void RemoveImage(Image* aCSSImage);
- nsPresContext* GetPresContext();
- void DoRedraw(FrameSet* aFrameSet, bool aForcePaint);
- nsresult OnSizeAvailable(imgIRequest* aRequest, imgIContainer* aImage);
- nsresult OnFrameComplete(imgIRequest* aRequest);
- nsresult OnImageIsAnimated(imgIRequest* aRequest);
- nsresult OnFrameUpdate(imgIRequest* aRequest);
- // 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___ */
|