diff options
author | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-12 09:27:39 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@nokia.com> | 2012-08-12 09:27:39 +0200 |
commit | 3749d61e1f7a59f5ec5067e560af1eb610c82015 (patch) | |
tree | 73dc228333948738bbe02976cacca8cd382bc978 /Source/WebCore/loader | |
parent | b32b4dcd9a51ab8de6afc53d9e17f8707e1f7a5e (diff) | |
download | qtwebkit-3749d61e1f7a59f5ec5067e560af1eb610c82015.tar.gz |
Imported WebKit commit a77350243e054f3460d1137301d8b3faee3d2052 (http://svn.webkit.org/repository/webkit/trunk@125365)
New snapshot with build fixes for latest API changes in Qt and all WK1 Win MSVC fixes upstream
Diffstat (limited to 'Source/WebCore/loader')
40 files changed, 416 insertions, 66 deletions
diff --git a/Source/WebCore/loader/DocumentLoader.cpp b/Source/WebCore/loader/DocumentLoader.cpp index 3f493c1ec..32ff28c32 100644 --- a/Source/WebCore/loader/DocumentLoader.cpp +++ b/Source/WebCore/loader/DocumentLoader.cpp @@ -357,19 +357,19 @@ void DocumentLoader::commitData(const char* bytes, size_t length) void DocumentLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { - MemoryClassInfo<DocumentLoader> info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); info.addInstrumentedMember(m_frame); info.addInstrumentedMember(m_mainResourceLoader); info.addInstrumentedHashSet(m_subresourceLoaders); info.addInstrumentedHashSet(m_multipartSubresourceLoaders); info.addInstrumentedHashSet(m_plugInStreamLoaders); - info.addString(m_pageTitle.string()); - info.addString(m_overrideEncoding); + info.addMember(m_pageTitle.string()); + info.addMember(m_overrideEncoding); info.addVector(m_responses); info.addHashMap(m_pendingSubstituteResources); info.addHashSet(m_resourcesClientKnowsAbout); info.addVector(m_resourcesLoadedFromMemoryCacheForClientNotification); - info.addString(m_clientRedirectSourceForHistory); + info.addMember(m_clientRedirectSourceForHistory); info.addInstrumentedMember(m_mainResourceData); } diff --git a/Source/WebCore/loader/EmptyClients.cpp b/Source/WebCore/loader/EmptyClients.cpp index b2dbeced8..d8bc06f33 100644 --- a/Source/WebCore/loader/EmptyClients.cpp +++ b/Source/WebCore/loader/EmptyClients.cpp @@ -47,6 +47,9 @@ namespace WebCore { void fillWithEmptyClients(Page::PageClients& pageClients) { + static ChromeClient* dummyChromeClient = adoptPtr(new EmptyChromeClient).leakPtr(); + pageClients.chromeClient = dummyChromeClient; + #if ENABLE(CONTEXT_MENUS) static ContextMenuClient* dummyContextMenuClient = adoptPtr(new EmptyContextMenuClient).leakPtr(); pageClients.contextMenuClient = dummyContextMenuClient; diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp index 1efbcdf5f..0dcb3b24f 100644 --- a/Source/WebCore/loader/FrameLoader.cpp +++ b/Source/WebCore/loader/FrameLoader.cpp @@ -1501,6 +1501,10 @@ void FrameLoader::stopAllLoaders(ClearProvisionalItemPolicy clearProvisionalItem // If this method is called from within this method, infinite recursion can occur (3442218). Avoid this. if (m_inStopAllLoaders) return; + + // Calling stopLoading() on the provisional document loader can blow away + // the frame from underneath. + RefPtr<Frame> protect(m_frame); m_inStopAllLoaders = true; @@ -3225,11 +3229,11 @@ NetworkingContext* FrameLoader::networkingContext() const void FrameLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { - MemoryClassInfo<FrameLoader> info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); info.addInstrumentedMember(m_documentLoader.get()); info.addInstrumentedMember(m_provisionalDocumentLoader.get()); info.addInstrumentedMember(m_policyDocumentLoader.get()); - info.addString(m_outgoingReferrer); + info.addMember(m_outgoingReferrer); info.addInstrumentedHashSet(m_openedFrames); } diff --git a/Source/WebCore/loader/ImageLoader.h b/Source/WebCore/loader/ImageLoader.h index 4f02c4154..d3b76692c 100644 --- a/Source/WebCore/loader/ImageLoader.h +++ b/Source/WebCore/loader/ImageLoader.h @@ -24,6 +24,7 @@ #define ImageLoader_h #include "CachedImage.h" +#include "CachedImageClient.h" #include "CachedResourceHandle.h" #include "Element.h" #include <wtf/OwnPtr.h> diff --git a/Source/WebCore/loader/MainResourceLoader.cpp b/Source/WebCore/loader/MainResourceLoader.cpp index fe7d1f9f2..74aa3afc1 100644 --- a/Source/WebCore/loader/MainResourceLoader.cpp +++ b/Source/WebCore/loader/MainResourceLoader.cpp @@ -544,6 +544,15 @@ void MainResourceLoader::didFail(const ResourceError& error) receivedError(error); } +void MainResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + ResourceLoader::reportMemoryUsage(memoryObjectInfo); + info.addMember(m_initialRequest); + info.addInstrumentedMember(m_substituteData); + info.addMember(m_dataLoadTimer); +} + void MainResourceLoader::handleEmptyLoad(const KURL& url, bool forURLScheme) { String mimeType; diff --git a/Source/WebCore/loader/MainResourceLoader.h b/Source/WebCore/loader/MainResourceLoader.h index d526a2373..25027fdb2 100644 --- a/Source/WebCore/loader/MainResourceLoader.h +++ b/Source/WebCore/loader/MainResourceLoader.h @@ -73,6 +73,8 @@ namespace WebCore { bool isLoadingMultipartContent() const { return m_loadingMultipartContent; } + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: explicit MainResourceLoader(Frame*); diff --git a/Source/WebCore/loader/ResourceLoader.cpp b/Source/WebCore/loader/ResourceLoader.cpp index 9315108ae..0175b16b8 100644 --- a/Source/WebCore/loader/ResourceLoader.cpp +++ b/Source/WebCore/loader/ResourceLoader.cpp @@ -530,7 +530,7 @@ AsyncFileStream* ResourceLoader::createAsyncFileStream(FileStreamClient* client) void ResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const { - MemoryClassInfo<ResourceLoader> info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); info.addMember(m_handle.get()); info.addInstrumentedMember(m_frame); info.addInstrumentedMember(m_documentLoader); diff --git a/Source/WebCore/loader/SubframeLoader.cpp b/Source/WebCore/loader/SubframeLoader.cpp index 63cfb3b64..410bfe368 100644 --- a/Source/WebCore/loader/SubframeLoader.cpp +++ b/Source/WebCore/loader/SubframeLoader.cpp @@ -104,51 +104,103 @@ bool SubframeLoader::resourceWillUsePlugin(const String& url, const String& mime return shouldUsePlugin(completedURL, mimeType, shouldPreferPlugInsForImages, false, useFallback); } -bool SubframeLoader::requestPlugin(HTMLPlugInImageElement* ownerElement, const KURL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) +bool SubframeLoader::pluginIsLoadable(HTMLPlugInImageElement* pluginElement, const KURL& url, const String& mimeType) { Settings* settings = m_frame->settings(); if (!settings) return false; - // Application plug-ins are plug-ins implemented by the user agent, for example Qt plug-ins, - // as opposed to third-party code such as Flash. The user agent decides whether or not they are - // permitted, rather than WebKit. - if ((!allowPlugins(AboutToInstantiatePlugin) && !MIMETypeRegistry::isApplicationPluginMIMEType(mimeType))) - return false; - if (MIMETypeRegistry::isJavaAppletMIMEType(mimeType)) { if (!settings->isJavaEnabled()) return false; - if (m_frame->document() && m_frame->document()->securityOrigin()->isLocal() && !settings->isJavaEnabledForLocalFiles()) + if (document() && document()->securityOrigin()->isLocal() && !settings->isJavaEnabledForLocalFiles()) return false; } - if (m_frame->document()) { - if (m_frame->document()->isSandboxed(SandboxPlugins)) + if (document()) { + if (document()->isSandboxed(SandboxPlugins)) return false; - if (!m_frame->document()->contentSecurityPolicy()->allowObjectFromSource(url)) + + if (!document()->securityOrigin()->canDisplay(url)) { + FrameLoader::reportLocalLoadFailed(m_frame, url.string()); + return false; + } + + if (!document()->contentSecurityPolicy()->allowObjectFromSource(url)) { + RenderEmbeddedObject* renderer = pluginElement->renderEmbeddedObject(); + renderer->setPluginUnavailabilityReason(RenderEmbeddedObject::PluginBlockedByContentSecurityPolicy); + return false; + } + + if (m_frame->loader() && !m_frame->loader()->checkIfRunInsecureContent(document()->securityOrigin(), url)) return false; } + return true; +} + +bool SubframeLoader::requestPlugin(HTMLPlugInImageElement* ownerElement, const KURL& url, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback) +{ + + // Application plug-ins are plug-ins implemented by the user agent, for example Qt plug-ins, + // as opposed to third-party code such as Flash. The user agent decides whether or not they are + // permitted, rather than WebKit. + if ((!allowPlugins(AboutToInstantiatePlugin) && !MIMETypeRegistry::isApplicationPluginMIMEType(mimeType))) + return false; + + if (!pluginIsLoadable(ownerElement, url, mimeType)) + return false; + ASSERT(ownerElement->hasTagName(objectTag) || ownerElement->hasTagName(embedTag)); return loadPlugin(ownerElement, url, mimeType, paramNames, paramValues, useFallback); } -static void logPluginRequest(Page* page, const String& mimeType, bool success) +static String findPluginMIMETypeFromURL(Page* page, const String& url) +{ + if (!url) + return String(); + + size_t dotIndex = url.reverseFind('.'); + if (dotIndex == notFound) + return String(); + + String extension = url.substring(dotIndex + 1); + + PluginData* pluginData = page->pluginData(); + for (size_t i = 0; i < pluginData->mimes().size(); ++i) { + const MimeClassInfo& mimeClassInfo = pluginData->mimes()[i]; + for (size_t j = 0; j < mimeClassInfo.extensions.size(); ++j) { + if (equalIgnoringCase(extension, mimeClassInfo.extensions[j])) + return mimeClassInfo.type; + } + } + + return String(); +} + +static void logPluginRequest(Page* page, const String& mimeType, const String& url, bool success) { if (!page || !page->settings()->diagnosticLoggingEnabled()) return; - + + String newMIMEType = mimeType; + if (!newMIMEType) { + // Try to figure out the MIME type from the URL extension. + newMIMEType = findPluginMIMETypeFromURL(page, url); + if (!newMIMEType) + return; + } + ChromeClient* client = page->chrome()->client(); - client->logDiagnosticMessage(success ? DiagnosticLoggingKeys::pluginLoadedKey() : DiagnosticLoggingKeys::pluginLoadingFailedKey(), mimeType, DiagnosticLoggingKeys::noopKey()); + client->logDiagnosticMessage(success ? DiagnosticLoggingKeys::pluginLoadedKey() : DiagnosticLoggingKeys::pluginLoadingFailedKey(), newMIMEType, DiagnosticLoggingKeys::noopKey()); if (!page->hasSeenAnyPlugin()) client->logDiagnosticMessage(DiagnosticLoggingKeys::pageContainsAtLeastOnePluginKey(), emptyString(), DiagnosticLoggingKeys::noopKey()); - if (!page->hasSeenPlugin(mimeType)) - client->logDiagnosticMessage(DiagnosticLoggingKeys::pageContainsPluginKey(), mimeType, DiagnosticLoggingKeys::noopKey()); + if (!page->hasSeenPlugin(newMIMEType)) + client->logDiagnosticMessage(DiagnosticLoggingKeys::pageContainsPluginKey(), newMIMEType, DiagnosticLoggingKeys::noopKey()); - page->sawPlugin(mimeType); + page->sawPlugin(newMIMEType); } bool SubframeLoader::requestObject(HTMLPlugInImageElement* ownerElement, const String& url, const AtomicString& frameName, const String& mimeType, const Vector<String>& paramNames, const Vector<String>& paramValues) @@ -169,7 +221,7 @@ bool SubframeLoader::requestObject(HTMLPlugInImageElement* ownerElement, const S bool useFallback; if (shouldUsePlugin(completedURL, mimeType, ownerElement->shouldPreferPlugInsForImages(), renderer->hasFallbackContent(), useFallback)) { bool success = requestPlugin(ownerElement, completedURL, mimeType, paramNames, paramValues, useFallback); - logPluginRequest(document()->page(), mimeType, success); + logPluginRequest(document()->page(), mimeType, completedURL, success); return success; } @@ -253,7 +305,7 @@ PassRefPtr<Widget> SubframeLoader::createJavaAppletWidget(const IntSize& size, H if (allowPlugins(AboutToInstantiatePlugin)) widget = m_frame->loader()->client()->createJavaAppletWidget(size, element, baseURL, paramNames, paramValues); - logPluginRequest(document()->page(), element->serviceType(), widget); + logPluginRequest(document()->page(), element->serviceType(), String(), widget); if (!widget) { RenderEmbeddedObject* renderer = element->renderEmbeddedObject(); @@ -385,21 +437,9 @@ bool SubframeLoader::loadPlugin(HTMLPlugInImageElement* pluginElement, const KUR if (!renderer || useFallback) return false; - if (!document()->securityOrigin()->canDisplay(url)) { - FrameLoader::reportLocalLoadFailed(m_frame, url.string()); - return false; - } - - if (!document()->contentSecurityPolicy()->allowObjectFromSource(url)) - return false; - - FrameLoader* frameLoader = m_frame->loader(); - if (!frameLoader->checkIfRunInsecureContent(document()->securityOrigin(), url)) - return false; - IntSize contentSize = roundedIntSize(LayoutSize(renderer->contentWidth(), renderer->contentHeight())); bool loadManually = document()->isPluginDocument() && !m_containsPlugins && toPluginDocument(document())->shouldLoadPluginManually(); - RefPtr<Widget> widget = frameLoader->client()->createPlugin(contentSize, + RefPtr<Widget> widget = m_frame->loader()->client()->createPlugin(contentSize, pluginElement, url, paramNames, paramValues, mimeType, loadManually); if (!widget) { diff --git a/Source/WebCore/loader/SubframeLoader.h b/Source/WebCore/loader/SubframeLoader.h index bcc89025d..74a166872 100644 --- a/Source/WebCore/loader/SubframeLoader.h +++ b/Source/WebCore/loader/SubframeLoader.h @@ -88,6 +88,7 @@ private: const Vector<String>& paramNames, const Vector<String>& paramValues, bool useFallback); bool shouldUsePlugin(const KURL&, const String& mimeType, bool shouldPreferPlugInsForImages, bool hasFallback, bool& useFallback); + bool pluginIsLoadable(HTMLPlugInImageElement*, const KURL&, const String& mimeType); Document* document() const; diff --git a/Source/WebCore/loader/SubresourceLoader.cpp b/Source/WebCore/loader/SubresourceLoader.cpp index 34b7065ef..eaf1f5a81 100644 --- a/Source/WebCore/loader/SubresourceLoader.cpp +++ b/Source/WebCore/loader/SubresourceLoader.cpp @@ -36,6 +36,7 @@ #include "FrameLoader.h" #include "Logging.h" #include "MemoryCache.h" +#include "MemoryInstrumentation.h" #include "SecurityOrigin.h" #include "SecurityPolicy.h" #include <wtf/RefCountedLeakCounter.h> @@ -129,6 +130,15 @@ void SubresourceLoader::cancelIfNotFinishing() ResourceLoader::cancel(); } +void SubresourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + ResourceLoader::reportMemoryUsage(memoryObjectInfo); + info.addInstrumentedMember(m_resource); + info.addInstrumentedMember(m_document); + info.addMember(m_requestCountTracker); +} + bool SubresourceLoader::init(const ResourceRequest& request) { if (!ResourceLoader::init(request)) diff --git a/Source/WebCore/loader/SubresourceLoader.h b/Source/WebCore/loader/SubresourceLoader.h index 9f00bf4f4..a2de2cb41 100644 --- a/Source/WebCore/loader/SubresourceLoader.h +++ b/Source/WebCore/loader/SubresourceLoader.h @@ -47,6 +47,8 @@ public: void cancelIfNotFinishing(); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: SubresourceLoader(Frame*, CachedResource*, const ResourceLoaderOptions&); virtual ~SubresourceLoader(); diff --git a/Source/WebCore/loader/SubstituteData.cpp b/Source/WebCore/loader/SubstituteData.cpp new file mode 100644 index 000000000..806bd1d8e --- /dev/null +++ b/Source/WebCore/loader/SubstituteData.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2012 Google Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "config.h" +#include "SubstituteData.h" + +#include "MemoryInstrumentation.h" + +namespace WebCore { + +void SubstituteData::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + info.addInstrumentedMember(m_content); + info.addMember(m_mimeType); + info.addMember(m_textEncoding); + info.addMember(m_failingURL); + info.addMember(m_responseURL); +} + +} diff --git a/Source/WebCore/loader/SubstituteData.h b/Source/WebCore/loader/SubstituteData.h index 0b87b625d..8da894820 100644 --- a/Source/WebCore/loader/SubstituteData.h +++ b/Source/WebCore/loader/SubstituteData.h @@ -34,6 +34,8 @@ namespace WebCore { + class MemoryObjectInfo; + class SubstituteData { public: SubstituteData() { } @@ -54,6 +56,8 @@ namespace WebCore { const String& textEncoding() const { return m_textEncoding; } const KURL& failingURL() const { return m_failingURL; } const KURL& responseURL() const { return m_responseURL; } + + void reportMemoryUsage(MemoryObjectInfo*) const; private: RefPtr<SharedBuffer> m_content; diff --git a/Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp b/Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp index 5d103b2ff..778e4e388 100644 --- a/Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp +++ b/Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp @@ -92,7 +92,7 @@ static unsigned urlHostHash(const KURL& url) unsigned hostStart = url.hostStart(); unsigned hostEnd = url.hostEnd(); - return AlreadyHashed::avoidDeletedValue(StringHasher::computeHash(url.string().characters() + hostStart, hostEnd - hostStart)); + return AlreadyHashed::avoidDeletedValue(StringHasher::computeHashAndMaskTop8Bits(url.string().characters() + hostStart, hostEnd - hostStart)); } ApplicationCacheGroup* ApplicationCacheStorage::loadCacheGroup(const KURL& manifestURL) diff --git a/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp b/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp index cffbef9b3..5567746c3 100644 --- a/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp +++ b/Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp @@ -45,6 +45,7 @@ #include <wtf/CryptographicallyRandomNumber.h> #include <wtf/DateMath.h> +#include <wtf/GregorianDateTime.h> #include <wtf/StdLibExtras.h> #include <wtf/text/Base64.h> #include <wtf/text/StringBuilder.h> @@ -150,9 +151,9 @@ PassRefPtr<SharedBuffer> MHTMLArchive::generateMHTMLData(Page* page, bool useBin String boundary = generateRandomBoundary(); String endOfResourceBoundary = makeString("--", boundary, "\r\n"); - tm localTM; - getCurrentLocalTime(&localTM); - String dateString = makeRFC2822DateString(localTM.tm_wday, localTM.tm_mday, localTM.tm_mon, 1900 + localTM.tm_year, localTM.tm_hour, localTM.tm_min, localTM.tm_sec, calculateUTCOffset() / (1000 * 60)); + GregorianDateTime now; + now.setToCurrentLocalTime(); + String dateString = makeRFC2822DateString(now.weekDay(), now.monthDay(), now.month(), now.year(), now.hour(), now.minute(), now.second(), now.utcOffset() / 60); StringBuilder stringBuilder; stringBuilder.append("From: <Saved by WebKit>\r\n"); diff --git a/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp b/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp index e1fb02cfa..7e44ebc28 100644 --- a/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp +++ b/Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp @@ -32,6 +32,7 @@ #include "CachedStyleSheetClient.h" #include "HTTPParsers.h" #include "MemoryCache.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "StyleSheetContents.h" #include "TextResourceDecoder.h" @@ -58,10 +59,13 @@ CachedCSSStyleSheet::~CachedCSSStyleSheet() void CachedCSSStyleSheet::didAddClient(CachedResourceClient* c) { ASSERT(c->resourceClientType() == CachedStyleSheetClient::expectedType()); + // CachedResource::didAddClient() must be before setCSSStyleSheet(), + // because setCSSStyleSheet() may cause scripts to be executed, which could destroy 'c' if it is an instance of HTMLLinkElement. + // see the comment of HTMLLinkElement::setCSSStyleSheet. + CachedResource::didAddClient(c); + if (!isLoading()) static_cast<CachedStyleSheetClient*>(c)->setCSSStyleSheet(m_resourceRequest.url(), m_response.url(), m_decoder->encoding().name(), this); - - CachedResource::didAddClient(c); } void CachedCSSStyleSheet::setEncoding(const String& chs) @@ -168,6 +172,12 @@ PassRefPtr<StyleSheetContents> CachedCSSStyleSheet::restoreParsedStyleSheet(cons { if (!m_parsedStyleSheetCache) return 0; + if (m_parsedStyleSheetCache->hasFailedOrCanceledSubresources()) { + m_parsedStyleSheetCache->removedFromMemoryCache(); + m_parsedStyleSheetCache.clear(); + return 0; + } + ASSERT(m_parsedStyleSheetCache->isCacheable()); ASSERT(m_parsedStyleSheetCache->isInMemoryCache()); @@ -192,4 +202,13 @@ void CachedCSSStyleSheet::saveParsedStyleSheet(PassRefPtr<StyleSheetContents> sh setDecodedSize(m_parsedStyleSheetCache->estimatedSizeInBytes()); } +void CachedCSSStyleSheet::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceCSS); + CachedResource::reportMemoryUsage(memoryObjectInfo); + info.addMember(m_decoder); + info.addInstrumentedMember(m_parsedStyleSheetCache); + info.addMember(m_decodedSheetText); +} + } diff --git a/Source/WebCore/loader/cache/CachedCSSStyleSheet.h b/Source/WebCore/loader/cache/CachedCSSStyleSheet.h index 9ad6f14ba..434ba4561 100644 --- a/Source/WebCore/loader/cache/CachedCSSStyleSheet.h +++ b/Source/WebCore/loader/cache/CachedCSSStyleSheet.h @@ -32,6 +32,7 @@ namespace WebCore { class CachedResourceClient; + class MemoryObjectInfo; class SharedBuffer; class StyleSheetContents; class TextResourceDecoder; @@ -58,6 +59,8 @@ namespace WebCore { PassRefPtr<StyleSheetContents> restoreParsedStyleSheet(const CSSParserContext&); void saveParsedStyleSheet(PassRefPtr<StyleSheetContents>); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: bool canUseSheet(bool enforceMIMEType, bool* hasValidMIMEType) const; virtual PurgePriority purgePriority() const { return PurgeLast; } diff --git a/Source/WebCore/loader/cache/CachedFont.cpp b/Source/WebCore/loader/cache/CachedFont.cpp index fddd79d47..27ffd9574 100644 --- a/Source/WebCore/loader/cache/CachedFont.cpp +++ b/Source/WebCore/loader/cache/CachedFont.cpp @@ -36,6 +36,7 @@ #include "CachedResourceLoader.h" #include "FontPlatformData.h" #include "MemoryCache.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "TextResourceDecoder.h" #include <wtf/Vector.h> @@ -206,4 +207,16 @@ void CachedFont::error(CachedResource::Status status) checkNotify(); } +void CachedFont::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceFont); + CachedResource::reportMemoryUsage(memoryObjectInfo); +#if ENABLE(SVG_FONTS) + info.addInstrumentedMember(m_externalSVGDocument); +#endif +#ifdef STORE_FONT_CUSTOM_PLATFORM_DATA + info.addMember(m_fontData); +#endif +} + } diff --git a/Source/WebCore/loader/cache/CachedFont.h b/Source/WebCore/loader/cache/CachedFont.h index 3cafc1e50..cff342a25 100644 --- a/Source/WebCore/loader/cache/CachedFont.h +++ b/Source/WebCore/loader/cache/CachedFont.h @@ -70,6 +70,8 @@ public: SVGFontElement* getSVGFontById(const String&) const; #endif + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: FontCustomPlatformData* m_fontData; bool m_loadInitiated; diff --git a/Source/WebCore/loader/cache/CachedImage.cpp b/Source/WebCore/loader/cache/CachedImage.cpp index 313475ce1..72647c6b7 100644 --- a/Source/WebCore/loader/cache/CachedImage.cpp +++ b/Source/WebCore/loader/cache/CachedImage.cpp @@ -25,7 +25,7 @@ #include "CachedImage.h" #include "BitmapImage.h" -#include "MemoryCache.h" +#include "CachedImageClient.h" #include "CachedResourceClient.h" #include "CachedResourceClientWalker.h" #include "CachedResourceLoader.h" @@ -33,6 +33,7 @@ #include "FrameLoaderClient.h" #include "FrameLoaderTypes.h" #include "FrameView.h" +#include "MemoryCache.h" #include "Page.h" #include "RenderObject.h" #include "Settings.h" @@ -467,4 +468,18 @@ void CachedImage::changedInRect(const Image* image, const IntRect& rect) notifyObservers(&rect); } +void CachedImage::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceImage); + CachedResource::reportMemoryUsage(memoryObjectInfo); + if (m_image) { + if (m_image->data()) + info.addRawBuffer(m_image->data(), m_image->data()->size()); + info.addRawBuffer(m_image.get(), decodedSize()); + } +#if ENABLE(SVG) + info.addMember(m_svgImageCache); +#endif +} + } // namespace WebCore diff --git a/Source/WebCore/loader/cache/CachedImage.h b/Source/WebCore/loader/cache/CachedImage.h index b99215173..4865c7e24 100644 --- a/Source/WebCore/loader/cache/CachedImage.h +++ b/Source/WebCore/loader/cache/CachedImage.h @@ -24,7 +24,6 @@ #define CachedImage_h #include "CachedResource.h" -#include "CachedResourceClient.h" #include "SVGImageCache.h" #include "ImageObserver.h" #include "IntRect.h" @@ -32,6 +31,7 @@ namespace WebCore { +class CachedImageClient; class CachedResourceLoader; class FloatSize; class MemoryCache; @@ -93,6 +93,8 @@ public: virtual void animationAdvanced(const Image*); virtual void changedInRect(const Image*, const IntRect&); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: Image* lookupOrCreateImageForRenderer(const RenderObject*); @@ -113,23 +115,6 @@ private: bool m_shouldPaintBrokenImage; }; -class CachedImageClient : public CachedResourceClient { -public: - virtual ~CachedImageClient() { } - static CachedResourceClientType expectedType() { return ImageType; } - virtual CachedResourceClientType resourceClientType() const { return expectedType(); } - - // Called whenever a frame of an image changes, either because we got more data from the network or - // because we are animating. If not null, the IntRect is the changed rect of the image. - virtual void imageChanged(CachedImage*, const IntRect* = 0) { } - - // Called to find out if this client wants to actually display the image. Used to tell when we - // can halt animation. Content nodes that hold image refs for example would not render the image, - // but RenderImages would (assuming they have visibility: visible and their render tree isn't hidden - // e.g., in the b/f cache or in a background tab). - virtual bool willRenderImage(CachedImage*) { return false; } -}; - } #endif diff --git a/Source/WebCore/loader/cache/CachedImageClient.h b/Source/WebCore/loader/cache/CachedImageClient.h new file mode 100644 index 000000000..765cd63fb --- /dev/null +++ b/Source/WebCore/loader/cache/CachedImageClient.h @@ -0,0 +1,52 @@ +/* + Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) + Copyright (C) 2001 Dirk Mueller <mueller@kde.org> + Copyright (C) 2006 Samuel Weinig (sam.weinig@gmail.com) + Copyright (C) 2004, 2005, 2006, 2007 Apple Inc. All rights reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public License + along with this library; see the file COPYING.LIB. If not, write to + the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + Boston, MA 02110-1301, USA. +*/ + +#ifndef CachedImageClient_h +#define CachedImageClient_h + +#include "CachedResourceClient.h" + +namespace WebCore { + +class CachedImage; +class IntRect; + +class CachedImageClient : public CachedResourceClient { +public: + virtual ~CachedImageClient() { } + static CachedResourceClientType expectedType() { return ImageType; } + virtual CachedResourceClientType resourceClientType() const { return expectedType(); } + + // Called whenever a frame of an image changes, either because we got more data from the network or + // because we are animating. If not null, the IntRect is the changed rect of the image. + virtual void imageChanged(CachedImage*, const IntRect* = 0) { } + + // Called to find out if this client wants to actually display the image. Used to tell when we + // can halt animation. Content nodes that hold image refs for example would not render the image, + // but RenderImages would (assuming they have visibility: visible and their render tree isn't hidden + // e.g., in the b/f cache or in a background tab). + virtual bool willRenderImage(CachedImage*) { return false; } +}; + +} + +#endif diff --git a/Source/WebCore/loader/cache/CachedRawResource.cpp b/Source/WebCore/loader/cache/CachedRawResource.cpp index b0a703304..4e43131b1 100644 --- a/Source/WebCore/loader/cache/CachedRawResource.cpp +++ b/Source/WebCore/loader/cache/CachedRawResource.cpp @@ -29,6 +29,7 @@ #include "CachedResourceClient.h" #include "CachedResourceClientWalker.h" #include "CachedResourceLoader.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "SubresourceLoader.h" #include <wtf/PassRefPtr.h> @@ -159,4 +160,11 @@ bool CachedRawResource::canReuse(const ResourceRequest& newRequest) const return true; } +void CachedRawResource::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResource); + CachedResource::reportMemoryUsage(memoryObjectInfo); +} + + } // namespace WebCore diff --git a/Source/WebCore/loader/cache/CachedRawResource.h b/Source/WebCore/loader/cache/CachedRawResource.h index e296ab87e..c349b866a 100644 --- a/Source/WebCore/loader/cache/CachedRawResource.h +++ b/Source/WebCore/loader/cache/CachedRawResource.h @@ -29,6 +29,7 @@ namespace WebCore { class CachedRawResourceCallback; class CachedRawResourceClient; +class MemoryObjectInfo; class CachedRawResource : public CachedResource { public: @@ -44,6 +45,8 @@ public: bool canReuse(const ResourceRequest&) const; + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: virtual void didAddClient(CachedResourceClient*); virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived); diff --git a/Source/WebCore/loader/cache/CachedResource.cpp b/Source/WebCore/loader/cache/CachedResource.cpp index 41cd60189..c619ddad6 100755 --- a/Source/WebCore/loader/cache/CachedResource.cpp +++ b/Source/WebCore/loader/cache/CachedResource.cpp @@ -37,6 +37,7 @@ #include "InspectorInstrumentation.h" #include "KURL.h" #include "Logging.h" +#include "MemoryInstrumentation.h" #include "PurgeableBuffer.h" #include "ResourceHandle.h" #include "ResourceLoadScheduler.h" @@ -800,4 +801,27 @@ void CachedResource::CachedResourceCallback::timerFired(Timer<CachedResourceCall m_resource->didAddClient(m_client); } +void CachedResource::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResource); + info.addMember(m_resourceRequest); + info.addHashSet(m_clients); + info.addMember(m_accept); + info.addInstrumentedMember(m_loader); + info.addMember(m_response); + info.addInstrumentedMember(m_data); + info.addMember(m_cachedMetadata.get()); + info.addInstrumentedMember(m_nextInAllResourcesList); + info.addInstrumentedMember(m_prevInAllResourcesList); + info.addInstrumentedMember(m_nextInLiveResourcesList); + info.addInstrumentedMember(m_prevInLiveResourcesList); + info.addInstrumentedMember(m_owningCachedResourceLoader); + info.addInstrumentedMember(m_resourceToRevalidate); + info.addInstrumentedMember(m_proxyResource); + info.addInstrumentedHashSet(m_handlesToRevalidate); + + if (m_purgeableData && !m_purgeableData->wasPurged()) + info.addRawBuffer(m_purgeableData.get(), m_purgeableData->size()); +} + } diff --git a/Source/WebCore/loader/cache/CachedResource.h b/Source/WebCore/loader/cache/CachedResource.h index fe3e1fc63..f61ad5834 100644 --- a/Source/WebCore/loader/cache/CachedResource.h +++ b/Source/WebCore/loader/cache/CachedResource.h @@ -47,6 +47,7 @@ class CachedResourceHandleBase; class CachedResourceLoader; class Frame; class InspectorResource; +class MemoryObjectInfo; class PurgeableBuffer; class SecurityOrigin; class SubresourceLoader; @@ -205,6 +206,7 @@ public: bool wasCanceled() const { return m_status == Canceled; } bool errorOccurred() const { return (m_status == LoadError || m_status == DecodeError); } + bool loadFailedOrCanceled() { return m_status == Canceled || m_status == LoadError; } bool sendResourceLoadCallbacks() const { return m_options.sendLoadCallbacks == SendCallbacks; } @@ -249,6 +251,8 @@ public: void setLoadFinishTime(double finishTime) { m_loadFinishTime = finishTime; } double loadFinishTime() const { return m_loadFinishTime; } + virtual void reportMemoryUsage(MemoryObjectInfo*) const; + protected: void checkNotify(); diff --git a/Source/WebCore/loader/cache/CachedResourceHandle.cpp b/Source/WebCore/loader/cache/CachedResourceHandle.cpp index 871292c62..ea1631814 100644 --- a/Source/WebCore/loader/cache/CachedResourceHandle.cpp +++ b/Source/WebCore/loader/cache/CachedResourceHandle.cpp @@ -26,6 +26,8 @@ #include "config.h" #include "CachedResourceHandle.h" +#include "MemoryInstrumentation.h" + namespace WebCore { void CachedResourceHandleBase::setResource(CachedResource* resource) @@ -39,4 +41,11 @@ void CachedResourceHandleBase::setResource(CachedResource* resource) m_resource->registerHandle(this); } +void CachedResourceHandleBase::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResource); + info.addInstrumentedMember(m_resource); +} + + } diff --git a/Source/WebCore/loader/cache/CachedResourceHandle.h b/Source/WebCore/loader/cache/CachedResourceHandle.h index 95cd0ff7f..15d44c757 100644 --- a/Source/WebCore/loader/cache/CachedResourceHandle.h +++ b/Source/WebCore/loader/cache/CachedResourceHandle.h @@ -30,6 +30,8 @@ namespace WebCore { +class MemoryObjectInfo; + class CachedResourceHandleBase { public: ~CachedResourceHandleBase() { if (m_resource) m_resource->unregisterHandle(this); } @@ -41,6 +43,8 @@ namespace WebCore { typedef CachedResource* CachedResourceHandleBase::*UnspecifiedBoolType; operator UnspecifiedBoolType() const { return m_resource ? &CachedResourceHandleBase::m_resource : 0; } + void reportMemoryUsage(MemoryObjectInfo*) const; + protected: CachedResourceHandleBase() : m_resource(0) {} CachedResourceHandleBase(CachedResource* res) { m_resource = res; if (m_resource) m_resource->registerHandle(this); } diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.cpp b/Source/WebCore/loader/cache/CachedResourceLoader.cpp index 9a88724a1..69ffb928f 100644 --- a/Source/WebCore/loader/cache/CachedResourceLoader.cpp +++ b/Source/WebCore/loader/cache/CachedResourceLoader.cpp @@ -877,5 +877,19 @@ void CachedResourceLoader::printPreloadStats() printf("IMAGES: %d (%d hits, hit rate %d%%)\n", images, images - imageMisses, (images - imageMisses) * 100 / images); } #endif - + +void CachedResourceLoader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::Loader); + info.addHashMap(m_documentResources); + for (DocumentResourceMap::const_iterator i = m_documentResources.begin(); i != m_documentResources.end(); ++i) { + info.addMember(i->first); + info.addInstrumentedMember(i->second); + } + info.addHashSet(m_validatedURLs); + if (m_preloads) + info.addListHashSet(*m_preloads); + info.addMember(m_pendingPreloads); +} + } diff --git a/Source/WebCore/loader/cache/CachedResourceLoader.h b/Source/WebCore/loader/cache/CachedResourceLoader.h index 5eeb3871f..3f1c233b0 100644 --- a/Source/WebCore/loader/cache/CachedResourceLoader.h +++ b/Source/WebCore/loader/cache/CachedResourceLoader.h @@ -52,6 +52,7 @@ class Document; class Frame; class ImageLoader; class KURL; +class MemoryObjectInfo; // The CachedResourceLoader manages the loading of scripts/images/stylesheets for a single document. class CachedResourceLoader { @@ -119,6 +120,8 @@ public: void printPreloadStats(); bool canRequest(CachedResource::Type, const KURL&, bool forPreload = false); + void reportMemoryUsage(MemoryObjectInfo*) const; + private: CachedResourceHandle<CachedResource> requestResource(CachedResource::Type, ResourceRequest&, const String& charset, const ResourceLoaderOptions&, ResourceLoadPriority = ResourceLoadPriorityUnresolved, bool isPreload = false); CachedResourceHandle<CachedResource> revalidateResource(CachedResource*, ResourceLoadPriority, const ResourceLoaderOptions&); diff --git a/Source/WebCore/loader/cache/CachedSVGDocument.cpp b/Source/WebCore/loader/cache/CachedSVGDocument.cpp index f03fadb57..423008e8b 100644 --- a/Source/WebCore/loader/cache/CachedSVGDocument.cpp +++ b/Source/WebCore/loader/cache/CachedSVGDocument.cpp @@ -71,6 +71,14 @@ void CachedSVGDocument::data(PassRefPtr<SharedBuffer> data, bool allDataReceived checkNotify(); } +void CachedSVGDocument::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceSVG); + CachedResource::reportMemoryUsage(memoryObjectInfo); + info.addInstrumentedMember(m_document); + info.addMember(m_decoder); +} + } #endif diff --git a/Source/WebCore/loader/cache/CachedSVGDocument.h b/Source/WebCore/loader/cache/CachedSVGDocument.h index b05ef67d1..54d5a8881 100644 --- a/Source/WebCore/loader/cache/CachedSVGDocument.h +++ b/Source/WebCore/loader/cache/CachedSVGDocument.h @@ -43,6 +43,8 @@ public: virtual String encoding() const; virtual void data(PassRefPtr<SharedBuffer> data, bool allDataReceived); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + protected: RefPtr<SVGDocument> m_document; RefPtr<TextResourceDecoder> m_decoder; diff --git a/Source/WebCore/loader/cache/CachedScript.cpp b/Source/WebCore/loader/cache/CachedScript.cpp index a2da74489..7e7f26905 100644 --- a/Source/WebCore/loader/cache/CachedScript.cpp +++ b/Source/WebCore/loader/cache/CachedScript.cpp @@ -30,6 +30,7 @@ #include "MemoryCache.h" #include "CachedResourceClient.h" #include "CachedResourceClientWalker.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "TextResourceDecoder.h" #include <wtf/Vector.h> @@ -71,7 +72,7 @@ const String& CachedScript::script() if (!m_script && m_data) { m_script = m_decoder->decode(m_data->data(), encodedSize()); m_script += m_decoder->flush(); - setDecodedSize(m_script.length() * sizeof(UChar)); + setDecodedSize(m_script.sizeInBytes()); } m_decodedDataDeletionTimer.startOneShot(0); @@ -126,4 +127,15 @@ void CachedScript::sourceProviderCacheSizeChanged(int delta) } #endif +void CachedScript::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceScript); + CachedResource::reportMemoryUsage(memoryObjectInfo); + info.addMember(m_script); + info.addMember(m_decoder); +#if USE(JSC) + info.addMember(m_sourceProviderCache); +#endif +} + } // namespace WebCore diff --git a/Source/WebCore/loader/cache/CachedScript.h b/Source/WebCore/loader/cache/CachedScript.h index 9a4f38ad0..3df6be938 100644 --- a/Source/WebCore/loader/cache/CachedScript.h +++ b/Source/WebCore/loader/cache/CachedScript.h @@ -37,6 +37,7 @@ namespace JSC { namespace WebCore { class CachedResourceLoader; + class MemoryObjectInfo; class TextResourceDecoder; class CachedScript : public CachedResource { @@ -57,6 +58,9 @@ namespace WebCore { JSC::SourceProviderCache* sourceProviderCache() const; void sourceProviderCacheSizeChanged(int delta); #endif + + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: virtual PurgePriority purgePriority() const { return PurgeLast; } diff --git a/Source/WebCore/loader/cache/CachedShader.cpp b/Source/WebCore/loader/cache/CachedShader.cpp index b8d7c5f9a..72eb5c053 100644 --- a/Source/WebCore/loader/cache/CachedShader.cpp +++ b/Source/WebCore/loader/cache/CachedShader.cpp @@ -32,6 +32,7 @@ #if ENABLE(CSS_SHADERS) #include "CachedShader.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "TextResourceDecoder.h" #include <wtf/text/StringBuilder.h> @@ -67,6 +68,14 @@ void CachedShader::data(PassRefPtr<SharedBuffer> data, bool allDataReceived) CachedResource::data(data, allDataReceived); } +void CachedShader::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceShader); + CachedResource::reportMemoryUsage(memoryObjectInfo); + info.addMember(m_decoder); + info.addMember(m_shaderString); +} + } // namespace WebCore #endif // ENABLE(CSS_SHADERS) diff --git a/Source/WebCore/loader/cache/CachedShader.h b/Source/WebCore/loader/cache/CachedShader.h index d1de14d77..4286770ad 100644 --- a/Source/WebCore/loader/cache/CachedShader.h +++ b/Source/WebCore/loader/cache/CachedShader.h @@ -36,6 +36,7 @@ namespace WebCore { +class MemoryObjectInfo; class TextResourceDecoder; class CachedShader : public CachedResource { @@ -46,6 +47,8 @@ public: const String& shaderString(); void data(PassRefPtr<SharedBuffer>, bool allDataReceived); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + private: RefPtr<TextResourceDecoder> m_decoder; String m_shaderString; diff --git a/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp b/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp index 336fce4ac..d14d5f2a3 100644 --- a/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp +++ b/Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp @@ -29,6 +29,7 @@ #include "CachedResourceClientWalker.h" #include "CachedStyleSheetClient.h" +#include "MemoryInstrumentation.h" #include "SharedBuffer.h" #include "TextResourceDecoder.h" #include <wtf/Vector.h> @@ -96,6 +97,14 @@ void CachedXSLStyleSheet::error(CachedResource::Status status) checkNotify(); } +void CachedXSLStyleSheet::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::CachedResourceXSLT); + CachedResource::reportMemoryUsage(memoryObjectInfo); + info.addMember(m_sheet); + info.addMember(m_decoder); +} + #endif } diff --git a/Source/WebCore/loader/cache/CachedXSLStyleSheet.h b/Source/WebCore/loader/cache/CachedXSLStyleSheet.h index b8f7283d3..2aa8dfa25 100644 --- a/Source/WebCore/loader/cache/CachedXSLStyleSheet.h +++ b/Source/WebCore/loader/cache/CachedXSLStyleSheet.h @@ -32,6 +32,7 @@ namespace WebCore { class CachedResourceLoader; + class MemoryObjectInfo; class TextResourceDecoder; #if ENABLE(XSLT) @@ -50,6 +51,8 @@ namespace WebCore { void checkNotify(); + virtual void reportMemoryUsage(MemoryObjectInfo*) const OVERRIDE; + protected: String m_sheet; RefPtr<TextResourceDecoder> m_decoder; diff --git a/Source/WebCore/loader/cache/MemoryCache.cpp b/Source/WebCore/loader/cache/MemoryCache.cpp index 5dc047402..50f45cd12 100644 --- a/Source/WebCore/loader/cache/MemoryCache.cpp +++ b/Source/WebCore/loader/cache/MemoryCache.cpp @@ -36,6 +36,7 @@ #include "FrameView.h" #include "Image.h" #include "Logging.h" +#include "MemoryInstrumentation.h" #include "ResourceHandle.h" #include "SecurityOrigin.h" #include "SecurityOriginHash.h" @@ -714,6 +715,19 @@ MemoryCache::Statistics MemoryCache::getStatistics() return stats; } +void MemoryCache::reportMemoryUsage(MemoryObjectInfo* memoryObjectInfo) const +{ + MemoryClassInfo info(memoryObjectInfo, this, MemoryInstrumentation::MemoryCacheStructures); + info.addHashMap(m_resources); + CachedResourceMap::const_iterator e = m_resources.end(); + for (CachedResourceMap::const_iterator i = m_resources.begin(); i != e; ++i) { + info.addMember(i->first); + info.addInstrumentedMember(i->second); + } + info.addVector(m_allResources); + info.addMember(m_liveDecodedResources); +} + void MemoryCache::setDisabled(bool disabled) { m_disabled = disabled; diff --git a/Source/WebCore/loader/cache/MemoryCache.h b/Source/WebCore/loader/cache/MemoryCache.h index 6f9832662..5a2f9495e 100644 --- a/Source/WebCore/loader/cache/MemoryCache.h +++ b/Source/WebCore/loader/cache/MemoryCache.h @@ -39,6 +39,7 @@ class CachedCSSStyleSheet; class CachedResource; class CachedResourceLoader; class KURL; +class MemoryObjectInfo; class ScriptExecutionContext; class SecurityOrigin; struct SecurityOriginHash; @@ -168,6 +169,8 @@ public: unsigned liveSize() const { return m_liveSize; } unsigned deadSize() const { return m_deadSize; } + void reportMemoryUsage(MemoryObjectInfo*) const; + private: MemoryCache(); ~MemoryCache(); // Not implemented to make sure nobody accidentally calls delete -- WebCore does not delete singletons. |