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
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
50 class CSSFontFaceSource
;
51 class CSSFontSelector
;
58 class ExecutionContext
;
61 class FontFaceSet final
: public EventTargetWithInlineData
, public HeapSupplement
<Document
>, public ActiveDOMObject
{
62 USING_GARBAGE_COLLECTED_MIXIN(FontFaceSet
);
63 using SupplementType
= HeapSupplement
<Document
>;
65 class FontFaceSet final
: public EventTargetWithInlineData
, public RefCountedSupplement
<Document
, FontFaceSet
>, public ActiveDOMObject
{
66 REFCOUNTED_EVENT_TARGET(FontFaceSet
);
67 using SupplementType
= RefCountedSupplement
<Document
, FontFaceSet
>;
69 DEFINE_WRAPPERTYPEINFO();
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
&);
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;
97 void beginFontLoading(FontFace
*);
98 void fontLoaded(FontFace
*);
99 void loadError(FontFace
*);
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();
114 static PassRefPtrWillBeRawPtr
<FontFaceSet
> create(Document
& document
)
116 return adoptRefWillBeNoop(new FontFaceSet(document
));
119 class FontLoadHistogram
{
120 DISALLOW_ALLOCATION();
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
*);
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
;
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
;
166 #endif // FontFaceSet_h