1/* 2 * Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef CSSFontSelector_h 27#define CSSFontSelector_h 28 29#include "CachedResourceHandle.h" 30#include "FontSelector.h" 31#include "SimpleFontData.h" 32#include "Timer.h" 33#include <memory> 34#include <wtf/Forward.h> 35#include <wtf/HashMap.h> 36#include <wtf/HashSet.h> 37#include <wtf/RefPtr.h> 38#include <wtf/text/StringHash.h> 39 40namespace WebCore { 41 42class CSSFontFace; 43class CSSFontFaceRule; 44class CSSSegmentedFontFace; 45class CachedFont; 46class Document; 47class FontDescription; 48class StyleRuleFontFace; 49 50class CSSFontSelector final : public FontSelector { 51public: 52 static PassRefPtr<CSSFontSelector> create(Document* document) 53 { 54 return adoptRef(new CSSFontSelector(document)); 55 } 56 virtual ~CSSFontSelector(); 57 58 virtual unsigned version() const override { return m_version; } 59 virtual unsigned uniqueId() const override { return m_uniqueId; } 60 61 virtual PassRefPtr<FontData> getFontData(const FontDescription&, const AtomicString&) override; 62 virtual size_t fallbackFontDataCount() override; 63 virtual PassRefPtr<FontData> getFallbackFontData(const FontDescription&, size_t) override; 64 CSSSegmentedFontFace* getFontFace(const FontDescription&, const AtomicString& family); 65 66 virtual bool resolvesFamilyFor(const FontDescription&) const override; 67 68 void clearDocument(); 69 70 void addFontFaceRule(const StyleRuleFontFace*); 71 72 void fontLoaded(); 73 virtual void fontCacheInvalidated() override; 74 75 bool isEmpty() const; 76 77 virtual void registerForInvalidationCallbacks(FontSelectorClient*) override; 78 virtual void unregisterForInvalidationCallbacks(FontSelectorClient*) override; 79 80 Document* document() const { return m_document; } 81 82 void beginLoadingFontSoon(CachedFont*); 83 84private: 85 CSSFontSelector(Document*); 86 87 void dispatchInvalidationCallbacks(); 88 89 void beginLoadTimerFired(Timer<CSSFontSelector>&); 90 91 Document* m_document; 92 HashMap<String, std::unique_ptr<Vector<RefPtr<CSSFontFace>>>, CaseFoldingHash> m_fontFaces; 93 HashMap<String, std::unique_ptr<Vector<RefPtr<CSSFontFace>>>, CaseFoldingHash> m_locallyInstalledFontFaces; 94 HashMap<String, std::unique_ptr<HashMap<unsigned, RefPtr<CSSSegmentedFontFace>>>, CaseFoldingHash> m_fonts; 95 HashSet<FontSelectorClient*> m_clients; 96 97 Vector<CachedResourceHandle<CachedFont>> m_fontsToBeginLoading; 98 Timer<CSSFontSelector> m_beginLoadingTimer; 99 100 unsigned m_uniqueId; 101 unsigned m_version; 102}; 103 104} // namespace WebCore 105 106#endif // CSSFontSelector_h 107