void FontFaceSet::fireDoneEventIfPossible() { if (m_shouldFireLoadingEvent) return; if (!m_loadingFonts.isEmpty() || !hasLoadedFonts()) return; // If the layout was invalidated in between when we thought layout // was updated and when we're ready to fire the event, just wait // until after the next layout before firing events. Document* d = document(); if (!d->view() || d->view()->needsLayout()) return; if (hasLoadedFonts()) { RefPtr<FontFaceSetLoadEvent> doneEvent = nullptr; RefPtr<FontFaceSetLoadEvent> errorEvent = nullptr; doneEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingdone, m_loadedFonts); m_loadedFonts.clear(); if (!m_failedFonts.isEmpty()) { errorEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingerror, m_failedFonts); m_failedFonts.clear(); } dispatchEvent(doneEvent); if (errorEvent) dispatchEvent(errorEvent); } }
void FontFaceSet::fireDoneEventIfPossible() { if (m_shouldFireLoadingEvent) return; if (!m_loadingFonts.isEmpty() || (!hasLoadedFonts() && m_readyResolvers.isEmpty())) return; // If the layout was invalidated in between when we thought layout // was updated and when we're ready to fire the event, just wait // until after the next layout before firing events. Document* d = document(); if (!d->view() || d->view()->needsLayout()) return; if (hasLoadedFonts()) { RefPtr<FontFaceSetLoadEvent> doneEvent = nullptr; RefPtr<FontFaceSetLoadEvent> errorEvent = nullptr; doneEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingdone, m_loadedFonts); m_loadedFonts.clear(); if (!m_failedFonts.isEmpty()) { errorEvent = FontFaceSetLoadEvent::createForFontFaces(EventTypeNames::loadingerror, m_failedFonts); m_failedFonts.clear(); } dispatchEvent(doneEvent); if (errorEvent) dispatchEvent(errorEvent); } if (!m_readyResolvers.isEmpty()) { Vector<OwnPtr<FontsReadyPromiseResolver> > resolvers; m_readyResolvers.swap(resolvers); for (size_t index = 0; index < resolvers.size(); ++index) resolvers[index]->resolve(this); } }
void FontFaceSet::addToLoadingFonts(PassRefPtr<FontFace> fontFace) { if (m_loadingFonts.isEmpty() && !hasLoadedFonts()) { m_shouldFireLoadingEvent = true; handlePendingEventsAndPromisesSoon(); } m_loadingFonts.add(fontFace); }
void FontFaceSet::didLayout() { if (m_loadingFonts.isEmpty()) m_histogram.record(); if (!m_loadingFonts.isEmpty() || !hasLoadedFonts()) return; handlePendingEventsAndPromisesSoon(); }
AtomicString FontFaceSet::status() const { DEFINE_STATIC_LOCAL(AtomicString, loading, ("loading", AtomicString::ConstructFromLiteral)); DEFINE_STATIC_LOCAL(AtomicString, loaded, ("loaded", AtomicString::ConstructFromLiteral)); return (!m_loadingFonts.isEmpty() || hasLoadedFonts()) ? loading : loaded; }