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