| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "config.h" | 5 #include "config.h" |
| 6 #include "core/css/RemoteFontFaceSource.h" | 6 #include "core/css/RemoteFontFaceSource.h" |
| 7 | 7 |
| 8 #include "core/css/CSSCustomFontData.h" | 8 #include "core/css/CSSCustomFontData.h" |
| 9 #include "core/css/CSSFontFace.h" | 9 #include "core/css/CSSFontFace.h" |
| 10 #include "core/css/FontLoader.h" | 10 #include "core/css/FontLoader.h" |
| 11 #include "platform/fonts/FontCache.h" | 11 #include "platform/fonts/FontCache.h" |
| 12 #include "platform/fonts/FontDescription.h" | 12 #include "platform/fonts/FontDescription.h" |
| 13 #include "platform/fonts/SimpleFontData.h" | 13 #include "platform/fonts/SimpleFontData.h" |
| 14 #include "public/platform/Platform.h" | 14 #include "public/platform/Platform.h" |
| 15 #include "wtf/CurrentTime.h" | 15 #include "wtf/CurrentTime.h" |
| 16 | 16 |
| 17 namespace blink { | 17 namespace blink { |
| 18 | 18 |
| 19 RemoteFontFaceSource::RemoteFontFaceSource(FontResource* font, PassRefPtrWillBeR
awPtr<FontLoader> fontLoader) | 19 RemoteFontFaceSource::RemoteFontFaceSource(FontResource* font, PassRefPtrWillBeR
awPtr<FontLoader> fontLoader, FontDisplay display) |
| 20 : m_font(font) | 20 : m_font(font) |
| 21 , m_fontLoader(fontLoader) | 21 , m_fontLoader(fontLoader) |
| 22 , m_display(display) |
| 23 , m_period(display == FontDisplaySwap ? SwapPeriod : BlockPeriod) |
| 22 { | 24 { |
| 23 m_font->addClient(this); | 25 m_font->addClient(this); |
| 24 } | 26 } |
| 25 | 27 |
| 26 RemoteFontFaceSource::~RemoteFontFaceSource() | 28 RemoteFontFaceSource::~RemoteFontFaceSource() |
| 27 { | 29 { |
| 28 m_font->removeClient(this); | 30 m_font->removeClient(this); |
| 29 pruneTable(); | 31 pruneTable(); |
| 30 } | 32 } |
| 31 | 33 |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 73 if (m_font->status() == Resource::DecodeError) | 75 if (m_font->status() == Resource::DecodeError) |
| 74 m_fontLoader->didFailToDecode(m_font.get()); | 76 m_fontLoader->didFailToDecode(m_font.get()); |
| 75 | 77 |
| 76 pruneTable(); | 78 pruneTable(); |
| 77 if (m_face) { | 79 if (m_face) { |
| 78 m_fontLoader->fontFaceInvalidated(); | 80 m_fontLoader->fontFaceInvalidated(); |
| 79 m_face->fontLoaded(this); | 81 m_face->fontLoaded(this); |
| 80 } | 82 } |
| 81 } | 83 } |
| 82 | 84 |
| 83 void RemoteFontFaceSource::fontLoadWaitLimitExceeded(FontResource*) | 85 void RemoteFontFaceSource::fontLoadShortLimitExceeded(FontResource*) |
| 84 { | 86 { |
| 87 if (m_display == FontDisplayFallback) |
| 88 switchToSwapPeriod(); |
| 89 else if (m_display == FontDisplayOptional) |
| 90 switchToFailurePeriod(); |
| 91 } |
| 92 |
| 93 void RemoteFontFaceSource::fontLoadLongLimitExceeded(FontResource*) |
| 94 { |
| 95 if (m_display == FontDisplayAuto || m_display == FontDisplayBlock) |
| 96 switchToSwapPeriod(); |
| 97 else if (m_display == FontDisplayFallback) |
| 98 switchToFailurePeriod(); |
| 99 } |
| 100 |
| 101 void RemoteFontFaceSource::switchToSwapPeriod() |
| 102 { |
| 103 ASSERT(m_period == BlockPeriod); |
| 104 m_period = SwapPeriod; |
| 105 |
| 85 pruneTable(); | 106 pruneTable(); |
| 86 if (m_face) { | 107 if (m_face) { |
| 87 m_fontLoader->fontFaceInvalidated(); | 108 m_fontLoader->fontFaceInvalidated(); |
| 88 m_face->fontLoadWaitLimitExceeded(this); | 109 m_face->didBecomeVisibleFallback(this); |
| 89 } | 110 } |
| 90 | 111 |
| 91 m_histograms.recordFallbackTime(m_font.get()); | 112 m_histograms.recordFallbackTime(m_font.get()); |
| 92 } | 113 } |
| 93 | 114 |
| 115 void RemoteFontFaceSource::switchToFailurePeriod() |
| 116 { |
| 117 if (m_period == BlockPeriod) |
| 118 switchToSwapPeriod(); |
| 119 ASSERT(m_period == SwapPeriod); |
| 120 m_period = FailurePeriod; |
| 121 } |
| 122 |
| 94 PassRefPtr<SimpleFontData> RemoteFontFaceSource::createFontData(const FontDescri
ption& fontDescription) | 123 PassRefPtr<SimpleFontData> RemoteFontFaceSource::createFontData(const FontDescri
ption& fontDescription) |
| 95 { | 124 { |
| 96 if (!isLoaded()) | 125 if (!isLoaded()) |
| 97 return createLoadingFallbackFontData(fontDescription); | 126 return createLoadingFallbackFontData(fontDescription); |
| 98 | 127 |
| 99 // Create new FontPlatformData from our CGFontRef, point size and ATSFontRef
. | 128 if (!m_font->ensureCustomFontData() || m_period == FailurePeriod) |
| 100 if (!m_font->ensureCustomFontData()) | |
| 101 return nullptr; | 129 return nullptr; |
| 102 | 130 |
| 103 m_histograms.recordFallbackTime(m_font.get()); | 131 m_histograms.recordFallbackTime(m_font.get()); |
| 104 | 132 |
| 105 return SimpleFontData::create( | 133 return SimpleFontData::create( |
| 106 m_font->platformDataFromCustomData(fontDescription.effectiveFontSize(), | 134 m_font->platformDataFromCustomData(fontDescription.effectiveFontSize(), |
| 107 fontDescription.isSyntheticBold(), fontDescription.isSyntheticItalic
(), | 135 fontDescription.isSyntheticBold(), fontDescription.isSyntheticItalic
(), |
| 108 fontDescription.orientation()), CustomFontData::create()); | 136 fontDescription.orientation()), CustomFontData::create()); |
| 109 } | 137 } |
| 110 | 138 |
| 111 PassRefPtr<SimpleFontData> RemoteFontFaceSource::createLoadingFallbackFontData(c
onst FontDescription& fontDescription) | 139 PassRefPtr<SimpleFontData> RemoteFontFaceSource::createLoadingFallbackFontData(c
onst FontDescription& fontDescription) |
| 112 { | 140 { |
| 113 // This temporary font is not retained and should not be returned. | 141 // This temporary font is not retained and should not be returned. |
| 114 FontCachePurgePreventer fontCachePurgePreventer; | 142 FontCachePurgePreventer fontCachePurgePreventer; |
| 115 SimpleFontData* temporaryFont = FontCache::fontCache()->getNonRetainedLastRe
sortFallbackFont(fontDescription); | 143 SimpleFontData* temporaryFont = FontCache::fontCache()->getNonRetainedLastRe
sortFallbackFont(fontDescription); |
| 116 if (!temporaryFont) { | 144 if (!temporaryFont) { |
| 117 ASSERT_NOT_REACHED(); | 145 ASSERT_NOT_REACHED(); |
| 118 return nullptr; | 146 return nullptr; |
| 119 } | 147 } |
| 120 RefPtr<CSSCustomFontData> cssFontData = CSSCustomFontData::create(this, m_fo
nt->exceedsFontLoadWaitLimit() ? CSSCustomFontData::VisibleFallback : CSSCustomF
ontData::InvisibleFallback); | 148 RefPtr<CSSCustomFontData> cssFontData = CSSCustomFontData::create(this, m_pe
riod == BlockPeriod ? CSSCustomFontData::InvisibleFallback : CSSCustomFontData::
VisibleFallback); |
| 121 return SimpleFontData::create(temporaryFont->platformData(), cssFontData); | 149 return SimpleFontData::create(temporaryFont->platformData(), cssFontData); |
| 122 } | 150 } |
| 123 | 151 |
| 124 void RemoteFontFaceSource::beginLoadIfNeeded() | 152 void RemoteFontFaceSource::beginLoadIfNeeded() |
| 125 { | 153 { |
| 126 if (m_font->stillNeedsLoad()) | 154 if (m_font->stillNeedsLoad()) |
| 127 m_fontLoader->addFontToBeginLoading(m_font.get()); | 155 m_fontLoader->addFontToBeginLoading(m_font.get()); |
| 128 | 156 |
| 129 if (m_face) | 157 if (m_face) |
| 130 m_face->didBeginLoad(); | 158 m_face->didBeginLoad(); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 if (size < 50 * 1024) | 215 if (size < 50 * 1024) |
| 188 return "WebFont.DownloadTime.1.10KBTo50KB"; | 216 return "WebFont.DownloadTime.1.10KBTo50KB"; |
| 189 if (size < 100 * 1024) | 217 if (size < 100 * 1024) |
| 190 return "WebFont.DownloadTime.2.50KBTo100KB"; | 218 return "WebFont.DownloadTime.2.50KBTo100KB"; |
| 191 if (size < 1024 * 1024) | 219 if (size < 1024 * 1024) |
| 192 return "WebFont.DownloadTime.3.100KBTo1MB"; | 220 return "WebFont.DownloadTime.3.100KBTo1MB"; |
| 193 return "WebFont.DownloadTime.4.Over1MB"; | 221 return "WebFont.DownloadTime.4.Over1MB"; |
| 194 } | 222 } |
| 195 | 223 |
| 196 } // namespace blink | 224 } // namespace blink |
| OLD | NEW |