| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008 Apple Inc. All rights reserved. |
| 3 * Copyright (C) 2009 Torch Mobile, Inc. | 3 * Copyright (C) 2009 Torch Mobile, Inc. |
| 4 * | 4 * |
| 5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
| 6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
| 7 * are met: | 7 * are met: |
| 8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 | 37 |
| 38 #if ENABLE(SVG_FONTS) | 38 #if ENABLE(SVG_FONTS) |
| 39 #include "SVGNames.h" | 39 #include "SVGNames.h" |
| 40 #include "core/html/HTMLCollection.h" | 40 #include "core/html/HTMLCollection.h" |
| 41 #include "core/svg/SVGDocument.h" | 41 #include "core/svg/SVGDocument.h" |
| 42 #include "core/svg/SVGFontElement.h" | 42 #include "core/svg/SVGFontElement.h" |
| 43 #endif | 43 #endif |
| 44 | 44 |
| 45 namespace WebCore { | 45 namespace WebCore { |
| 46 | 46 |
| 47 static const double fontLoadWaitLimitSec = 3.0; |
| 48 |
| 47 FontResource::FontResource(const ResourceRequest& resourceRequest) | 49 FontResource::FontResource(const ResourceRequest& resourceRequest) |
| 48 : Resource(resourceRequest, Font) | 50 : Resource(resourceRequest, Font) |
| 49 , m_loadInitiated(false) | 51 , m_loadInitiated(false) |
| 52 , m_exceedsFontLoadWaitLimit(false) |
| 53 , m_fontLoadWaitLimitTimer(this, &FontResource::fontLoadWaitLimitCallback) |
| 50 { | 54 { |
| 51 } | 55 } |
| 52 | 56 |
| 53 FontResource::~FontResource() | 57 FontResource::~FontResource() |
| 54 { | 58 { |
| 55 } | 59 } |
| 56 | 60 |
| 57 void FontResource::load(ResourceFetcher*, const ResourceLoaderOptions& options) | 61 void FontResource::load(ResourceFetcher*, const ResourceLoaderOptions& options) |
| 58 { | 62 { |
| 59 // Don't load the file yet. Wait for an access before triggering the load. | 63 // Don't load the file yet. Wait for an access before triggering the load. |
| 60 setLoading(true); | 64 setLoading(true); |
| 61 m_options = options; | 65 m_options = options; |
| 62 } | 66 } |
| 63 | 67 |
| 64 void FontResource::didAddClient(ResourceClient* c) | 68 void FontResource::didAddClient(ResourceClient* c) |
| 65 { | 69 { |
| 66 ASSERT(c->resourceClientType() == FontResourceClient::expectedType()); | 70 ASSERT(c->resourceClientType() == FontResourceClient::expectedType()); |
| 67 Resource::didAddClient(c); | 71 Resource::didAddClient(c); |
| 68 if (!isLoading()) | 72 if (!isLoading()) |
| 69 static_cast<FontResourceClient*>(c)->fontLoaded(this); | 73 static_cast<FontResourceClient*>(c)->fontLoaded(this); |
| 70 } | 74 } |
| 71 | 75 |
| 72 void FontResource::beginLoadIfNeeded(ResourceFetcher* dl) | 76 void FontResource::beginLoadIfNeeded(ResourceFetcher* dl) |
| 73 { | 77 { |
| 74 if (!m_loadInitiated) { | 78 if (!m_loadInitiated) { |
| 75 m_loadInitiated = true; | 79 m_loadInitiated = true; |
| 76 Resource::load(dl, m_options); | 80 Resource::load(dl, m_options); |
| 81 m_fontLoadWaitLimitTimer.startOneShot(fontLoadWaitLimitSec); |
| 77 | 82 |
| 78 ResourceClientWalker<FontResourceClient> walker(m_clients); | 83 ResourceClientWalker<FontResourceClient> walker(m_clients); |
| 79 while (FontResourceClient* client = walker.next()) | 84 while (FontResourceClient* client = walker.next()) |
| 80 client->didStartFontLoad(this); | 85 client->didStartFontLoad(this); |
| 81 } | 86 } |
| 82 } | 87 } |
| 83 | 88 |
| 84 bool FontResource::ensureCustomFontData() | 89 bool FontResource::ensureCustomFontData() |
| 85 { | 90 { |
| 86 if (!m_fontData && !errorOccurred() && !isLoading()) { | 91 if (!m_fontData && !errorOccurred() && !isLoading()) { |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 for (unsigned i = 0; i < collectionLength; ++i) { | 153 for (unsigned i = 0; i < collectionLength; ++i) { |
| 149 SVGFontElement* element = toSVGFontElement(collection->item(i)); | 154 SVGFontElement* element = toSVGFontElement(collection->item(i)); |
| 150 if (element->getIdAttribute() == fontName) | 155 if (element->getIdAttribute() == fontName) |
| 151 return element; | 156 return element; |
| 152 } | 157 } |
| 153 | 158 |
| 154 return 0; | 159 return 0; |
| 155 } | 160 } |
| 156 #endif | 161 #endif |
| 157 | 162 |
| 163 void FontResource::fontLoadWaitLimitCallback(Timer<FontResource>*) |
| 164 { |
| 165 if (!isLoading()) |
| 166 return; |
| 167 m_exceedsFontLoadWaitLimit = true; |
| 168 ResourceClientWalker<FontResourceClient> walker(m_clients); |
| 169 while (FontResourceClient* client = walker.next()) |
| 170 client->fontLoadWaitLimitExceeded(this); |
| 171 } |
| 172 |
| 158 void FontResource::allClientsRemoved() | 173 void FontResource::allClientsRemoved() |
| 159 { | 174 { |
| 160 m_fontData.clear(); | 175 m_fontData.clear(); |
| 161 Resource::allClientsRemoved(); | 176 Resource::allClientsRemoved(); |
| 162 } | 177 } |
| 163 | 178 |
| 164 void FontResource::checkNotify() | 179 void FontResource::checkNotify() |
| 165 { | 180 { |
| 181 m_fontLoadWaitLimitTimer.stop(); |
| 166 ResourceClientWalker<FontResourceClient> w(m_clients); | 182 ResourceClientWalker<FontResourceClient> w(m_clients); |
| 167 while (FontResourceClient* c = w.next()) | 183 while (FontResourceClient* c = w.next()) |
| 168 c->fontLoaded(this); | 184 c->fontLoaded(this); |
| 169 } | 185 } |
| 170 | 186 |
| 171 } | 187 } |
| OLD | NEW |