1/*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
19 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
20 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
23 * DAMAGE.
24 */
25
26#if ENABLE(FONT_LOAD_EVENTS)
27
28#ifndef FontLoader_h
29#define FontLoader_h
30
31#include "ActiveDOMObject.h"
32#include "EventListener.h"
33#include "EventNames.h"
34#include "EventTarget.h"
35#include "VoidCallback.h"
36#include <wtf/PassRefPtr.h>
37#include <wtf/RefCounted.h>
38#include <wtf/Vector.h>
39
40namespace WebCore {
41
42class CachedFont;
43class CSSFontFaceRule;
44class CSSFontFaceSource;
45class Dictionary;
46class Document;
47class Event;
48class Font;
49class ScriptExecutionContext;
50
51class FontLoader : public RefCounted<FontLoader>, public ActiveDOMObject, public EventTarget {
52public:
53    static PassRefPtr<FontLoader> create(Document* document)
54    {
55        return adoptRef<FontLoader>(new FontLoader(document));
56    }
57    virtual ~FontLoader();
58
59    DEFINE_ATTRIBUTE_EVENT_LISTENER(loading);
60    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadingdone);
61    DEFINE_ATTRIBUTE_EVENT_LISTENER(loadstart);
62    DEFINE_ATTRIBUTE_EVENT_LISTENER(load);
63    DEFINE_ATTRIBUTE_EVENT_LISTENER(error);
64
65    bool checkFont(const String&, const String&);
66    void loadFont(const Dictionary&);
67    void notifyWhenFontsReady(PassRefPtr<VoidCallback>);
68
69    bool loading() const { return m_loadingCount > 0; }
70
71    virtual ScriptExecutionContext* scriptExecutionContext() const;
72    virtual const AtomicString& interfaceName() const;
73
74    using RefCounted<FontLoader>::ref;
75    using RefCounted<FontLoader>::deref;
76
77    Document* document() const { return m_document; }
78
79    void didLayout();
80    void beginFontLoading(CSSFontFaceRule*);
81    void fontLoaded(CSSFontFaceRule*);
82    void loadError(CSSFontFaceRule*, CSSFontFaceSource*);
83    void loadingDone();
84
85private:
86    FontLoader(Document*);
87
88    virtual void refEventTarget() { ref(); }
89    virtual void derefEventTarget() { deref(); }
90    virtual EventTargetData* eventTargetData();
91    virtual EventTargetData* ensureEventTargetData();
92
93    void scheduleEvent(PassRefPtr<Event>);
94    void firePendingEvents();
95    bool resolveFontStyle(const String&, Font&);
96
97    Document* m_document;
98    EventTargetData m_eventTargetData;
99    unsigned m_loadingCount;
100    Vector<RefPtr<Event> > m_pendingEvents;
101    Vector<RefPtr<VoidCallback> > m_callbacks;
102    RefPtr<Event> m_loadingDoneEvent;
103};
104
105} // namespace WebCore
106
107#endif // FontLoader_h
108#endif // ENABLE(FONT_LOAD_EVENTS)
109