15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007, 2008, 2011 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (C) 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org> 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSFontSelector.h" 2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 30f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include "core/css/CSSFontSelectorClient.h" 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSSegmentedFontFace.h" 3253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSValueList.h" 3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/css/FontFaceSet.h" 3481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)#include "core/css/resolver/StyleResolver.h" 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/Document.h" 36d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 3709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/frame/Settings.h" 38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/loader/FrameLoader.h" 395d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "platform/RuntimeEnabledFeatures.h" 40a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/FontCache.h" 41a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)#include "platform/fonts/SimpleFontData.h" 4293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)#include "wtf/text/AtomicString.h" 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 44c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 461e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)CSSFontSelector::CSSFontSelector(Document* document) 471e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) : m_document(document) 4876c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) , m_fontLoader(FontLoader::create(this, document->fetcher())) 49a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) , m_genericFontFamilySettings(document->frame()->settings()->genericFontFamilySettings()) 501e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // FIXME: An old comment used to say there was no need to hold a reference to m_document 521e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // because "we are guaranteed to be destroyed before the document". But there does not 531e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) // seem to be any such guarantee. 54e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 551e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) ASSERT(m_document); 56a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) ASSERT(m_document->frame()); 57a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) FontCache::fontCache()->addClient(this); 58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) FontFaceSet::from(*document)->addFontFacesToFontFaceCache(&m_fontFaceCache, this); 591e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)} 6002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 611e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)CSSFontSelector::~CSSFontSelector() 621e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles){ 636f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#if !ENABLE(OILPAN) 64323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) clearDocument(); 65a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) FontCache::fontCache()->removeClient(this); 666f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch#endif 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSFontSelector::registerForInvalidationCallbacks(CSSFontSelectorClient* client) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_clients.add(client); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 7407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#if !ENABLE(OILPAN) 7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSFontSelector::unregisterForInvalidationCallbacks(CSSFontSelectorClient* client) 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_clients.remove(client); 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CSSFontSelector::dispatchInvalidationCallbacks() 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 8307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch WillBeHeapVector<RawPtrWillBeMember<CSSFontSelectorClient> > clients; 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) copyToVector(m_clients, clients); 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < clients.size(); ++i) 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) clients[i]->fontsNeedUpdate(this); 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 89d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)void CSSFontSelector::fontFaceInvalidated() 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchInvalidationCallbacks(); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CSSFontSelector::fontCacheInvalidated() 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) dispatchInvalidationCallbacks(); 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles)static AtomicString familyNameFromSettings(const GenericFontFamilySettings& settings, const FontDescription& fontDescription, const AtomicString& genericFamilyName) 10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 101d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#if OS(ANDROID) 10243e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (fontDescription.genericFamily() == FontDescription::StandardFamily) 1037242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return FontCache::getGenericFamilyNameForScript(FontFamilyNames::webkit_standard, fontDescription); 10451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) if (genericFamilyName.startsWith("-webkit-")) 1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return FontCache::getGenericFamilyNameForScript(genericFamilyName, fontDescription); 10751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#else 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci UScriptCode script = fontDescription.script(); 10943e7502580f146aa5b3db8267ba6dbb5c733a489Torne (Richard Coles) if (fontDescription.genericFamily() == FontDescription::StandardFamily) 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return settings.standard(script); 11151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_serif) 112a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.serif(script); 11351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_sans_serif) 114a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.sansSerif(script); 11551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_cursive) 116a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.cursive(script); 11751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_fantasy) 118a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.fantasy(script); 11951b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_monospace) 120a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.fixed(script); 12151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_pictograph) 122a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.pictograph(script); 12351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (genericFamilyName == FontFamilyNames::webkit_standard) 124a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return settings.standard(script); 12551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#endif 12651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return emptyAtom; 12751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 12851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<FontData> CSSFontSelector::getFontData(const FontDescription& fontDescription, const AtomicString& familyName) 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (CSSSegmentedFontFace* face = m_fontFaceCache.get(fontDescription, familyName)) 13251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) return face->getFontData(fontDescription); 13351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 13451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) // Try to return the correct font based off our settings, in case we were handed the generic font family name. 135a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) AtomicString settingsFamilyName = familyNameFromSettings(m_genericFontFamilySettings, fontDescription, familyName); 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) if (settingsFamilyName.isEmpty()) 137d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 13851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 139a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) return FontCache::fontCache()->getFontData(fontDescription, settingsFamilyName); 140926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 142f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liuvoid CSSFontSelector::willUseFontData(const FontDescription& fontDescription, const AtomicString& family, UChar32 character) 143e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles){ 14409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) CSSSegmentedFontFace* face = m_fontFaceCache.get(fontDescription, family); 145e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (face) 146f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu face->willUseFontData(fontDescription, character); 147e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)} 148e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 1495d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)bool CSSFontSelector::isPlatformFontAvailable(const FontDescription& fontDescription, const AtomicString& passedFamily) 1505d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles){ 1515d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) AtomicString family = familyNameFromSettings(m_genericFontFamilySettings, fontDescription, passedFamily); 1525d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (family.isEmpty()) 1535d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) family = passedFamily; 1545d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return FontCache::fontCache()->isPlatformFontAvailable(fontDescription, family); 1555d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)} 1565d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) 157323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#if !ENABLE(OILPAN) 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void CSSFontSelector::clearDocument() 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 16076c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles) m_fontLoader->clearResourceFetcherAndFontSelector(); 161323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) m_document = nullptr; 162c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) m_fontFaceCache.clearAll(); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 164323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 16609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)void CSSFontSelector::updateGenericFontFamilySettings(Document& document) 16709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){ 1685d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) if (!document.settings()) 1695d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) return; 17009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) m_genericFontFamilySettings = document.settings()->genericFontFamilySettings(); 1715d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) // Need to increment FontFaceCache version to update RenderStyles. 1725d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) m_fontFaceCache.incrementVersion(); 17309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)} 17409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) 1756f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdochvoid CSSFontSelector::trace(Visitor* visitor) 1766f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{ 177197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if ENABLE(OILPAN) 178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) visitor->trace(m_document); 1796f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch visitor->trace(m_fontFaceCache); 1806f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch visitor->trace(m_clients); 1816f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch visitor->trace(m_fontLoader); 182197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#endif 183323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) FontSelector::trace(visitor); 1846f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch} 1856f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 187