Move parseFontFaceDescriptor to CSSPropertyParser.cpp
[chromium-blink-merge.git] / third_party / WebKit / Source / core / css / FontFaceSet.h
blobfda6c9171e0ae44cbd4ed82cdf12b379849013f5
1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
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.
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.
26 #ifndef FontFaceSet_h
27 #define FontFaceSet_h
29 #include "bindings/core/v8/ScriptPromise.h"
30 #include "core/css/FontFace.h"
31 #include "core/css/FontFaceSetForEachCallback.h"
32 #include "core/dom/ActiveDOMObject.h"
33 #include "core/events/EventListener.h"
34 #include "core/events/EventTarget.h"
35 #include "platform/AsyncMethodRunner.h"
36 #include "platform/RefCountedSupplement.h"
37 #include "wtf/Allocator.h"
38 #include "wtf/PassRefPtr.h"
39 #include "wtf/RefCounted.h"
40 #include "wtf/Vector.h"
42 // Mac OS X 10.6 SDK defines check() macro that interfares with our check() method
43 #ifdef check
44 #undef check
45 #endif
47 namespace blink {
49 class CSSFontFace;
50 class CSSFontFaceSource;
51 class CSSFontSelector;
52 class Dictionary;
53 class Document;
54 class ExceptionState;
55 class Font;
56 class FontFaceCache;
57 class FontResource;
58 class ExecutionContext;
60 #if ENABLE(OILPAN)
61 class FontFaceSet final : public EventTargetWithInlineData, public HeapSupplement<Document>, public ActiveDOMObject {
62 USING_GARBAGE_COLLECTED_MIXIN(FontFaceSet);
63 using SupplementType = HeapSupplement<Document>;
64 #else
65 class FontFaceSet final : public EventTargetWithInlineData, public RefCountedSupplement<Document, FontFaceSet>, public ActiveDOMObject {
66 REFCOUNTED_EVENT_TARGET(FontFaceSet);
67 using SupplementType = RefCountedSupplement<Document, FontFaceSet>;
68 #endif
69 DEFINE_WRAPPERTYPEINFO();
70 public:
71 ~FontFaceSet() override;
73 DEFINE_ATTRIBUTE_EVENT_LISTENER(loading);
74 DEFINE_ATTRIBUTE_EVENT_LISTENER(loadingdone);
75 DEFINE_ATTRIBUTE_EVENT_LISTENER(loadingerror);
77 bool check(const String& font, const String& text, ExceptionState&);
78 ScriptPromise load(ScriptState*, const String& font, const String& text);
79 ScriptPromise ready(ScriptState*);
81 void add(FontFace*, ExceptionState&);
82 void clear();
83 bool remove(FontFace*, ExceptionState&);
84 void forEach(FontFaceSetForEachCallback*, const ScriptValue& thisArg) const;
85 void forEach(FontFaceSetForEachCallback*) const;
86 bool has(FontFace*, ExceptionState&) const;
88 unsigned long size() const;
89 AtomicString status() const;
91 ExecutionContext* executionContext() const override;
92 const AtomicString& interfaceName() const override;
94 Document* document() const;
96 void didLayout();
97 void beginFontLoading(FontFace*);
98 void fontLoaded(FontFace*);
99 void loadError(FontFace*);
101 // ActiveDOMObject
102 void suspend() override;
103 void resume() override;
104 void stop() override;
106 static PassRefPtrWillBeRawPtr<FontFaceSet> from(Document&);
107 static void didLayout(Document&);
109 void addFontFacesToFontFaceCache(FontFaceCache*, CSSFontSelector*);
111 DECLARE_VIRTUAL_TRACE();
113 private:
114 static PassRefPtrWillBeRawPtr<FontFaceSet> create(Document& document)
116 return adoptRefWillBeNoop(new FontFaceSet(document));
119 class FontLoadHistogram {
120 DISALLOW_ALLOCATION();
121 public:
122 enum Status { NoWebFonts, HadBlankText, DidNotHaveBlankText, Reported };
123 FontLoadHistogram() : m_status(NoWebFonts), m_count(0), m_recorded(false) { }
124 void incrementCount() { m_count++; }
125 void updateStatus(FontFace*);
126 void record();
128 private:
129 Status m_status;
130 int m_count;
131 bool m_recorded;
134 FontFaceSet(Document&);
136 bool inActiveDocumentContext() const;
137 void forEachInternal(FontFaceSetForEachCallback*, const ScriptValue* thisArg) const;
138 void addToLoadingFonts(PassRefPtrWillBeRawPtr<FontFace>);
139 void removeFromLoadingFonts(PassRefPtrWillBeRawPtr<FontFace>);
140 void fireLoadingEvent();
141 void fireDoneEventIfPossible();
142 bool resolveFontStyle(const String&, Font&);
143 void handlePendingEventsAndPromisesSoon();
144 void handlePendingEventsAndPromises();
145 const WillBeHeapListHashSet<RefPtrWillBeMember<FontFace>>& cssConnectedFontFaceList() const;
146 bool isCSSConnectedFontFace(FontFace*) const;
147 bool shouldSignalReady() const;
149 using ReadyProperty = ScriptPromiseProperty<RawPtrWillBeMember<FontFaceSet>, RawPtrWillBeMember<FontFaceSet>, Member<DOMException>>;
151 WillBeHeapHashSet<RefPtrWillBeMember<FontFace>> m_loadingFonts;
152 bool m_shouldFireLoadingEvent;
153 bool m_isLoading;
154 PersistentWillBeMember<ReadyProperty> m_ready;
155 FontFaceArray m_loadedFonts;
156 FontFaceArray m_failedFonts;
157 WillBeHeapListHashSet<RefPtrWillBeMember<FontFace>> m_nonCSSConnectedFaces;
159 AsyncMethodRunner<FontFaceSet> m_asyncRunner;
161 FontLoadHistogram m_histogram;
164 } // namespace blink
166 #endif // FontFaceSet_h