void FontFaceSet::fireDoneEventIfPossible() { if (m_shouldFireLoadingEvent) return; if (!shouldSignalReady()) 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 (m_isLoading) { RefPtrWillBeRawPtr<FontFaceSetLoadEvent> doneEvent = nullptr; RefPtrWillBeRawPtr<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(); } m_isLoading = false; dispatchEvent(doneEvent); if (errorEvent) dispatchEvent(errorEvent); } if (m_ready->state() == ReadyProperty::Pending) m_ready->resolve(this); }
void FontFaceSet::didLayout() { if (document()->frame()->isMainFrame() && m_loadingFonts.isEmpty()) m_histogram.record(); if (!shouldSignalReady()) return; handlePendingEventsAndPromisesSoon(); }