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 3 // found in the LICENSE file. 4 5 #include "config.h" 6 #include "core/css/FontLoader.h" 7 8 #include "core/css/CSSFontSelector.h" 9 #include "core/fetch/FontResource.h" 10 #include "core/fetch/ResourceFetcher.h" 11 12 namespace blink { 13 FontLoader(CSSFontSelector * fontSelector,ResourceFetcher * resourceFetcher)14FontLoader::FontLoader(CSSFontSelector* fontSelector, ResourceFetcher* resourceFetcher) 15 : m_beginLoadingTimer(this, &FontLoader::beginLoadTimerFired) 16 , m_fontSelector(fontSelector) 17 , m_resourceFetcher(resourceFetcher) 18 { 19 } 20 ~FontLoader()21FontLoader::~FontLoader() 22 { 23 #if ENABLE(OILPAN) 24 if (!m_resourceFetcher) { 25 ASSERT(m_fontsToBeginLoading.isEmpty()); 26 return; 27 } 28 m_beginLoadingTimer.stop(); 29 // This will decrement the request counts on the ResourceFetcher for all the 30 // fonts that were pending at the time the FontLoader dies. 31 clearPendingFonts(); 32 #endif 33 } 34 addFontToBeginLoading(FontResource * fontResource)35void FontLoader::addFontToBeginLoading(FontResource* fontResource) 36 { 37 if (!m_resourceFetcher || !fontResource->stillNeedsLoad() || fontResource->loadScheduled()) 38 return; 39 40 m_fontsToBeginLoading.append( 41 std::make_pair(fontResource, ResourceLoader::RequestCountTracker(m_resourceFetcher, fontResource))); 42 fontResource->didScheduleLoad(); 43 if (!m_beginLoadingTimer.isActive()) 44 m_beginLoadingTimer.startOneShot(0, FROM_HERE); 45 } 46 beginLoadTimerFired(Timer<blink::FontLoader> *)47void FontLoader::beginLoadTimerFired(Timer<blink::FontLoader>*) 48 { 49 loadPendingFonts(); 50 } 51 loadPendingFonts()52void FontLoader::loadPendingFonts() 53 { 54 ASSERT(m_resourceFetcher); 55 56 FontsToLoadVector fontsToBeginLoading; 57 fontsToBeginLoading.swap(m_fontsToBeginLoading); 58 for (FontsToLoadVector::iterator it = fontsToBeginLoading.begin(); it != fontsToBeginLoading.end(); ++it) { 59 FontResource* fontResource = it->first.get(); 60 fontResource->beginLoadIfNeeded(m_resourceFetcher); 61 } 62 63 // When the local fontsToBeginLoading vector goes out of scope it will 64 // decrement the request counts on the ResourceFetcher for all the fonts 65 // that were just loaded. 66 } 67 fontFaceInvalidated()68void FontLoader::fontFaceInvalidated() 69 { 70 if (m_fontSelector) 71 m_fontSelector->fontFaceInvalidated(); 72 } 73 74 #if !ENABLE(OILPAN) clearResourceFetcherAndFontSelector()75void FontLoader::clearResourceFetcherAndFontSelector() 76 { 77 if (!m_resourceFetcher) { 78 ASSERT(m_fontsToBeginLoading.isEmpty()); 79 return; 80 } 81 82 m_beginLoadingTimer.stop(); 83 clearPendingFonts(); 84 m_resourceFetcher = nullptr; 85 m_fontSelector = nullptr; 86 } 87 #endif 88 clearPendingFonts()89void FontLoader::clearPendingFonts() 90 { 91 for (FontsToLoadVector::iterator it = m_fontsToBeginLoading.begin(); it != m_fontsToBeginLoading.end(); ++it) 92 it->first->didUnscheduleLoad(); 93 m_fontsToBeginLoading.clear(); 94 } 95 trace(Visitor * visitor)96void FontLoader::trace(Visitor* visitor) 97 { 98 visitor->trace(m_resourceFetcher); 99 visitor->trace(m_fontSelector); 100 } 101 102 } // namespace blink 103