summaryrefslogtreecommitdiff
path: root/chromium/third_party/blink/renderer/core/css/font_face_set_document.h
blob: f00f129a01670aa47cf0127765e2dd6b1dbdaa93 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/*
 * Copyright (C) 2013 Google Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 */

#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_CSS_FONT_FACE_SET_DOCUMENT_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_CSS_FONT_FACE_SET_DOCUMENT_H_

#include "third_party/blink/renderer/bindings/core/v8/iterable.h"
#include "third_party/blink/renderer/bindings/core/v8/script_promise.h"
#include "third_party/blink/renderer/core/css/css_font_selector.h"
#include "third_party/blink/renderer/core/css/font_face.h"
#include "third_party/blink/renderer/core/css/font_face_set.h"
#include "third_party/blink/renderer/core/css/style_engine.h"
#include "third_party/blink/renderer/core/dom/document.h"
#include "third_party/blink/renderer/core/dom/events/event_listener.h"
#include "third_party/blink/renderer/core/dom/events/event_target.h"
#include "third_party/blink/renderer/platform/heap/handle.h"
#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h"

namespace blink {

class Font;

class CORE_EXPORT FontFaceSetDocument final : public FontFaceSet,
                                              public Supplement<Document> {
 public:
  static const char kSupplementName[];

  explicit FontFaceSetDocument(Document&);
  FontFaceSetDocument(const FontFaceSetDocument&) = delete;
  FontFaceSetDocument& operator=(const FontFaceSetDocument&) = delete;
  ~FontFaceSetDocument() override;

  ScriptPromise ready(ScriptState*) override;

  AtomicString status() const override;

  void DidLayout();
  void BeginFontLoading(FontFace*);

  // FontFace::LoadFontCallback
  void NotifyLoaded(FontFace*) override;
  void NotifyError(FontFace*) override;

  // After flipping the flag to true, all 'font-display: auto' fonts that
  // haven't finished loading will enter the failure period immediately (except
  // for those already in the memory cache), so that they don't cause a bad
  // Largest Contentful Paint (https://wicg.github.io/largest-contentful-paint/)
  bool HasReachedLCPLimit() const { return has_reached_lcp_limit_; }
  void LCPLimitReached(TimerBase*);

  size_t ApproximateBlankCharacterCount() const;

  static FontFaceSetDocument* From(Document&);
  static void DidLayout(Document&);
  static size_t ApproximateBlankCharacterCount(Document&);

  void Trace(Visitor*) const override;

 protected:
  bool InActiveContext() const override;
  FontSelector* GetFontSelector() const override {
    DCHECK(IsMainThread());
    return GetDocument()->GetStyleEngine().GetFontSelector();
  }

  bool ResolveFontStyle(const String&, Font&) override;

 private:
  Document* GetDocument() const;

  void FireDoneEventIfPossible() override;
  const HeapLinkedHashSet<Member<FontFace>>& CSSConnectedFontFaceList()
      const override;

  void StartLCPLimitTimerIfNeeded();
  void AlignTimeoutWithLCPGoal(FontFace* font_face);

  class FontLoadHistogram {
    DISALLOW_NEW();

   public:
    enum Status { kNoWebFonts, kHadBlankText, kDidNotHaveBlankText, kReported };
    FontLoadHistogram() : status_(kNoWebFonts) {}
    void UpdateStatus(FontFace*);
    void Record();

   private:
    Status status_;
  };
  FontLoadHistogram font_load_histogram_;

  class FontDisplayAutoAlignHistogram {
    DISALLOW_NEW();

   public:
    void SetHasFontDisplayAuto() { has_font_display_auto_ = true; }
    void CountAffected() { ++affected_count_; }

    void Record();

   private:
    unsigned affected_count_ = 0;
    bool has_font_display_auto_ = false;
    bool reported_ = false;
  };
  FontDisplayAutoAlignHistogram font_display_auto_align_histogram_;

  HeapTaskRunnerTimer<FontFaceSetDocument> lcp_limit_timer_;

  bool has_reached_lcp_limit_ = false;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_CSS_FONT_FACE_SET_DOCUMENT_H_