Chromium Code Reviews| Index: third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp |
| diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp |
| index bd49325ebda38e603bd5f7ffd78f72c79f1429b2..4e6da51f5fdc3ea3bc8175b6ba467f1ba3c39a91 100644 |
| --- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp |
| +++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp |
| @@ -24,6 +24,35 @@ namespace blink { |
| namespace { |
| +// Should not change following enum order to be used for metrics values. |
| +enum CacheHitMetrics { |
| + Miss, |
| + DiskHit, |
| + DataUrl, |
| + MemoryHit, |
| + CacheHitEnumMax |
| +}; |
| + |
| +CacheHitMetrics getMetricsValue(RemoteFontFaceSource::DataSource dataSource) |
| +{ |
| + switch (dataSource) { |
| + case RemoteFontFaceSource::FromDataURL: |
| + return DataUrl; |
| + case RemoteFontFaceSource::FromMemoryCache: |
| + return MemoryHit; |
| + case RemoteFontFaceSource::FromDiskCache: |
| + return DiskHit; |
| + case RemoteFontFaceSource::FromNetwork: |
| + return Miss; |
| + case RemoteFontFaceSource::FromUnknown: |
| + // Still loading implies coming from network. |
|
Kunihiko Sakamoto
2016/09/06 18:04:53
Having this logic in this conversion function feel
Takashi Toyoshima
2016/09/07 08:49:08
Done.
|
| + return Miss; |
| + default: |
| + NOTREACHED(); |
| + } |
| + return Miss; |
| +} |
| + |
| bool isEffectiveConnectionTypeSlowFor(Document* document) |
| { |
| WebEffectiveConnectionType type = document->frame()->loader().client()->getEffectiveConnectionType(); |
| @@ -40,11 +69,11 @@ bool isConnectionTypeSlow() |
| return networkStateNotifier().connectionType() == WebConnectionTypeCellular2G; |
| } |
| -bool shouldTriggerWebFontsIntervention(Document* document, FontDisplay display, bool isLoadedFromMemoryCache, bool isLoadedFromDataURL) |
| +bool shouldTriggerWebFontsIntervention(Document* document, FontDisplay display, RemoteFontFaceSource::DataSource dataSource) |
|
Kunihiko Sakamoto
2016/09/06 18:04:53
Maybe make this a private member function of Remot
Takashi Toyoshima
2016/09/07 08:49:08
Hum... I'm neutral on this, but I'd rather conside
Kunihiko Sakamoto
2016/09/07 16:25:42
ok, sgtm.
|
| { |
| if (RuntimeEnabledFeatures::webFontsInterventionTriggerEnabled()) |
| return true; |
| - if (isLoadedFromMemoryCache || isLoadedFromDataURL) |
| + if (dataSource == RemoteFontFaceSource::FromMemoryCache || dataSource == RemoteFontFaceSource::FromDataURL) |
| return false; |
| bool isV2Enabled = RuntimeEnabledFeatures::webFontsInterventionV2With2GEnabled() || RuntimeEnabledFeatures::webFontsInterventionV2WithSlow2GEnabled(); |
| @@ -62,13 +91,12 @@ RemoteFontFaceSource::RemoteFontFaceSource(FontResource* font, CSSFontSelector* |
| , m_display(display) |
| , m_period(display == FontDisplaySwap ? SwapPeriod : BlockPeriod) |
| , m_isInterventionTriggered(false) |
| - , m_isLoadedFromMemoryCache(font->isLoaded()) |
| + , m_dataSource(font->url().protocolIsData() ? FromDataURL : font->isLoaded() ? FromMemoryCache : FromUnknown) |
| { |
| ThreadState::current()->registerPreFinalizer(this); |
| m_font->addClient(this); |
| - if (shouldTriggerWebFontsIntervention(m_fontSelector->document(), display, m_isLoadedFromMemoryCache, m_font->url().protocolIsData())) { |
| - |
| + if (shouldTriggerWebFontsIntervention(m_fontSelector->document(), display, m_dataSource)) { |
| m_isInterventionTriggered = true; |
| m_period = SwapPeriod; |
| m_fontSelector->document()->addConsoleMessage(ConsoleMessage::create(OtherMessageSource, InfoMessageLevel, "Slow network is detected. Fallback font will be used while loading: " + m_font->url().elidedString())); |
| @@ -116,8 +144,10 @@ bool RemoteFontFaceSource::isValid() const |
| void RemoteFontFaceSource::notifyFinished(Resource*) |
| { |
| - m_histograms.recordRemoteFont(m_font.get(), m_isLoadedFromMemoryCache); |
| - m_histograms.fontLoaded(m_isInterventionTriggered, !m_isLoadedFromMemoryCache && !m_font->url().protocolIsData() && !m_font->response().wasCached()); |
| + if (m_dataSource == FromUnknown) |
| + m_dataSource = m_font->response().wasCached() ? FromDiskCache : FromNetwork; |
| + m_histograms.recordRemoteFont(m_font.get(), m_dataSource); |
| + m_histograms.fontLoaded(m_isInterventionTriggered, m_dataSource); |
| m_font->ensureCustomFontData(); |
| // FIXME: Provide more useful message such as OTS rejection reason. |
| @@ -152,7 +182,7 @@ void RemoteFontFaceSource::fontLoadLongLimitExceeded(FontResource*) |
| else if (m_display == FontDisplayFallback) |
| switchToFailurePeriod(); |
| - m_histograms.longLimitExceeded(m_isInterventionTriggered); |
| + m_histograms.longLimitExceeded(m_isInterventionTriggered, m_dataSource); |
| } |
| void RemoteFontFaceSource::switchToSwapPeriod() |
| @@ -238,16 +268,16 @@ void RemoteFontFaceSource::FontLoadHistograms::fallbackFontPainted(DisplayPeriod |
| m_blankPaintTime = currentTimeMS(); |
| } |
| -void RemoteFontFaceSource::FontLoadHistograms::fontLoaded(bool isInterventionTriggered, bool isLoadedFromNetwork) |
| +void RemoteFontFaceSource::FontLoadHistograms::fontLoaded(bool isInterventionTriggered, DataSource dataSource) |
| { |
| if (!m_isLongLimitExceeded) |
| - recordInterventionResult(isInterventionTriggered, isLoadedFromNetwork); |
| + recordInterventionResult(isInterventionTriggered, dataSource); |
| } |
| -void RemoteFontFaceSource::FontLoadHistograms::longLimitExceeded(bool isInterventionTriggered) |
| +void RemoteFontFaceSource::FontLoadHistograms::longLimitExceeded(bool isInterventionTriggered, DataSource dataSource) |
| { |
| m_isLongLimitExceeded = true; |
| - recordInterventionResult(isInterventionTriggered, true); |
| + recordInterventionResult(isInterventionTriggered, dataSource); |
| } |
| void RemoteFontFaceSource::FontLoadHistograms::recordFallbackTime(const FontResource* font) |
| @@ -260,20 +290,17 @@ void RemoteFontFaceSource::FontLoadHistograms::recordFallbackTime(const FontReso |
| m_blankPaintTime = -1; |
| } |
| -void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResource* font, bool isLoadedFromMemoryCache) |
| +void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResource* font, DataSource dataSource) |
| { |
| if (m_loadStartTime > 0 && font && !font->isLoading()) { |
| - int duration = static_cast<int>(currentTimeMS() - m_loadStartTime); |
| - recordLoadTimeHistogram(font, duration); |
| - m_loadStartTime = -1; |
| - |
| enum { Miss, DiskHit, DataUrl, MemoryHit, CacheHitEnumMax }; |
| - int histogramValue = font->url().protocolIsData() ? DataUrl |
| - : isLoadedFromMemoryCache ? MemoryHit |
| - : font->response().wasCached() ? DiskHit |
| - : Miss; |
| + int cacheHitValue = getMetricsValue(dataSource); |
| DEFINE_STATIC_LOCAL(EnumerationHistogram, cacheHitHistogram, ("WebFont.CacheHit", CacheHitEnumMax)); |
| - cacheHitHistogram.count(histogramValue); |
| + cacheHitHistogram.count(cacheHitValue); |
|
Kunihiko Sakamoto
2016/09/06 18:04:53
Call getMetricsValue() here and remove cacheHitVal
Takashi Toyoshima
2016/09/07 08:49:09
Done.
|
| + |
| + int duration = static_cast<int>(currentTimeMS() - m_loadStartTime); |
| + recordLoadTimeHistogram(font, duration, dataSource); |
| + m_loadStartTime = -1; |
| enum { CORSFail, CORSSuccess, CORSEnumMax }; |
| int corsValue = font->isCORSFailed() ? CORSFail : CORSSuccess; |
| @@ -282,40 +309,58 @@ void RemoteFontFaceSource::FontLoadHistograms::recordRemoteFont(const FontResour |
| } |
| } |
| -void RemoteFontFaceSource::FontLoadHistograms::recordLoadTimeHistogram(const FontResource* font, int duration) |
| +void RemoteFontFaceSource::FontLoadHistograms::recordLoadTimeHistogram(const FontResource* font, int duration, DataSource dataSource) |
| { |
| if (font->errorOccurred()) { |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, loadErrorHistogram, ("WebFont.DownloadTime.LoadError", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheLoadErrorHistogram, ("WebFont.MissedCache.DownloadTime.LoadError", 0, 10000, 50)); |
|
Takashi Toyoshima
2016/09/07 08:49:08
Also, I'd say there is another requirement to have
Kunihiko Sakamoto
2016/09/07 16:25:42
Yeah I'm following the thread, and I agree we need
Takashi Toyoshima
2016/09/09 06:25:24
Good point.
|
| loadErrorHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheLoadErrorHistogram.count(duration); |
| return; |
| } |
| unsigned size = font->encodedSize(); |
| if (size < 10 * 1024) { |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, under10kHistogram, ("WebFont.DownloadTime.0.Under10KB", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheUnder10kHistogram, ("WebFont.MissedCache.DownloadTime.0.Under10KB", 0, 10000, 50)); |
| under10kHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheUnder10kHistogram.count(duration); |
| return; |
| } |
| if (size < 50 * 1024) { |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, under50kHistogram, ("WebFont.DownloadTime.1.10KBTo50KB", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheUnder50kHistogram, ("WebFont.MissedCache.DownloadTime.1.10KBTo50KB", 0, 10000, 50)); |
| under50kHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheUnder50kHistogram.count(duration); |
| return; |
| } |
| if (size < 100 * 1024) { |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, under100kHistogram, ("WebFont.DownloadTime.2.50KBTo100KB", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheUnder100kHistogram, ("WebFont.MissedCache.DownloadTime.2.50KBTo100KB", 0, 10000, 50)); |
| under100kHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheUnder100kHistogram.count(duration); |
| return; |
| } |
| if (size < 1024 * 1024) { |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, under1mbHistogram, ("WebFont.DownloadTime.3.100KBTo1MB", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheUnder1mbHistogram, ("WebFont.MissedCache.DownloadTime.3.100KBTo1MB", 0, 10000, 50)); |
| under1mbHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheUnder1mbHistogram.count(duration); |
| return; |
| } |
| DEFINE_STATIC_LOCAL(CustomCountHistogram, over1mbHistogram, ("WebFont.DownloadTime.4.Over1MB", 0, 10000, 50)); |
| + DEFINE_STATIC_LOCAL(CustomCountHistogram, missedCacheOver1mbHistogram, ("WebFont.MissedCache.DownloadTime.4.Over1MB", 0, 10000, 50)); |
| over1mbHistogram.count(duration); |
| + if (dataSource == FromNetwork) |
| + missedCacheOver1mbHistogram.count(duration); |
| } |
| -void RemoteFontFaceSource::FontLoadHistograms::recordInterventionResult(bool isTriggered, bool isLoadedFromNetwork) |
| +void RemoteFontFaceSource::FontLoadHistograms::recordInterventionResult(bool isTriggered, DataSource dataSource) |
| { |
| // interventionResult takes 0-3 values. |
| int interventionResult = 0; |
| @@ -328,7 +373,7 @@ void RemoteFontFaceSource::FontLoadHistograms::recordInterventionResult(bool isT |
| DEFINE_STATIC_LOCAL(EnumerationHistogram, interventionHistogram, ("WebFont.InterventionResult", boundary)); |
| DEFINE_STATIC_LOCAL(EnumerationHistogram, missedCacheInterventionHistogram, ("WebFont.InterventionResult.MissedCache", boundary)); |
| interventionHistogram.count(interventionResult); |
| - if (isLoadedFromNetwork) |
| + if (dataSource == FromNetwork || dataSource == FromUnknown) |
| missedCacheInterventionHistogram.count(interventionResult); |
| } |