summaryrefslogtreecommitdiff
path: root/Source/WebCore/loader
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@nokia.com>2012-08-12 09:27:39 +0200
committerSimon Hausmann <simon.hausmann@nokia.com>2012-08-12 09:27:39 +0200
commit3749d61e1f7a59f5ec5067e560af1eb610c82015 (patch)
tree73dc228333948738bbe02976cacca8cd382bc978 /Source/WebCore/loader
parentb32b4dcd9a51ab8de6afc53d9e17f8707e1f7a5e (diff)
downloadqtwebkit-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')
-rw-r--r--Source/WebCore/loader/DocumentLoader.cpp8
-rw-r--r--Source/WebCore/loader/EmptyClients.cpp3
-rw-r--r--Source/WebCore/loader/FrameLoader.cpp8
-rw-r--r--Source/WebCore/loader/ImageLoader.h1
-rw-r--r--Source/WebCore/loader/MainResourceLoader.cpp9
-rw-r--r--Source/WebCore/loader/MainResourceLoader.h2
-rw-r--r--Source/WebCore/loader/ResourceLoader.cpp2
-rw-r--r--Source/WebCore/loader/SubframeLoader.cpp104
-rw-r--r--Source/WebCore/loader/SubframeLoader.h1
-rw-r--r--Source/WebCore/loader/SubresourceLoader.cpp10
-rw-r--r--Source/WebCore/loader/SubresourceLoader.h2
-rw-r--r--Source/WebCore/loader/SubstituteData.cpp48
-rw-r--r--Source/WebCore/loader/SubstituteData.h4
-rw-r--r--Source/WebCore/loader/appcache/ApplicationCacheStorage.cpp2
-rw-r--r--Source/WebCore/loader/archive/mhtml/MHTMLArchive.cpp7
-rw-r--r--Source/WebCore/loader/cache/CachedCSSStyleSheet.cpp23
-rw-r--r--Source/WebCore/loader/cache/CachedCSSStyleSheet.h3
-rw-r--r--Source/WebCore/loader/cache/CachedFont.cpp13
-rw-r--r--Source/WebCore/loader/cache/CachedFont.h2
-rw-r--r--Source/WebCore/loader/cache/CachedImage.cpp17
-rw-r--r--Source/WebCore/loader/cache/CachedImage.h21
-rw-r--r--Source/WebCore/loader/cache/CachedImageClient.h52
-rw-r--r--Source/WebCore/loader/cache/CachedRawResource.cpp8
-rw-r--r--Source/WebCore/loader/cache/CachedRawResource.h3
-rwxr-xr-xSource/WebCore/loader/cache/CachedResource.cpp24
-rw-r--r--Source/WebCore/loader/cache/CachedResource.h4
-rw-r--r--Source/WebCore/loader/cache/CachedResourceHandle.cpp9
-rw-r--r--Source/WebCore/loader/cache/CachedResourceHandle.h4
-rw-r--r--Source/WebCore/loader/cache/CachedResourceLoader.cpp16
-rw-r--r--Source/WebCore/loader/cache/CachedResourceLoader.h3
-rw-r--r--Source/WebCore/loader/cache/CachedSVGDocument.cpp8
-rw-r--r--Source/WebCore/loader/cache/CachedSVGDocument.h2
-rw-r--r--Source/WebCore/loader/cache/CachedScript.cpp14
-rw-r--r--Source/WebCore/loader/cache/CachedScript.h4
-rw-r--r--Source/WebCore/loader/cache/CachedShader.cpp9
-rw-r--r--Source/WebCore/loader/cache/CachedShader.h3
-rw-r--r--Source/WebCore/loader/cache/CachedXSLStyleSheet.cpp9
-rw-r--r--Source/WebCore/loader/cache/CachedXSLStyleSheet.h3
-rw-r--r--Source/WebCore/loader/cache/MemoryCache.cpp14
-rw-r--r--Source/WebCore/loader/cache/MemoryCache.h3
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.