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