OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are met: | 5 * modification, are permitted provided that the following conditions are met: |
6 * | 6 * |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
166 | 166 |
167 void FontFaceSet::handlePendingEventsAndPromisesSoon() | 167 void FontFaceSet::handlePendingEventsAndPromisesSoon() |
168 { | 168 { |
169 // setPendingActivity() is unnecessary because m_asyncRunner will be | 169 // setPendingActivity() is unnecessary because m_asyncRunner will be |
170 // automatically stopped on destruction. | 170 // automatically stopped on destruction. |
171 m_asyncRunner.runAsync(); | 171 m_asyncRunner.runAsync(); |
172 } | 172 } |
173 | 173 |
174 void FontFaceSet::didLayout() | 174 void FontFaceSet::didLayout() |
175 { | 175 { |
176 if (document()->frame()->isMainFrame()) | 176 if (document()->frame()->isMainFrame() && m_loadingFonts.isEmpty()) |
177 m_histogram.record(); | 177 m_histogram.record(); |
178 if (!RuntimeEnabledFeatures::fontLoadEventsEnabled()) | 178 if (!RuntimeEnabledFeatures::fontLoadEventsEnabled()) |
179 return; | 179 return; |
180 if (!m_loadingFonts.isEmpty() || (!hasLoadedFonts() && m_readyResolvers.isEm
pty())) | 180 if (!m_loadingFonts.isEmpty() || (!hasLoadedFonts() && m_readyResolvers.isEm
pty())) |
181 return; | 181 return; |
182 handlePendingEventsAndPromisesSoon(); | 182 handlePendingEventsAndPromisesSoon(); |
183 } | 183 } |
184 | 184 |
185 void FontFaceSet::handlePendingEventsAndPromises() | 185 void FontFaceSet::handlePendingEventsAndPromises() |
186 { | 186 { |
(...skipping 25 matching lines...) Expand all Loading... |
212 } | 212 } |
213 | 213 |
214 void FontFaceSet::beginFontLoading(FontFace* fontFace) | 214 void FontFaceSet::beginFontLoading(FontFace* fontFace) |
215 { | 215 { |
216 m_histogram.incrementCount(); | 216 m_histogram.incrementCount(); |
217 addToLoadingFonts(fontFace); | 217 addToLoadingFonts(fontFace); |
218 } | 218 } |
219 | 219 |
220 void FontFaceSet::fontLoaded(FontFace* fontFace) | 220 void FontFaceSet::fontLoaded(FontFace* fontFace) |
221 { | 221 { |
| 222 m_histogram.updateStatus(fontFace); |
222 if (RuntimeEnabledFeatures::fontLoadEventsEnabled()) | 223 if (RuntimeEnabledFeatures::fontLoadEventsEnabled()) |
223 m_loadedFonts.append(fontFace); | 224 m_loadedFonts.append(fontFace); |
224 removeFromLoadingFonts(fontFace); | 225 removeFromLoadingFonts(fontFace); |
225 } | 226 } |
226 | 227 |
227 void FontFaceSet::loadError(FontFace* fontFace) | 228 void FontFaceSet::loadError(FontFace* fontFace) |
228 { | 229 { |
| 230 m_histogram.updateStatus(fontFace); |
229 if (RuntimeEnabledFeatures::fontLoadEventsEnabled()) | 231 if (RuntimeEnabledFeatures::fontLoadEventsEnabled()) |
230 m_failedFonts.append(fontFace); | 232 m_failedFonts.append(fontFace); |
231 removeFromLoadingFonts(fontFace); | 233 removeFromLoadingFonts(fontFace); |
232 } | 234 } |
233 | 235 |
234 void FontFaceSet::addToLoadingFonts(PassRefPtr<FontFace> fontFace) | 236 void FontFaceSet::addToLoadingFonts(PassRefPtr<FontFace> fontFace) |
235 { | 237 { |
236 if (RuntimeEnabledFeatures::fontLoadEventsEnabled() && m_loadingFonts.isEmpt
y() && !hasLoadedFonts()) { | 238 if (RuntimeEnabledFeatures::fontLoadEventsEnabled() && m_loadingFonts.isEmpt
y() && !hasLoadedFonts()) { |
237 m_shouldFireLoadingEvent = true; | 239 m_shouldFireLoadingEvent = true; |
238 handlePendingEventsAndPromisesSoon(); | 240 handlePendingEventsAndPromisesSoon(); |
(...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 CSSPropertyValue(CSSPropertyLineHeight, *parsedStyle), | 504 CSSPropertyValue(CSSPropertyLineHeight, *parsedStyle), |
503 }; | 505 }; |
504 StyleResolver& styleResolver = document()->ensureStyleResolver(); | 506 StyleResolver& styleResolver = document()->ensureStyleResolver(); |
505 styleResolver.applyPropertiesToStyle(properties, WTF_ARRAY_LENGTH(properties
), style.get()); | 507 styleResolver.applyPropertiesToStyle(properties, WTF_ARRAY_LENGTH(properties
), style.get()); |
506 | 508 |
507 font = style->font(); | 509 font = style->font(); |
508 font.update(document()->styleEngine()->fontSelector()); | 510 font.update(document()->styleEngine()->fontSelector()); |
509 return true; | 511 return true; |
510 } | 512 } |
511 | 513 |
| 514 void FontFaceSet::FontLoadHistogram::updateStatus(FontFace* fontFace) |
| 515 { |
| 516 if (m_status == Reported) |
| 517 return; |
| 518 if (fontFace->hadBlankText()) |
| 519 m_status = HadBlankText; |
| 520 else if (m_status == NoWebFonts) |
| 521 m_status = DidNotHaveBlankText; |
| 522 } |
| 523 |
512 void FontFaceSet::FontLoadHistogram::record() | 524 void FontFaceSet::FontLoadHistogram::record() |
513 { | 525 { |
514 if (m_recorded) | 526 if (!m_recorded) { |
515 return; | 527 m_recorded = true; |
516 m_recorded = true; | 528 blink::Platform::current()->histogramCustomCounts("WebFont.WebFontsInPag
e", m_count, 1, 100, 50); |
517 blink::Platform::current()->histogramCustomCounts("WebFont.WebFontsInPage",
m_count, 1, 100, 50); | 529 } |
| 530 if (m_status == HadBlankText || m_status == DidNotHaveBlankText) { |
| 531 blink::Platform::current()->histogramEnumeration("WebFont.HadBlankText",
m_status == HadBlankText ? 1 : 0, 2); |
| 532 m_status = Reported; |
| 533 } |
518 } | 534 } |
519 | 535 |
520 static const char* supplementName() | 536 static const char* supplementName() |
521 { | 537 { |
522 return "FontFaceSet"; | 538 return "FontFaceSet"; |
523 } | 539 } |
524 | 540 |
525 PassRefPtr<FontFaceSet> FontFaceSet::from(Document& document) | 541 PassRefPtr<FontFaceSet> FontFaceSet::from(Document& document) |
526 { | 542 { |
527 RefPtr<FontFaceSet> fonts = static_cast<FontFaceSet*>(SupplementType::from(d
ocument, supplementName())); | 543 RefPtr<FontFaceSet> fonts = static_cast<FontFaceSet*>(SupplementType::from(d
ocument, supplementName())); |
528 if (!fonts) { | 544 if (!fonts) { |
529 fonts = FontFaceSet::create(document); | 545 fonts = FontFaceSet::create(document); |
530 SupplementType::provideTo(document, supplementName(), fonts); | 546 SupplementType::provideTo(document, supplementName(), fonts); |
531 } | 547 } |
532 | 548 |
533 return fonts.release(); | 549 return fonts.release(); |
534 } | 550 } |
535 | 551 |
536 void FontFaceSet::didLayout(Document& document) | 552 void FontFaceSet::didLayout(Document& document) |
537 { | 553 { |
538 if (FontFaceSet* fonts = static_cast<FontFaceSet*>(SupplementType::from(docu
ment, supplementName()))) | 554 if (FontFaceSet* fonts = static_cast<FontFaceSet*>(SupplementType::from(docu
ment, supplementName()))) |
539 fonts->didLayout(); | 555 fonts->didLayout(); |
540 } | 556 } |
541 | 557 |
542 | 558 |
543 } // namespace WebCore | 559 } // namespace WebCore |
OLD | NEW |