18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved.
3231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block * Copyright (C) 2009 Torch Mobile, Inc.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *    documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedFont.h"
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
302daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch// FIXME: This should really be a blacklist instead of a whitelist
312daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if USE(CG) || PLATFORM(QT) || PLATFORM(GTK) || (PLATFORM(CHROMIUM) && (OS(WINDOWS) || OS(LINUX) || OS(FREEBSD) || USE(SKIA_MAC_ON_CHROME))) || PLATFORM(HAIKU) || OS(WINCE) || PLATFORM(ANDROID) || PLATFORM(BREWMP)
32231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define STORE_FONT_CUSTOM_PLATFORM_DATA
33231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
34231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClient.h"
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResourceClientWalker.h"
37f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "CachedResourceLoader.h"
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "FontPlatformData.h"
39f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "MemoryCache.h"
40dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "SharedBuffer.h"
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "TextResourceDecoder.h"
428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/Vector.h>
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
44dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
45dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#include "FontCustomPlatformData.h"
46dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
47dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS)
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "NodeList.h"
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGElement.h"
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGFontElement.h"
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "SVGGElement.h"
53f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch#include "SVGNames.h"
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedFont::CachedFont(const String &url)
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    : CachedResource(url, FontResource)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_fontData(0)
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    , m_loadInitiated(false)
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectCachedFont::~CachedFont()
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
67231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    delete m_fontData;
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid CachedFont::load(CachedResourceLoader*)
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // Don't load the file yet.  Wait for an access before triggering the load.
756c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    setLoading(true);
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochvoid CachedFont::didAddClient(CachedResourceClient* c)
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
806c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!isLoading())
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        c->fontLoaded(this);
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedFont::data(PassRefPtr<SharedBuffer> data, bool allDataReceived)
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!allDataReceived)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_data = data;
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    setEncodedSize(m_data.get() ? m_data->size() : 0);
916c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    setLoading(false);
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkNotify();
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
955abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrickvoid CachedFont::beginLoadIfNeeded(CachedResourceLoader* dl)
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!m_loadInitiated) {
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_loadInitiated = true;
99f05b935882198ccf7d81675736e3aeb089c5113aBen Murdoch        dl->load(this, false);
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CachedFont::ensureCustomFontData()
1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
105231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
1066c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!m_fontData && !errorOccurred() && !isLoading() && m_data) {
1078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontData = createFontCustomPlatformData(m_data.get());
1088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (!m_fontData)
1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner            setStatus(DecodeError);
1108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_fontData;
1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1152bde8e466a4451c7319e3a072d118917957d6554Steve BlockFontPlatformData CachedFont::platformDataFromCustomData(float size, bool bold, bool italic, FontOrientation orientation, TextOrientation textOrientation, FontWidthVariant widthVariant, FontRenderingMode renderingMode)
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS)
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_externalSVGDocument)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return FontPlatformData(size, bold, italic);
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
121231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    ASSERT(m_fontData);
1232bde8e466a4451c7319e3a072d118917957d6554Steve Block    return m_fontData->fontPlatformData(static_cast<int>(size), bold, italic, orientation, textOrientation, widthVariant, renderingMode);
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#else
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return FontPlatformData();
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if ENABLE(SVG_FONTS)
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool CachedFont::ensureSVGFontData()
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1326c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!m_externalSVGDocument && !errorOccurred() && !isLoading() && m_data) {
13306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen        m_externalSVGDocument = SVGDocument::create(0, KURL());
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        RefPtr<TextResourceDecoder> decoder = TextResourceDecoder::create("application/xml");
1362daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        String svgSource = decoder->decode(m_data->data(), m_data->size());
1372daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        svgSource += decoder->flush();
1382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1392daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        m_externalSVGDocument->setContent(svgSource);
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (decoder->sawError())
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_externalSVGDocument = 0;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return m_externalSVGDocument;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectSVGFontElement* CachedFont::getSVGFontById(const String& fontName) const
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
150dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block    RefPtr<NodeList> list = m_externalSVGDocument->getElementsByTagNameNS(SVGNames::fontTag.namespaceURI(), SVGNames::fontTag.localName());
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!list)
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return 0;
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1546c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    unsigned listLength = list->length();
1556c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (!listLength)
1566c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return 0;
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1586c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#ifndef NDEBUG
1596c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (unsigned i = 0; i < listLength; ++i) {
1606c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ASSERT(list->item(i));
1616c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        ASSERT(list->item(i)->hasTagName(SVGNames::fontTag));
1626c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    }
1636c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen#endif
1646c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1656c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (fontName.isEmpty())
1666c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        return static_cast<SVGFontElement*>(list->item(0));
1676c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen
1686c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    for (unsigned i = 0; i < listLength; ++i) {
169545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        SVGFontElement* element = static_cast<SVGFontElement*>(list->item(i));
170545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch        if (element->getIdAttribute() == fontName)
171545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch            return element;
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return 0;
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedFont::allClientsRemoved()
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
180231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (m_fontData) {
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        delete m_fontData;
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        m_fontData = 0;
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid CachedFont::checkNotify()
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1906c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    if (isLoading())
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CachedResourceClientWalker w(m_clients);
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    while (CachedResourceClient *c = w.next())
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project         c->fontLoaded(this);
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennervoid CachedFont::error(CachedResource::Status status)
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    setStatus(status);
2026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    ASSERT(errorOccurred());
2036c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    setLoading(false);
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    checkNotify();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
208