diff options
Diffstat (limited to 'chromium/third_party/blink/renderer/core/loader/font_preload_manager.h')
-rw-r--r-- | chromium/third_party/blink/renderer/core/loader/font_preload_manager.h | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/chromium/third_party/blink/renderer/core/loader/font_preload_manager.h b/chromium/third_party/blink/renderer/core/loader/font_preload_manager.h new file mode 100644 index 00000000000..a7e4871c94e --- /dev/null +++ b/chromium/third_party/blink/renderer/core/loader/font_preload_manager.h @@ -0,0 +1,89 @@ +// Copyright 2020 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FONT_PRELOAD_MANAGER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FONT_PRELOAD_MANAGER_H_ + +#include "third_party/blink/renderer/core/core_export.h" +#include "third_party/blink/renderer/platform/heap/handle.h" +#include "third_party/blink/renderer/platform/timer.h" + +namespace blink { + +class Document; +class FontResource; +class FontFace; +class ResourceFinishObserver; + +// This class monitors font preloading (via <link rel="preload"> or Font Loading +// API) and notifies the relevant document, so that it can manage the first +// rendering timing to work with preloaded fonts. +// Design doc: https://bit.ly/36E8UKB +class CORE_EXPORT FontPreloadManager final { + DISALLOW_NEW(); + + public: + explicit FontPreloadManager(Document&); + ~FontPreloadManager() = default; + + FontPreloadManager(const FontPreloadManager&) = delete; + FontPreloadManager& operator=(const FontPreloadManager&) = delete; + + bool HasPendingRenderBlockingFonts() const; + void WillBeginRendering(); + bool RenderingHasBegun() const { return state_ == State::kUnblocked; } + + void FontPreloadingStarted(FontResource*); + void FontPreloadingFinished(FontResource*, ResourceFinishObserver*); + void FontPreloadingDelaysRenderingTimerFired(TimerBase*); + + void ImperativeFontLoadingStarted(FontFace*); + void ImperativeFontLoadingFinished(); + + // Exposed to web tests via internals. + void SetRenderDelayTimeoutForTest(base::TimeDelta timeout); + + void Trace(Visitor* visitor); + + private: + friend class FontPreloadManagerTest; + + void DisableTimeoutForTest(); + + // State of font preloading before lifecycle updates begin + enum class State { + // Rendering hasn't begun. No font preloading yet. + kInitial, + // Rendering hasn't begun. There are ongoing font preloadings. + kLoading, + // Rendering hasn't begun. At least one font has been preloaded, + // and all font preloading so far has finished. + kLoaded, + // Rendering will begin soon or has begun. Font preloading shouldn't block + // rendering any more. + kUnblocked + }; + + void RenderBlockingFontLoadingStarted(); + void RenderBlockingFontLoadingFinished(); + + Member<Document> document_; + + // Need to hold strong references here, otherwise they'll be GC-ed immediately + // as Resource only holds weak references. + HeapHashSet<Member<ResourceFinishObserver>> finish_observers_; + + unsigned imperative_font_loading_count_ = 0; + + TaskRunnerTimer<FontPreloadManager> render_delay_timer_; + base::TimeDelta render_delay_timeout_; + + State state_ = State::kInitial; + + // TODO(xiaochengh): Do the same for fonts loaded for other reasons? +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LOADER_FONT_PRELOAD_MANAGER_H_ |