| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 15 matching lines...) Expand all Loading... |
| 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
| 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| 29 */ | 29 */ |
| 30 | 30 |
| 31 #include "sky/engine/config.h" | 31 #include "sky/engine/config.h" |
| 32 #include "sky/engine/core/css/FontFace.h" | 32 #include "sky/engine/core/css/FontFace.h" |
| 33 | 33 |
| 34 #include "gen/sky/core/CSSValueKeywords.h" | 34 #include "gen/sky/core/CSSValueKeywords.h" |
| 35 #include "gen/sky/platform/FontFamilyNames.h" | 35 #include "gen/sky/platform/FontFamilyNames.h" |
| 36 #include "sky/engine/bindings/core/v8/Dictionary.h" | 36 #include "sky/engine/bindings2/exception_state.h" |
| 37 #include "sky/engine/bindings/core/v8/ExceptionState.h" | |
| 38 #include "sky/engine/bindings/core/v8/ScriptState.h" | |
| 39 #include "sky/engine/core/css/BinaryDataFontFaceSource.h" | 37 #include "sky/engine/core/css/BinaryDataFontFaceSource.h" |
| 40 #include "sky/engine/core/css/CSSFontFace.h" | 38 #include "sky/engine/core/css/CSSFontFace.h" |
| 41 #include "sky/engine/core/css/CSSFontFaceSrcValue.h" | 39 #include "sky/engine/core/css/CSSFontFaceSrcValue.h" |
| 42 #include "sky/engine/core/css/CSSFontSelector.h" | 40 #include "sky/engine/core/css/CSSFontSelector.h" |
| 43 #include "sky/engine/core/css/CSSPrimitiveValue.h" | 41 #include "sky/engine/core/css/CSSPrimitiveValue.h" |
| 44 #include "sky/engine/core/css/CSSUnicodeRangeValue.h" | 42 #include "sky/engine/core/css/CSSUnicodeRangeValue.h" |
| 45 #include "sky/engine/core/css/CSSValueList.h" | 43 #include "sky/engine/core/css/CSSValueList.h" |
| 46 #include "sky/engine/core/css/LocalFontFaceSource.h" | 44 #include "sky/engine/core/css/LocalFontFaceSource.h" |
| 47 #include "sky/engine/core/css/RemoteFontFaceSource.h" | 45 #include "sky/engine/core/css/RemoteFontFaceSource.h" |
| 48 #include "sky/engine/core/css/StylePropertySet.h" | 46 #include "sky/engine/core/css/StylePropertySet.h" |
| (...skipping 12 matching lines...) Expand all Loading... |
| 61 | 59 |
| 62 static PassRefPtr<CSSValue> parseCSSValue(const Document* document, const String
& s, CSSPropertyID propertyID) | 60 static PassRefPtr<CSSValue> parseCSSValue(const Document* document, const String
& s, CSSPropertyID propertyID) |
| 63 { | 61 { |
| 64 if (s.isEmpty()) | 62 if (s.isEmpty()) |
| 65 return nullptr; | 63 return nullptr; |
| 66 RefPtr<MutableStylePropertySet> parsedStyle = MutableStylePropertySet::creat
e(); | 64 RefPtr<MutableStylePropertySet> parsedStyle = MutableStylePropertySet::creat
e(); |
| 67 BisonCSSParser::parseValue(parsedStyle.get(), propertyID, s, *document); | 65 BisonCSSParser::parseValue(parsedStyle.get(), propertyID, s, *document); |
| 68 return parsedStyle->getPropertyCSSValue(propertyID); | 66 return parsedStyle->getPropertyCSSValue(propertyID); |
| 69 } | 67 } |
| 70 | 68 |
| 71 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, const String& source, const Dictionary& descriptors) | 69 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, const String& source) |
| 72 { | 70 { |
| 73 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family, descripto
rs)); | 71 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family)); |
| 74 | 72 |
| 75 RefPtr<CSSValue> src = parseCSSValue(toDocument(context), source, CSSPropert
ySrc); | 73 RefPtr<CSSValue> src = parseCSSValue(toDocument(context), source, CSSPropert
ySrc); |
| 76 if (!src || !src->isValueList()) | 74 if (!src || !src->isValueList()) |
| 77 fontFace->setError(DOMException::create(SyntaxError, "The source provide
d ('" + source + "') could not be parsed as a value list.")); | 75 fontFace->setError(DOMException::create(SyntaxError, "The source provide
d ('" + source + "') could not be parsed as a value list.")); |
| 78 | 76 |
| 79 fontFace->initCSSFontFace(toDocument(context), src); | 77 fontFace->initCSSFontFace(toDocument(context), src); |
| 80 return fontFace.release(); | 78 return fontFace.release(); |
| 81 } | 79 } |
| 82 | 80 |
| 83 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, PassRefPtr<ArrayBuffer> source, const Dictionary& descriptors) | 81 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, PassRefPtr<ArrayBuffer> source) |
| 84 { | 82 { |
| 85 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family, descripto
rs)); | 83 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family)); |
| 86 fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->data()),
source->byteLength()); | 84 fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->data()),
source->byteLength()); |
| 87 return fontFace.release(); | 85 return fontFace.release(); |
| 88 } | 86 } |
| 89 | 87 |
| 90 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, PassRefPtr<ArrayBufferView> source, const Dictionary& descriptors) | 88 PassRefPtr<FontFace> FontFace::create(ExecutionContext* context, const AtomicStr
ing& family, PassRefPtr<ArrayBufferView> source) |
| 91 { | 89 { |
| 92 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family, descripto
rs)); | 90 RefPtr<FontFace> fontFace = adoptRef(new FontFace(context, family)); |
| 93 fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->baseAddr
ess()), source->byteLength()); | 91 fontFace->initCSSFontFace(static_cast<const unsigned char*>(source->baseAddr
ess()), source->byteLength()); |
| 94 return fontFace.release(); | 92 return fontFace.release(); |
| 95 } | 93 } |
| 96 | 94 |
| 97 PassRefPtr<FontFace> FontFace::create(Document* document, const StyleRuleFontFac
e* fontFaceRule) | 95 PassRefPtr<FontFace> FontFace::create(Document* document, const StyleRuleFontFac
e* fontFaceRule) |
| 98 { | 96 { |
| 99 const StylePropertySet& properties = fontFaceRule->properties(); | 97 const StylePropertySet& properties = fontFaceRule->properties(); |
| 100 | 98 |
| 101 // Obtain the font-family property and the src property. Both must be define
d. | 99 // Obtain the font-family property and the src property. Both must be define
d. |
| 102 RefPtr<CSSValue> family = properties.getPropertyCSSValue(CSSPropertyFontFami
ly); | 100 RefPtr<CSSValue> family = properties.getPropertyCSSValue(CSSPropertyFontFami
ly); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 121 return fontFace.release(); | 119 return fontFace.release(); |
| 122 } | 120 } |
| 123 return nullptr; | 121 return nullptr; |
| 124 } | 122 } |
| 125 | 123 |
| 126 FontFace::FontFace() | 124 FontFace::FontFace() |
| 127 : m_status(Unloaded) | 125 : m_status(Unloaded) |
| 128 { | 126 { |
| 129 } | 127 } |
| 130 | 128 |
| 131 FontFace::FontFace(ExecutionContext* context, const AtomicString& family, const
Dictionary& descriptors) | 129 FontFace::FontFace(ExecutionContext* context, const AtomicString& family) |
| 132 : m_family(family) | 130 : m_family(family) |
| 133 , m_status(Unloaded) | 131 , m_status(Unloaded) |
| 134 { | 132 { |
| 135 Document* document = toDocument(context); | |
| 136 String value; | |
| 137 if (DictionaryHelper::get(descriptors, "style", value)) | |
| 138 setPropertyFromString(document, value, CSSPropertyFontStyle); | |
| 139 if (DictionaryHelper::get(descriptors, "weight", value)) | |
| 140 setPropertyFromString(document, value, CSSPropertyFontWeight); | |
| 141 if (DictionaryHelper::get(descriptors, "stretch", value)) | |
| 142 setPropertyFromString(document, value, CSSPropertyFontStretch); | |
| 143 if (DictionaryHelper::get(descriptors, "unicodeRange", value)) | |
| 144 setPropertyFromString(document, value, CSSPropertyUnicodeRange); | |
| 145 if (DictionaryHelper::get(descriptors, "variant", value)) | |
| 146 setPropertyFromString(document, value, CSSPropertyFontVariant); | |
| 147 if (DictionaryHelper::get(descriptors, "featureSettings", value)) | |
| 148 setPropertyFromString(document, value, CSSPropertyWebkitFontFeatureSetti
ngs); | |
| 149 } | 133 } |
| 150 | 134 |
| 151 FontFace::~FontFace() | 135 FontFace::~FontFace() |
| 152 { | 136 { |
| 153 } | 137 } |
| 154 | 138 |
| 155 String FontFace::style() const | 139 String FontFace::style() const |
| 156 { | 140 { |
| 157 return m_style ? m_style->cssText() : "normal"; | 141 return m_style ? m_style->cssText() : "normal"; |
| 158 } | 142 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 } | 197 } |
| 214 | 198 |
| 215 void FontFace::setPropertyFromString(const Document* document, const String& s,
CSSPropertyID propertyID, ExceptionState* exceptionState) | 199 void FontFace::setPropertyFromString(const Document* document, const String& s,
CSSPropertyID propertyID, ExceptionState* exceptionState) |
| 216 { | 200 { |
| 217 RefPtr<CSSValue> value = parseCSSValue(document, s, propertyID); | 201 RefPtr<CSSValue> value = parseCSSValue(document, s, propertyID); |
| 218 if (value && setPropertyValue(value, propertyID)) | 202 if (value && setPropertyValue(value, propertyID)) |
| 219 return; | 203 return; |
| 220 | 204 |
| 221 String message = "Failed to set '" + s + "' as a property value."; | 205 String message = "Failed to set '" + s + "' as a property value."; |
| 222 if (exceptionState) | 206 if (exceptionState) |
| 223 exceptionState->throwDOMException(SyntaxError, message); | 207 exceptionState->ThrowDOMException(SyntaxError, message); |
| 224 else | 208 else |
| 225 setError(DOMException::create(SyntaxError, message)); | 209 setError(DOMException::create(SyntaxError, message)); |
| 226 } | 210 } |
| 227 | 211 |
| 228 bool FontFace::setPropertyFromStyle(const StylePropertySet& properties, CSSPrope
rtyID propertyID) | 212 bool FontFace::setPropertyFromStyle(const StylePropertySet& properties, CSSPrope
rtyID propertyID) |
| 229 { | 213 { |
| 230 return setPropertyValue(properties.getPropertyCSSValue(propertyID), property
ID); | 214 return setPropertyValue(properties.getPropertyCSSValue(propertyID), property
ID); |
| 231 } | 215 } |
| 232 | 216 |
| 233 bool FontFace::setPropertyValue(PassRefPtr<CSSValue> value, CSSPropertyID proper
tyID) | 217 bool FontFace::setPropertyValue(PassRefPtr<CSSValue> value, CSSPropertyID proper
tyID) |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 316 } | 300 } |
| 317 return emptyString(); | 301 return emptyString(); |
| 318 } | 302 } |
| 319 | 303 |
| 320 void FontFace::setLoadStatus(LoadStatus status) | 304 void FontFace::setLoadStatus(LoadStatus status) |
| 321 { | 305 { |
| 322 m_status = status; | 306 m_status = status; |
| 323 ASSERT(m_status != Error || m_error); | 307 ASSERT(m_status != Error || m_error); |
| 324 | 308 |
| 325 if (m_status == Loaded || m_status == Error) { | 309 if (m_status == Loaded || m_status == Error) { |
| 326 if (m_loadedProperty) { | |
| 327 if (m_status == Loaded) | |
| 328 m_loadedProperty->resolve(this); | |
| 329 else | |
| 330 m_loadedProperty->reject(m_error.get()); | |
| 331 } | |
| 332 | |
| 333 Vector<RefPtr<LoadFontCallback> > callbacks; | 310 Vector<RefPtr<LoadFontCallback> > callbacks; |
| 334 m_callbacks.swap(callbacks); | 311 m_callbacks.swap(callbacks); |
| 335 for (size_t i = 0; i < callbacks.size(); ++i) { | 312 for (size_t i = 0; i < callbacks.size(); ++i) { |
| 336 if (m_status == Loaded) | 313 if (m_status == Loaded) |
| 337 callbacks[i]->notifyLoaded(this); | 314 callbacks[i]->notifyLoaded(this); |
| 338 else | 315 else |
| 339 callbacks[i]->notifyError(this); | 316 callbacks[i]->notifyError(this); |
| 340 } | 317 } |
| 341 } | 318 } |
| 342 } | 319 } |
| 343 | 320 |
| 344 void FontFace::setError(PassRefPtr<DOMException> error) | 321 void FontFace::setError(PassRefPtr<DOMException> error) |
| 345 { | 322 { |
| 346 if (!m_error) | 323 if (!m_error) |
| 347 m_error = error ? error : DOMException::create(NetworkError); | 324 m_error = error ? error : DOMException::create(NetworkError); |
| 348 setLoadStatus(Error); | 325 setLoadStatus(Error); |
| 349 } | 326 } |
| 350 | 327 |
| 351 ScriptPromise FontFace::fontStatusPromise(ScriptState* scriptState) | |
| 352 { | |
| 353 if (!m_loadedProperty) { | |
| 354 m_loadedProperty = adoptPtr(new LoadedProperty(scriptState->executionCon
text(), this, LoadedProperty::Loaded)); | |
| 355 if (m_status == Loaded) | |
| 356 m_loadedProperty->resolve(this); | |
| 357 else if (m_status == Error) | |
| 358 m_loadedProperty->reject(m_error.get()); | |
| 359 } | |
| 360 return m_loadedProperty->promise(scriptState->world()); | |
| 361 } | |
| 362 | |
| 363 ScriptPromise FontFace::load(ScriptState* scriptState) | |
| 364 { | |
| 365 loadInternal(scriptState->executionContext()); | |
| 366 return fontStatusPromise(scriptState); | |
| 367 } | |
| 368 | |
| 369 void FontFace::loadWithCallback(PassRefPtr<LoadFontCallback> callback, Execution
Context* context) | 328 void FontFace::loadWithCallback(PassRefPtr<LoadFontCallback> callback, Execution
Context* context) |
| 370 { | 329 { |
| 371 loadInternal(context); | 330 loadInternal(context); |
| 372 if (m_status == Loaded) | 331 if (m_status == Loaded) |
| 373 callback->notifyLoaded(this); | 332 callback->notifyLoaded(this); |
| 374 else if (m_status == Error) | 333 else if (m_status == Error) |
| 375 callback->notifyError(this); | 334 callback->notifyError(this); |
| 376 else | 335 else |
| 377 m_callbacks.append(callback); | 336 m_callbacks.append(callback); |
| 378 } | 337 } |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 545 setError(DOMException::create(SyntaxError, "Invalid font data in ArrayBu
ffer.")); | 504 setError(DOMException::create(SyntaxError, "Invalid font data in ArrayBu
ffer.")); |
| 546 m_cssFontFace->addSource(source.release()); | 505 m_cssFontFace->addSource(source.release()); |
| 547 } | 506 } |
| 548 | 507 |
| 549 bool FontFace::hadBlankText() const | 508 bool FontFace::hadBlankText() const |
| 550 { | 509 { |
| 551 return m_cssFontFace->hadBlankText(); | 510 return m_cssFontFace->hadBlankText(); |
| 552 } | 511 } |
| 553 | 512 |
| 554 } // namespace blink | 513 } // namespace blink |
| OLD | NEW |