Index: Source/core/css/FontFaceSet.cpp |
diff --git a/Source/core/css/FontFaceSet.cpp b/Source/core/css/FontFaceSet.cpp |
index bfa0f0832926be55a0225122ee0a398a23af0284..38a4e99c6ad477867ec6cd2dc018220477803477 100644 |
--- a/Source/core/css/FontFaceSet.cpp |
+++ b/Source/core/css/FontFaceSet.cpp |
@@ -114,38 +114,11 @@ DEFINE_TRACE(LoadFontPromiseResolver) |
LoadFontCallback::trace(visitor); |
} |
-class FontsReadyPromiseResolver final : public GarbageCollected<FontsReadyPromiseResolver> { |
-public: |
- static FontsReadyPromiseResolver* create(ScriptState* scriptState) |
- { |
- return new FontsReadyPromiseResolver(scriptState); |
- } |
- |
- void resolve(PassRefPtrWillBeRawPtr<FontFaceSet> fontFaceSet) |
- { |
- m_resolver->resolve(fontFaceSet); |
- } |
- |
- ScriptPromise promise() { return m_resolver->promise(); } |
- |
- DEFINE_INLINE_TRACE() |
- { |
- visitor->trace(m_resolver); |
- } |
- |
-private: |
- explicit FontsReadyPromiseResolver(ScriptState* scriptState) |
- : m_resolver(ScriptPromiseResolver::create(scriptState)) |
- { |
- } |
- |
- Member<ScriptPromiseResolver> m_resolver; |
-}; |
- |
FontFaceSet::FontFaceSet(Document& document) |
: ActiveDOMObject(&document) |
, m_shouldFireLoadingEvent(false) |
, m_isLoading(false) |
+ , m_ready(new ReadyProperty(executionContext(), this, ReadyProperty::Ready)) |
, m_asyncRunner(this, &FontFaceSet::handlePendingEventsAndPromises) |
{ |
suspendIfNeeded(); |
@@ -199,11 +172,18 @@ void FontFaceSet::didLayout() |
{ |
if (document()->frame()->isMainFrame() && m_loadingFonts.isEmpty()) |
m_histogram.record(); |
- if (!m_loadingFonts.isEmpty() || (!m_isLoading && m_readyResolvers.isEmpty())) |
+ if (!shouldSignalReady()) |
return; |
handlePendingEventsAndPromisesSoon(); |
} |
+bool FontFaceSet::shouldSignalReady() const |
+{ |
+ if (!m_loadingFonts.isEmpty()) |
+ return false; |
+ return m_isLoading || m_ready->state() == ReadyProperty::Pending; |
+} |
+ |
void FontFaceSet::handlePendingEventsAndPromises() |
{ |
fireLoadingEvent(); |
@@ -258,6 +238,8 @@ void FontFaceSet::addToLoadingFonts(PassRefPtrWillBeRawPtr<FontFace> fontFace) |
if (!m_isLoading) { |
m_isLoading = true; |
m_shouldFireLoadingEvent = true; |
+ if (m_ready->state() != ReadyProperty::Pending) |
+ m_ready->reset(); |
handlePendingEventsAndPromisesSoon(); |
} |
m_loadingFonts.add(fontFace); |
@@ -272,13 +254,7 @@ void FontFaceSet::removeFromLoadingFonts(PassRefPtrWillBeRawPtr<FontFace> fontFa |
ScriptPromise FontFaceSet::ready(ScriptState* scriptState) |
{ |
- if (!inActiveDocumentContext()) |
- return ScriptPromise(); |
- FontsReadyPromiseResolver* resolver = FontsReadyPromiseResolver::create(scriptState); |
- ScriptPromise promise = resolver->promise(); |
- m_readyResolvers.append(resolver); |
- handlePendingEventsAndPromisesSoon(); |
- return promise; |
+ return m_ready->promise(scriptState->world()); |
} |
void FontFaceSet::add(FontFace* fontFace, ExceptionState& exceptionState) |
@@ -406,7 +382,7 @@ void FontFaceSet::fireDoneEventIfPossible() |
{ |
if (m_shouldFireLoadingEvent) |
return; |
- if (!m_loadingFonts.isEmpty() || (!m_isLoading && m_readyResolvers.isEmpty())) |
+ if (!shouldSignalReady()) |
return; |
// If the layout was invalidated in between when we thought layout |
@@ -431,12 +407,8 @@ void FontFaceSet::fireDoneEventIfPossible() |
dispatchEvent(errorEvent); |
} |
- if (!m_readyResolvers.isEmpty()) { |
- HeapVector<Member<FontsReadyPromiseResolver>> resolvers; |
- m_readyResolvers.swap(resolvers); |
- for (size_t index = 0; index < resolvers.size(); ++index) |
- resolvers[index]->resolve(this); |
- } |
+ if (m_ready->state() == ReadyProperty::Pending) |
+ m_ready->resolve(this); |
} |
ScriptPromise FontFaceSet::load(ScriptState* scriptState, const String& fontString, const String& text) |
@@ -582,8 +554,8 @@ void FontFaceSet::didLayout(Document& document) |
DEFINE_TRACE(FontFaceSet) |
{ |
#if ENABLE(OILPAN) |
+ visitor->trace(m_ready); |
visitor->trace(m_loadingFonts); |
- visitor->trace(m_readyResolvers); |
visitor->trace(m_loadedFonts); |
visitor->trace(m_failedFonts); |
visitor->trace(m_nonCSSConnectedFaces); |