Split headerValueForVary into specialized functions for NetworkProcess and WebProcess...
[WebKit-https.git] / Source / WebCore / loader / ImageLoader.h
index bc85915..bd4ba9e 100644 (file)
  *
  */
 
-#ifndef ImageLoader_h
-#define ImageLoader_h
+#pragma once
 
-#include "CachedImage.h"
 #include "CachedImageClient.h"
 #include "CachedResourceHandle.h"
-#include <wtf/OwnPtr.h>
-#include <wtf/PassOwnPtr.h>
+#include "JSDOMPromiseDeferred.h"
+#include "Timer.h"
+#include <wtf/Vector.h>
 #include <wtf/text/AtomicString.h>
 
 namespace WebCore {
 
 class Element;
 class ImageLoader;
-class ImageLoaderClient;
-class QualifiedName;
 class RenderImageResource;
 
 template<typename T> class EventSender;
 typedef EventSender<ImageLoader> ImageEventSender;
 
 class ImageLoader : public CachedImageClient {
+    WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit ImageLoader(ImageLoaderClient*);
     virtual ~ImageLoader();
 
-    ImageLoaderClient* client() const { return m_client; }
-
     // This function should be called when the element is attached to a document; starts
     // loading if a load hasn't already been started.
     void updateFromElement();
@@ -58,10 +53,15 @@ public:
 
     void elementDidMoveToNewDocument();
 
+    Element& element() { return m_element; }
+    const Element& element() const { return m_element; }
+
     bool imageComplete() const { return m_imageComplete; }
 
     CachedImage* image() const { return m_image.get(); }
-    void setImage(CachedImage*); // Cancels pending beforeload and load events, and doesn't dispatch new ones.
+    void clearImage(); // Cancels pending beforeload and load events, and doesn't dispatch new ones.
+    
+    void decode(Ref<DeferredPromise>&&);
 
     void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
 
@@ -75,10 +75,10 @@ public:
     static void dispatchPendingErrorEvents();
 
 protected:
-    virtual void notifyFinished(CachedResource*);
+    explicit ImageLoader(Element&);
+    void notifyFinished(CachedResource&) override;
 
 private:
-    Document* document();
     virtual void dispatchLoadEvent() = 0;
     virtual String sourceURI(const AtomicString&) const = 0;
 
@@ -91,11 +91,21 @@ private:
     RenderImageResource* renderImageResource();
     void updateRenderer();
 
-    void setImageWithoutConsideringPendingLoadEvent(CachedImage*);
+    void clearImageWithoutConsideringPendingLoadEvent();
+    void clearFailedLoadURL();
 
-    ImageLoaderClient* m_client;
+    bool hasPendingDecodePromises() const { return !m_decodingPromises.isEmpty(); }
+    void decodeError(const char*);
+    void decode();
+    
+    void timerFired();
+
+    Element& m_element;
     CachedResourceHandle<CachedImage> m_image;
+    Timer m_derefElementTimer;
+    RefPtr<Element> m_protectedElement;
     AtomicString m_failedLoadURL;
+    Vector<RefPtr<DeferredPromise>, 1> m_decodingPromises;
     bool m_hasPendingBeforeLoadEvent : 1;
     bool m_hasPendingLoadEvent : 1;
     bool m_hasPendingErrorEvent : 1;
@@ -105,5 +115,3 @@ private:
 };
 
 }
-
-#endif