18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *           (C) 1999 Antti Koivisto (koivisto@kde.org)
48f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian * Copyright (C) 2004, 2009 Apple Inc. All rights reserved.
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef ImageLoader_h
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define ImageLoader_h
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceHandle.h"
28f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Element;
338f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qianclass ImageLoadEventSender;
345ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsenclass RenderImageResource;
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass ImageLoader : public CachedResourceClient {
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ImageLoader(Element*);
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ~ImageLoader();
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This function should be called when the element is attached to a document; starts
428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // loading if a load hasn't already been started.
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void updateFromElement();
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // This function should be called whenever the 'src' attribute is set, even if its value
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    // doesn't change; starts new load unconditionally (matches Firefox and Opera behavior).
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    void updateFromElementIgnoringPreviousError();
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
49dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    void elementWillMoveToNewOwnerDocument();
50dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* element() const { return m_element; }
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool imageComplete() const { return m_imageComplete; }
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedImage* image() const { return m_image.get(); }
558a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block    void setImage(CachedImage*); // Cancels pending beforeload and load events, and doesn't dispatch new ones.
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setLoadManually(bool loadManually) { m_loadManually = loadManually; }
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    bool haveFiredBeforeLoadEvent() const { return m_firedBeforeLoad; }
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool haveFiredLoadEvent() const { return m_firedLoad; }
618f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
62d0825bca7fe65beaee391d30da42e937db621564Steve Block    static void dispatchPendingBeforeLoadEvents();
63d0825bca7fe65beaee391d30da42e937db621564Steve Block    static void dispatchPendingLoadEvents();
648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void notifyFinished(CachedResource*);
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
698f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual void dispatchLoadEvent() = 0;
708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    virtual String sourceURI(const AtomicString&) const = 0;
718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
72cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    friend class ImageEventSender;
73cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void dispatchPendingBeforeLoadEvent();
748f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian    void dispatchPendingLoadEvent();
758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
765ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen    RenderImageResource* renderImageResource();
77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    void updateRenderer();
78cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Element* m_element;
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedResourceHandle<CachedImage> m_image;
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    AtomicString m_failedLoadURL;
82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block    bool m_firedBeforeLoad : 1;
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_firedLoad : 1;
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_imageComplete : 1;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool m_loadManually : 1;
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
91