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 69bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * met: 79bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * 89bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 99bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * in the documentation and/or other materials provided with the 139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * distribution. 149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * this software without specific prior written permission. 179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * 189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 289bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) */ 309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 319bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "config.h" 329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/FontFace.h" 339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 34197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h" 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ScriptState.h" 365d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/CSSValueKeywords.h" 37d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/BinaryDataFontFaceSource.h" 389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSFontFace.h" 399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSFontFaceSrcValue.h" 4009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/CSSFontSelector.h" 419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSPrimitiveValue.h" 429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSUnicodeRangeValue.h" 439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/CSSValueList.h" 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/css/FontFaceDescriptors.h" 45d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/LocalFontFaceSource.h" 46d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/css/RemoteFontFaceSource.h" 479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/StylePropertySet.h" 489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/css/StyleRule.h" 497242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/css/parser/CSSParser.h" 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/DOMException.h" 519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/dom/Document.h" 52a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "core/dom/ExceptionCode.h" 5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/dom/StyleEngine.h" 54d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/frame/UseCounter.h" 579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#include "core/svg/SVGFontFaceElement.h" 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/svg/SVGFontFaceSource.h" 59d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/svg/SVGRemoteFontFaceSource.h" 605d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/FontFamilyNames.h" 61d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "platform/SharedBuffer.h" 629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 63c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 65d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)static PassRefPtrWillBeRawPtr<CSSValue> parseCSSValue(const Document* document, const String& s, CSSPropertyID propertyID) 669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 677242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci CSSParserContext context(*document, UseCounter::getFrom(document)); 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return CSSParser::parseSingleValue(propertyID, s, context); 699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicString& family, const String& source, const FontFaceDescriptors& descriptors) 729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 73c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtrWillBeRawPtr<FontFace> fontFace = adoptRefWillBeNoop(new FontFace(context, family, descriptors)); 749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 75d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<CSSValue> src = parseCSSValue(toDocument(context), source, CSSPropertySrc); 76c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!src || !src->isValueList()) 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fontFace->setError(DOMException::create(SyntaxError, "The source provided ('" + source + "') could not be parsed as a value list.")); 78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fontFace->initCSSFontFace(toDocument(context), src); 80d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return fontFace.release(); 81d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicString& family, PassRefPtr<ArrayBuffer> source, const FontFaceDescriptors& descriptors) 84d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 85c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtrWillBeRawPtr<FontFace> fontFace = adoptRefWillBeNoop(new FontFace(context, family, descriptors)); 86c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->data()), source->byteLength()); 87d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return fontFace.release(); 88d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 89d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 907242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciPassRefPtrWillBeRawPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicString& family, PassRefPtr<ArrayBufferView> source, const FontFaceDescriptors& descriptors) 91d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) RefPtrWillBeRawPtr<FontFace> fontFace = adoptRefWillBeNoop(new FontFace(context, family, descriptors)); 93c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->baseAddress()), source->byteLength()); 94d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return fontFace.release(); 959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 97f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo LiuPassRefPtrWillBeRawPtr<FontFace> FontFace::create(Document* document, const StyleRuleFontFace* fontFaceRule) 989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 99d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) const StylePropertySet& properties = fontFaceRule->properties(); 1009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Obtain the font-family property and the src property. Both must be defined. 102d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<CSSValue> family = properties.getPropertyCSSValue(CSSPropertyFontFamily); 1039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!family || !family->isValueList()) 104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<CSSValue> src = properties.getPropertyCSSValue(CSSPropertySrc); 1069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!src || !src->isValueList()) 107d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtrWillBeRawPtr<FontFace> fontFace = adoptRefWillBeNoop(new FontFace(document)); 1109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (fontFace->setFamilyValue(toCSSValueList(family.get())) 1129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyFontStyle) 1139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyFontWeight) 1149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyFontStretch) 1159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyUnicodeRange) 1169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyFontVariant) 11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) && fontFace->setPropertyFromStyle(properties, CSSPropertyWebkitFontFeatureSettings) 11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) && !fontFace->family().isEmpty() 119197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch && fontFace->traits().bitfield()) { 120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) fontFace->initCSSFontFace(document, src); 121d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return fontFace.release(); 12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) } 123d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 1249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFontFace::FontFace(ExecutionContext* context) 1277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci : ActiveDOMObject(context) 1287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_status(Unloaded) 1299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci suspendIfNeeded(); 131c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano TucciFontFace::FontFace(ExecutionContext* context, const AtomicString& family, const FontFaceDescriptors& descriptors) 1347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci : ActiveDOMObject(context) 1357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci , m_family(family) 136c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) , m_status(Unloaded) 137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 138c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) Document* document = toDocument(context); 1397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPropertyFromString(document, descriptors.style(), CSSPropertyFontStyle); 1407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPropertyFromString(document, descriptors.weight(), CSSPropertyFontWeight); 1417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: we don't implement 'font-strech' property yet so we can't set the property. 1427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPropertyFromString(document, descriptors.unicodeRange(), CSSPropertyUnicodeRange); 1437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPropertyFromString(document, descriptors.variant(), CSSPropertyFontVariant); 1447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci setPropertyFromString(document, descriptors.featureSettings(), CSSPropertyWebkitFontFeatureSettings); 1457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 1467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci suspendIfNeeded(); 1479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)FontFace::~FontFace() 1509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::style() const 1549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_style ? m_style->cssText() : "normal"; 1569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::weight() const 1599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_weight ? m_weight->cssText() : "normal"; 1619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::stretch() const 1649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_stretch ? m_stretch->cssText() : "normal"; 1669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::unicodeRange() const 1699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1709bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_unicodeRange ? m_unicodeRange->cssText() : "U+0-10FFFF"; 1719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::variant() const 1749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_variant ? m_variant->cssText() : "normal"; 1769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 1789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::featureSettings() const 1799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 1809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return m_featureSettings ? m_featureSettings->cssText() : "normal"; 1819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1829bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 18309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setStyle(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 1849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 185c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyFontStyle, &exceptionState); 1869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 18809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setWeight(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 1899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 190c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyFontWeight, &exceptionState); 1919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 19309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setStretch(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 1949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 195c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyFontStretch, &exceptionState); 1969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 1979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 19809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setUnicodeRange(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 1999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 200c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyUnicodeRange, &exceptionState); 2019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 20309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setVariant(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 2049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 205c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyFontVariant, &exceptionState); 2069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 20809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void FontFace::setFeatureSettings(ExecutionContext* context, const String& s, ExceptionState& exceptionState) 2099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 210c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setPropertyFromString(toDocument(context), s, CSSPropertyWebkitFontFeatureSettings, &exceptionState); 2119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 213c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FontFace::setPropertyFromString(const Document* document, const String& s, CSSPropertyID propertyID, ExceptionState* exceptionState) 2149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 215d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtrWillBeRawPtr<CSSValue> value = parseCSSValue(document, s, propertyID); 216c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (value && setPropertyValue(value, propertyID)) 217c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 218c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 219c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) String message = "Failed to set '" + s + "' as a property value."; 220c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (exceptionState) 221c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) exceptionState->throwDOMException(SyntaxError, message); 222c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else 223c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setError(DOMException::create(SyntaxError, message)); 2249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 226d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool FontFace::setPropertyFromStyle(const StylePropertySet& properties, CSSPropertyID propertyID) 2279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 228d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return setPropertyValue(properties.getPropertyCSSValue(propertyID), propertyID); 2299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 231d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool FontFace::setPropertyValue(PassRefPtrWillBeRawPtr<CSSValue> value, CSSPropertyID propertyID) 2329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 2339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) switch (propertyID) { 2349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyFontStyle: 2359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_style = value; 2369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyFontWeight: 2389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_weight = value; 2399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyFontStretch: 2419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_stretch = value; 2429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyUnicodeRange: 2449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (value && !value->isValueList()) 2459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return false; 2469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_unicodeRange = value; 2479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2489bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyFontVariant: 2499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_variant = value; 2509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSPropertyWebkitFontFeatureSettings: 2529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_featureSettings = value; 2539bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 2559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) ASSERT_NOT_REACHED(); 2569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return false; 2579bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 2589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return true; 2599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 2609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 2619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)bool FontFace::setFamilyValue(CSSValueList* familyList) 2629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 2639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // The font-family descriptor has to have exactly one family name. 2649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (familyList->length() != 1) 2659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return false; 2669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 267197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch CSSPrimitiveValue* familyValue = toCSSPrimitiveValue(familyList->item(0)); 268a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) AtomicString family; 2699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (familyValue->isString()) { 270a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) family = AtomicString(familyValue->getStringValue()); 2719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else if (familyValue->isValueID()) { 2729bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // We need to use the raw text for all the generic family types, since @font-face is a way of actually 2739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // defining what font to use for those types. 2749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) switch (familyValue->getValueID()) { 2759bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueSerif: 276f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_serif; 2779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueSansSerif: 279f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_sans_serif; 2809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueCursive: 282f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_cursive; 2839bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueFantasy: 285f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_fantasy; 2869bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueMonospace: 288f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_monospace; 2899bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueWebkitPictograph: 291f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) family = FontFamilyNames::webkit_pictograph; 2929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 2939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 2949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return false; 2959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 2969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 2979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) m_family = family; 2989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return true; 2999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 3009bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 3019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)String FontFace::status() const 3029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 3039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) switch (m_status) { 3049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case Unloaded: 3059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return "unloaded"; 3069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case Loading: 3079bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return "loading"; 3089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case Loaded: 3099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return "loaded"; 3109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case Error: 3119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return "error"; 3129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 3139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) ASSERT_NOT_REACHED(); 3149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 3159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return emptyString(); 3169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 3179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 318a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)void FontFace::setLoadStatus(LoadStatus status) 319a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 320a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) m_status = status; 321c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(m_status != Error || m_error); 322c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 32343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (m_status == Loaded || m_status == Error) { 324e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_loadedProperty) { 325e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_status == Loaded) 326e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_loadedProperty->resolve(this); 327e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) else 328e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_loadedProperty->reject(m_error.get()); 329e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 33043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 331323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) WillBeHeapVector<RefPtrWillBeMember<LoadFontCallback> > callbacks; 33243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) m_callbacks.swap(callbacks); 33343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) for (size_t i = 0; i < callbacks.size(); ++i) { 33443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (m_status == Loaded) 33543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) callbacks[i]->notifyLoaded(this); 33643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) else 33743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) callbacks[i]->notifyError(this); 33843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) } 33943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) } 34043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)} 34143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 342c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)void FontFace::setError(PassRefPtrWillBeRawPtr<DOMException> error) 343c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 344c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (!m_error) 345c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_error = error ? error : DOMException::create(NetworkError); 346c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setLoadStatus(Error); 347c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 348c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 349d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptPromise FontFace::fontStatusPromise(ScriptState* scriptState) 35043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 351e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (!m_loadedProperty) { 352e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_loadedProperty = new LoadedProperty(scriptState->executionContext(), this, LoadedProperty::Loaded); 353e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) if (m_status == Loaded) 354e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_loadedProperty->resolve(this); 355e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) else if (m_status == Error) 356e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) m_loadedProperty->reject(m_error.get()); 357e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) } 358e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) return m_loadedProperty->promise(scriptState->world()); 359a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 360a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 361d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ScriptPromise FontFace::load(ScriptState* scriptState) 362d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles){ 363d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) loadInternal(scriptState->executionContext()); 364d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) return fontStatusPromise(scriptState); 365d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)} 366d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 367323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void FontFace::loadWithCallback(PassRefPtrWillBeRawPtr<LoadFontCallback> callback, ExecutionContext* context) 36843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles){ 36943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) loadInternal(context); 37043e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (m_status == Loaded) 37143e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) callback->notifyLoaded(this); 37243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) else if (m_status == Error) 37343e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) callback->notifyError(this); 37443e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) else 37543e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) m_callbacks.append(callback); 37643e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)} 37743e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) 37843e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles)void FontFace::loadInternal(ExecutionContext* context) 379a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles){ 38009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (m_status != Unloaded) 381a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return; 382a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 383d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) m_cssFontFace->load(); 384d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) toDocument(context)->styleEngine()->fontSelector()->fontLoader()->loadPendingFonts(); 385a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)} 386a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) 387d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)FontTraits FontFace::traits() const 3889bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 389d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) FontStyle style = FontStyleNormal; 3909bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_style) { 3919bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!m_style->isPrimitiveValue()) 3929bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return 0; 3939bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 3949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) switch (toCSSPrimitiveValue(m_style.get())->getValueID()) { 3959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueNormal: 396d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) style = FontStyleNormal; 3979bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 3989bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueItalic: 3999bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueOblique: 400d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) style = FontStyleItalic; 4019bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4029bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 4039bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4049bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 407d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) FontWeight weight = FontWeight400; 4089bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (m_weight) { 4099bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!m_weight->isPrimitiveValue()) 4109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return 0; 4119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 4129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) switch (toCSSPrimitiveValue(m_weight.get())->getValueID()) { 4139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueBold: 4149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue700: 415d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight700; 4169bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4179bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueNormal: 4189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue400: 419d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight400; 4209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue900: 422d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight900; 4239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue800: 425d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight800; 4269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue600: 428d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight600; 4299bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue500: 431d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight500; 4329bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4339bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue300: 434d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight300; 4359bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue200: 437d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight200; 4389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValue100: 440d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) weight = FontWeight100; 4419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // Although 'lighter' and 'bolder' are valid keywords for font-weights, they are invalid 4437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // inside font-face rules so they are ignored. Reference: http://www.w3.org/TR/css3-fonts/#descdef-font-weight. 4447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case CSSValueLighter: 4457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci case CSSValueBolder: 4467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci break; 4479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 44809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) ASSERT_NOT_REACHED(); 4499bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4519bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4529bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 453d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) FontVariant variant = FontVariantNormal; 454d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (RefPtrWillBeRawPtr<CSSValue> fontVariant = m_variant) { 4559bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // font-variant descriptor can be a value list. 4569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (fontVariant->isPrimitiveValue()) { 45709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createCommaSeparated(); 4589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) list->append(fontVariant); 4599bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) fontVariant = list; 4609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else if (!fontVariant->isValueList()) { 4619bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return 0; 4629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 4649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) CSSValueList* variantList = toCSSValueList(fontVariant.get()); 4659bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) unsigned numVariants = variantList->length(); 4669bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!numVariants) 4679bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) return 0; 4689bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 4699bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (unsigned i = 0; i < numVariants; ++i) { 470197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch switch (toCSSPrimitiveValue(variantList->item(i))->getValueID()) { 4719bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueNormal: 472d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) variant = FontVariantNormal; 4739bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4749bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) case CSSValueSmallCaps: 475d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) variant = FontVariantSmallCaps; 4769bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4779bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) default: 4789bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) break; 4799bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 4819bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 482d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 483d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return FontTraits(style, variant, weight, FontStretchNormal); 4849bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 4859bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 486f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic PassOwnPtrWillBeRawPtr<CSSFontFace> createCSSFontFace(FontFace* fontFace, CSSValue* unicodeRange) 4879bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){ 488d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) Vector<CSSFontFace::UnicodeRange> ranges; 489d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (CSSValueList* rangeList = toCSSValueList(unicodeRange)) { 490d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) unsigned numRanges = rangeList->length(); 491d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) for (unsigned i = 0; i < numRanges; i++) { 492197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch CSSUnicodeRangeValue* range = toCSSUnicodeRangeValue(rangeList->item(i)); 493d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) ranges.append(CSSFontFace::UnicodeRange(range->from(), range->to())); 494d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 495d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 496d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 497f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu return adoptPtrWillBeNoop(new CSSFontFace(fontFace, ranges)); 498d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 499d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 500d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFace::initCSSFontFace(Document* document, PassRefPtrWillBeRawPtr<CSSValue> src) 501d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 502d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cssFontFace = createCSSFontFace(this, m_unicodeRange.get()); 503c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_error) 504c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 5059bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 5069bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // Each item in the src property's list is a single CSSFontFaceSource. Put them all into a CSSFontFace. 507c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(src); 508c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) ASSERT(src->isValueList()); 509d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) CSSValueList* srcList = toCSSValueList(src.get()); 5109bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) int srcLength = srcList->length(); 5119bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 5129bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) bool foundSVGFont = false; 5139bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 5149bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) for (int i = 0; i < srcLength; i++) { 5159bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) // An item in the list either specifies a string (local font name) or a URL (remote font to download). 516197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch CSSFontFaceSrcValue* item = toCSSFontFaceSrcValue(srcList->item(i)); 517d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) OwnPtrWillBeRawPtr<CSSFontFaceSource> source = nullptr; 5189bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 5199bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#if ENABLE(SVG_FONTS) 5209bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) foundSVGFont = item->isSVGFontFaceSrc() || item->svgFontFaceElement(); 5219bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif 5229bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (!item->isLocal()) { 5239bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) Settings* settings = document ? document->frame() ? document->frame()->settings() : 0 : 0; 5249bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) bool allowDownloading = foundSVGFont || (settings && settings->downloadableBinaryFontsEnabled()); 5259bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (allowDownloading && item->isSupportedFormat() && document) { 5269bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) FontResource* fetched = item->fetch(document); 5279bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) if (fetched) { 528d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) FontLoader* fontLoader = document->styleEngine()->fontSelector()->fontLoader(); 529d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) 5309bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#if ENABLE(SVG_FONTS) 531d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (foundSVGFont) { 532d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) source = adoptPtrWillBeNoop(new SVGRemoteFontFaceSource(item->resource(), fetched, fontLoader)); 533d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else 5349bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif 535d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 536d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) source = adoptPtrWillBeNoop(new RemoteFontFaceSource(fetched, fontLoader)); 537d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 5389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 5399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 5409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } else { 5419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#if ENABLE(SVG_FONTS) 542d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (item->svgFontFaceElement()) { 543d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) RefPtrWillBeRawPtr<SVGFontFaceElement> fontfaceElement = item->svgFontFaceElement(); 5446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // SVGFontFaceSource assumes that it is the case where <font-face> element resides in the same document. 5456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch // We put a RELEASE_ASSERT here as it will cause UAF if the assumption is false. 5466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch RELEASE_ASSERT(fontfaceElement->inDocument()); 5476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch RELEASE_ASSERT(fontfaceElement->document() == document); 548d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) source = adoptPtrWillBeNoop(new SVGFontFaceSource(fontfaceElement.get())); 549d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } else 5509bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)#endif 551d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) { 552d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) source = adoptPtrWillBeNoop(new LocalFontFaceSource(item->resource())); 553d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) } 5549bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 555d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 556d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (source) 557d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cssFontFace->addSource(source.release()); 5589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) } 559d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 5609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 561d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFace::initCSSFontFace(const unsigned char* data, unsigned size) 562d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 563d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cssFontFace = createCSSFontFace(this, m_unicodeRange.get()); 564c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (m_error) 565c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) return; 566d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 567d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) RefPtr<SharedBuffer> buffer = SharedBuffer::create(data, size); 568d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles) OwnPtrWillBeRawPtr<BinaryDataFontFaceSource> source = adoptPtrWillBeNoop(new BinaryDataFontFaceSource(buffer.get())); 569c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) if (source->isValid()) 570c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setLoadStatus(Loaded); 571c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) else 572c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) setError(DOMException::create(SyntaxError, "Invalid font data in ArrayBuffer.")); 573d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) m_cssFontFace->addSource(source.release()); 574d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 575d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 576d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void FontFace::trace(Visitor* visitor) 577d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 578d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_src); 579d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_style); 580d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_weight); 581d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_stretch); 582d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_unicodeRange); 583d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_variant); 584d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_featureSettings); 585d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) visitor->trace(m_error); 586e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles) visitor->trace(m_loadedProperty); 587f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu visitor->trace(m_cssFontFace); 588323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_callbacks); 589d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 590d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 591d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)bool FontFace::hadBlankText() const 592d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 593d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return m_cssFontFace->hadBlankText(); 5949bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)} 5959bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles) 5967242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccibool FontFace::hasPendingActivity() const 5977242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci{ 5987242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return m_status == Loading && executionContext() && !executionContext()->activeDOMObjectsAreStopped(); 5997242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} 6007242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 601c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 602