19bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)/*
29bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * Copyright (C) 2013 Google Inc. All rights reserved.
39bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *
49bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without
59bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * modification, are permitted provided that the following conditions are met:
69bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *
79bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright
89bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer.
99bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright
109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *    notice, this list of conditions and the following disclaimer in the
119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *    documentation and/or other materials provided with the distribution.
129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) *
139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * DAMAGE.
249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) */
259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "config.h"
279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/FontFaceSet.h"
289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
29197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/Dictionary.h"
30197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptPromiseResolver.h"
31197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h"
329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSFontSelector.h"
339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSSegmentedFontFace.h"
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/FontFaceCache.h"
35e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "core/css/FontFaceSetLoadEvent.h"
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/StylePropertySet.h"
377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/css/parser/CSSParser.h"
389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/resolver/StyleResolver.h"
399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/dom/Document.h"
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/dom/StyleEngine.h"
411e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/frame/FrameView.h"
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h"
435d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/rendering/style/StyleInheritedData.h"
44f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "public/platform/Platform.h"
459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
46c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static const int defaultFontSize = 10;
49f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const char defaultFontFamily[] = "sans-serif";
509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
51323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)class LoadFontPromiseResolver FINAL : public FontFace::LoadFontCallback {
529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)public:
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<LoadFontPromiseResolver> create(FontFaceArray faces, ScriptState* scriptState)
549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
55d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        return adoptRefWillBeNoop(new LoadFontPromiseResolver(faces, scriptState));
569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    void loadFonts(ExecutionContext*);
59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ScriptPromise promise() { return m_resolver->promise(); }
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
6143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual void notifyLoaded(FontFace*) OVERRIDE;
6243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    virtual void notifyError(FontFace*) OVERRIDE;
639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
64323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    virtual void trace(Visitor*) OVERRIDE;
65323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)private:
67d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    LoadFontPromiseResolver(FontFaceArray faces, ScriptState* scriptState)
6843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        : m_numLoading(faces.size())
699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        , m_errorOccured(false)
70197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        , m_resolver(ScriptPromiseResolver::create(scriptState))
7143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    {
7243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_fontFaces.swap(faces);
7343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
75323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    WillBeHeapVector<RefPtrWillBeMember<FontFace> > m_fontFaces;
769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    int m_numLoading;
779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    bool m_errorOccured;
78197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtr<ScriptPromiseResolver> m_resolver;
799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)};
809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
8143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void LoadFontPromiseResolver::loadFonts(ExecutionContext* context)
8243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){
8343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!m_numLoading) {
8443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_resolver->resolve(m_fontFaces);
8543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return;
8643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
8743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
8843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    for (size_t i = 0; i < m_fontFaces.size(); i++)
8943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_fontFaces[i]->loadWithCallback(this, context);
9043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)}
9143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
9243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void LoadFontPromiseResolver::notifyLoaded(FontFace* fontFace)
939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_numLoading--;
9543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (m_numLoading || m_errorOccured)
969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
9843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    m_resolver->resolve(m_fontFaces);
999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
10143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void LoadFontPromiseResolver::notifyError(FontFace* fontFace)
1029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
10343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    m_numLoading--;
10443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    if (!m_errorOccured) {
10543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_errorOccured = true;
10643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        m_resolver->reject(fontFace->error());
10743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    }
1089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
110323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void LoadFontPromiseResolver::trace(Visitor* visitor)
111323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){
112323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    visitor->trace(m_fontFaces);
113323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    LoadFontCallback::trace(visitor);
114323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)}
115323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)
1169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)class FontsReadyPromiseResolver {
1179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)public:
118323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    static PassOwnPtr<FontsReadyPromiseResolver> create(ScriptState* scriptState)
1199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
120323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        return adoptPtr(new FontsReadyPromiseResolver(scriptState));
1219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
1229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
123323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    void resolve(PassRefPtrWillBeRawPtr<FontFaceSet> fontFaceSet)
1249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    {
125bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        m_resolver->resolve(fontFaceSet);
1269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
1279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
128d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ScriptPromise promise() { return m_resolver->promise(); }
129d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
1309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)private:
131323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    explicit FontsReadyPromiseResolver(ScriptState* scriptState)
132197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        : m_resolver(ScriptPromiseResolver::create(scriptState))
133a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    {
134a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    }
135a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch
136197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    RefPtr<ScriptPromiseResolver> m_resolver;
1379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)};
1389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
139d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FontFaceSet::FontFaceSet(Document& document)
140d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    : ActiveDOMObject(&document)
141a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    , m_shouldFireLoadingEvent(false)
142f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    , m_asyncRunner(this, &FontFaceSet::handlePendingEventsAndPromises)
1439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    suspendIfNeeded();
1459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FontFaceSet::~FontFaceSet()
1489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)Document* FontFaceSet::document() const
1529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return toDocument(executionContext());
1549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
15609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FontFaceSet::inActiveDocumentContext() const
15709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
15809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ExecutionContext* context = executionContext();
15909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return context && toDocument(context)->isActive();
16009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
16109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
16209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFaceSet::addFontFacesToFontFaceCache(FontFaceCache* fontFaceCache, CSSFontSelector* fontSelector)
16309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
164197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >::iterator it = m_nonCSSConnectedFaces.begin(); it != m_nonCSSConnectedFaces.end(); ++it)
16509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fontFaceCache->addFontFace(fontSelector, *it, false);
16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)const AtomicString& FontFaceSet::interfaceName() const
1699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1701e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return EventTargetNames::FontFaceSet;
1719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)ExecutionContext* FontFaceSet::executionContext() const
1749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)    return ActiveDOMObject::executionContext();
1769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)AtomicString FontFaceSet::status() const
1799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
1809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, loading, ("loading", AtomicString::ConstructFromLiteral));
1819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    DEFINE_STATIC_LOCAL(AtomicString, loaded, ("loaded", AtomicString::ConstructFromLiteral));
182d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return (!m_loadingFonts.isEmpty() || hasLoadedFonts()) ? loading : loaded;
183f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
184f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
185f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FontFaceSet::handlePendingEventsAndPromisesSoon()
186f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
187197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    // m_asyncRunner will be automatically stopped on destruction.
188f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_asyncRunner.runAsync();
1899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
1919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FontFaceSet::didLayout()
1929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
193d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (document()->frame()->isMainFrame() && m_loadingFonts.isEmpty())
1949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_histogram.record();
195d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_loadingFonts.isEmpty() || (!hasLoadedFonts() && m_readyResolvers.isEmpty()))
1969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
197f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    handlePendingEventsAndPromisesSoon();
1989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
1999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
200f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FontFaceSet::handlePendingEventsAndPromises()
2019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
202a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    fireLoadingEvent();
2039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    fireDoneEventIfPossible();
2049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
206a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FontFaceSet::fireLoadingEvent()
2079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
208a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_shouldFireLoadingEvent) {
209a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)        m_shouldFireLoadingEvent = false;
210e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        dispatchEvent(FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loading));
211a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    }
2129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
214f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FontFaceSet::suspend()
215f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
216f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_asyncRunner.suspend();
217f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
218f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
219f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FontFaceSet::resume()
220f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
221f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_asyncRunner.resume();
222f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
223f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
224f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)void FontFaceSet::stop()
225f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
226f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    m_asyncRunner.stop();
227f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
228f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
2299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FontFaceSet::beginFontLoading(FontFace* fontFace)
2309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
2319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_histogram.incrementCount();
232d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    addToLoadingFonts(fontFace);
2339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FontFaceSet::fontLoaded(FontFace* fontFace)
2369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
237d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_histogram.updateStatus(fontFace);
2389e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_loadedFonts.append(fontFace);
239d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    removeFromLoadingFonts(fontFace);
2409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
2429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FontFaceSet::loadError(FontFace* fontFace)
2439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
244d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_histogram.updateStatus(fontFace);
2459e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    m_failedFonts.append(fontFace);
246d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    removeFromLoadingFonts(fontFace);
2479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
249f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid FontFaceSet::addToLoadingFonts(PassRefPtrWillBeRawPtr<FontFace> fontFace)
25009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
2519e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_loadingFonts.isEmpty() && !hasLoadedFonts()) {
25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_shouldFireLoadingEvent = true;
25309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        handlePendingEventsAndPromisesSoon();
25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
255d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_loadingFonts.add(fontFace);
25609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
25709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
258f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid FontFaceSet::removeFromLoadingFonts(PassRefPtrWillBeRawPtr<FontFace> fontFace)
2599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
260d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    m_loadingFonts.remove(fontFace);
2619e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    if (m_loadingFonts.isEmpty())
262f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        handlePendingEventsAndPromisesSoon();
2639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
265323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)ScriptPromise FontFaceSet::ready(ScriptState* scriptState)
2669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
26709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return ScriptPromise();
269323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    OwnPtr<FontsReadyPromiseResolver> resolver = FontsReadyPromiseResolver::create(scriptState);
270d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    ScriptPromise promise = resolver->promise();
2719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_readyResolvers.append(resolver.release());
272f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    handlePendingEventsAndPromisesSoon();
2739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return promise;
2749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
2759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFaceSet::add(FontFace* fontFace, ExceptionState& exceptionState)
27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
27809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!fontFace) {
28109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwTypeError("The argument is not a FontFace.");
28209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
28309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
28409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (m_nonCSSConnectedFaces.contains(fontFace))
28509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isCSSConnectedFontFace(fontFace)) {
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidModificationError, "Cannot add a CSS-connected FontFace.");
28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
29009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    CSSFontSelector* fontSelector = document()->styleEngine()->fontSelector();
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_nonCSSConnectedFaces.add(fontFace);
29209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    fontSelector->fontFaceCache()->addFontFace(fontSelector, fontFace, false);
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (fontFace->loadStatus() == FontFace::Loading)
294d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        addToLoadingFonts(fontFace);
295d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    fontSelector->fontFaceInvalidated();
29609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFaceSet::clear()
29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
300d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    if (!inActiveDocumentContext() || m_nonCSSConnectedFaces.isEmpty())
30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
302d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    CSSFontSelector* fontSelector = document()->styleEngine()->fontSelector();
303d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    FontFaceCache* fontFaceCache = fontSelector->fontFaceCache();
304197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >::iterator it = m_nonCSSConnectedFaces.begin(); it != m_nonCSSConnectedFaces.end(); ++it) {
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fontFaceCache->removeFontFace(it->get(), false);
30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if ((*it)->loadStatus() == FontFace::Loading)
307d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            removeFromLoadingFonts(*it);
30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    m_nonCSSConnectedFaces.clear();
310d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    fontSelector->fontFaceInvalidated();
31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FontFaceSet::remove(FontFace* fontFace, ExceptionState& exceptionState)
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!fontFace) {
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwTypeError("The argument is not a FontFace.");
31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
32009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
321197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >::iterator it = m_nonCSSConnectedFaces.find(fontFace);
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (it != m_nonCSSConnectedFaces.end()) {
32309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        m_nonCSSConnectedFaces.remove(it);
324d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        CSSFontSelector* fontSelector = document()->styleEngine()->fontSelector();
325d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        fontSelector->fontFaceCache()->removeFontFace(fontFace, false);
32609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (fontFace->loadStatus() == FontFace::Loading)
327d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)            removeFromLoadingFonts(fontFace);
328d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)        fontSelector->fontFaceInvalidated();
32909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return true;
33009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
33109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (isCSSConnectedFontFace(fontFace))
33209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(InvalidModificationError, "Cannot delete a CSS-connected FontFace.");
33309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return false;
33409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FontFaceSet::has(FontFace* fontFace, ExceptionState& exceptionState) const
33709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
33809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
33909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
34009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!fontFace) {
34109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwTypeError("The argument is not a FontFace.");
34209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
34309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return m_nonCSSConnectedFaces.contains(fontFace) || isCSSConnectedFontFace(fontFace);
34509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
347197021e6b966cfb06891637935ef33fff06433d1Ben Murdochconst WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >& FontFaceSet::cssConnectedFontFaceList() const
34809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Document* d = document();
35009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    d->ensureStyleResolver(); // Flush pending style changes.
35109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return d->styleEngine()->fontSelector()->fontFaceCache()->cssConnectedFontFaces();
35209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
35309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)bool FontFaceSet::isCSSConnectedFontFace(FontFace* fontFace) const
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
35609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return cssConnectedFontFaceList().contains(fontFace);
35709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontFaceSet::forEach(FontFaceSetForEachCallback* callback, const ScriptValue& thisArg) const
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    forEachInternal(callback, &thisArg);
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
36309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3647242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontFaceSet::forEach(FontFaceSetForEachCallback* callback) const
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
36609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    forEachInternal(callback, 0);
36709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccivoid FontFaceSet::forEachInternal(FontFaceSetForEachCallback* callback, const ScriptValue* thisArg) const
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
37209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return;
373197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    const WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >& cssConnectedFaces = cssConnectedFontFaceList();
374f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    WillBeHeapVector<RefPtrWillBeMember<FontFace> > fontFaces;
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    fontFaces.reserveInitialCapacity(cssConnectedFaces.size() + m_nonCSSConnectedFaces.size());
376197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >::const_iterator it = cssConnectedFaces.begin(); it != cssConnectedFaces.end(); ++it)
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fontFaces.append(*it);
378197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    for (WillBeHeapListHashSet<RefPtrWillBeMember<FontFace> >::const_iterator it = m_nonCSSConnectedFaces.begin(); it != m_nonCSSConnectedFaces.end(); ++it)
37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        fontFaces.append(*it);
38009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (size_t i = 0; i < fontFaces.size(); ++i) {
38209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        FontFace* face = fontFaces[i].get();
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        if (thisArg)
38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            callback->handleItem(*thisArg, face, face, const_cast<FontFaceSet*>(this));
38509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        else
38609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)            callback->handleItem(face, face, const_cast<FontFaceSet*>(this));
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)unsigned long FontFaceSet::size() const
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
39209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return m_nonCSSConnectedFaces.size();
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return cssConnectedFontFaceList().size() + m_nonCSSConnectedFaces.size();
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
39609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
3979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)void FontFaceSet::fireDoneEventIfPossible()
3989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
399a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    if (m_shouldFireLoadingEvent)
4009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
401d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_loadingFonts.isEmpty() || (!hasLoadedFonts() && m_readyResolvers.isEmpty()))
4029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
4039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // If the layout was invalidated in between when we thought layout
4059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // was updated and when we're ready to fire the event, just wait
4069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // until after the next layout before firing events.
4079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    Document* d = document();
4089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!d->view() || d->view()->needsLayout())
4099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
4109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
411f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (hasLoadedFonts()) {
412e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RefPtrWillBeRawPtr<FontFaceSetLoadEvent> doneEvent = nullptr;
413e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        RefPtrWillBeRawPtr<FontFaceSetLoadEvent> errorEvent = nullptr;
414e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)        doneEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingdone, m_loadedFonts);
4159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_loadedFonts.clear();
4169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (!m_failedFonts.isEmpty()) {
417e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)            errorEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingerror, m_failedFonts);
4189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            m_failedFonts.clear();
4199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        }
4209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        dispatchEvent(doneEvent);
4219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        if (errorEvent)
4229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)            dispatchEvent(errorEvent);
4239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!m_readyResolvers.isEmpty()) {
4269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        Vector<OwnPtr<FontsReadyPromiseResolver> > resolvers;
4279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        m_readyResolvers.swap(resolvers);
4289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        for (size_t index = 0; index < resolvers.size(); ++index)
429a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)            resolvers[index]->resolve(this);
4309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
4329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
433323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)ScriptPromise FontFaceSet::load(ScriptState* scriptState, const String& fontString, const String& text)
4349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
43509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
43609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return ScriptPromise();
43709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    Font font;
4399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!resolveFontStyle(fontString, font)) {
440323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)        RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
44143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        ScriptPromise promise = resolver->promise();
442c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        resolver->reject(DOMException::create(SyntaxError, "Could not resolve '" + fontString + "' as a font."));
44343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        return promise;
4449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
44643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    FontFaceCache* fontFaceCache = document()->styleEngine()->fontSelector()->fontFaceCache();
44743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    FontFaceArray faces;
44809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (const FontFamily* f = &font.fontDescription().family(); f; f = f->next()) {
44943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        CSSSegmentedFontFace* segmentedFontFace = fontFaceCache->get(font.fontDescription(), f->family());
45043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)        if (segmentedFontFace)
4517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            segmentedFontFace->match(text, faces);
4529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
45343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)
454d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<LoadFontPromiseResolver> resolver = LoadFontPromiseResolver::create(faces, scriptState);
45543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    ScriptPromise promise = resolver->promise();
45643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    resolver->loadFonts(executionContext()); // After this, resolver->promise() may return null.
457bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return promise;
4589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
4599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
46051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)bool FontFaceSet::check(const String& fontString, const String& text, ExceptionState& exceptionState)
4619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
46209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (!inActiveDocumentContext())
46309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return false;
46409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    Font font;
4669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (!resolveFontStyle(fontString, font)) {
46709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        exceptionState.throwDOMException(SyntaxError, "Could not resolve '" + fontString + "' as a font.");
4689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return false;
4699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    CSSFontSelector* fontSelector = document()->styleEngine()->fontSelector();
4725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    FontFaceCache* fontFaceCache = fontSelector->fontFaceCache();
4735d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)
4745d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    bool hasLoadedFaces = false;
47509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    for (const FontFamily* f = &font.fontDescription().family(); f; f = f->next()) {
47609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        CSSSegmentedFontFace* face = fontFaceCache->get(font.fontDescription(), f->family());
4775d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (face) {
4787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci            if (!face->checkFont(text))
4795d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)                return false;
4805d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            hasLoadedFaces = true;
4815d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        }
4829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    }
4835d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    if (hasLoadedFaces)
4845d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        return true;
4855d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    for (const FontFamily* f = &font.fontDescription().family(); f; f = f->next()) {
4865d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)        if (fontSelector->isPlatformFontAvailable(font.fontDescription(), f->family()))
4875d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)            return true;
4885d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    }
4895d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)    return false;
4909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
4919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool FontFaceSet::resolveFontStyle(const String& fontString, Font& font)
4939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
4949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (fontString.isEmpty())
4959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return false;
4969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
4979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // Interpret fontString in the same way as the 'font' attribute of CanvasRenderingContext2D.
49843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)    RefPtrWillBeRawPtr<MutableStylePropertySet> parsedStyle = MutableStylePropertySet::create();
4997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    CSSParser::parseValue(parsedStyle.get(), CSSPropertyFont, fontString, true, HTMLStandardMode, 0);
5009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (parsedStyle->isEmpty())
5019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return false;
5029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    String fontValue = parsedStyle->getPropertyValue(CSSPropertyFont);
5049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    if (fontValue == "inherit" || fontValue == "initial")
5059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return false;
5069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    RefPtr<RenderStyle> style = RenderStyle::create();
5089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    FontFamily fontFamily;
5109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    fontFamily.setFamily(defaultFontFamily);
5119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    FontDescription defaultFontDescription;
5139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    defaultFontDescription.setFamily(fontFamily);
5149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    defaultFontDescription.setSpecifiedSize(defaultFontSize);
5159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    defaultFontDescription.setComputedSize(defaultFontSize);
5169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    style->setFontDescription(defaultFontDescription);
5189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    style->font().update(style->font().fontSelector());
5209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    // Now map the font property longhands into the style.
5229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    CSSPropertyValue properties[] = {
5239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontFamily, *parsedStyle),
524c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontStretch, *parsedStyle),
5259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontStyle, *parsedStyle),
5269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontVariant, *parsedStyle),
5279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontWeight, *parsedStyle),
5289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyFontSize, *parsedStyle),
5299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        CSSPropertyValue(CSSPropertyLineHeight, *parsedStyle),
5309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    };
531a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    StyleResolver& styleResolver = document()->ensureStyleResolver();
532a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    styleResolver.applyPropertiesToStyle(properties, WTF_ARRAY_LENGTH(properties), style.get());
5339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    font = style->font();
535a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)    font.update(document()->styleEngine()->fontSelector());
5369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return true;
5379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
5389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
539d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFaceSet::FontLoadHistogram::updateStatus(FontFace* fontFace)
5409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
541d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_status == Reported)
5429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return;
543d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (fontFace->hadBlankText())
544d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_status = HadBlankText;
545d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    else if (m_status == NoWebFonts)
546d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_status = DidNotHaveBlankText;
547d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
548d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFaceSet::FontLoadHistogram::record()
550d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (!m_recorded) {
552d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_recorded = true;
553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        blink::Platform::current()->histogramCustomCounts("WebFont.WebFontsInPage", m_count, 1, 100, 50);
554d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (m_status == HadBlankText || m_status == DidNotHaveBlankText) {
556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        blink::Platform::current()->histogramEnumeration("WebFont.HadBlankText", m_status == HadBlankText ? 1 : 0, 2);
557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        m_status = Reported;
558d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    }
559f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
560f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
561f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)static const char* supplementName()
562f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
563f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return "FontFaceSet";
5649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
5659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
5666f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochPassRefPtrWillBeRawPtr<FontFaceSet> FontFaceSet::from(Document& document)
567f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
5686f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    RefPtrWillBeRawPtr<FontFaceSet> fonts = static_cast<FontFaceSet*>(SupplementType::from(document, supplementName()));
569f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (!fonts) {
570f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        fonts = FontFaceSet::create(document);
571f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        SupplementType::provideTo(document, supplementName(), fonts);
572f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    }
573f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
574f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    return fonts.release();
575f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
576f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFaceSet::didLayout(Document& document)
578f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles){
579f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)    if (FontFaceSet* fonts = static_cast<FontFaceSet*>(SupplementType::from(document, supplementName())))
580f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)        fonts->didLayout();
581f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)}
582f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
5836f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#if ENABLE(OILPAN)
5846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid FontFaceSet::trace(Visitor* visitor)
5856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
586f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    visitor->trace(m_loadingFonts);
587f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    visitor->trace(m_loadedFonts);
588f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    visitor->trace(m_failedFonts);
589f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu    visitor->trace(m_nonCSSConnectedFaces);
590323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)    DocumentSupplement::trace(visitor);
591d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    EventTargetWithInlineData::trace(visitor);
5926f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
5936f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#endif
594f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)
595c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
596