Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(139)

Side by Side Diff: Source/core/css/FontFaceSet.cpp

Issue 26004002: Decouple ScriptPromise creation from ScriptPromiseResolver. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: rebase Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 met: 5 * modification, are permitted provided that the following conditions are met:
6 * 6 *
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 #include "core/frame/FrameView.h" 43 #include "core/frame/FrameView.h"
44 #include "core/platform/HistogramSupport.h" 44 #include "core/platform/HistogramSupport.h"
45 45
46 namespace WebCore { 46 namespace WebCore {
47 47
48 static const int defaultFontSize = 10; 48 static const int defaultFontSize = 10;
49 static const char* const defaultFontFamily = "sans-serif"; 49 static const char* const defaultFontFamily = "sans-serif";
50 50
51 class LoadFontPromiseResolver : public CSSSegmentedFontFace::LoadFontCallback { 51 class LoadFontPromiseResolver : public CSSSegmentedFontFace::LoadFontCallback {
52 public: 52 public:
53 static PassRefPtr<LoadFontPromiseResolver> create(const FontFamily& family, ExecutionContext* context) 53 static PassRefPtr<LoadFontPromiseResolver> create(const FontFamily& family, ScriptPromise promise, ExecutionContext* context)
54 { 54 {
55 int numFamilies = 0; 55 int numFamilies = 0;
56 for (const FontFamily* f = &family; f; f = f->next()) 56 for (const FontFamily* f = &family; f; f = f->next())
57 numFamilies++; 57 numFamilies++;
58 return adoptRef<LoadFontPromiseResolver>(new LoadFontPromiseResolver(num Families, context)); 58 return adoptRef<LoadFontPromiseResolver>(new LoadFontPromiseResolver(num Families, promise, context));
59 } 59 }
60 60
61 virtual void notifyLoaded(CSSSegmentedFontFace*) OVERRIDE; 61 virtual void notifyLoaded(CSSSegmentedFontFace*) OVERRIDE;
62 virtual void notifyError(CSSSegmentedFontFace*) OVERRIDE; 62 virtual void notifyError(CSSSegmentedFontFace*) OVERRIDE;
63 void loaded(Document*); 63 void loaded(Document*);
64 void error(Document*); 64 void error(Document*);
65 void resolve(); 65 void resolve();
66 66
67 ScriptPromise promise()
68 {
69 ScriptPromise promise = m_resolver->promise();
70 m_resolver->detachPromise();
71 return promise;
72 }
73
74 private: 67 private:
75 LoadFontPromiseResolver(int numLoading, ExecutionContext* context) 68 LoadFontPromiseResolver(int numLoading, ScriptPromise promise, ExecutionCont ext* context)
76 : m_numLoading(numLoading) 69 : m_numLoading(numLoading)
77 , m_errorOccured(false) 70 , m_errorOccured(false)
78 , m_scriptState(ScriptState::current()) 71 , m_scriptState(ScriptState::current())
79 , m_resolver(ScriptPromiseResolver::create(context)) 72 , m_resolver(ScriptPromiseResolver::create(promise, context))
80 { } 73 { }
81 74
82 int m_numLoading; 75 int m_numLoading;
83 bool m_errorOccured; 76 bool m_errorOccured;
84 ScriptState* m_scriptState; 77 ScriptState* m_scriptState;
85 RefPtr<ScriptPromiseResolver> m_resolver; 78 RefPtr<ScriptPromiseResolver> m_resolver;
86 }; 79 };
87 80
88 void LoadFontPromiseResolver::loaded(Document* document) 81 void LoadFontPromiseResolver::loaded(Document* document)
89 { 82 {
(...skipping 19 matching lines...) Expand all
109 { 102 {
110 error(face->fontSelector()->document()); 103 error(face->fontSelector()->document());
111 } 104 }
112 105
113 void LoadFontPromiseResolver::resolve() 106 void LoadFontPromiseResolver::resolve()
114 { 107 {
115 ScriptScope scope(m_scriptState); 108 ScriptScope scope(m_scriptState);
116 if (m_errorOccured) 109 if (m_errorOccured)
117 m_resolver->reject(ScriptValue::createNull()); 110 m_resolver->reject(ScriptValue::createNull());
118 else 111 else
119 m_resolver->fulfill(ScriptValue::createNull()); 112 m_resolver->resolve(ScriptValue::createNull());
120 } 113 }
121 114
122 class FontsReadyPromiseResolver { 115 class FontsReadyPromiseResolver {
123 public: 116 public:
124 static PassOwnPtr<FontsReadyPromiseResolver> create(ExecutionContext* contex t) 117 static PassOwnPtr<FontsReadyPromiseResolver> create(ScriptPromise promise, E xecutionContext* context)
125 { 118 {
126 return adoptPtr(new FontsReadyPromiseResolver(context)); 119 return adoptPtr(new FontsReadyPromiseResolver(promise, context));
127 } 120 }
128 121
129 void call(PassRefPtr<FontFaceSet> fontFaceSet) 122 void call(PassRefPtr<FontFaceSet> fontFaceSet)
130 { 123 {
131 ScriptScope scope(m_scriptState); 124 ScriptScope scope(m_scriptState);
132 m_resolver->fulfill(fontFaceSet); 125 m_resolver->resolve(fontFaceSet);
133 }
134
135 ScriptPromise promise()
136 {
137 ScriptPromise promise = m_resolver->promise();
138 m_resolver->detachPromise();
139 return promise;
140 } 126 }
141 127
142 private: 128 private:
143 FontsReadyPromiseResolver(ExecutionContext* context) 129 FontsReadyPromiseResolver(ScriptPromise promise, ExecutionContext* context)
144 : m_scriptState(ScriptState::current()) 130 : m_scriptState(ScriptState::current())
145 , m_resolver(ScriptPromiseResolver::create(context)) 131 , m_resolver(ScriptPromiseResolver::create(promise, context))
146 { } 132 { }
147 ScriptState* m_scriptState; 133 ScriptState* m_scriptState;
148 RefPtr<ScriptPromiseResolver> m_resolver; 134 RefPtr<ScriptPromiseResolver> m_resolver;
149 }; 135 };
150 136
151 FontFaceSet::FontFaceSet(Document* document) 137 FontFaceSet::FontFaceSet(Document* document)
152 : ActiveDOMObject(document) 138 : ActiveDOMObject(document)
153 , m_loadingCount(0) 139 , m_loadingCount(0)
154 , m_shouldFireDoneEvent(false) 140 , m_shouldFireDoneEvent(false)
155 , m_timer(this, &FontFaceSet::timerFired) 141 , m_timer(this, &FontFaceSet::timerFired)
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
274 if (!m_loadingCount) { 260 if (!m_loadingCount) {
275 ASSERT(!m_shouldFireDoneEvent); 261 ASSERT(!m_shouldFireDoneEvent);
276 m_shouldFireDoneEvent = true; 262 m_shouldFireDoneEvent = true;
277 if (!m_timer.isActive()) 263 if (!m_timer.isActive())
278 m_timer.startOneShot(0); 264 m_timer.startOneShot(0);
279 } 265 }
280 } 266 }
281 267
282 ScriptPromise FontFaceSet::ready() 268 ScriptPromise FontFaceSet::ready()
283 { 269 {
284 OwnPtr<FontsReadyPromiseResolver> resolver = FontsReadyPromiseResolver::crea te(executionContext()); 270 ScriptPromise promise = ScriptPromise::createPending(executionContext());
285 ScriptPromise promise = resolver->promise(); 271 OwnPtr<FontsReadyPromiseResolver> resolver = FontsReadyPromiseResolver::crea te(promise, executionContext());
286 m_readyResolvers.append(resolver.release()); 272 m_readyResolvers.append(resolver.release());
287 if (!m_timer.isActive()) 273 if (!m_timer.isActive())
288 m_timer.startOneShot(0); 274 m_timer.startOneShot(0);
289 return promise; 275 return promise;
290 } 276 }
291 277
292 void FontFaceSet::fireDoneEventIfPossible() 278 void FontFaceSet::fireDoneEventIfPossible()
293 { 279 {
294 if (!m_pendingEvents.isEmpty() || !m_pendingLoadResolvers.isEmpty()) 280 if (!m_pendingEvents.isEmpty() || !m_pendingLoadResolvers.isEmpty())
295 return; 281 return;
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 338
353 ScriptPromise FontFaceSet::load(const String& fontString, const String& text, Ex ceptionState& es) 339 ScriptPromise FontFaceSet::load(const String& fontString, const String& text, Ex ceptionState& es)
354 { 340 {
355 Font font; 341 Font font;
356 if (!resolveFontStyle(fontString, font)) { 342 if (!resolveFontStyle(fontString, font)) {
357 es.throwUninformativeAndGenericDOMException(SyntaxError); 343 es.throwUninformativeAndGenericDOMException(SyntaxError);
358 return ScriptPromise(); 344 return ScriptPromise();
359 } 345 }
360 346
361 Document* d = document(); 347 Document* d = document();
362 RefPtr<LoadFontPromiseResolver> resolver = LoadFontPromiseResolver::create(f ont.family(), executionContext()); 348 ScriptPromise promise = ScriptPromise::createPending(executionContext());
349 RefPtr<LoadFontPromiseResolver> resolver = LoadFontPromiseResolver::create(f ont.family(), promise, executionContext());
363 for (const FontFamily* f = &font.family(); f; f = f->next()) { 350 for (const FontFamily* f = &font.family(); f; f = f->next()) {
364 CSSSegmentedFontFace* face = d->styleResolver()->fontSelector()->getFont Face(font.fontDescription(), f->family()); 351 CSSSegmentedFontFace* face = d->styleResolver()->fontSelector()->getFont Face(font.fontDescription(), f->family());
365 if (!face) { 352 if (!face) {
366 resolver->error(d); 353 resolver->error(d);
367 continue; 354 continue;
368 } 355 }
369 face->loadFont(font.fontDescription(), nullToSpace(text), resolver); 356 face->loadFont(font.fontDescription(), nullToSpace(text), resolver);
370 } 357 }
371 return resolver->promise(); 358 return promise;
372 } 359 }
373 360
374 bool FontFaceSet::check(const String& fontString, const String& text, ExceptionS tate& es) 361 bool FontFaceSet::check(const String& fontString, const String& text, ExceptionS tate& es)
375 { 362 {
376 Font font; 363 Font font;
377 if (!resolveFontStyle(fontString, font)) { 364 if (!resolveFontStyle(fontString, font)) {
378 es.throwUninformativeAndGenericDOMException(SyntaxError); 365 es.throwUninformativeAndGenericDOMException(SyntaxError);
379 return false; 366 return false;
380 } 367 }
381 368
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 422
436 void FontFaceSet::FontLoadHistogram::record() 423 void FontFaceSet::FontLoadHistogram::record()
437 { 424 {
438 if (m_recorded) 425 if (m_recorded)
439 return; 426 return;
440 m_recorded = true; 427 m_recorded = true;
441 HistogramSupport::histogramCustomCounts("WebFont.WebFontsInPage", m_count, 1 , 100, 50); 428 HistogramSupport::histogramCustomCounts("WebFont.WebFontsInPage", m_count, 1 , 100, 50);
442 } 429 }
443 430
444 } // namespace WebCore 431 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698