Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(256)

Unified Diff: third_party/WebKit/Source/core/fetch/FontResource.cpp

Issue 2453813004: WebFonts cache-aware timeout adaptation (Closed)
Patch Set: rebase Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/fetch/FontResource.cpp
diff --git a/third_party/WebKit/Source/core/fetch/FontResource.cpp b/third_party/WebKit/Source/core/fetch/FontResource.cpp
index fd9bf9e757ba7a0cd2e0e7e211a000a6f26a5b9d..dee2a22b3e9d2e469c0e347fc2c872d31b25f055 100644
--- a/third_party/WebKit/Source/core/fetch/FontResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/FontResource.cpp
@@ -29,6 +29,7 @@
#include "core/fetch/FetchRequest.h"
#include "core/fetch/ResourceClientWalker.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/fetch/ResourceLoader.h"
#include "platform/Histogram.h"
#include "platform/SharedBuffer.h"
#include "platform/fonts/FontCustomPlatformData.h"
@@ -39,6 +40,8 @@ namespace blink {
// Durations of font-display periods.
// https://tabatkins.github.io/specs/css-font-display/#font-display-desc
+// TODO(shaochuan): Revisit short limit value once cache-aware font display is
+// launched. crbug.com/570205
static const double fontLoadWaitShortLimitSec = 0.1;
static const double fontLoadWaitLongLimitSec = 3.0;
@@ -95,6 +98,12 @@ FontResource::~FontResource() {}
void FontResource::didAddClient(ResourceClient* c) {
DCHECK(FontResourceClient::isExpectedType(c));
Resource::didAddClient(c);
+
+ // Block client callbacks if currently loading from cache.
+ if (isLoading() && loader()->isCacheAwareLoadingActivated())
+ return;
+
+ ProhibitAddRemoveClientInScope prohibitAddRemoveClient(this);
if (m_loadLimitState == ShortLimitExceeded ||
m_loadLimitState == LongLimitExceeded)
static_cast<FontResourceClient*>(c)->fontLoadShortLimitExceeded(this);
@@ -143,21 +152,53 @@ FontPlatformData FontResource::platformDataFromCustomData(
return m_fontData->fontPlatformData(size, bold, italic, orientation);
}
+void FontResource::willReloadAfterDiskCacheMiss() {
+ DCHECK(isLoading());
+ DCHECK(loader()->isCacheAwareLoadingActivated());
+
+ if (m_loadLimitState == ShortLimitExceeded ||
+ m_loadLimitState == LongLimitExceeded)
+ notifyClientsShortLimitExceeded();
+ if (m_loadLimitState == LongLimitExceeded)
+ notifyClientsLongLimitExceeded();
+
+ DEFINE_STATIC_LOCAL(
+ EnumerationHistogram, loadLimitHistogram,
+ ("WebFont.LoadLimitOnDiskCacheMiss", LoadLimitStateEnumMax));
+ loadLimitHistogram.count(m_loadLimitState);
+}
+
void FontResource::fontLoadShortLimitCallback(TimerBase*) {
- if (!isLoading())
- return;
+ DCHECK(isLoading());
DCHECK_EQ(m_loadLimitState, UnderLimit);
m_loadLimitState = ShortLimitExceeded;
- ResourceClientWalker<FontResourceClient> walker(clients());
- while (FontResourceClient* client = walker.next())
- client->fontLoadShortLimitExceeded(this);
+
+ // Block client callbacks if currently loading from cache.
+ if (loader()->isCacheAwareLoadingActivated())
+ return;
+ notifyClientsShortLimitExceeded();
}
void FontResource::fontLoadLongLimitCallback(TimerBase*) {
- if (!isLoading())
- return;
+ DCHECK(isLoading());
DCHECK_EQ(m_loadLimitState, ShortLimitExceeded);
m_loadLimitState = LongLimitExceeded;
+
+ // Block client callbacks if currently loading from cache.
+ if (loader()->isCacheAwareLoadingActivated())
+ return;
+ notifyClientsLongLimitExceeded();
+}
+
+void FontResource::notifyClientsShortLimitExceeded() {
+ ProhibitAddRemoveClientInScope prohibitAddRemoveClient(this);
+ ResourceClientWalker<FontResourceClient> walker(clients());
+ while (FontResourceClient* client = walker.next())
+ client->fontLoadShortLimitExceeded(this);
+}
+
+void FontResource::notifyClientsLongLimitExceeded() {
+ ProhibitAddRemoveClientInScope prohibitAddRemoveClient(this);
ResourceClientWalker<FontResourceClient> walker(clients());
while (FontResourceClient* client = walker.next())
client->fontLoadLongLimitExceeded(this);
« no previous file with comments | « third_party/WebKit/Source/core/fetch/FontResource.h ('k') | third_party/WebKit/Source/core/fetch/MockResourceClients.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698