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