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

Unified Diff: third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp

Issue 2717123003: RemoteFontFaceSource should keep FontCustomPlatformData over FontResource revalidation (Closed)
Patch Set: test description Created 3 years, 10 months 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/css/RemoteFontFaceSource.cpp
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
index cf7ce8b81954bb9086d4bd25f1c01b05d2c89095..1ab1a6e9a30fb18a3358e04bfb9334f0f504e4cb 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
@@ -14,6 +14,7 @@
#include "platform/Histogram.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "platform/fonts/FontCache.h"
+#include "platform/fonts/FontCustomPlatformData.h"
#include "platform/fonts/FontDescription.h"
#include "platform/fonts/SimpleFontData.h"
#include "platform/loader/fetch/ResourceFetcher.h"
@@ -79,8 +80,10 @@ RemoteFontFaceSource::RemoteFontFaceSource(FontResource* font,
RemoteFontFaceSource::~RemoteFontFaceSource() {}
void RemoteFontFaceSource::dispose() {
- m_font->removeClient(this);
- m_font = nullptr;
+ if (m_font) {
+ m_font->removeClient(this);
+ m_font = nullptr;
+ }
pruneTable();
}
@@ -97,18 +100,19 @@ void RemoteFontFaceSource::pruneTable() {
}
bool RemoteFontFaceSource::isLoading() const {
- return m_font->isLoading();
+ return m_font && m_font->isLoading();
}
bool RemoteFontFaceSource::isLoaded() const {
- return m_font->isLoaded();
+ return !m_font;
}
bool RemoteFontFaceSource::isValid() const {
- return !m_font->errorOccurred();
+ return m_font || m_customFontData;
}
-void RemoteFontFaceSource::notifyFinished(Resource*) {
+void RemoteFontFaceSource::notifyFinished(Resource* unusedResource) {
+ DCHECK_EQ(unusedResource, m_font);
m_histograms.maySetDataSource(m_font->response().wasCached()
? FontLoadHistograms::FromDiskCache
: FontLoadHistograms::FromNetwork);
@@ -117,7 +121,8 @@ void RemoteFontFaceSource::notifyFinished(Resource*) {
m_font->getStatus() == ResourceStatus::LoadError,
m_isInterventionTriggered);
- m_font->ensureCustomFontData();
+ m_customFontData = m_font->getCustomFontData();
+
// FIXME: Provide more useful message such as OTS rejection reason.
// See crbug.com/97467
if (m_font->getStatus() == ResourceStatus::DecodeError &&
@@ -131,6 +136,9 @@ void RemoteFontFaceSource::notifyFinished(Resource*) {
"OTS parsing error: " + m_font->otsParsingMessage()));
}
+ m_font->removeClient(this);
+ m_font = nullptr;
+
pruneTable();
if (m_face) {
m_fontSelector->fontFaceInvalidated();
@@ -139,7 +147,7 @@ void RemoteFontFaceSource::notifyFinished(Resource*) {
}
void RemoteFontFaceSource::fontLoadShortLimitExceeded(FontResource*) {
- if (m_font->isLoaded())
+ if (isLoaded())
return;
if (m_display == FontDisplayFallback)
@@ -149,7 +157,7 @@ void RemoteFontFaceSource::fontLoadShortLimitExceeded(FontResource*) {
}
void RemoteFontFaceSource::fontLoadLongLimitExceeded(FontResource*) {
- if (m_font->isLoaded())
+ if (isLoaded())
return;
if (m_display == FontDisplayBlock ||
@@ -171,7 +179,7 @@ void RemoteFontFaceSource::switchToSwapPeriod() {
m_face->didBecomeVisibleFallback(this);
}
- m_histograms.recordFallbackTime(m_font.get());
+ m_histograms.recordFallbackTime();
}
void RemoteFontFaceSource::switchToFailurePeriod() {
@@ -206,16 +214,16 @@ bool RemoteFontFaceSource::isLowPriorityLoadingAllowedForRemoteFont() const {
PassRefPtr<SimpleFontData> RemoteFontFaceSource::createFontData(
const FontDescription& fontDescription) {
+ if (m_period == FailurePeriod || !isValid())
+ return nullptr;
if (!isLoaded())
return createLoadingFallbackFontData(fontDescription);
+ DCHECK(m_customFontData);
- if (!m_font->ensureCustomFontData() || m_period == FailurePeriod)
- return nullptr;
-
- m_histograms.recordFallbackTime(m_font.get());
+ m_histograms.recordFallbackTime();
return SimpleFontData::create(
- m_font->platformDataFromCustomData(fontDescription.effectiveFontSize(),
+ m_customFontData->fontPlatformData(fontDescription.effectiveFontSize(),
fontDescription.isSyntheticBold(),
fontDescription.isSyntheticItalic(),
fontDescription.orientation(),
@@ -241,6 +249,10 @@ PassRefPtr<SimpleFontData> RemoteFontFaceSource::createLoadingFallbackFontData(
}
void RemoteFontFaceSource::beginLoadIfNeeded() {
+ if (isLoaded())
+ return;
+ DCHECK(m_font);
+
if (m_fontSelector->document() && m_font->stillNeedsLoad()) {
if (!m_font->url().protocolIsData() && !m_font->isLoaded() &&
m_display == FontDisplayAuto &&
@@ -297,8 +309,7 @@ void RemoteFontFaceSource::FontLoadHistograms::longLimitExceeded(
recordInterventionResult(isInterventionTriggered);
}
-void RemoteFontFaceSource::FontLoadHistograms::recordFallbackTime(
- const FontResource* font) {
+void RemoteFontFaceSource::FontLoadHistograms::recordFallbackTime() {
if (m_blankPaintTime <= 0)
return;
int duration = static_cast<int>(currentTimeMS() - m_blankPaintTime);

Powered by Google App Engine
This is Rietveld 408576698