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
|
// Copyright 2014 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 RemoteFontFaceSource_h
#define RemoteFontFaceSource_h
#include "core/css/CSSFontFaceSource.h"
#include "core/loader/resource/FontResource.h"
#include "wtf/Allocator.h"
namespace blink {
class CSSFontSelector;
enum FontDisplay {
FontDisplayAuto,
FontDisplayBlock,
FontDisplaySwap,
FontDisplayFallback,
FontDisplayOptional,
FontDisplayEnumMax
};
class RemoteFontFaceSource final : public CSSFontFaceSource,
public FontResourceClient {
USING_PRE_FINALIZER(RemoteFontFaceSource, dispose);
USING_GARBAGE_COLLECTED_MIXIN(RemoteFontFaceSource);
public:
enum DisplayPeriod { BlockPeriod, SwapPeriod, FailurePeriod };
explicit RemoteFontFaceSource(FontResource*, CSSFontSelector*, FontDisplay);
~RemoteFontFaceSource() override;
void dispose();
bool isLoading() const override;
bool isLoaded() const override;
bool isValid() const override;
DisplayPeriod getDisplayPeriod() const { return m_period; }
void beginLoadIfNeeded() override;
void notifyFinished(Resource*) override;
void fontLoadShortLimitExceeded(FontResource*) override;
void fontLoadLongLimitExceeded(FontResource*) override;
String debugName() const override { return "RemoteFontFaceSource"; }
bool isBlank() override { return m_period == BlockPeriod; }
// For UMA reporting
bool hadBlankText() override { return m_histograms.hadBlankText(); }
void paintRequested() { m_histograms.fallbackFontPainted(m_period); }
DECLARE_VIRTUAL_TRACE();
protected:
PassRefPtr<SimpleFontData> createFontData(const FontDescription&) override;
PassRefPtr<SimpleFontData> createLoadingFallbackFontData(
const FontDescription&);
void pruneTable();
private:
class FontLoadHistograms {
DISALLOW_NEW();
public:
// Should not change following order in CacheHitMetrics to be used for
// metrics values.
enum CacheHitMetrics { Miss, DiskHit, DataUrl, MemoryHit, CacheHitEnumMax };
enum DataSource {
FromUnknown,
FromDataURL,
FromMemoryCache,
FromDiskCache,
FromNetwork
};
FontLoadHistograms(DataSource dataSource, FontDisplay fontDisplay)
: m_loadStartTime(0),
m_blankPaintTime(0),
m_isLongLimitExceeded(false),
m_dataSource(dataSource),
m_fontDisplay(fontDisplay) {}
void loadStarted();
void fallbackFontPainted(DisplayPeriod);
void fontLoaded(bool isCorsFailed,
bool loadError,
bool isInterventionTriggered);
void longLimitExceeded(bool isInterventionTriggered);
void recordFallbackTime(const FontResource*);
void recordRemoteFont(const FontResource*, bool isInterventionTriggered);
bool hadBlankText() { return m_blankPaintTime; }
DataSource dataSource() { return m_dataSource; }
void maySetDataSource(DataSource);
private:
void recordLoadTimeHistogram(const FontResource*,
int duration,
bool isInterventionTriggered);
void recordInterventionResult(bool isTriggered);
CacheHitMetrics dataSourceMetricsValue();
double m_loadStartTime;
double m_blankPaintTime;
bool m_isLongLimitExceeded;
DataSource m_dataSource;
FontDisplay m_fontDisplay;
};
void switchToSwapPeriod();
void switchToFailurePeriod();
bool shouldTriggerWebFontsIntervention();
bool isLowPriorityLoadingAllowedForRemoteFont() const override;
Member<FontResource> m_font;
Member<CSSFontSelector> m_fontSelector;
const FontDisplay m_display;
DisplayPeriod m_period;
FontLoadHistograms m_histograms;
bool m_isInterventionTriggered;
};
} // namespace blink
#endif
|