summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpicksi <picksi@google.com>2016-02-03 05:50:23 -0800
committerCommit bot <commit-bot@chromium.org>2016-02-03 13:51:22 +0000
commit783c4ec025ab4ed46d0cf2f8a1acde990928e39d (patch)
tree4e24e077badc63fb6037cfabd6d1582ca5314b37
parent36b4e445347aab5b32b5f7fa39b2199ddb85968c (diff)
downloadchromium_src-783c4ec025ab4ed46d0cf2f8a1acde990928e39d.zip
chromium_src-783c4ec025ab4ed46d0cf2f8a1acde990928e39d.tar.gz
chromium_src-783c4ec025ab4ed46d0cf2f8a1acde990928e39d.tar.bz2
Revert of Make Resource RefCountedWillBeGarbageCollectedFinalized (patchset #28 id:520001 of https://codereview.chromium.org/1423033012/ )
Reason for revert: Perf sheriffing. This CL looks like it causes multiple failures during sign in to Facebook. Original issue's description: > Make Resource RefCountedWillBeGarbageCollectedFinalized > > Resource's lifetime is currently managed by an unholy mix of > factors that would ideally be represented in a more canonical > way. Historically, some of this was necessary, and it was > glossed over because of ResourcePtr which, in addition to > keeping the Resource alive, performed a key part of > revalidation handling in the case of a 304. Now that > ResourcePtr's revalidation behavior has been removed, > standardize Resource's lifetime management. > > BUG=571190 > > Committed: https://crrev.com/078b8da5052922b9d4ab7b7f9294a8050bdc3286 > Cr-Commit-Position: refs/heads/master@{#373046} TBR=mkwst@chromium.org,sigbjornf@opera.com,haraken@chromium.org,peria@chromium.org,dgozman@chromium.org,yhirano@chromium.org,keishi@chromium.org,japhet@chromium.org # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true BUG=571190 Review URL: https://codereview.chromium.org/1661823003 Cr-Commit-Position: refs/heads/master@{#373227}
-rw-r--r--third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.cpp5
-rw-r--r--third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.h6
-rw-r--r--third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp6
-rw-r--r--third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp10
-rw-r--r--third_party/WebKit/Source/core/clipboard/DataTransfer.cpp3
-rw-r--r--third_party/WebKit/Source/core/clipboard/DataTransfer.h3
-rw-r--r--third_party/WebKit/Source/core/core.gypi2
-rw-r--r--third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp14
-rw-r--r--third_party/WebKit/Source/core/css/CSSCrossfadeValue.h5
-rw-r--r--third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp12
-rw-r--r--third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h31
-rw-r--r--third_party/WebKit/Source/core/css/CSSImageSetValue.cpp2
-rw-r--r--third_party/WebKit/Source/core/css/CSSImageValue.cpp2
-rw-r--r--third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h9
-rw-r--r--third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp4
-rw-r--r--third_party/WebKit/Source/core/css/FontFace.cpp4
-rw-r--r--third_party/WebKit/Source/core/css/FontLoader.cpp27
-rw-r--r--third_party/WebKit/Source/core/css/FontLoader.h3
-rw-r--r--third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp4
-rw-r--r--third_party/WebKit/Source/core/css/RemoteFontFaceSource.h5
-rw-r--r--third_party/WebKit/Source/core/css/StyleRuleImport.cpp12
-rw-r--r--third_party/WebKit/Source/core/css/StyleRuleImport.h6
-rw-r--r--third_party/WebKit/Source/core/dom/PendingScript.h2
-rw-r--r--third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp2
-rw-r--r--third_party/WebKit/Source/core/dom/ScriptLoader.cpp4
-rw-r--r--third_party/WebKit/Source/core/dom/ScriptLoader.h5
-rw-r--r--third_party/WebKit/Source/core/dom/ScriptRunner.h1
-rw-r--r--third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp9
-rw-r--r--third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h11
-rw-r--r--third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp97
-rw-r--r--third_party/WebKit/Source/core/fetch/DocumentResource.cpp2
-rw-r--r--third_party/WebKit/Source/core/fetch/DocumentResource.h9
-rw-r--r--third_party/WebKit/Source/core/fetch/DocumentResourceReference.h3
-rw-r--r--third_party/WebKit/Source/core/fetch/FontResource.cpp2
-rw-r--r--third_party/WebKit/Source/core/fetch/FontResource.h11
-rw-r--r--third_party/WebKit/Source/core/fetch/ImageResource.cpp4
-rw-r--r--third_party/WebKit/Source/core/fetch/ImageResource.h24
-rw-r--r--third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp9
-rw-r--r--third_party/WebKit/Source/core/fetch/LinkFetchResource.cpp2
-rw-r--r--third_party/WebKit/Source/core/fetch/LinkFetchResource.h7
-rw-r--r--third_party/WebKit/Source/core/fetch/MemoryCache.cpp78
-rw-r--r--third_party/WebKit/Source/core/fetch/MemoryCache.h14
-rw-r--r--third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp214
-rw-r--r--third_party/WebKit/Source/core/fetch/MockImageResourceClient.cpp3
-rw-r--r--third_party/WebKit/Source/core/fetch/MockImageResourceClient.h7
-rw-r--r--third_party/WebKit/Source/core/fetch/RawResource.cpp30
-rw-r--r--third_party/WebKit/Source/core/fetch/RawResource.h29
-rw-r--r--third_party/WebKit/Source/core/fetch/RawResourceTest.cpp13
-rw-r--r--third_party/WebKit/Source/core/fetch/Resource.cpp115
-rw-r--r--third_party/WebKit/Source/core/fetch/Resource.h68
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp28
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceFetcher.h18
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp31
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceLoader.cpp40
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceLoader.h4
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceOwner.h21
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourcePtr.cpp41
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourcePtr.h122
-rw-r--r--third_party/WebKit/Source/core/fetch/ResourceTest.cpp3
-rw-r--r--third_party/WebKit/Source/core/fetch/ScriptResource.cpp6
-rw-r--r--third_party/WebKit/Source/core/fetch/ScriptResource.h13
-rw-r--r--third_party/WebKit/Source/core/fetch/TextResource.h2
-rw-r--r--third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp6
-rw-r--r--third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h9
-rw-r--r--third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp16
-rw-r--r--third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp5
-rw-r--r--third_party/WebKit/Source/core/html/HTMLImageElement.cpp4
-rw-r--r--third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp2
-rw-r--r--third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h2
-rw-r--r--third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp2
-rw-r--r--third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp2
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp4
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl2
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp2
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp11
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h2
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp6
-rw-r--r--third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.h4
-rw-r--r--third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp2
-rw-r--r--third_party/WebKit/Source/core/inspector/NetworkResourcesData.h4
-rw-r--r--third_party/WebKit/Source/core/layout/LayoutImageResource.h5
-rw-r--r--third_party/WebKit/Source/core/layout/LayoutImageResourceStyleImage.cpp3
-rw-r--r--third_party/WebKit/Source/core/loader/DocumentLoader.cpp8
-rw-r--r--third_party/WebKit/Source/core/loader/DocumentLoader.h5
-rw-r--r--third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp2
-rw-r--r--third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h8
-rw-r--r--third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp2
-rw-r--r--third_party/WebKit/Source/core/loader/ImageLoader.cpp10
-rw-r--r--third_party/WebKit/Source/core/loader/ImageLoader.h3
-rw-r--r--third_party/WebKit/Source/core/loader/LinkLoader.cpp14
-rw-r--r--third_party/WebKit/Source/core/loader/LinkLoader.h2
-rw-r--r--third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp2
-rw-r--r--third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h2
-rw-r--r--third_party/WebKit/Source/core/style/StyleFetchedImage.cpp2
-rw-r--r--third_party/WebKit/Source/core/style/StyleFetchedImage.h3
-rw-r--r--third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp2
-rw-r--r--third_party/WebKit/Source/core/style/StyleFetchedImageSet.h3
-rw-r--r--third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp5
-rw-r--r--third_party/WebKit/Source/core/svg/SVGFEImageElement.h3
-rw-r--r--third_party/WebKit/Source/core/svg/SVGUseElement.cpp16
-rw-r--r--third_party/WebKit/Source/core/svg/SVGUseElement.h7
-rw-r--r--third_party/WebKit/Source/core/xml/XSLImportRule.cpp2
-rw-r--r--third_party/WebKit/Source/core/xml/XSLImportRule.h1
-rw-r--r--third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp2
-rw-r--r--third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp16
-rw-r--r--third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h3
-rw-r--r--third_party/WebKit/Source/web/tests/WebFrameTest.cpp10
107 files changed, 892 insertions, 613 deletions
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.cpp
index bc41b08..dfb6423 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.cpp
@@ -7,7 +7,8 @@
namespace blink {
ScriptSourceCode::ScriptSourceCode()
- : m_startPosition(TextPosition::minimumPosition())
+ : m_resource(0)
+ , m_startPosition(TextPosition::minimumPosition())
{
}
@@ -18,6 +19,7 @@ ScriptSourceCode::ScriptSourceCode(const String& source, const KURL& url, const
ScriptSourceCode::ScriptSourceCode(const CompressibleString& source, const KURL& url, const TextPosition& startPosition)
: m_source(source)
+ , m_resource(0)
, m_url(url)
, m_startPosition(startPosition)
{
@@ -49,7 +51,6 @@ ScriptSourceCode::~ScriptSourceCode()
DEFINE_TRACE(ScriptSourceCode)
{
- visitor->trace(m_resource);
visitor->trace(m_streamer);
}
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.h b/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.h
index 0cc57e4..0d4056e 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.h
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptSourceCode.h
@@ -33,6 +33,7 @@
#include "bindings/core/v8/ScriptStreamer.h"
#include "core/CoreExport.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/ScriptResource.h"
#include "platform/heap/Handle.h"
#include "platform/weborigin/KURL.h"
@@ -41,6 +42,9 @@
namespace blink {
+template <class R> class ResourcePtr;
+class ScriptResource;
+
class CORE_EXPORT ScriptSourceCode final {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
public:
@@ -74,7 +78,7 @@ private:
void treatNullSourceAsEmpty();
CompressibleString m_source;
- RefPtrWillBeMember<ScriptResource> m_resource;
+ ResourcePtr<ScriptResource> m_resource;
RefPtrWillBeMember<ScriptStreamer> m_streamer;
mutable KURL m_url;
TextPosition m_startPosition;
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
index 7317c68..4056578 100644
--- a/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/ScriptStreamerTest.cpp
@@ -32,7 +32,7 @@ public:
, m_scope(v8::Isolate::GetCurrent())
, m_settings(Settings::create())
, m_resourceRequest("http://www.streaming-test.com/")
- , m_resource(ScriptResource::create(m_resourceRequest, "UTF-8"))
+ , m_resource(new ScriptResource(m_resourceRequest, "UTF-8"))
, m_pendingScript(PendingScript::create(0, m_resource.get()))
{
m_resource->setLoading(true);
@@ -89,7 +89,7 @@ protected:
// fetch any data outside the test; the test controls the data by calling
// ScriptResource::appendData.
ResourceRequest m_resourceRequest;
- RefPtrWillBePersistent<ScriptResource> m_resource;
+ ResourcePtr<ScriptResource> m_resource;
OwnPtrWillBePersistent<PendingScript> m_pendingScript;
};
@@ -194,7 +194,7 @@ TEST_F(ScriptStreamingTest, CancellingStreaming)
pendingScript()->stopWatchingForLoad(&client);
pendingScript()->releaseElementAndClear();
m_pendingScript = nullptr; // This will destroy m_resource.
- m_resource = nullptr;
+ m_resource = 0;
// The V8 side will complete too. This should not crash. We don't receive
// any results from the streaming and the client doesn't get notified.
diff --git a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp
index a974e8b..1cf157a 100644
--- a/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp
+++ b/third_party/WebKit/Source/bindings/core/v8/V8ScriptRunnerTest.cpp
@@ -73,13 +73,13 @@ public:
void setEmptyResource()
{
m_resourceRequest = ResourceRequest();
- m_resource = ScriptResource::create(m_resourceRequest, "UTF-8");
+ m_resource = new ScriptResource(m_resourceRequest, "UTF-8");
}
void setResource()
{
m_resourceRequest = ResourceRequest(url());
- m_resource = ScriptResource::create(m_resourceRequest, "UTF-8");
+ m_resource = new ScriptResource(m_resourceRequest, "UTF-8");
}
CachedMetadataHandler* cacheHandler()
@@ -89,7 +89,7 @@ public:
protected:
ResourceRequest m_resourceRequest;
- RefPtrWillBePersistent<ScriptResource> m_resource;
+ ResourcePtr<ScriptResource> m_resource;
V8TestingScope m_scope;
static int counter;
@@ -118,7 +118,7 @@ TEST_F(V8ScriptRunnerTest, parseOption)
EXPECT_FALSE(cacheHandler()->cachedMetadata(tagForCodeCache(cacheHandler())));
// The cached data is associated with the encoding.
ResourceRequest request(url());
- RefPtrWillBeRawPtr<ScriptResource> anotherResource = ScriptResource::create(request, "UTF-16");
+ ResourcePtr<ScriptResource> anotherResource = new ScriptResource(request, "UTF-16");
EXPECT_FALSE(cacheHandler()->cachedMetadata(tagForParserCache(anotherResource->cacheHandler())));
}
@@ -134,7 +134,7 @@ TEST_F(V8ScriptRunnerTest, codeOption)
EXPECT_TRUE(cacheHandler()->cachedMetadata(tagForCodeCache(cacheHandler())));
// The cached data is associated with the encoding.
ResourceRequest request(url());
- RefPtrWillBeRawPtr<ScriptResource> anotherResource = ScriptResource::create(request, "UTF-16");
+ ResourcePtr<ScriptResource> anotherResource = new ScriptResource(request, "UTF-16");
EXPECT_FALSE(cacheHandler()->cachedMetadata(tagForCodeCache(anotherResource->cacheHandler())));
}
diff --git a/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp b/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp
index 3b01ec0..8e1e9c1 100644
--- a/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp
+++ b/third_party/WebKit/Source/core/clipboard/DataTransfer.cpp
@@ -230,7 +230,7 @@ void DataTransfer::clearDragImage()
if (!canSetDragImage())
return;
- m_dragImage = nullptr;
+ m_dragImage = 0;
m_dragLoc = IntPoint();
m_dragImageElement = nullptr;
}
@@ -513,7 +513,6 @@ String convertDragOperationToDropZoneOperation(DragOperation operation)
DEFINE_TRACE(DataTransfer)
{
visitor->trace(m_dataObject);
- visitor->trace(m_dragImage);
#if ENABLE(OILPAN)
visitor->trace(m_dragImageElement);
#endif
diff --git a/third_party/WebKit/Source/core/clipboard/DataTransfer.h b/third_party/WebKit/Source/core/clipboard/DataTransfer.h
index c36b790..ff489c30 100644
--- a/third_party/WebKit/Source/core/clipboard/DataTransfer.h
+++ b/third_party/WebKit/Source/core/clipboard/DataTransfer.h
@@ -28,6 +28,7 @@
#include "core/CoreExport.h"
#include "core/clipboard/DataTransferAccessPolicy.h"
#include "core/fetch/ImageResource.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/page/DragActions.h"
#include "platform/geometry/IntPoint.h"
#include "platform/heap/Handle.h"
@@ -130,7 +131,7 @@ private:
Member<DataObject> m_dataObject;
IntPoint m_dragLoc;
- RefPtrWillBeMember<ImageResource> m_dragImage;
+ ResourcePtr<ImageResource> m_dragImage;
RefPtrWillBeMember<Node> m_dragImageElement;
};
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi
index 0e51588..a3600e9 100644
--- a/third_party/WebKit/Source/core/core.gypi
+++ b/third_party/WebKit/Source/core/core.gypi
@@ -1581,6 +1581,8 @@
'fetch/ResourceLoaderOptions.h',
'fetch/ResourceLoaderSet.cpp',
'fetch/ResourceLoaderSet.h',
+ 'fetch/ResourcePtr.cpp',
+ 'fetch/ResourcePtr.h',
'fetch/ScriptResource.cpp',
'fetch/ScriptResource.h',
'fetch/SubstituteData.h',
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
index f852653..ec59447 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.cpp
@@ -125,14 +125,10 @@ CSSCrossfadeValue::~CSSCrossfadeValue()
void CSSCrossfadeValue::dispose()
{
- if (m_cachedFromImage) {
+ if (m_cachedFromImage)
m_cachedFromImage->removeClient(&m_crossfadeSubimageObserver);
- m_cachedFromImage = nullptr;
- }
- if (m_cachedToImage) {
+ if (m_cachedToImage)
m_cachedToImage->removeClient(&m_crossfadeSubimageObserver);
- m_cachedToImage = nullptr;
- }
}
String CSSCrossfadeValue::customCSSText() const
@@ -194,8 +190,8 @@ bool CSSCrossfadeValue::knownToBeOpaque(const LayoutObject* layoutObject) const
void CSSCrossfadeValue::loadSubimages(Document* document)
{
- RefPtrWillBeRawPtr<ImageResource> oldCachedFromImage = m_cachedFromImage;
- RefPtrWillBeRawPtr<ImageResource> oldCachedToImage = m_cachedToImage;
+ ResourcePtr<ImageResource> oldCachedFromImage = m_cachedFromImage;
+ ResourcePtr<ImageResource> oldCachedToImage = m_cachedToImage;
m_cachedFromImage = cachedImageForCSSValue(m_fromValue.get(), document);
m_cachedToImage = cachedImageForCSSValue(m_toValue.get(), document);
@@ -277,8 +273,6 @@ DEFINE_TRACE_AFTER_DISPATCH(CSSCrossfadeValue)
visitor->trace(m_fromValue);
visitor->trace(m_toValue);
visitor->trace(m_percentageValue);
- visitor->trace(m_cachedFromImage);
- visitor->trace(m_cachedToImage);
visitor->trace(m_crossfadeSubimageObserver);
CSSImageGeneratorValue::traceAfterDispatch(visitor);
}
diff --git a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
index 0a3a9d6..8f93a01 100644
--- a/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
+++ b/third_party/WebKit/Source/core/css/CSSCrossfadeValue.h
@@ -31,6 +31,7 @@
#include "core/css/CSSPrimitiveValue.h"
#include "core/fetch/ImageResource.h"
#include "core/fetch/ImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/graphics/Image.h"
namespace blink {
@@ -101,8 +102,8 @@ private:
RefPtrWillBeMember<CSSValue> m_toValue;
RefPtrWillBeMember<CSSPrimitiveValue> m_percentageValue;
- RefPtrWillBeMember<ImageResource> m_cachedFromImage;
- RefPtrWillBeMember<ImageResource> m_cachedToImage;
+ ResourcePtr<ImageResource> m_cachedFromImage;
+ ResourcePtr<ImageResource> m_cachedToImage;
RefPtr<Image> m_generatedImage;
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
index 3b5e056..2244957 100644
--- a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.cpp
@@ -72,7 +72,7 @@ String CSSFontFaceSrcValue::customCSSText() const
bool CSSFontFaceSrcValue::hasFailedOrCanceledSubresources() const
{
- return m_fetched && m_fetched->resource()->loadFailedOrCanceled();
+ return m_fetched && m_fetched->loadFailedOrCanceled();
}
static void setCrossOriginAccessControl(FetchRequest& request, SecurityOrigin* securityOrigin)
@@ -93,13 +93,13 @@ FontResource* CSSFontFaceSrcValue::fetch(Document* document)
SecurityOrigin* securityOrigin = document->securityOrigin();
setCrossOriginAccessControl(request, securityOrigin);
request.mutableResourceRequest().setHTTPReferrer(SecurityPolicy::generateReferrer(m_referrer.referrerPolicy, request.url(), m_referrer.referrer));
- m_fetched = FontResourceHelper::create(FontResource::fetch(request, document->fetcher()));
+ m_fetched = FontResource::fetch(request, document->fetcher());
} else {
// FIXME: CSSFontFaceSrcValue::fetch is invoked when @font-face rule
// is processed by StyleResolver / StyleEngine.
restoreCachedResourceIfNeeded(document);
}
- return m_fetched->resource();
+ return m_fetched.get();
}
void CSSFontFaceSrcValue::restoreCachedResourceIfNeeded(Document* document)
@@ -113,9 +113,9 @@ void CSSFontFaceSrcValue::restoreCachedResourceIfNeeded(Document* document)
FetchRequest request(ResourceRequest(resourceURL), FetchInitiatorTypeNames::css);
request.setContentSecurityCheck(m_shouldCheckContentSecurityPolicy);
- MixedContentChecker::shouldBlockFetch(document->frame(), m_fetched->resource()->lastResourceRequest(),
- m_fetched->resource()->lastResourceRequest().url(), MixedContentChecker::SendReport);
- document->fetcher()->requestLoadStarted(m_fetched->resource(), request, ResourceFetcher::ResourceLoadingFromCache);
+ MixedContentChecker::shouldBlockFetch(document->frame(), m_fetched->lastResourceRequest(),
+ m_fetched->lastResourceRequest().url(), MixedContentChecker::SendReport);
+ document->fetcher()->requestLoadStarted(m_fetched.get(), request, ResourceFetcher::ResourceLoadingFromCache);
}
bool CSSFontFaceSrcValue::equals(const CSSFontFaceSrcValue& other) const
diff --git a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
index eea8f3e..ab53370 100644
--- a/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
+++ b/third_party/WebKit/Source/core/css/CSSFontFaceSrcValue.h
@@ -27,14 +27,14 @@
#define CSSFontFaceSrcValue_h
#include "core/css/CSSValue.h"
-#include "core/fetch/FontResource.h"
-#include "core/fetch/ResourceOwner.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/weborigin/Referrer.h"
#include "wtf/PassRefPtr.h"
#include "wtf/text/WTFString.h"
namespace blink {
+class FontResource;
class Document;
class CSSFontFaceSrcValue : public CSSValue {
@@ -65,11 +65,7 @@ public:
bool equals(const CSSFontFaceSrcValue&) const;
- DEFINE_INLINE_TRACE_AFTER_DISPATCH()
- {
- visitor->trace(m_fetched);
- CSSValue::traceAfterDispatch(visitor);
- }
+ DEFINE_INLINE_TRACE_AFTER_DISPATCH() { CSSValue::traceAfterDispatch(visitor); }
private:
CSSFontFaceSrcValue(const String& resource, bool local, ContentSecurityPolicyDisposition shouldCheckContentSecurityPolicy)
@@ -88,26 +84,7 @@ private:
bool m_isLocal;
ContentSecurityPolicyDisposition m_shouldCheckContentSecurityPolicy;
-
- class FontResourceHelper : public NoBaseWillBeGarbageCollectedFinalized<FontResourceHelper>, public ResourceOwner<FontResource> {
- WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(FontResourceHelper);
- public:
- static PassOwnPtrWillBeRawPtr<FontResourceHelper> create(PassRefPtrWillBeRawPtr<FontResource> resource)
- {
- return adoptPtrWillBeNoop(new FontResourceHelper(resource));
- }
-
- DEFINE_INLINE_VIRTUAL_TRACE() { ResourceOwner<FontResource>::trace(visitor); }
-
- private:
- FontResourceHelper(PassRefPtrWillBeRawPtr<FontResource> resource)
- {
- setResource(resource);
- }
-
- String debugName() const override { return "CSSFontFaceSrcValue::FontResourceHelper"; }
- };
- OwnPtrWillBeMember<FontResourceHelper> m_fetched;
+ ResourcePtr<FontResource> m_fetched;
};
DEFINE_CSS_VALUE_TYPE_CASTS(CSSFontFaceSrcValue, isFontFaceSrcValue());
diff --git a/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp b/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
index aaf2bb0..b68a44a 100644
--- a/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSImageSetValue.cpp
@@ -122,7 +122,7 @@ StyleImage* CSSImageSetValue::cacheImage(Document* document, float deviceScaleFa
if (crossOrigin != CrossOriginAttributeNotSet)
request.setCrossOriginAccessControl(document->securityOrigin(), crossOrigin);
- if (RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher()))
+ if (ResourcePtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher()))
m_cachedImage = StyleFetchedImageSet::create(cachedImage.get(), image.scaleFactor, this, request.url());
else
m_cachedImage = StyleInvalidImage::create(image.imageURL);
diff --git a/third_party/WebKit/Source/core/css/CSSImageValue.cpp b/third_party/WebKit/Source/core/css/CSSImageValue.cpp
index fcbe961..25a5250 100644
--- a/third_party/WebKit/Source/core/css/CSSImageValue.cpp
+++ b/third_party/WebKit/Source/core/css/CSSImageValue.cpp
@@ -68,7 +68,7 @@ StyleFetchedImage* CSSImageValue::cacheImage(Document* document, CrossOriginAttr
if (crossOrigin != CrossOriginAttributeNotSet)
request.setCrossOriginAccessControl(document->securityOrigin(), crossOrigin);
- if (RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher()))
+ if (ResourcePtr<ImageResource> cachedImage = ImageResource::fetch(request, document->fetcher()))
m_cachedImage = StyleFetchedImage::create(cachedImage.get(), document, request.url());
}
diff --git a/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h b/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
index 11dd452..edd2357 100644
--- a/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
+++ b/third_party/WebKit/Source/core/css/CSSSVGDocumentValue.h
@@ -27,6 +27,7 @@
#include "core/css/CSSValue.h"
#include "core/fetch/DocumentResource.h"
+#include "core/fetch/ResourcePtr.h"
namespace blink {
@@ -48,17 +49,13 @@ public:
bool loadRequested() const { return m_loadRequested; }
bool equals(const CSSSVGDocumentValue&) const;
- DEFINE_INLINE_TRACE_AFTER_DISPATCH()
- {
- visitor->trace(m_document);
- CSSValue::traceAfterDispatch(visitor);
- }
+ DEFINE_INLINE_TRACE_AFTER_DISPATCH() { CSSValue::traceAfterDispatch(visitor); }
private:
CSSSVGDocumentValue(const String& url);
String m_url;
- RefPtrWillBeMember<DocumentResource> m_document;
+ ResourcePtr<DocumentResource> m_document;
bool m_loadRequested;
};
diff --git a/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp b/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
index 5080f8e..4c16737 100644
--- a/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
+++ b/third_party/WebKit/Source/core/css/CSSStyleSheetResourceTest.cpp
@@ -71,7 +71,7 @@ TEST_F(CSSStyleSheetResourceTest, PruneCanCauseEviction)
// the image resource.
document()->fetcher()->setAutoLoadImages(false);
- RefPtrWillBeRawPtr<CSSStyleSheetResource> cssResource = CSSStyleSheetResource::createForTest(ResourceRequest(cssURL), "utf-8");
+ ResourcePtr<CSSStyleSheetResource> cssResource = CSSStyleSheetResource::createForTest(ResourceRequest(cssURL), "utf-8");
memoryCache()->add(cssResource.get());
cssResource->responseReceived(ResourceResponse(cssURL, "style/css", 0, nullAtom, String()), nullptr);
cssResource->finish();
@@ -92,7 +92,7 @@ TEST_F(CSSStyleSheetResourceTest, PruneCanCauseEviction)
StyleRule::create(CSSSelectorList::adoptSelectorVector(selectors), ImmutableStylePropertySet::create(&property, 1, HTMLStandardMode)));
crossfade->loadSubimages(document());
- RefPtrWillBeRawPtr<Resource> imageResource = memoryCache()->resourceForURL(imageURL, MemoryCache::defaultCacheIdentifier());
+ ResourcePtr<Resource> imageResource = memoryCache()->resourceForURL(imageURL, MemoryCache::defaultCacheIdentifier());
ASSERT_TRUE(imageResource);
ResourceResponse imageResponse;
imageResponse.setURL(imageURL);
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp
index 710f527..2f4661d 100644
--- a/third_party/WebKit/Source/core/css/FontFace.cpp
+++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -588,10 +588,10 @@ void FontFace::initCSSFontFace(Document* document, PassRefPtrWillBeRawPtr<CSSVal
const Settings* settings = document ? document->settings() : nullptr;
bool allowDownloading = settings && settings->downloadableBinaryFontsEnabled();
if (allowDownloading && item->isSupportedFormat() && document) {
- RefPtrWillBeRawPtr<FontResource> fetched = item->fetch(document);
+ FontResource* fetched = item->fetch(document);
if (fetched) {
FontLoader* fontLoader = document->styleEngine().fontSelector()->fontLoader();
- source = adoptPtrWillBeNoop(new RemoteFontFaceSource(fetched.release(), fontLoader, CSSValueToFontDisplay(m_display.get())));
+ source = adoptPtrWillBeNoop(new RemoteFontFaceSource(fetched, fontLoader, CSSValueToFontDisplay(m_display.get())));
}
}
} else {
diff --git a/third_party/WebKit/Source/core/css/FontLoader.cpp b/third_party/WebKit/Source/core/css/FontLoader.cpp
index 5495890..fda44d7 100644
--- a/third_party/WebKit/Source/core/css/FontLoader.cpp
+++ b/third_party/WebKit/Source/core/css/FontLoader.cpp
@@ -12,29 +12,16 @@
namespace blink {
-struct FontLoader::FontToLoad : public NoBaseWillBeGarbageCollectedFinalized<FontLoader::FontToLoad> {
+struct FontLoader::FontToLoad {
public:
- static PassOwnPtrWillBeRawPtr<FontToLoad> create(FontResource* fontResource, Document& document)
+ static PassOwnPtr<FontToLoad> create(FontResource* fontResource, Document& document)
{
- return adoptPtrWillBeNoop(new FontToLoad(fontResource, document));
+ return adoptPtr(new FontToLoad(fontResource, document));
}
- virtual ~FontToLoad()
- {
- ASSERT(!fontResource);
- }
-
- RefPtrWillBeMember<FontResource> fontResource;
+ ResourcePtr<FontResource> fontResource;
OwnPtr<IncrementLoadEventDelayCount> delay;
- void dispose()
- {
- fontResource = nullptr;
- delay.clear();
- }
-
- DEFINE_INLINE_TRACE() { visitor->trace(fontResource); }
-
private:
FontToLoad(FontResource* resource, Document& document)
: fontResource(resource)
@@ -91,7 +78,6 @@ void FontLoader::loadPendingFonts()
fontToLoad->fontResource->beginLoadIfNeeded(m_document->fetcher());
else
fontToLoad->fontResource->error(Resource::LoadError);
- fontToLoad->dispose();
}
// When the local fontsToBeginLoading vector goes out of scope it will
@@ -133,16 +119,13 @@ void FontLoader::clearDocumentAndFontSelector()
void FontLoader::clearPendingFonts()
{
- for (const auto& fontToLoad : m_fontsToBeginLoading) {
+ for (const auto& fontToLoad : m_fontsToBeginLoading)
fontToLoad->fontResource->didUnscheduleLoad();
- fontToLoad->dispose();
- }
m_fontsToBeginLoading.clear();
}
DEFINE_TRACE(FontLoader)
{
- visitor->trace(m_fontsToBeginLoading);
visitor->trace(m_document);
visitor->trace(m_fontSelector);
}
diff --git a/third_party/WebKit/Source/core/css/FontLoader.h b/third_party/WebKit/Source/core/css/FontLoader.h
index 9221b4f..a7e7634 100644
--- a/third_party/WebKit/Source/core/css/FontLoader.h
+++ b/third_party/WebKit/Source/core/css/FontLoader.h
@@ -6,6 +6,7 @@
#define FontLoader_h
#include "core/fetch/ResourceLoader.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/Timer.h"
#include "platform/heap/Handle.h"
#include "wtf/Vector.h"
@@ -43,7 +44,7 @@ private:
Timer<FontLoader> m_beginLoadingTimer;
struct FontToLoad;
- using FontsToLoadVector = WillBeHeapVector<OwnPtrWillBeMember<FontToLoad>>;
+ using FontsToLoadVector = Vector<OwnPtr<FontToLoad>>;
FontsToLoadVector m_fontsToBeginLoading;
RawPtrWillBeMember<CSSFontSelector> m_fontSelector;
RawPtrWillBeWeakMember<Document> m_document;
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
index 069122b..d86c598 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.cpp
@@ -17,7 +17,7 @@
namespace blink {
-RemoteFontFaceSource::RemoteFontFaceSource(PassRefPtrWillBeRawPtr<FontResource> font, PassRefPtrWillBeRawPtr<FontLoader> fontLoader, FontDisplay display)
+RemoteFontFaceSource::RemoteFontFaceSource(FontResource* font, PassRefPtrWillBeRawPtr<FontLoader> fontLoader, FontDisplay display)
: m_font(font)
, m_fontLoader(fontLoader)
, m_display(display)
@@ -49,7 +49,6 @@ RemoteFontFaceSource::~RemoteFontFaceSource()
void RemoteFontFaceSource::dispose()
{
m_font->removeClient(this);
- m_font = nullptr;
pruneTable();
}
@@ -187,7 +186,6 @@ void RemoteFontFaceSource::beginLoadIfNeeded()
DEFINE_TRACE(RemoteFontFaceSource)
{
- visitor->trace(m_font);
visitor->trace(m_fontLoader);
CSSFontFaceSource::trace(visitor);
}
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
index a346a5d..9d58bcb 100644
--- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
+++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
@@ -7,6 +7,7 @@
#include "core/css/CSSFontFaceSource.h"
#include "core/fetch/FontResource.h"
+#include "core/fetch/ResourcePtr.h"
#include "wtf/Allocator.h"
namespace blink {
@@ -27,7 +28,7 @@ class RemoteFontFaceSource final : public CSSFontFaceSource, public FontResource
public:
enum DisplayPeriod { BlockPeriod, SwapPeriod, FailurePeriod };
- explicit RemoteFontFaceSource(PassRefPtrWillBeRawPtr<FontResource>, PassRefPtrWillBeRawPtr<FontLoader>, FontDisplay);
+ explicit RemoteFontFaceSource(FontResource*, PassRefPtrWillBeRawPtr<FontLoader>, FontDisplay);
~RemoteFontFaceSource() override;
void dispose();
@@ -79,7 +80,7 @@ private:
void switchToSwapPeriod();
void switchToFailurePeriod();
- RefPtrWillBeMember<FontResource> m_font;
+ ResourcePtr<FontResource> m_font;
RefPtrWillBeMember<FontLoader> m_fontLoader;
const FontDisplay m_display;
DisplayPeriod m_period;
diff --git a/third_party/WebKit/Source/core/css/StyleRuleImport.cpp b/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
index b252d3f..cc09ce7 100644
--- a/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
+++ b/third_party/WebKit/Source/core/css/StyleRuleImport.cpp
@@ -41,14 +41,11 @@ StyleRuleImport::StyleRuleImport(const String& href, PassRefPtrWillBeRawPtr<Medi
, m_styleSheetClient(this)
, m_strHref(href)
, m_mediaQueries(media)
+ , m_resource(nullptr)
, m_loading(false)
{
if (!m_mediaQueries)
m_mediaQueries = MediaQuerySet::create(String());
-
-#if ENABLE(OILPAN)
- ThreadState::current()->registerPreFinalizer(this);
-#endif
}
StyleRuleImport::~StyleRuleImport()
@@ -56,15 +53,9 @@ StyleRuleImport::~StyleRuleImport()
#if !ENABLE(OILPAN)
if (m_styleSheet)
m_styleSheet->clearOwnerRule();
- dispose();
#endif
-}
-
-void StyleRuleImport::dispose()
-{
if (m_resource)
m_resource->removeClient(&m_styleSheetClient);
- m_resource = nullptr;
}
DEFINE_TRACE_AFTER_DISPATCH(StyleRuleImport)
@@ -73,7 +64,6 @@ DEFINE_TRACE_AFTER_DISPATCH(StyleRuleImport)
visitor->trace(m_parentStyleSheet);
visitor->trace(m_mediaQueries);
visitor->trace(m_styleSheet);
- visitor->trace(m_resource);
StyleRuleBase::traceAfterDispatch(visitor);
}
diff --git a/third_party/WebKit/Source/core/css/StyleRuleImport.h b/third_party/WebKit/Source/core/css/StyleRuleImport.h
index d7cb9d1..2c795e1 100644
--- a/third_party/WebKit/Source/core/css/StyleRuleImport.h
+++ b/third_party/WebKit/Source/core/css/StyleRuleImport.h
@@ -23,6 +23,7 @@
#define StyleRuleImport_h
#include "core/css/StyleRule.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/StyleSheetResourceClient.h"
#include "platform/heap/Handle.h"
@@ -34,7 +35,6 @@ class StyleSheetContents;
class StyleRuleImport : public StyleRuleBase {
USING_FAST_MALLOC_WILL_BE_REMOVED(StyleRuleImport);
- WILL_BE_USING_PRE_FINALIZER(StyleRuleImport, dispose);
public:
static PassRefPtrWillBeRawPtr<StyleRuleImport> create(const String& href, PassRefPtrWillBeRawPtr<MediaQuerySet>);
@@ -83,15 +83,13 @@ private:
StyleRuleImport(const String& href, PassRefPtrWillBeRawPtr<MediaQuerySet>);
- void dispose();
-
RawPtrWillBeMember<StyleSheetContents> m_parentStyleSheet;
ImportedStyleSheetClient m_styleSheetClient;
String m_strHref;
RefPtrWillBeMember<MediaQuerySet> m_mediaQueries;
RefPtrWillBeMember<StyleSheetContents> m_styleSheet;
- RefPtrWillBeMember<CSSStyleSheetResource> m_resource;
+ ResourcePtr<CSSStyleSheetResource> m_resource;
bool m_loading;
};
diff --git a/third_party/WebKit/Source/core/dom/PendingScript.h b/third_party/WebKit/Source/core/dom/PendingScript.h
index e4269a3..1fdf269 100644
--- a/third_party/WebKit/Source/core/dom/PendingScript.h
+++ b/third_party/WebKit/Source/core/dom/PendingScript.h
@@ -42,7 +42,7 @@ class ScriptSourceCode;
// A container for an external script which may be loaded and executed.
//
-// A RefPtr alone does not prevent the underlying Resource
+// A ResourcePtr alone does not prevent the underlying Resource
// from purging its data buffer. This class holds a dummy client open for its
// lifetime in order to guarantee that the data buffer will not be purged.
class CORE_EXPORT PendingScript final : public NoBaseWillBeGarbageCollectedFinalized<PendingScript>, public ResourceOwner<ScriptResource> {
diff --git a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
index c41eaf7..fd53c61 100644
--- a/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
+++ b/third_party/WebKit/Source/core/dom/ProcessingInstruction.cpp
@@ -165,7 +165,7 @@ void ProcessingInstruction::process(const String& href, const String& charset)
String url = document().completeURL(href).string();
- RefPtrWillBeRawPtr<StyleSheetResource> resource = nullptr;
+ ResourcePtr<StyleSheetResource> resource;
FetchRequest request(ResourceRequest(document().completeURL(href)), FetchInitiatorTypeNames::processinginstruction);
if (m_isXSL) {
if (RuntimeEnabledFeatures::xsltEnabled())
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
index f861af8..1e990c2 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.cpp
@@ -59,6 +59,7 @@ namespace blink {
ScriptLoader::ScriptLoader(Element* element, bool parserInserted, bool alreadyStarted)
: m_element(element)
+ , m_resource(0)
, m_startLineNumber(WTF::OrdinalNumber::beforeFirst())
, m_parserInserted(parserInserted)
, m_isExternalScript(false)
@@ -88,7 +89,6 @@ ScriptLoader::~ScriptLoader()
DEFINE_TRACE(ScriptLoader)
{
visitor->trace(m_element);
- visitor->trace(m_resource);
visitor->trace(m_pendingScript);
}
@@ -454,7 +454,7 @@ void ScriptLoader::execute()
else
dispatchErrorEvent();
}
- m_resource = nullptr;
+ m_resource = 0;
}
void ScriptLoader::notifyFinished(Resource* resource)
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h
index ae027ad..7b71d0c 100644
--- a/third_party/WebKit/Source/core/dom/ScriptLoader.h
+++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -25,6 +25,7 @@
#include "core/dom/PendingScript.h"
#include "core/fetch/FetchRequest.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/ScriptResource.h"
#include "wtf/text/TextPosition.h"
#include "wtf/text/WTFString.h"
@@ -68,7 +69,7 @@ public:
bool willBeParserExecuted() const { return m_willBeParserExecuted; }
bool readyToBeParserExecuted() const { return m_readyToBeParserExecuted; }
bool willExecuteWhenDocumentFinishedParsing() const { return m_willExecuteWhenDocumentFinishedParsing; }
- ScriptResource* resource() { return m_resource.get(); }
+ ResourcePtr<ScriptResource> resource() { return m_resource; }
void setHaveFiredLoadEvent(bool haveFiredLoad) { m_haveFiredLoad = haveFiredLoad; }
bool isParserInserted() const { return m_parserInserted; }
@@ -103,7 +104,7 @@ private:
String debugName() const override { return "ScriptLoader"; }
RawPtrWillBeMember<Element> m_element;
- RefPtrWillBeMember<ScriptResource> m_resource;
+ ResourcePtr<ScriptResource> m_resource;
WTF::OrdinalNumber m_startLineNumber;
String m_characterEncoding;
String m_fallbackCharacterEncoding;
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.h b/third_party/WebKit/Source/core/dom/ScriptRunner.h
index 0303b62..a553e51 100644
--- a/third_party/WebKit/Source/core/dom/ScriptRunner.h
+++ b/third_party/WebKit/Source/core/dom/ScriptRunner.h
@@ -27,6 +27,7 @@
#define ScriptRunner_h
#include "core/CoreExport.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/heap/Handle.h"
#include "wtf/Deque.h"
#include "wtf/HashMap.h"
diff --git a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
index 29a0bfc..2151f9e 100644
--- a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.cpp
@@ -37,16 +37,16 @@
namespace blink {
-PassRefPtrWillBeRawPtr<CSSStyleSheetResource> CSSStyleSheetResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<CSSStyleSheetResource> CSSStyleSheetResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextStyle);
return toCSSStyleSheetResource(fetcher->requestResource(request, CSSStyleSheetResourceFactory()));
}
-PassRefPtrWillBeRawPtr<CSSStyleSheetResource> CSSStyleSheetResource::createForTest(const ResourceRequest& request, const String& charset)
+ResourcePtr<CSSStyleSheetResource> CSSStyleSheetResource::createForTest(const ResourceRequest& request, const String& charset)
{
- return adoptRefWillBeNoop(new CSSStyleSheetResource(request, charset));
+ return new CSSStyleSheetResource(request, charset);
}
CSSStyleSheetResource::CSSStyleSheetResource(const ResourceRequest& resourceRequest, const String& charset)
@@ -65,12 +65,11 @@ CSSStyleSheetResource::~CSSStyleSheetResource()
ASSERT(!m_parsedStyleSheetCache);
}
-void CSSStyleSheetResource::removedFromMemoryCache()
+void CSSStyleSheetResource::dispose()
{
if (m_parsedStyleSheetCache)
m_parsedStyleSheetCache->removedFromMemoryCache();
m_parsedStyleSheetCache.clear();
- Resource::removedFromMemoryCache();
}
DEFINE_TRACE(CSSStyleSheetResource)
diff --git a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h
index 8f6d75e..b462afd 100644
--- a/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h
+++ b/third_party/WebKit/Source/core/fetch/CSSStyleSheetResource.h
@@ -27,6 +27,7 @@
#define CSSStyleSheetResource_h
#include "core/CoreExport.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/StyleSheetResource.h"
#include "platform/heap/Handle.h"
@@ -42,8 +43,8 @@ class CORE_EXPORT CSSStyleSheetResource final : public StyleSheetResource {
public:
enum class MIMETypeCheck { Strict, Lax };
- static PassRefPtrWillBeRawPtr<CSSStyleSheetResource> fetch(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<CSSStyleSheetResource> createForTest(const ResourceRequest&, const String& charset);
+ static ResourcePtr<CSSStyleSheetResource> fetch(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<CSSStyleSheetResource> createForTest(const ResourceRequest&, const String& charset);
~CSSStyleSheetResource() override;
DECLARE_VIRTUAL_TRACE();
@@ -68,15 +69,15 @@ private:
CSSStyleSheetResourceFactory()
: ResourceFactory(Resource::CSSStyleSheet) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new CSSStyleSheetResource(request, charset));
+ return new CSSStyleSheetResource(request, charset);
}
};
CSSStyleSheetResource(const ResourceRequest&, const String& charset);
bool canUseSheet(MIMETypeCheck) const;
- void removedFromMemoryCache() override;
+ void dispose() override;
void checkNotify() override;
String m_decodedSheetText;
diff --git a/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp b/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
index 5cdd739..d90176e 100644
--- a/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/CachingCorrectnessTest.cpp
@@ -34,6 +34,7 @@
#include "core/fetch/RawResource.h"
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/network/ResourceRequest.h"
#include "platform/testing/TestingPlatformSupport.h"
#include "public/platform/Platform.h"
@@ -76,17 +77,17 @@ protected:
m_proxyPlatform.advanceClock(seconds);
}
- PassRefPtrWillBeRawPtr<Resource> resourceFromResourceResponse(ResourceResponse response, Resource::Type type = Resource::Raw)
+ ResourcePtr<Resource> resourceFromResourceResponse(ResourceResponse response, Resource::Type type = Resource::Raw)
{
if (response.url().isNull())
response.setURL(KURL(ParsedURLString, kResourceURL));
- RefPtrWillBeRawPtr<Resource> resource = nullptr;
+ ResourcePtr<Resource> resource;
switch (type) {
case Resource::Raw:
- resource = Resource::create(ResourceRequest(response.url()), type);
+ resource = new Resource(ResourceRequest(response.url()), type);
break;
case Resource::Image:
- resource = ImageResource::create(ResourceRequest(response.url()), nullptr);
+ resource = new ImageResource(ResourceRequest(response.url()), nullptr);
break;
default:
EXPECT_TRUE(false) << "'Unreachable' code was reached";
@@ -98,25 +99,25 @@ protected:
return resource;
}
- PassRefPtrWillBeRawPtr<Resource> resourceFromResourceRequest(ResourceRequest request, Resource::Type type = Resource::Raw)
+ ResourcePtr<Resource> resourceFromResourceRequest(ResourceRequest request, Resource::Type type = Resource::Raw)
{
if (request.url().isNull())
request.setURL(KURL(ParsedURLString, kResourceURL));
- RefPtrWillBeRawPtr<Resource> resource =
- Resource::create(request, type);
+ ResourcePtr<Resource> resource =
+ new Resource(request, type);
resource->setResponse(ResourceResponse(KURL(ParsedURLString, kResourceURL), "text/html", 0, nullAtom, String()));
memoryCache()->add(resource.get());
return resource;
}
- PassRefPtrWillBeRawPtr<Resource> fetch()
+ ResourcePtr<Resource> fetch()
{
FetchRequest fetchRequest(ResourceRequest(KURL(ParsedURLString, kResourceURL)), FetchInitiatorInfo());
return RawResource::fetchSynchronously(fetchRequest, fetcher());
}
- PassRefPtrWillBeRawPtr<Resource> fetchImage()
+ ResourcePtr<Resource> fetchImage()
{
FetchRequest fetchRequest(ResourceRequest(KURL(ParsedURLString, kResourceURL)), FetchInitiatorInfo());
return ImageResource::fetch(fetchRequest, fetcher());
@@ -174,12 +175,12 @@ TEST_F(CachingCorrectnessTest, FreshFromLastModified)
fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
fresh200Response.setHTTPHeaderField("Last-Modified", kOneDayBeforeOriginalRequest);
- RefPtrWillBeRawPtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
+ ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
// Advance the clock within the implicit freshness period of this resource before we make a request.
advanceClock(600.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(fresh200, fetched);
}
@@ -190,12 +191,12 @@ TEST_F(CachingCorrectnessTest, FreshFromExpires)
fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
fresh200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
- RefPtrWillBeRawPtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
+ ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
// Advance the clock within the freshness period of this resource before we make a request.
advanceClock(24. * 60. * 60. - 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(fresh200, fetched);
}
@@ -206,12 +207,12 @@ TEST_F(CachingCorrectnessTest, FreshFromMaxAge)
fresh200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
fresh200Response.setHTTPHeaderField("Cache-Control", "max-age=600");
- RefPtrWillBeRawPtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
+ ResourcePtr<Resource> fresh200 = resourceFromResourceResponse(fresh200Response);
// Advance the clock within the freshness period of this resource before we make a request.
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(fresh200, fetched);
}
@@ -223,12 +224,12 @@ TEST_F(CachingCorrectnessTest, DISABLED_ExpiredFromLastModified)
expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
expired200Response.setHTTPHeaderField("Last-Modified", kOneDayBeforeOriginalRequest);
- RefPtrWillBeRawPtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
+ ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
// Advance the clock beyond the implicit freshness period.
advanceClock(24. * 60. * 60. * 0.2);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(expired200, fetched);
}
@@ -239,12 +240,12 @@ TEST_F(CachingCorrectnessTest, ExpiredFromExpires)
expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
- RefPtrWillBeRawPtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
+ ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
// Advance the clock within the expiredness period of this resource before we make a request.
advanceClock(24. * 60. * 60. + 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(expired200, fetched);
}
@@ -256,12 +257,12 @@ TEST_F(CachingCorrectnessTest, NewImageExpiredFromExpires)
expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
- RefPtrWillBeRawPtr<Resource> expired200 = resourceFromResourceResponse(expired200Response, Resource::Image);
+ ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Response, Resource::Image);
// Advance the clock within the expiredness period of this resource before we make a request.
advanceClock(24. * 60. * 60. + 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetchImage();
+ ResourcePtr<Resource> fetched = fetchImage();
EXPECT_NE(expired200, fetched);
}
@@ -274,17 +275,17 @@ TEST_F(CachingCorrectnessTest, ReuseImageExpiredFromExpires)
expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
expired200Response.setHTTPHeaderField("Expires", kOneDayAfterOriginalRequest);
- RefPtrWillBeRawPtr<Resource> expired200 = resourceFromResourceResponse(expired200Response, Resource::Image);
+ ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Response, Resource::Image);
// Advance the clock within the freshness period, and make a request to add this image to the document resources.
advanceClock(15.);
- RefPtrWillBeRawPtr<Resource> firstFetched = fetchImage();
+ ResourcePtr<Resource> firstFetched = fetchImage();
EXPECT_EQ(expired200, firstFetched);
// Advance the clock within the expiredness period of this resource before we make a request.
advanceClock(24. * 60. * 60. + 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetchImage();
+ ResourcePtr<Resource> fetched = fetchImage();
EXPECT_EQ(expired200, fetched);
}
@@ -295,12 +296,12 @@ TEST_F(CachingCorrectnessTest, ExpiredFromMaxAge)
expired200Response.setHTTPHeaderField("Date", kOriginalRequestDateAsString);
expired200Response.setHTTPHeaderField("Cache-Control", "max-age=600");
- RefPtrWillBeRawPtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
+ ResourcePtr<Resource> expired200 = resourceFromResourceResponse(expired200Response);
// Advance the clock within the expiredness period of this resource before we make a request.
advanceClock(700.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(expired200, fetched);
}
@@ -312,12 +313,12 @@ TEST_F(CachingCorrectnessTest, FreshButNoCache)
fresh200NocacheResponse.setHTTPHeaderField(HTTPNames::Expires, kOneDayAfterOriginalRequest);
fresh200NocacheResponse.setHTTPHeaderField(HTTPNames::Cache_Control, "no-cache");
- RefPtrWillBeRawPtr<Resource> fresh200Nocache = resourceFromResourceResponse(fresh200NocacheResponse);
+ ResourcePtr<Resource> fresh200Nocache = resourceFromResourceResponse(fresh200NocacheResponse);
// Advance the clock within the freshness period of this resource before we make a request.
advanceClock(24. * 60. * 60. - 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(fresh200Nocache, fetched);
}
@@ -325,8 +326,8 @@ TEST_F(CachingCorrectnessTest, RequestWithNoCahe)
{
ResourceRequest noCacheRequest;
noCacheRequest.setHTTPHeaderField(HTTPNames::Cache_Control, "no-cache");
- RefPtrWillBeRawPtr<Resource> noCacheResource = resourceFromResourceRequest(noCacheRequest);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> noCacheResource = resourceFromResourceRequest(noCacheRequest);
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(noCacheResource, fetched);
}
@@ -338,12 +339,12 @@ TEST_F(CachingCorrectnessTest, FreshButNoStore)
fresh200NostoreResponse.setHTTPHeaderField(HTTPNames::Expires, kOneDayAfterOriginalRequest);
fresh200NostoreResponse.setHTTPHeaderField(HTTPNames::Cache_Control, "no-store");
- RefPtrWillBeRawPtr<Resource> fresh200Nostore = resourceFromResourceResponse(fresh200NostoreResponse);
+ ResourcePtr<Resource> fresh200Nostore = resourceFromResourceResponse(fresh200NostoreResponse);
// Advance the clock within the freshness period of this resource before we make a request.
advanceClock(24. * 60. * 60. - 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(fresh200Nostore, fetched);
}
@@ -351,8 +352,8 @@ TEST_F(CachingCorrectnessTest, RequestWithNoStore)
{
ResourceRequest noStoreRequest;
noStoreRequest.setHTTPHeaderField(HTTPNames::Cache_Control, "no-store");
- RefPtrWillBeRawPtr<Resource> noStoreResource = resourceFromResourceRequest(noStoreRequest);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> noStoreResource = resourceFromResourceRequest(noStoreRequest);
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(noStoreResource, fetched);
}
@@ -366,12 +367,12 @@ TEST_F(CachingCorrectnessTest, DISABLED_FreshButMustRevalidate)
fresh200MustRevalidateResponse.setHTTPHeaderField(HTTPNames::Expires, kOneDayAfterOriginalRequest);
fresh200MustRevalidateResponse.setHTTPHeaderField(HTTPNames::Cache_Control, "must-revalidate");
- RefPtrWillBeRawPtr<Resource> fresh200MustRevalidate = resourceFromResourceResponse(fresh200MustRevalidateResponse);
+ ResourcePtr<Resource> fresh200MustRevalidate = resourceFromResourceResponse(fresh200MustRevalidateResponse);
// Advance the clock within the freshness period of this resource before we make a request.
advanceClock(24. * 60. * 60. - 15.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(fresh200MustRevalidate, fetched);
}
@@ -381,7 +382,7 @@ TEST_F(CachingCorrectnessTest, FreshWithFreshRedirect)
const char redirectTargetUrlString[] = "http://redirect-target.com";
KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
- RefPtrWillBeRawPtr<Resource> firstResource = Resource::create(ResourceRequest(redirectUrl), Resource::Raw);
+ ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw);
ResourceResponse fresh301Response;
fresh301Response.setURL(redirectUrl);
@@ -406,7 +407,7 @@ TEST_F(CachingCorrectnessTest, FreshWithFreshRedirect)
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(firstResource, fetched);
}
@@ -416,7 +417,7 @@ TEST_F(CachingCorrectnessTest, FreshWithStaleRedirect)
const char redirectTargetUrlString[] = "http://redirect-target.com";
KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
- RefPtrWillBeRawPtr<Resource> firstResource = Resource::create(ResourceRequest(redirectUrl), Resource::Raw);
+ ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw);
ResourceResponse stale301Response;
stale301Response.setURL(redirectUrl);
@@ -440,7 +441,7 @@ TEST_F(CachingCorrectnessTest, FreshWithStaleRedirect)
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(firstResource, fetched);
}
@@ -448,14 +449,14 @@ TEST_F(CachingCorrectnessTest, PostToSameURLTwice)
{
ResourceRequest request1(KURL(ParsedURLString, kResourceURL));
request1.setHTTPMethod(HTTPNames::POST);
- RefPtrWillBeRawPtr<Resource> resource1 = Resource::create(ResourceRequest(request1.url()), Resource::Raw);
+ ResourcePtr<Resource> resource1 = new Resource(ResourceRequest(request1.url()), Resource::Raw);
resource1->setLoading(true);
memoryCache()->add(resource1.get());
ResourceRequest request2(KURL(ParsedURLString, kResourceURL));
request2.setHTTPMethod(HTTPNames::POST);
FetchRequest fetch2(request2, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> resource2 = RawResource::fetchSynchronously(fetch2, fetcher());
+ ResourcePtr<Resource> resource2 = RawResource::fetchSynchronously(fetch2, fetcher());
EXPECT_EQ(resource2, memoryCache()->resourceForURL(request2.url()));
EXPECT_NE(resource1, resource2);
@@ -467,7 +468,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectNotImplicitlyFresh)
const char redirectTargetUrlString[] = "http://redirect-target.com";
KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
- RefPtrWillBeRawPtr<Resource> firstResource = Resource::create(ResourceRequest(redirectUrl), Resource::Raw);
+ ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw);
ResourceResponse fresh302Response;
fresh302Response.setURL(redirectUrl);
@@ -492,7 +493,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectNotImplicitlyFresh)
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_NE(firstResource, fetched);
}
@@ -502,7 +503,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshMaxAge)
const char redirectTargetUrlString[] = "http://redirect-target.com";
KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
- RefPtrWillBeRawPtr<Resource> firstResource = Resource::create(ResourceRequest(redirectUrl), Resource::Raw);
+ ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw);
ResourceResponse fresh302Response;
fresh302Response.setURL(redirectUrl);
@@ -527,7 +528,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshMaxAge)
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(firstResource, fetched);
}
@@ -537,7 +538,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshExpires)
const char redirectTargetUrlString[] = "http://redirect-target.com";
KURL redirectTargetUrl(ParsedURLString, redirectTargetUrlString);
- RefPtrWillBeRawPtr<Resource> firstResource = Resource::create(ResourceRequest(redirectUrl), Resource::Raw);
+ ResourcePtr<Resource> firstResource = new Resource(ResourceRequest(redirectUrl), Resource::Raw);
ResourceResponse fresh302Response;
fresh302Response.setURL(redirectUrl);
@@ -562,7 +563,7 @@ TEST_F(CachingCorrectnessTest, 302RedirectExplicitlyFreshExpires)
advanceClock(500.);
- RefPtrWillBeRawPtr<Resource> fetched = fetch();
+ ResourcePtr<Resource> fetched = fetch();
EXPECT_EQ(firstResource, fetched);
}
diff --git a/third_party/WebKit/Source/core/fetch/DocumentResource.cpp b/third_party/WebKit/Source/core/fetch/DocumentResource.cpp
index aab75f7..5396803 100644
--- a/third_party/WebKit/Source/core/fetch/DocumentResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/DocumentResource.cpp
@@ -30,7 +30,7 @@
namespace blink {
-PassRefPtrWillBeRawPtr<DocumentResource> DocumentResource::fetchSVGDocument(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<DocumentResource> DocumentResource::fetchSVGDocument(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextImage);
diff --git a/third_party/WebKit/Source/core/fetch/DocumentResource.h b/third_party/WebKit/Source/core/fetch/DocumentResource.h
index fbbf7e5..326e2a5 100644
--- a/third_party/WebKit/Source/core/fetch/DocumentResource.h
+++ b/third_party/WebKit/Source/core/fetch/DocumentResource.h
@@ -25,6 +25,7 @@
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/html/parser/TextResourceDecoder.h"
namespace blink {
@@ -37,7 +38,7 @@ class DocumentResource final : public Resource {
public:
using ClientType = ResourceClient;
- static PassRefPtrWillBeRawPtr<DocumentResource> fetchSVGDocument(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<DocumentResource> fetchSVGDocument(FetchRequest&, ResourceFetcher*);
~DocumentResource() override;
DECLARE_VIRTUAL_TRACE();
@@ -53,9 +54,9 @@ private:
SVGDocumentResourceFactory()
: ResourceFactory(Resource::SVGDocument) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new DocumentResource(request, Resource::SVGDocument));
+ return new DocumentResource(request, Resource::SVGDocument);
}
};
DocumentResource(const ResourceRequest&, Type);
@@ -67,7 +68,7 @@ private:
};
DEFINE_TYPE_CASTS(DocumentResource, Resource, resource, resource->type() == Resource::SVGDocument, resource.type() == Resource::SVGDocument); \
-inline DocumentResource* toDocumentResource(const RefPtrWillBeRawPtr<Resource>& ptr) { return toDocumentResource(ptr.get()); }
+inline DocumentResource* toDocumentResource(const ResourcePtr<Resource>& ptr) { return toDocumentResource(ptr.get()); }
class DocumentResourceClient : public ResourceClient {
public:
diff --git a/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h b/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
index fff7f74..56f7280 100644
--- a/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
+++ b/third_party/WebKit/Source/core/fetch/DocumentResourceReference.h
@@ -27,6 +27,7 @@
#define DocumentResourceReference_h
#include "core/fetch/DocumentResource.h"
+#include "core/fetch/ResourcePtr.h"
namespace blink {
@@ -38,7 +39,7 @@ public:
DocumentResource* document() { return m_document.get(); }
private:
String debugName() const override { return "DocumentResourceReference"; }
- RefPtrWillBePersistent<DocumentResource> m_document;
+ ResourcePtr<DocumentResource> m_document;
};
} // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/FontResource.cpp b/third_party/WebKit/Source/core/fetch/FontResource.cpp
index 10cb041..48b48ae 100644
--- a/third_party/WebKit/Source/core/fetch/FontResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/FontResource.cpp
@@ -69,7 +69,7 @@ static void recordPackageFormatHistogram(FontPackageFormat format)
Platform::current()->histogramEnumeration("WebFont.PackageFormat", format, PackageFormatEnumMax);
}
-PassRefPtrWillBeRawPtr<FontResource> FontResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<FontResource> FontResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextFont);
diff --git a/third_party/WebKit/Source/core/fetch/FontResource.h b/third_party/WebKit/Source/core/fetch/FontResource.h
index 3bda896..7586499 100644
--- a/third_party/WebKit/Source/core/fetch/FontResource.h
+++ b/third_party/WebKit/Source/core/fetch/FontResource.h
@@ -26,8 +26,8 @@
#ifndef FontResource_h
#define FontResource_h
-#include "core/fetch/Resource.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/Timer.h"
#include "platform/fonts/FontOrientation.h"
#include "wtf/OwnPtr.h"
@@ -38,13 +38,12 @@ class FetchRequest;
class ResourceFetcher;
class FontPlatformData;
class FontCustomPlatformData;
-class FontResourceClient;
class FontResource final : public Resource {
public:
- using ClientType = FontResourceClient;
+ using ClientType = ResourceClient;
- static PassRefPtrWillBeRawPtr<FontResource> fetch(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<FontResource> fetch(FetchRequest&, ResourceFetcher*);
~FontResource() override;
void load(ResourceFetcher*, const ResourceLoaderOptions&) override;
@@ -75,9 +74,9 @@ private:
FontResourceFactory()
: ResourceFactory(Resource::Font) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new FontResource(request));
+ return new FontResource(request);
}
};
FontResource(const ResourceRequest&);
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.cpp b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
index 8a61421..6395714 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.cpp
@@ -41,7 +41,7 @@
namespace blink {
-PassRefPtrWillBeRawPtr<ImageResource> ImageResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<ImageResource> ImageResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
if (request.resourceRequest().requestContext() == WebURLRequest::RequestContextUnspecified)
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextImage);
@@ -49,7 +49,7 @@ PassRefPtrWillBeRawPtr<ImageResource> ImageResource::fetch(FetchRequest& request
KURL requestURL = request.resourceRequest().url();
if (requestURL.isValid() && fetcher->context().canRequest(Resource::Image, request.resourceRequest(), requestURL, request.options(), request.forPreload(), request.originRestriction()))
fetcher->context().sendImagePing(requestURL);
- return nullptr;
+ return 0;
}
if (fetcher->clientDefersImage(request.resourceRequest().url()))
diff --git a/third_party/WebKit/Source/core/fetch/ImageResource.h b/third_party/WebKit/Source/core/fetch/ImageResource.h
index 31ac208..5776aaf 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResource.h
+++ b/third_party/WebKit/Source/core/fetch/ImageResource.h
@@ -24,7 +24,7 @@
#define ImageResource_h
#include "core/CoreExport.h"
-#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/geometry/IntRect.h"
#include "platform/geometry/IntSizeHash.h"
#include "platform/geometry/LayoutSize.h"
@@ -48,20 +48,11 @@ class CORE_EXPORT ImageResource final : public Resource, public ImageObserver {
public:
using ClientType = ImageResourceClient;
- static PassRefPtrWillBeRawPtr<ImageResource> fetch(FetchRequest&, ResourceFetcher*);
-
- static PassRefPtrWillBeRawPtr<ImageResource> create(blink::Image* image)
- {
- return adoptRefWillBeNoop(new ImageResource(image));
- }
+ static ResourcePtr<ImageResource> fetch(FetchRequest&, ResourceFetcher*);
+ ImageResource(blink::Image*);
// Exposed for testing
- static PassRefPtrWillBeRawPtr<ImageResource> create(const ResourceRequest& request, blink::Image* image)
- {
- return adoptRefWillBeNoop(new ImageResource(request, image));
- }
-
-
+ ImageResource(const ResourceRequest&, blink::Image*);
~ImageResource() override;
void load(ResourceFetcher*, const ResourceLoaderOptions&) override;
@@ -125,17 +116,14 @@ protected:
private:
friend class PaintLayerTest;
- explicit ImageResource(blink::Image*);
- ImageResource(const ResourceRequest&, blink::Image*);
-
class ImageResourceFactory : public ResourceFactory {
public:
ImageResourceFactory()
: ResourceFactory(Resource::Image) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String&) const override
+ Resource* create(const ResourceRequest& request, const String&) const override
{
- return adoptRefWillBeNoop(new ImageResource(request));
+ return new ImageResource(request);
}
};
ImageResource(const ResourceRequest&);
diff --git a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
index 6631f9e..9f13c66 100644
--- a/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ImageResourceTest.cpp
@@ -35,6 +35,7 @@
#include "core/fetch/MockImageResourceClient.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/fetch/ResourceLoader.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/UniqueIdentifier.h"
#include "platform/SharedBuffer.h"
#include "platform/exported/WrappedResourceResponse.h"
@@ -88,7 +89,7 @@ TEST(ImageResourceTest, MultipartImage)
URLTestHelpers::registerMockedURLLoad(testURL, "cancelTest.html", "text/html");
// Emulate starting a real load, but don't expect any "real" WebURLLoaderClient callbacks.
- RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::create(ResourceRequest(testURL), nullptr);
+ ResourcePtr<ImageResource> cachedImage = new ImageResource(ResourceRequest(testURL), nullptr);
cachedImage->setIdentifier(createUniqueIdentifier());
cachedImage->load(fetcher, ResourceLoaderOptions());
Platform::current()->unitTestSupport()->unregisterMockedURL(testURL);
@@ -144,7 +145,7 @@ TEST(ImageResourceTest, CancelOnDetach)
ResourceFetcher* fetcher = ResourceFetcher::create(nullptr);
// Emulate starting a real load.
- RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::create(ResourceRequest(testURL), nullptr);
+ ResourcePtr<ImageResource> cachedImage = new ImageResource(ResourceRequest(testURL), nullptr);
cachedImage->setIdentifier(createUniqueIdentifier());
cachedImage->load(fetcher, ResourceLoaderOptions());
@@ -168,7 +169,7 @@ TEST(ImageResourceTest, CancelOnDetach)
TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients)
{
- RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::create(ResourceRequest(), nullptr);
+ ResourcePtr<ImageResource> cachedImage = new ImageResource(ResourceRequest(), nullptr);
cachedImage->setLoading(true);
MockImageResourceClient client(cachedImage);
@@ -201,7 +202,7 @@ TEST(ImageResourceTest, DecodedDataRemainsWhileHasClients)
TEST(ImageResourceTest, UpdateBitmapImages)
{
- RefPtrWillBeRawPtr<ImageResource> cachedImage = ImageResource::create(ResourceRequest(), nullptr);
+ ResourcePtr<ImageResource> cachedImage = new ImageResource(ResourceRequest(), nullptr);
cachedImage->setLoading(true);
MockImageResourceClient client(cachedImage);
diff --git a/third_party/WebKit/Source/core/fetch/LinkFetchResource.cpp b/third_party/WebKit/Source/core/fetch/LinkFetchResource.cpp
index 2c92ed8..65653f1 100644
--- a/third_party/WebKit/Source/core/fetch/LinkFetchResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/LinkFetchResource.cpp
@@ -10,7 +10,7 @@
namespace blink {
-PassRefPtrWillBeRawPtr<Resource> LinkFetchResource::fetch(Resource::Type type, FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<Resource> LinkFetchResource::fetch(Resource::Type type, FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(type == LinkPrefetch);
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
diff --git a/third_party/WebKit/Source/core/fetch/LinkFetchResource.h b/third_party/WebKit/Source/core/fetch/LinkFetchResource.h
index 62d7131..654716d 100644
--- a/third_party/WebKit/Source/core/fetch/LinkFetchResource.h
+++ b/third_party/WebKit/Source/core/fetch/LinkFetchResource.h
@@ -8,6 +8,7 @@
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
namespace blink {
@@ -18,7 +19,7 @@ class LinkFetchResource final : public Resource {
public:
using ClientType = ResourceClient;
- static PassRefPtrWillBeRawPtr<Resource> fetch(Resource::Type, FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<Resource> fetch(Resource::Type, FetchRequest&, ResourceFetcher*);
~LinkFetchResource() override;
private:
@@ -27,9 +28,9 @@ private:
LinkResourceFactory(Resource::Type type)
: ResourceFactory(type) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new LinkFetchResource(request, type()));
+ return new LinkFetchResource(request, type());
}
};
LinkFetchResource(const ResourceRequest&, Type);
diff --git a/third_party/WebKit/Source/core/fetch/MemoryCache.cpp b/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
index 6edb7ce..cefaf93 100644
--- a/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
+++ b/third_party/WebKit/Source/core/fetch/MemoryCache.cpp
@@ -22,6 +22,7 @@
#include "core/fetch/MemoryCache.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/WebCacheMemoryDumpProvider.h"
#include "platform/Logging.h"
#include "platform/TraceEvent.h"
@@ -55,6 +56,12 @@ MemoryCache* memoryCache()
MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache)
{
+#if ENABLE(OILPAN)
+ // Move m_liveResources content to keep Resource objects alive.
+ for (const auto& resource : memoryCache()->m_liveResources)
+ cache->m_liveResources.add(resource);
+ memoryCache()->m_liveResources.clear();
+#endif
memoryCache();
MemoryCache* oldCache = gMemoryCache->release();
*gMemoryCache = cache;
@@ -64,7 +71,6 @@ MemoryCache* replaceMemoryCacheForTesting(MemoryCache* cache)
DEFINE_TRACE(MemoryCacheEntry)
{
- visitor->trace(m_resource);
visitor->trace(m_previousInLiveResourcesList);
visitor->trace(m_nextInLiveResourcesList);
visitor->trace(m_previousInAllResourcesList);
@@ -73,7 +79,6 @@ DEFINE_TRACE(MemoryCacheEntry)
void MemoryCacheEntry::dispose()
{
- m_resource->removedFromMemoryCache();
m_resource.clear();
}
@@ -125,6 +130,9 @@ DEFINE_TRACE(MemoryCache)
for (size_t i = 0; i < WTF_ARRAY_LENGTH(m_liveDecodedResources); ++i)
visitor->trace(m_liveDecodedResources[i]);
visitor->trace(m_resourceMaps);
+#if ENABLE(OILPAN)
+ visitor->trace(m_liveResources);
+#endif
}
KURL MemoryCache::removeFragmentIdentifierIfNeeded(const KURL& originalURL)
@@ -199,8 +207,12 @@ Resource* MemoryCache::resourceForURL(const KURL& resourceURL, const String& cac
if (!entry)
return nullptr;
Resource* resource = entry->m_resource.get();
- if (resource && !resource->lock())
+ if (resource && !resource->lock()) {
+ ASSERT(!resource->hasClients());
+ bool didEvict = evict(entry);
+ ASSERT_UNUSED(didEvict, didEvict);
return nullptr;
+ }
return resource;
}
@@ -288,6 +300,24 @@ void MemoryCache::pruneDeadResources(PruneStrategy strategy)
size_t targetSize = static_cast<size_t>(capacity * cTargetPrunePercentage); // Cut by a percentage to avoid immediately pruning again.
int size = m_allResources.size();
+
+ // See if we have any purged resources we can evict.
+ for (int i = 0; i < size; i++) {
+ MemoryCacheEntry* current = m_allResources[i].m_tail;
+ while (current) {
+ MemoryCacheEntry* previous = current->m_previousInAllResourcesList;
+ // Main Resources in the cache are only substitue data that was
+ // precached and should not be evicted.
+ if (current->m_resource->wasPurged() && current->m_resource->canDelete()
+ && current->m_resource->type() != Resource::MainResource) {
+ ASSERT(!current->m_resource->hasClients());
+ ASSERT(!current->m_resource->isPreloaded());
+ bool wasEvicted = evict(current);
+ ASSERT_UNUSED(wasEvicted, wasEvicted);
+ }
+ current = previous;
+ }
+ }
if (targetSize && m_deadSize <= targetSize)
return;
@@ -327,8 +357,13 @@ void MemoryCache::pruneDeadResources(PruneStrategy strategy)
ASSERT(previous->m_resource);
ASSERT(contains(previous->m_resource.get()));
}
- if (!current->m_resource->hasClients() && !current->m_resource->isPreloaded()) {
- evict(current);
+ if (!current->m_resource->hasClients() && !current->m_resource->isPreloaded()
+ && !current->m_resource->isCacheValidator() && current->m_resource->canDelete()
+ && current->m_resource->type() != Resource::MainResource) {
+ // Main Resources in the cache are only substitue data that was
+ // precached and should not be evicted.
+ bool wasEvicted = evict(current);
+ ASSERT_UNUSED(wasEvicted, wasEvicted);
if (targetSize && m_deadSize <= targetSize)
return;
}
@@ -357,11 +392,12 @@ void MemoryCache::setCapacities(size_t minDeadBytes, size_t maxDeadBytes, size_t
prune();
}
-void MemoryCache::evict(MemoryCacheEntry* entry)
+bool MemoryCache::evict(MemoryCacheEntry* entry)
{
ASSERT(WTF::isMainThread());
Resource* resource = entry->m_resource.get();
+ bool canDelete = resource->canDelete();
WTF_LOG(ResourceLoading, "Evicting resource %p for '%s' from cache", resource, resource->url().string().latin1().data());
// The resource may have already been removed by someone other than our caller,
// who needed a fresh copy for a reload. See <http://bugs.webkit.org/show_bug.cgi?id=12479#c6>.
@@ -377,6 +413,8 @@ void MemoryCache::evict(MemoryCacheEntry* entry)
resources->remove(it);
if (entryPtr)
entryPtr->dispose();
+
+ return canDelete;
}
MemoryCacheEntry* MemoryCache::getEntryForResource(const Resource* resource) const
@@ -590,15 +628,17 @@ void MemoryCache::removeURLFromCache(const KURL& url)
void MemoryCache::TypeStatistic::addResource(Resource* o)
{
- bool purgeable = o->isPurgeable();
+ bool purged = o->wasPurged();
+ bool purgeable = o->isPurgeable() && !purged;
size_t pageSize = (o->encodedSize() + o->overheadSize() + 4095) & ~4095;
count++;
- size += o->size();
+ size += purged ? 0 : o->size();
liveSize += o->hasClients() ? o->size() : 0;
decodedSize += o->decodedSize();
encodedSize += o->encodedSize();
encodedSizeDuplicatedInDataURLs += o->url().protocolIsData() ? o->encodedSize() : 0;
purgeableSize += purgeable ? pageSize : 0;
+ purgedSize += purged ? pageSize : 0;
}
MemoryCache::Statistics MemoryCache::getStatistics()
@@ -755,6 +795,22 @@ bool MemoryCache::isInSameLRUListForTest(const Resource* x, const Resource* y)
return lruListFor(ex->m_accessCount, x->size()) == lruListFor(ey->m_accessCount, y->size());
}
+void MemoryCache::registerLiveResource(Resource& resource)
+{
+#if ENABLE(OILPAN)
+ ASSERT(!m_liveResources.contains(&resource));
+ m_liveResources.add(&resource);
+#endif
+}
+
+void MemoryCache::unregisterLiveResource(Resource& resource)
+{
+#if ENABLE(OILPAN)
+ ASSERT(m_liveResources.contains(&resource));
+ m_liveResources.remove(&resource);
+#endif
+}
+
#ifdef MEMORY_CACHE_STATS
void MemoryCache::dumpStats(Timer<MemoryCache>*)
@@ -781,16 +837,16 @@ void MemoryCache::dumpStats(Timer<MemoryCache>*)
void MemoryCache::dumpLRULists(bool includeLive) const
{
- printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable):\n");
+ printf("LRU-SP lists in eviction order (Kilobytes decoded, Kilobytes encoded, Access count, Referenced, isPurgeable, wasPurged):\n");
int size = m_allResources.size();
for (int i = size - 1; i >= 0; i--) {
printf("\n\nList %d: ", i);
MemoryCacheEntry* current = m_allResources[i].m_tail;
while (current) {
- RefPtrWillBeRawPtr<Resource> currentResource = current->m_resource;
+ ResourcePtr<Resource> currentResource = current->m_resource;
if (includeLive || !currentResource->hasClients())
- printf("(%.1fK, %.1fK, %uA, %dR, %d); ", currentResource->decodedSize() / 1024.0f, (currentResource->encodedSize() + currentResource->overheadSize()) / 1024.0f, current->m_accessCount, currentResource->hasClients(), currentResource->isPurgeable());
+ printf("(%.1fK, %.1fK, %uA, %dR, %d, %d); ", currentResource->decodedSize() / 1024.0f, (currentResource->encodedSize() + currentResource->overheadSize()) / 1024.0f, current->m_accessCount, currentResource->hasClients(), currentResource->isPurgeable(), currentResource->wasPurged());
current = current->m_previousInAllResourcesList;
}
diff --git a/third_party/WebKit/Source/core/fetch/MemoryCache.h b/third_party/WebKit/Source/core/fetch/MemoryCache.h
index 987666f..43739bb 100644
--- a/third_party/WebKit/Source/core/fetch/MemoryCache.h
+++ b/third_party/WebKit/Source/core/fetch/MemoryCache.h
@@ -27,6 +27,7 @@
#include "core/CoreExport.h"
#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
#include "public/platform/WebMemoryDumpProvider.h"
#include "public/platform/WebThread.h"
#include "wtf/Allocator.h"
@@ -83,7 +84,7 @@ public:
DECLARE_TRACE();
void dispose();
- RefPtrWillBeMember<Resource> m_resource;
+ ResourcePtr<Resource> m_resource;
bool m_inLiveDecodedResourcesList;
unsigned m_accessCount;
MemoryCacheLiveResourcePriority m_liveResourcePriority;
@@ -272,7 +273,7 @@ private:
void pruneLiveResources(PruneStrategy);
void pruneNow(double currentTime, PruneStrategy);
- void evict(MemoryCacheEntry*);
+ bool evict(MemoryCacheEntry*);
MemoryCacheEntry* getEntryForResource(const Resource*) const;
@@ -310,6 +311,15 @@ private:
ResourceMap* ensureResourceMap(const String& cacheIdentifier);
ResourceMapIndex m_resourceMaps;
+#if ENABLE(OILPAN)
+ // Unlike m_allResources, m_liveResources is a set of Resource objects which
+ // should not be deleted. m_allResources only contains on-cache Resource
+ // objects.
+ // FIXME: Can we remove manual lifetime management of Resource and this?
+ HeapHashSet<Member<Resource>> m_liveResources;
+ friend CORE_EXPORT MemoryCache* replaceMemoryCacheForTesting(MemoryCache*);
+#endif
+
friend class MemoryCacheTest;
#ifdef MEMORY_CACHE_STATS
Timer<MemoryCache> m_statsTimer;
diff --git a/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp b/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp
index 4facb09..a2430bb 100644
--- a/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/MemoryCacheTest.cpp
@@ -32,6 +32,7 @@
#include "core/fetch/MockImageResourceClient.h"
#include "core/fetch/RawResource.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/network/ResourceRequest.h"
#include "platform/testing/UnitTestHelpers.h"
#include "public/platform/Platform.h"
@@ -44,9 +45,9 @@ class MemoryCacheTest : public ::testing::Test {
public:
class FakeDecodedResource : public Resource {
public:
- static RefPtrWillBeRawPtr<FakeDecodedResource> create(const ResourceRequest& request, Type type)
+ FakeDecodedResource(const ResourceRequest& request, Type type)
+ : Resource(request, type)
{
- return adoptRefWillBeNoop(new FakeDecodedResource(request, type));
}
virtual void appendData(const char* data, size_t len)
@@ -56,11 +57,6 @@ public:
}
protected:
- FakeDecodedResource(const ResourceRequest& request, Type type)
- : Resource(request, type)
- {
- }
-
void destroyDecodedDataIfPossible() override
{
setDecodedSize(0);
@@ -69,21 +65,15 @@ public:
class FakeResource : public Resource {
public:
- static RefPtrWillBeRawPtr<FakeResource> create(const ResourceRequest& request, Type type)
+ FakeResource(const ResourceRequest& request, Type type)
+ : Resource(request, type)
{
- return adoptRefWillBeNoop(new FakeResource(request, type));
}
void fakeEncodedSize(size_t size)
{
setEncodedSize(size);
}
-
- private:
- FakeResource(const ResourceRequest& request, Type type)
- : Resource(request, type)
- {
- }
};
protected:
@@ -123,8 +113,8 @@ TEST_F(MemoryCacheTest, VeryLargeResourceAccounting)
const size_t resourceSize1 = sizeMax / 16;
const size_t resourceSize2 = sizeMax / 20;
memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity);
- RefPtrWillBeRawPtr<FakeResource> cachedResource =
- FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> cachedResource =
+ new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedResource->fakeEncodedSize(resourceSize1);
ASSERT_EQ(0u, memoryCache()->deadSize());
@@ -180,24 +170,24 @@ static void TestDeadResourceEviction(Resource* resource1, Resource* resource2)
TEST_F(MemoryCacheTest, DeadResourceEviction_Basic)
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- Resource::create(ResourceRequest("http://test/resource1"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> resource2 =
- Resource::create(ResourceRequest("http://test/resource2"), Resource::Raw);
- TestDeadResourceEviction(resource1.get(), resource2.get());
+ Resource* resource1 =
+ new Resource(ResourceRequest("http://test/resource1"), Resource::Raw);
+ Resource* resource2 =
+ new Resource(ResourceRequest("http://test/resource2"), Resource::Raw);
+ TestDeadResourceEviction(resource1, resource2);
}
TEST_F(MemoryCacheTest, DeadResourceEviction_MultipleResourceMaps)
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- Resource::create(ResourceRequest("http://test/resource1"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> resource2 =
- Resource::create(ResourceRequest("http://test/resource2"), Resource::Raw);
+ Resource* resource1 =
+ new Resource(ResourceRequest("http://test/resource1"), Resource::Raw);
+ Resource* resource2 =
+ new Resource(ResourceRequest("http://test/resource2"), Resource::Raw);
resource2->setCacheIdentifier("foo");
- TestDeadResourceEviction(resource1.get(), resource2.get());
+ TestDeadResourceEviction(resource1, resource2);
}
-static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Resource* cachedLiveResource)
+static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, const ResourcePtr<Resource>& cachedLiveResource)
{
memoryCache()->setDelayBeforeLiveDecodedPrune(0);
const unsigned totalCapacity = 1;
@@ -211,7 +201,7 @@ static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Re
class Task1 : public WebTaskRunner::Task {
public:
- Task1(Resource* live, Resource* dead)
+ Task1(const ResourcePtr<Resource>& live, Resource* dead)
: m_live(live)
, m_dead(dead)
{ }
@@ -226,7 +216,7 @@ static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Re
ASSERT_EQ(0u, memoryCache()->deadSize());
ASSERT_EQ(0u, memoryCache()->liveSize());
- memoryCache()->add(m_dead.get());
+ memoryCache()->add(m_dead);
memoryCache()->add(m_live.get());
memoryCache()->updateDecodedResource(m_live.get(), UpdateForPropertyChange);
ASSERT_EQ(m_dead->size(), memoryCache()->deadSize());
@@ -240,8 +230,8 @@ static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Re
}
private:
- RefPtrWillBePersistent<Resource> m_live;
- RefPtrWillBePersistent<Resource> m_dead;
+ ResourcePtr<Resource> m_live;
+ RawPtrWillBePersistent<Resource> m_dead;
};
class Task2 : public WebTaskRunner::Task {
@@ -270,48 +260,48 @@ static void TestLiveResourceEvictionAtEndOfTask(Resource* cachedDeadResource, Re
// is deferred to the end of the task.
TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_Basic)
{
- RefPtrWillBeRawPtr<Resource> cachedDeadResource =
- Resource::create(ResourceRequest("hhtp://foo"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> cachedLiveResource =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
- TestLiveResourceEvictionAtEndOfTask(cachedDeadResource.get(), cachedLiveResource.get());
+ Resource* cachedDeadResource =
+ new Resource(ResourceRequest("hhtp://foo"), Resource::Raw);
+ ResourcePtr<Resource> cachedLiveResource =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
+ TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource);
}
TEST_F(MemoryCacheTest, LiveResourceEvictionAtEndOfTask_MultipleResourceMaps)
{
{
- RefPtrWillBeRawPtr<Resource> cachedDeadResource =
- Resource::create(ResourceRequest("hhtp://foo"), Resource::Raw);
+ Resource* cachedDeadResource =
+ new Resource(ResourceRequest("hhtp://foo"), Resource::Raw);
cachedDeadResource->setCacheIdentifier("foo");
- RefPtrWillBeRawPtr<Resource> cachedLiveResource =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
- TestLiveResourceEvictionAtEndOfTask(cachedDeadResource.get(), cachedLiveResource.get());
+ ResourcePtr<Resource> cachedLiveResource =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
+ TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<Resource> cachedDeadResource =
- Resource::create(ResourceRequest("hhtp://foo"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> cachedLiveResource =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ Resource* cachedDeadResource =
+ new Resource(ResourceRequest("hhtp://foo"), Resource::Raw);
+ ResourcePtr<Resource> cachedLiveResource =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedLiveResource->setCacheIdentifier("foo");
- TestLiveResourceEvictionAtEndOfTask(cachedDeadResource.get(), cachedLiveResource.get());
+ TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<Resource> cachedDeadResource =
- Resource::create(ResourceRequest("hhtp://test/resource"), Resource::Raw);
+ Resource* cachedDeadResource =
+ new Resource(ResourceRequest("hhtp://test/resource"), Resource::Raw);
cachedDeadResource->setCacheIdentifier("foo");
- RefPtrWillBeRawPtr<Resource> cachedLiveResource =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<Resource> cachedLiveResource =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedLiveResource->setCacheIdentifier("bar");
- TestLiveResourceEvictionAtEndOfTask(cachedDeadResource.get(), cachedLiveResource.get());
+ TestLiveResourceEvictionAtEndOfTask(cachedDeadResource, cachedLiveResource);
memoryCache()->evictResources();
}
}
// Verifies that cached resources are evicted immediately after release when
// the total dead resource size is more than double the dead resource capacity.
-static void TestClientRemoval(Resource* resource1, Resource* resource2)
+static void TestClientRemoval(const ResourcePtr<Resource>& resource1, const ResourcePtr<Resource>& resource2)
{
const char data[6] = "abcde";
MockImageResourceClient client1(resource1);
@@ -323,8 +313,8 @@ static void TestClientRemoval(Resource* resource1, Resource* resource2)
const unsigned maxDeadCapacity = ((resource1->size() + resource2->size()) / 2) - 1;
const unsigned totalCapacity = maxDeadCapacity;
memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity);
- memoryCache()->add(resource1);
- memoryCache()->add(resource2);
+ memoryCache()->add(resource1.get());
+ memoryCache()->add(resource2.get());
// Call prune. There is nothing to prune, but this will initialize
// the prune timestamp, allowing future prunes to be deferred.
memoryCache()->prune();
@@ -340,8 +330,8 @@ static void TestClientRemoval(Resource* resource1, Resource* resource2)
ASSERT_GT(resource2->decodedSize(), 0u);
ASSERT_EQ(memoryCache()->deadSize(), resource1->size());
ASSERT_EQ(memoryCache()->liveSize(), resource2->size());
- ASSERT_TRUE(memoryCache()->contains(resource1));
- ASSERT_TRUE(memoryCache()->contains(resource2));
+ ASSERT_TRUE(memoryCache()->contains(resource1.get()));
+ ASSERT_TRUE(memoryCache()->contains(resource2.get()));
// Removing the client from resource2 should result in immediate
// eviction of resource2 because we are over the prune deferral limit.
@@ -350,54 +340,54 @@ static void TestClientRemoval(Resource* resource1, Resource* resource2)
ASSERT_GT(resource2->decodedSize(), 0u);
ASSERT_EQ(memoryCache()->deadSize(), resource1->size());
ASSERT_EQ(memoryCache()->liveSize(), 0u);
- ASSERT_TRUE(memoryCache()->contains(resource1));
- ASSERT_FALSE(memoryCache()->contains(resource2));
+ ASSERT_TRUE(memoryCache()->contains(resource1.get()));
+ ASSERT_FALSE(memoryCache()->contains(resource2.get()));
}
TEST_F(MemoryCacheTest, ClientRemoval_Basic)
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> resource2 =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
- TestClientRemoval(resource1.get(), resource2.get());
+ ResourcePtr<Resource> resource1 =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<Resource> resource2 =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
+ TestClientRemoval(resource1, resource2);
}
TEST_F(MemoryCacheTest, ClientRemoval_MultipleResourceMaps)
{
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<Resource> resource1 =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
resource1->setCacheIdentifier("foo");
- RefPtrWillBeRawPtr<Resource> resource2 =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
- TestClientRemoval(resource1.get(), resource2.get());
+ ResourcePtr<Resource> resource2 =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
+ TestClientRemoval(resource1, resource2);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
- RefPtrWillBeRawPtr<Resource> resource2 =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<Resource> resource1 =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<Resource> resource2 =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
resource2->setCacheIdentifier("foo");
- TestClientRemoval(resource1.get(), resource2.get());
+ TestClientRemoval(resource1, resource2);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<Resource> resource1 =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<Resource> resource1 =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
resource1->setCacheIdentifier("foo");
- RefPtrWillBeRawPtr<Resource> resource2 =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<Resource> resource2 =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
resource2->setCacheIdentifier("bar");
- TestClientRemoval(resource1.get(), resource2.get());
+ TestClientRemoval(resource1, resource2);
memoryCache()->evictResources();
}
}
// Verifies that CachedResources are evicted from the decode cache
// according to their DecodeCachePriority.
-static void TestDecodeCacheOrder(Resource* cachedImageLowPriority, Resource* cachedImageHighPriority)
+static void TestDecodeCacheOrder(const ResourcePtr<Resource>& cachedImageLowPriority, const ResourcePtr<Resource>& cachedImageHighPriority)
{
memoryCache()->setDelayBeforeLiveDecodedPrune(0);
memoryCache()->setMaxPruneDeferralDelay(0);
@@ -424,23 +414,23 @@ static void TestDecodeCacheOrder(Resource* cachedImageLowPriority, Resource* cac
ASSERT_EQ(memoryCache()->liveSize(), 0u);
// Add the items. The item added first would normally be evicted first.
- memoryCache()->add(cachedImageHighPriority);
+ memoryCache()->add(cachedImageHighPriority.get());
ASSERT_EQ(memoryCache()->deadSize(), 0u);
ASSERT_EQ(memoryCache()->liveSize(), highPrioritySize);
- memoryCache()->add(cachedImageLowPriority);
+ memoryCache()->add(cachedImageLowPriority.get());
ASSERT_EQ(memoryCache()->deadSize(), 0u);
ASSERT_EQ(memoryCache()->liveSize(), highPrioritySize + lowPrioritySize);
// Insert all items in the decoded items list with the same priority
- memoryCache()->updateDecodedResource(cachedImageHighPriority, UpdateForPropertyChange);
- memoryCache()->updateDecodedResource(cachedImageLowPriority, UpdateForPropertyChange);
+ memoryCache()->updateDecodedResource(cachedImageHighPriority.get(), UpdateForPropertyChange);
+ memoryCache()->updateDecodedResource(cachedImageLowPriority.get(), UpdateForPropertyChange);
ASSERT_EQ(memoryCache()->deadSize(), 0u);
ASSERT_EQ(memoryCache()->liveSize(), totalSize);
// Now we will assign their priority and make sure they are moved to the correct buckets.
- memoryCache()->updateDecodedResource(cachedImageLowPriority, UpdateForPropertyChange, MemoryCacheLiveResourcePriorityLow);
- memoryCache()->updateDecodedResource(cachedImageHighPriority, UpdateForPropertyChange, MemoryCacheLiveResourcePriorityHigh);
+ memoryCache()->updateDecodedResource(cachedImageLowPriority.get(), UpdateForPropertyChange, MemoryCacheLiveResourcePriorityLow);
+ memoryCache()->updateDecodedResource(cachedImageHighPriority.get(), UpdateForPropertyChange, MemoryCacheLiveResourcePriorityHigh);
// Should first prune the LowPriority item.
memoryCache()->setCapacities(memoryCache()->minDeadCapacity(), memoryCache()->liveSize() - 10, memoryCache()->liveSize() - 10);
@@ -457,57 +447,57 @@ static void TestDecodeCacheOrder(Resource* cachedImageLowPriority, Resource* cac
TEST_F(MemoryCacheTest, DecodeCacheOrder_Basic)
{
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageLowPriority =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageHighPriority =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
- TestDecodeCacheOrder(cachedImageLowPriority.get(), cachedImageHighPriority.get());
+ ResourcePtr<FakeDecodedResource> cachedImageLowPriority =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageHighPriority =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
+ TestDecodeCacheOrder(cachedImageLowPriority, cachedImageHighPriority);
}
TEST_F(MemoryCacheTest, DecodeCacheOrder_MultipleResourceMaps)
{
{
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageLowPriority =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageHighPriority =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageLowPriority =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageHighPriority =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedImageLowPriority->setCacheIdentifier("foo");
- TestDecodeCacheOrder(cachedImageLowPriority.get(), cachedImageHighPriority.get());
+ TestDecodeCacheOrder(cachedImageLowPriority, cachedImageHighPriority);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageLowPriority =
- FakeDecodedResource::create(ResourceRequest("http://foo.com"), Resource::Raw);
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageHighPriority =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageLowPriority =
+ new FakeDecodedResource(ResourceRequest("http://foo.com"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageHighPriority =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedImageHighPriority->setCacheIdentifier("foo");
- TestDecodeCacheOrder(cachedImageLowPriority.get(), cachedImageHighPriority.get());
+ TestDecodeCacheOrder(cachedImageLowPriority, cachedImageHighPriority);
memoryCache()->evictResources();
}
{
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageLowPriority =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageLowPriority =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedImageLowPriority->setCacheIdentifier("foo");
- RefPtrWillBeRawPtr<FakeDecodedResource> cachedImageHighPriority =
- FakeDecodedResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeDecodedResource> cachedImageHighPriority =
+ new FakeDecodedResource(ResourceRequest("http://test/resource"), Resource::Raw);
cachedImageHighPriority->setCacheIdentifier("bar");
- TestDecodeCacheOrder(cachedImageLowPriority.get(), cachedImageHighPriority.get());
+ TestDecodeCacheOrder(cachedImageLowPriority, cachedImageHighPriority);
memoryCache()->evictResources();
}
}
TEST_F(MemoryCacheTest, RemoveDuringRevalidation)
{
- RefPtrWillBeRawPtr<FakeResource> resource1 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource1 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
memoryCache()->add(resource1.get());
- RefPtrWillBeRawPtr<FakeResource> resource2 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource2 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
memoryCache()->remove(resource1.get());
memoryCache()->add(resource2.get());
EXPECT_TRUE(memoryCache()->contains(resource2.get()));
EXPECT_FALSE(memoryCache()->contains(resource1.get()));
- RefPtrWillBeRawPtr<FakeResource> resource3 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource3 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
memoryCache()->remove(resource2.get());
memoryCache()->add(resource3.get());
EXPECT_TRUE(memoryCache()->contains(resource3.get()));
@@ -516,10 +506,10 @@ TEST_F(MemoryCacheTest, RemoveDuringRevalidation)
TEST_F(MemoryCacheTest, ResourceMapIsolation)
{
- RefPtrWillBeRawPtr<FakeResource> resource1 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource1 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
memoryCache()->add(resource1.get());
- RefPtrWillBeRawPtr<FakeResource> resource2 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource2 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
resource2->setCacheIdentifier("foo");
memoryCache()->add(resource2.get());
EXPECT_TRUE(memoryCache()->contains(resource1.get()));
@@ -531,7 +521,7 @@ TEST_F(MemoryCacheTest, ResourceMapIsolation)
EXPECT_EQ(resource2.get(), memoryCache()->resourceForURL(url, "foo"));
EXPECT_EQ(0, memoryCache()->resourceForURL(KURL()));
- RefPtrWillBeRawPtr<FakeResource> resource3 = FakeResource::create(ResourceRequest("http://test/resource"), Resource::Raw);
+ ResourcePtr<FakeResource> resource3 = new FakeResource(ResourceRequest("http://test/resource"), Resource::Raw);
resource3->setCacheIdentifier("foo");
memoryCache()->remove(resource2.get());
memoryCache()->add(resource3.get());
diff --git a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.cpp b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.cpp
index b3d9d15..4b41e4e 100644
--- a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.cpp
+++ b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.cpp
@@ -5,11 +5,12 @@
#include "core/fetch/MockImageResourceClient.h"
#include "core/fetch/ImageResource.h"
+#include "core/fetch/ResourcePtr.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
-MockImageResourceClient::MockImageResourceClient(PassRefPtrWillBeRawPtr<Resource> resource)
+MockImageResourceClient::MockImageResourceClient(const ResourcePtr<Resource>& resource)
: m_resource(resource.get())
, m_imageChangedCount(0)
, m_notifyFinishedCalled(false)
diff --git a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
index b877a92..914e126 100644
--- a/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
+++ b/third_party/WebKit/Source/core/fetch/MockImageResourceClient.h
@@ -32,14 +32,17 @@
#define MockImageResourceClient_h
#include "core/fetch/ImageResourceClient.h"
-#include "core/fetch/Resource.h"
#include "platform/heap/Handle.h"
namespace blink {
+template<typename T> class ResourcePtr;
+
+class Resource;
+
class MockImageResourceClient final : public ImageResourceClient {
public:
- explicit MockImageResourceClient(const PassRefPtrWillBeRawPtr<Resource>);
+ explicit MockImageResourceClient(const ResourcePtr<Resource>&);
~MockImageResourceClient() override;
void imageChanged(ImageResource*, const IntRect*) override
diff --git a/third_party/WebKit/Source/core/fetch/RawResource.cpp b/third_party/WebKit/Source/core/fetch/RawResource.cpp
index 1a8eaa6..9bc2cd4 100644
--- a/third_party/WebKit/Source/core/fetch/RawResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/RawResource.cpp
@@ -33,7 +33,7 @@
namespace blink {
-PassRefPtrWillBeRawPtr<Resource> RawResource::fetchSynchronously(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<Resource> RawResource::fetchSynchronously(FetchRequest& request, ResourceFetcher* fetcher)
{
request.mutableResourceRequest().setTimeoutInterval(10);
ResourceLoaderOptions options(request.options());
@@ -42,7 +42,7 @@ PassRefPtrWillBeRawPtr<Resource> RawResource::fetchSynchronously(FetchRequest& r
return fetcher->requestResource(request, RawResourceFactory(Resource::Raw));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchImport(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<RawResource> RawResource::fetchImport(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextImport);
@@ -50,14 +50,14 @@ PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchImport(FetchRequest& reque
return toRawResource(fetcher->requestResource(request, RawResourceFactory(Resource::ImportResource)));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<RawResource> RawResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
ASSERT(request.resourceRequest().requestContext() != WebURLRequest::RequestContextUnspecified);
return toRawResource(fetcher->requestResource(request, RawResourceFactory(Resource::Raw)));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMainResource(FetchRequest& request, ResourceFetcher* fetcher, const SubstituteData& substituteData)
+ResourcePtr<RawResource> RawResource::fetchMainResource(FetchRequest& request, ResourceFetcher* fetcher, const SubstituteData& substituteData)
{
ASSERT(request.resourceRequest().frameType() != WebURLRequest::FrameTypeNone);
ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestContextForm || request.resourceRequest().requestContext() == WebURLRequest::RequestContextFrame || request.resourceRequest().requestContext() == WebURLRequest::RequestContextHyperlink || request.resourceRequest().requestContext() == WebURLRequest::RequestContextIframe || request.resourceRequest().requestContext() == WebURLRequest::RequestContextInternal || request.resourceRequest().requestContext() == WebURLRequest::RequestContextLocation);
@@ -65,21 +65,21 @@ PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMainResource(FetchRequest&
return toRawResource(fetcher->requestResource(request, RawResourceFactory(Resource::MainResource), substituteData));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchMedia(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<RawResource> RawResource::fetchMedia(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestContextAudio || request.resourceRequest().requestContext() == WebURLRequest::RequestContextVideo);
return toRawResource(fetcher->requestResource(request, RawResourceFactory(Resource::Media)));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchTextTrack(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<RawResource> RawResource::fetchTextTrack(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextTrack);
return toRawResource(fetcher->requestResource(request, RawResourceFactory(Resource::TextTrack)));
}
-PassRefPtrWillBeRawPtr<RawResource> RawResource::fetchManifest(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<RawResource> RawResource::fetchManifest(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
ASSERT(request.resourceRequest().requestContext() == WebURLRequest::RequestContextManifest);
@@ -95,7 +95,7 @@ void RawResource::appendData(const char* data, size_t length)
{
Resource::appendData(data, length);
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
c->dataReceived(this, data, length);
@@ -108,7 +108,7 @@ void RawResource::didAddClient(ResourceClient* c)
// The calls to the client can result in events running, potentially causing
// this resource to be evicted from the cache and all clients to be removed,
// so a protector is necessary.
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ASSERT(c->resourceClientType() == RawResourceClient::expectedType());
RawResourceClient* client = static_cast<RawResourceClient*>(c);
for (const auto& redirect : redirectChain()) {
@@ -131,7 +131,7 @@ void RawResource::didAddClient(ResourceClient* c)
void RawResource::willFollowRedirect(ResourceRequest& newRequest, const ResourceResponse& redirectResponse)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ASSERT(!redirectResponse.isNull());
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
@@ -141,7 +141,7 @@ void RawResource::willFollowRedirect(ResourceRequest& newRequest, const Resource
void RawResource::updateRequest(const ResourceRequest& request)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
c->updateRequest(this, request);
@@ -149,7 +149,7 @@ void RawResource::updateRequest(const ResourceRequest& request)
void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle> handle)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ InternalResourcePtr protect(this);
bool isSuccessfulRevalidation = isCacheValidator() && response.httpStatusCode() == 304;
Resource::responseReceived(response, nullptr);
@@ -175,7 +175,7 @@ void RawResource::responseReceived(const ResourceResponse& response, PassOwnPtr<
void RawResource::setSerializedCachedMetadata(const char* data, size_t size)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
Resource::setSerializedCachedMetadata(data, size);
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
@@ -184,7 +184,7 @@ void RawResource::setSerializedCachedMetadata(const char* data, size_t size)
void RawResource::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
c->dataSent(this, bytesSent, totalBytesToBeSent);
@@ -192,7 +192,7 @@ void RawResource::didSendData(unsigned long long bytesSent, unsigned long long t
void RawResource::didDownloadData(int dataLength)
{
- RefPtrWillBeRawPtr<RawResource> protect(this);
+ ResourcePtr<RawResource> protect(this);
ResourceClientWalker<RawResourceClient> w(m_clients);
while (RawResourceClient* c = w.next())
c->dataDownloaded(this, dataLength);
diff --git a/third_party/WebKit/Source/core/fetch/RawResource.h b/third_party/WebKit/Source/core/fetch/RawResource.h
index d7061f0..0bab880 100644
--- a/third_party/WebKit/Source/core/fetch/RawResource.h
+++ b/third_party/WebKit/Source/core/fetch/RawResource.h
@@ -24,8 +24,8 @@
#define RawResource_h
#include "core/CoreExport.h"
-#include "core/fetch/Resource.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "public/platform/WebDataConsumerHandle.h"
#include "wtf/PassOwnPtr.h"
@@ -39,19 +39,16 @@ class CORE_EXPORT RawResource final : public Resource {
public:
using ClientType = RawResourceClient;
- static PassRefPtrWillBeRawPtr<Resource> fetchSynchronously(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<RawResource> fetch(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<RawResource> fetchMainResource(FetchRequest&, ResourceFetcher*, const SubstituteData&);
- static PassRefPtrWillBeRawPtr<RawResource> fetchImport(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<RawResource> fetchMedia(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<RawResource> fetchTextTrack(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<RawResource> fetchManifest(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<Resource> fetchSynchronously(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<RawResource> fetch(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<RawResource> fetchMainResource(FetchRequest&, ResourceFetcher*, const SubstituteData&);
+ static ResourcePtr<RawResource> fetchImport(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<RawResource> fetchMedia(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<RawResource> fetchTextTrack(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<RawResource> fetchManifest(FetchRequest&, ResourceFetcher*);
// Exposed for testing
- static RefPtrWillBeRawPtr<RawResource> create(const ResourceRequest& request, Type type)
- {
- return adoptRefWillBeNoop(new RawResource(request, type));
- }
+ RawResource(const ResourceRequest&, Type);
// FIXME: AssociatedURLLoader shouldn't be a DocumentThreadableLoader and therefore shouldn't
// use RawResource. However, it is, and it needs to be able to defer loading.
@@ -66,14 +63,12 @@ private:
RawResourceFactory(Resource::Type type)
: ResourceFactory(type) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new RawResource(request, m_type));
+ return new RawResource(request, m_type);
}
};
- RawResource(const ResourceRequest&, Type);
-
void didAddClient(ResourceClient*) override;
void appendData(const char*, size_t) override;
@@ -95,7 +90,7 @@ inline bool isRawResource(const Resource& resource)
return type == Resource::MainResource || type == Resource::Raw || type == Resource::TextTrack || type == Resource::Media || type == Resource::Manifest || type == Resource::ImportResource;
}
#endif
-inline PassRefPtrWillBeRawPtr<RawResource> toRawResource(const PassRefPtrWillBeRawPtr<Resource>& resource)
+inline RawResource* toRawResource(const ResourcePtr<Resource>& resource)
{
ASSERT_WITH_SECURITY_IMPLICATION(!resource || isRawResource(*resource.get()));
return static_cast<RawResource*>(resource.get());
diff --git a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
index ef41529..ed4b988 100644
--- a/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/RawResourceTest.cpp
@@ -34,6 +34,7 @@
#include "core/fetch/MemoryCache.h"
#include "core/fetch/MockImageResourceClient.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/SharedBuffer.h"
#include "platform/testing/UnitTestHelpers.h"
#include "public/platform/Platform.h"
@@ -49,7 +50,7 @@ TEST(RawResourceTest, DontIgnoreAcceptForCacheReuse)
ResourceRequest jpegRequest;
jpegRequest.setHTTPAccept("image/jpeg");
- RefPtrWillBeRawPtr<RawResource> jpegResource(RawResource::create(jpegRequest, Resource::Raw));
+ ResourcePtr<RawResource> jpegResource(new RawResource(jpegRequest, Resource::Raw));
ResourceRequest pngRequest;
pngRequest.setHTTPAccept("image/png");
@@ -107,13 +108,13 @@ public:
}
private:
DummyClient* m_dummyClient;
- RefPtrWillBePersistent<Resource> m_resource;
+ ResourcePtr<Resource> m_resource;
Timer<AddingClient> m_removeClientTimer;
};
TEST(RawResourceTest, RevalidationSucceeded)
{
- RefPtrWillBeRawPtr<Resource> resource = RawResource::create(ResourceRequest("data:text/html,"), Resource::Raw);
+ ResourcePtr<Resource> resource = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
ResourceResponse response;
response.setHTTPStatusCode(200);
resource->responseReceived(response, nullptr);
@@ -145,7 +146,7 @@ TEST(RawResourceTest, RevalidationSucceeded)
TEST(RawResourceTest, RevalidationSucceededForResourceWithoutBody)
{
- RefPtrWillBeRawPtr<Resource> resource = RawResource::create(ResourceRequest("data:text/html,"), Resource::Raw);
+ ResourcePtr<Resource> resource = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
ResourceResponse response;
response.setHTTPStatusCode(200);
resource->responseReceived(response, nullptr);
@@ -175,7 +176,7 @@ TEST(RawResourceTest, RevalidationSucceededForResourceWithoutBody)
TEST(RawResourceTest, AddClientDuringCallback)
{
- RefPtrWillBeRawPtr<Resource> raw = RawResource::create(ResourceRequest("data:text/html,"), Resource::Raw);
+ ResourcePtr<Resource> raw = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
raw->setLoading(false);
// Create a non-null response.
@@ -214,7 +215,7 @@ private:
TEST(RawResourceTest, RemoveClientDuringCallback)
{
- RefPtrWillBeRawPtr<Resource> raw = RawResource::create(ResourceRequest("data:text/html,"), Resource::Raw);
+ ResourcePtr<Resource> raw = new RawResource(ResourceRequest("data:text/html,"), Resource::Raw);
raw->setLoading(false);
// Create a non-null response.
diff --git a/third_party/WebKit/Source/core/fetch/Resource.cpp b/third_party/WebKit/Source/core/fetch/Resource.cpp
index 1bcc9d1..586b2d2 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.cpp
+++ b/third_party/WebKit/Source/core/fetch/Resource.cpp
@@ -31,6 +31,7 @@
#include "core/fetch/ResourceClientWalker.h"
#include "core/fetch/ResourceFetcher.h"
#include "core/fetch/ResourceLoader.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/inspector/InspectorInstrumentation.h"
#include "platform/Logging.h"
#include "platform/SharedBuffer.h"
@@ -154,13 +155,17 @@ Resource::Resource(const ResourceRequest& request, Type type)
, m_identifier(0)
, m_encodedSize(0)
, m_decodedSize(0)
+ , m_handleCount(0)
, m_preloadCount(0)
+ , m_protectorCount(0)
, m_cacheIdentifier(MemoryCache::defaultCacheIdentifier())
, m_preloadResult(PreloadNotReferenced)
, m_requestedFromNetworkingLayer(false)
, m_loading(false)
+ , m_switchingClientsToRevalidatedResource(false)
, m_type(type)
, m_status(Pending)
+ , m_wasPurged(false)
, m_needsSynchronousCacheHit(false)
, m_avoidBlockingOnLoad(false)
#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
@@ -169,6 +174,7 @@ Resource::Resource(const ResourceRequest& request, Type type)
{
ASSERT(m_type == unsigned(type)); // m_type is a bitfield, so this tests careless updates of the enum.
InstanceCounters::incrementCounter(InstanceCounters::ResourceCounter);
+ memoryCache()->registerLiveResource(*this);
// Currently we support the metadata caching only for HTTP family.
if (m_resourceRequest.url().protocolIsInHTTPFamily())
@@ -185,18 +191,19 @@ Resource::Resource(const ResourceRequest& request, Type type)
Resource::~Resource()
{
+ ASSERT(canDelete());
+ RELEASE_ASSERT(!memoryCache()->contains(this));
+ RELEASE_ASSERT(!ResourceCallback::callbackHandler()->isScheduled(this));
assertAlive();
#ifdef ENABLE_RESOURCE_IS_DELETED_CHECK
m_deleted = true;
#endif
-
InstanceCounters::decrementCounter(InstanceCounters::ResourceCounter);
}
-void Resource::removedFromMemoryCache()
+void Resource::dispose()
{
- InspectorInstrumentation::removedResourceFromMemoryCache(this);
}
DEFINE_TRACE(Resource)
@@ -439,13 +446,18 @@ bool Resource::unlock()
if (!m_data->isLocked())
return true;
- if (!memoryCache()->contains(this) || hasClients() || !m_revalidatingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock())
+ if (!memoryCache()->contains(this) || hasClients() || m_handleCount > 1 || !m_revalidatingRequest.isNull() || !m_loadFinishTime || !isSafeToUnlock())
return false;
m_data->unlock();
return true;
}
+bool Resource::hasRightHandleCountApartFromCache(unsigned targetCount) const
+{
+ return m_handleCount == targetCount + (memoryCache()->contains(this) ? 1 : 0);
+}
+
void Resource::responseReceived(const ResourceResponse& response, PassOwnPtr<WebDataConsumerHandle>)
{
m_responseTimestamp = currentTime();
@@ -517,6 +529,12 @@ WeakPtrWillBeRawPtr<Resource> Resource::asWeakPtr()
#endif
}
+bool Resource::canDelete() const
+{
+ return !hasClients() && !m_loader && !m_preloadCount && hasRightHandleCountApartFromCache(0)
+ && !m_protectorCount;
+}
+
String Resource::reasonNotDeletable() const
{
StringBuilder builder;
@@ -545,6 +563,20 @@ String Resource::reasonNotDeletable() const
builder.appendNumber(m_preloadCount);
builder.append(")");
}
+ if (!hasRightHandleCountApartFromCache(0)) {
+ if (!builder.isEmpty())
+ builder.append(' ');
+ builder.append("m_handleCount(");
+ builder.appendNumber(m_handleCount);
+ builder.append(")");
+ }
+ if (m_protectorCount) {
+ if (!builder.isEmpty())
+ builder.append(' ');
+ builder.append("m_protectorCount(");
+ builder.appendNumber(m_protectorCount);
+ builder.append(")");
+ }
if (memoryCache()->contains(this)) {
if (!builder.isEmpty())
builder.append(' ');
@@ -553,6 +585,11 @@ String Resource::reasonNotDeletable() const
return builder.toString();
}
+bool Resource::hasOneHandle() const
+{
+ return hasRightHandleCountApartFromCache(1);
+}
+
CachedMetadata* Resource::cachedMetadata(unsigned dataTypeID) const
{
if (!m_cachedMetadata || m_cachedMetadata->dataTypeID() != dataTypeID)
@@ -642,10 +679,11 @@ void Resource::removeClient(ResourceClient* client)
if (m_clientsAwaitingCallback.isEmpty())
ResourceCallback::callbackHandler()->cancel(this);
- if (!hasClients()) {
- RefPtrWillBeRawPtr<Resource> protect(this);
+ bool deleted = deleteIfPossible();
+ if (!deleted && !hasClients()) {
memoryCache()->makeDead(this);
- allClientsRemoved();
+ if (!m_switchingClientsToRevalidatedResource)
+ allClientsRemoved();
// RFC2616 14.9.2:
// "no-store: ... MUST make a best-effort attempt to remove the information from volatile storage as promptly as possible"
@@ -665,7 +703,7 @@ void Resource::allClientsRemoved()
{
if (!m_loader)
return;
- if (m_type == MainResource || m_type == Raw || !memoryCache()->contains(this))
+ if (m_type == MainResource || m_type == Raw)
cancelTimerFired(&m_cancelTimer);
else if (!m_cancelTimer.isActive())
m_cancelTimer.startOneShot(0, BLINK_FROM_HERE);
@@ -678,12 +716,26 @@ void Resource::cancelTimerFired(Timer<Resource>* timer)
ASSERT_UNUSED(timer, timer == &m_cancelTimer);
if (hasClients() || !m_loader)
return;
- RefPtrWillBeRawPtr<Resource> protect(this);
+ ResourcePtr<Resource> protect(this);
m_loader->cancelIfNotFinishing();
if (m_status != Cached)
memoryCache()->remove(this);
}
+bool Resource::deleteIfPossible()
+{
+ if (canDelete() && !memoryCache()->contains(this)) {
+ InspectorInstrumentation::willDestroyResource(this);
+ dispose();
+ memoryCache()->unregisterLiveResource(*this);
+#if !ENABLE(OILPAN)
+ delete this;
+#endif
+ return true;
+ }
+ return false;
+}
+
void Resource::setDecodedSize(size_t decodedSize)
{
if (decodedSize == m_decodedSize)
@@ -755,13 +807,14 @@ void Resource::onMemoryDump(WebMemoryDumpLevelOfDetail levelOfDetail, WebProcess
const String dumpName = getMemoryDumpName();
WebMemoryAllocatorDump* dump = memoryDump->createMemoryAllocatorDump(dumpName);
dump->addScalar("encoded_size", "bytes", m_encodedSize);
- if (m_data && m_data->isLocked())
- dump->addScalar("live_size", "bytes", m_encodedSize);
- else
+ if (canDelete()) {
dump->addScalar("dead_size", "bytes", m_encodedSize);
+ } else {
+ dump->addScalar("live_size", "bytes", m_encodedSize);
+ }
if (m_data) {
- dump->addScalar("purgeable_size", "bytes", isPurgeable() ? encodedSize() + overheadSize() : 0);
+ dump->addScalar("purgeable_size", "bytes", isPurgeable() && !wasPurged() ? encodedSize() + overheadSize() : 0);
m_data->onMemoryDump(dumpName, memoryDump);
}
@@ -843,6 +896,29 @@ void Resource::revalidationFailed()
destroyDecodedDataForFailedRevalidation();
}
+void Resource::registerHandle(ResourcePtrBase* h)
+{
+ assertAlive();
+ ++m_handleCount;
+}
+
+void Resource::unregisterHandle(ResourcePtrBase* h)
+{
+ assertAlive();
+ ASSERT(m_handleCount > 0);
+ --m_handleCount;
+
+ if (!m_handleCount) {
+ if (deleteIfPossible())
+ return;
+ unlock();
+ } else if (m_handleCount == 1 && memoryCache()->contains(this)) {
+ unlock();
+ if (!hasClients())
+ memoryCache()->prune(this);
+ }
+}
+
bool Resource::canReuseRedirectChain()
{
for (auto& redirect : m_redirectChain) {
@@ -884,6 +960,11 @@ bool Resource::isPurgeable() const
return m_data && !m_data->isLocked();
}
+bool Resource::wasPurged() const
+{
+ return m_wasPurged;
+}
+
bool Resource::lock()
{
if (!m_data)
@@ -893,10 +974,8 @@ bool Resource::lock()
ASSERT(!hasClients());
- // If locking fails, our buffer has been purged. There's no point
- // in leaving a purged resource in MemoryCache.
if (!m_data->lock()) {
- memoryCache()->remove(this);
+ m_wasPurged = true;
return false;
}
return true;
@@ -976,8 +1055,8 @@ bool Resource::ResourceCallback::isScheduled(Resource* resource) const
void Resource::ResourceCallback::runTask()
{
- WillBeHeapVector<RefPtrWillBeMember<Resource>> resources;
- for (const RefPtrWillBeMember<Resource>& resource : m_resourcesWithPendingClients)
+ Vector<ResourcePtr<Resource>> resources;
+ for (const RawPtrWillBeMember<Resource>& resource : m_resourcesWithPendingClients)
resources.append(resource.get());
m_resourcesWithPendingClients.clear();
diff --git a/third_party/WebKit/Source/core/fetch/Resource.h b/third_party/WebKit/Source/core/fetch/Resource.h
index 7689b3e..eae6e25 100644
--- a/third_party/WebKit/Source/core/fetch/Resource.h
+++ b/third_party/WebKit/Source/core/fetch/Resource.h
@@ -49,6 +49,7 @@ struct FetchInitiatorInfo;
class CachedMetadata;
class FetchRequest;
class ResourceClient;
+class ResourcePtrBase;
class ResourceFetcher;
class ResourceTimingInfo;
class InspectorResource;
@@ -59,7 +60,7 @@ class SharedBuffer;
// A resource that is held in the cache. Classes who want to use this object should derive
// from ResourceClient, to get the function calls in case the requested data has arrived.
// This class also does the actual communication with the loader to obtain the resource from the network.
-class CORE_EXPORT Resource : public RefCountedWillBeGarbageCollectedFinalized<Resource> {
+class CORE_EXPORT Resource : public NoBaseWillBeGarbageCollectedFinalized<Resource> {
WTF_MAKE_NONCOPYABLE(Resource);
USING_FAST_MALLOC_WITH_TYPE_NAME_WILL_BE_REMOVED(blink::Resource);
friend class InspectorResource;
@@ -91,13 +92,16 @@ public:
};
// Exposed for testing.
- static PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, Type type)
- {
- return adoptRefWillBeNoop(new Resource(request, type));
- }
+ Resource(const ResourceRequest&, Type);
+#if ENABLE(OILPAN)
virtual ~Resource();
-
- virtual void removedFromMemoryCache();
+#else
+protected:
+ // Only deleteIfPossible should delete this.
+ virtual ~Resource();
+public:
+#endif
+ virtual void dispose();
DECLARE_VIRTUAL_TRACE();
virtual void load(ResourceFetcher*, const ResourceLoaderOptions&);
@@ -137,6 +141,7 @@ public:
void addClient(ResourceClient*);
void removeClient(ResourceClient*);
bool hasClients() const { return !m_clients.isEmpty() || !m_clientsAwaitingCallback.isEmpty() || !m_finishedClients.isEmpty(); }
+ bool deleteIfPossible();
enum PreloadResult {
PreloadNotReferenced,
@@ -203,6 +208,8 @@ public:
// This may return nullptr when the resource isn't cacheable.
CachedMetadataHandler* cacheHandler();
+ bool hasOneHandle() const;
+ bool canDelete() const;
String reasonNotDeletable() const;
// List of acceptable MIME types separated by ",".
@@ -222,6 +229,9 @@ public:
void increasePreloadCount() { ++m_preloadCount; }
void decreasePreloadCount() { ASSERT(m_preloadCount); --m_preloadCount; }
+ void registerHandle(ResourcePtrBase* h);
+ void unregisterHandle(ResourcePtrBase* h);
+
bool canReuseRedirectChain();
bool mustRevalidateDueToCacheHeaders();
bool canUseCacheValidator();
@@ -235,6 +245,7 @@ public:
double stalenessLifetime();
bool isPurgeable() const;
+ bool wasPurged() const;
bool lock();
void setCacheIdentifier(const String& cacheIdentifier) { m_cacheIdentifier = cacheIdentifier; }
@@ -265,13 +276,38 @@ public:
#endif
protected:
- Resource(const ResourceRequest&, Type);
-
virtual void checkNotify();
virtual void finishOnePart();
virtual void destroyDecodedDataForFailedRevalidation() { }
+ // Normal resource pointers will silently switch what Resource* they reference when we
+ // successfully revalidated the resource. We need a way to guarantee that the Resource
+ // that received the 304 response survives long enough to switch everything over to the
+ // revalidatedresource. The normal mechanisms for keeping a Resource alive externally
+ // (ResourcePtrs and ResourceClients registering themselves) don't work in this case, so
+ // have a separate internal protector).
+ class InternalResourcePtr {
+ STACK_ALLOCATED();
+ public:
+ explicit InternalResourcePtr(Resource* resource)
+ : m_resource(resource)
+ {
+ m_resource->incrementProtectorCount();
+ }
+
+ ~InternalResourcePtr()
+ {
+ m_resource->decrementProtectorCount();
+ m_resource->deleteIfPossible();
+ }
+ private:
+ RawPtrWillBeMember<Resource> m_resource;
+ };
+
+ void incrementProtectorCount() { m_protectorCount++; }
+ void decrementProtectorCount() { m_protectorCount--; }
+
void setEncodedSize(size_t);
void setDecodedSize(size_t);
void didAccessDecodedData();
@@ -293,7 +329,7 @@ protected:
ResourceCallback();
void runTask();
OwnPtr<CancellableTaskFactory> m_callbackTaskFactory;
- WillBeHeapHashSet<RefPtrWillBeMember<Resource>> m_resourcesWithPendingClients;
+ WillBeHeapHashSet<RawPtrWillBeMember<Resource>> m_resourcesWithPendingClients;
};
bool hasClient(ResourceClient* client) { return m_clients.contains(client) || m_clientsAwaitingCallback.contains(client) || m_finishedClients.contains(client); }
@@ -342,6 +378,8 @@ private:
bool unlock();
+ bool hasRightHandleCountApartFromCache(unsigned targetCount) const;
+
void setCachedMetadata(unsigned dataTypeID, const char*, size_t, CachedMetadataHandler::CacheType);
void clearCachedMetadata(CachedMetadataHandler::CacheType);
CachedMetadata* cachedMetadata(unsigned dataTypeID) const;
@@ -363,7 +401,9 @@ private:
size_t m_encodedSize;
size_t m_decodedSize;
+ unsigned m_handleCount;
unsigned m_preloadCount;
+ unsigned m_protectorCount;
String m_cacheIdentifier;
@@ -372,9 +412,13 @@ private:
unsigned m_loading : 1;
+ unsigned m_switchingClientsToRevalidatedResource : 1;
+
unsigned m_type : 4; // Type
unsigned m_status : 3; // Status
+ unsigned m_wasPurged : 1;
+
unsigned m_needsSynchronousCacheHit : 1;
unsigned m_avoidBlockingOnLoad : 1;
@@ -389,7 +433,7 @@ private:
class ResourceFactory {
STACK_ALLOCATED();
public:
- virtual PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest&, const String&) const = 0;
+ virtual Resource* create(const ResourceRequest&, const String&) const = 0;
Resource::Type type() const { return m_type; }
protected:
@@ -400,7 +444,7 @@ protected:
#define DEFINE_RESOURCE_TYPE_CASTS(typeName) \
DEFINE_TYPE_CASTS(typeName##Resource, Resource, resource, resource->type() == Resource::typeName, resource.type() == Resource::typeName); \
- inline typeName##Resource* to##typeName##Resource(const RefPtrWillBeRawPtr<Resource>& ptr) { return to##typeName##Resource(ptr.get()); }
+ inline typeName##Resource* to##typeName##Resource(const ResourcePtr<Resource>& ptr) { return to##typeName##Resource(ptr.get()); }
} // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
index c269dc2..5d39309 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -275,7 +275,7 @@ static PassRefPtr<TracedValue> urlForTraceEvent(const KURL& url)
return value.release();
}
-void ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFactory& factory, const SubstituteData& substituteData)
+ResourcePtr<Resource> ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFactory& factory, const SubstituteData& substituteData)
{
const KURL& url = request.resourceRequest().url();
ASSERT(url.protocolIsData() || substituteData.isValid());
@@ -285,13 +285,13 @@ void ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFa
// layer where it isn't easy to mock out a network load. It uses data: urls to emulate the
// behavior it wants to test, which would otherwise be reserved for network loads.
if ((factory.type() == Resource::MainResource && !substituteData.isValid()) || factory.type() == Resource::Raw)
- return;
+ return nullptr;
const String cacheIdentifier = getCacheIdentifier();
if (Resource* oldResource = memoryCache()->resourceForURL(url, cacheIdentifier)) {
// There's no reason to re-parse if we saved the data from the previous parse.
if (request.options().dataBufferingPolicy != DoNotBufferData)
- return;
+ return oldResource;
memoryCache()->remove(oldResource);
}
@@ -305,13 +305,13 @@ void ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFa
} else {
data = PassRefPtr<SharedBuffer>(Platform::current()->parseDataURL(url, mimetype, charset));
if (!data)
- return;
+ return nullptr;
}
ResourceResponse response(url, mimetype, data->size(), charset, String());
response.setHTTPStatusCode(200);
response.setHTTPStatusText("OK");
- RefPtrWillBeRawPtr<Resource> resource = factory.create(request.resourceRequest(), request.charset());
+ ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), request.charset());
resource->setNeedsSynchronousCacheHit(substituteData.forceSynchronousLoad());
resource->setOptions(request.options());
// FIXME: We should provide a body stream here.
@@ -323,6 +323,7 @@ void ResourceFetcher::preCacheData(const FetchRequest& request, const ResourceFa
resource->setCacheIdentifier(cacheIdentifier);
resource->finish();
memoryCache()->add(resource.get());
+ return resource;
}
void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(Resource* resource, const FetchRequest& request)
@@ -337,7 +338,7 @@ void ResourceFetcher::moveCachedNonBlockingResourceToBlocking(Resource* resource
}
}
-PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::requestResource(FetchRequest& request, const ResourceFactory& factory, const SubstituteData& substituteData)
+ResourcePtr<Resource> ResourceFetcher::requestResource(FetchRequest& request, const ResourceFactory& factory, const SubstituteData& substituteData)
{
ASSERT(request.options().synchronousPolicy == RequestAsynchronously || factory.type() == Resource::Raw || factory.type() == Resource::XSLStyleSheet);
@@ -375,9 +376,11 @@ PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::requestResource(FetchRequest&
}
bool isStaticData = request.resourceRequest().url().protocolIsData() || substituteData.isValid();
+ ResourcePtr<Resource> resource;
if (isStaticData)
- preCacheData(request, factory, substituteData);
- RefPtrWillBeRawPtr<Resource> resource = memoryCache()->resourceForURL(url, getCacheIdentifier());
+ resource = preCacheData(request, factory, substituteData);
+ if (!resource)
+ resource = memoryCache()->resourceForURL(url, getCacheIdentifier());
// See if we can use an existing resource from the cache. If so, we need to move it to be load blocking.
moveCachedNonBlockingResourceToBlocking(resource.get(), request);
@@ -535,7 +538,7 @@ void ResourceFetcher::initializeRevalidation(const FetchRequest& request, Resour
resource->setRevalidatingRequest(revalidatingRequest);
}
-PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& request, const String& charset, const ResourceFactory& factory)
+ResourcePtr<Resource> ResourceFetcher::createResourceForLoading(FetchRequest& request, const String& charset, const ResourceFactory& factory)
{
const String cacheIdentifier = getCacheIdentifier();
ASSERT(!memoryCache()->resourceForURL(request.resourceRequest().url(), cacheIdentifier));
@@ -543,7 +546,7 @@ PassRefPtrWillBeRawPtr<Resource> ResourceFetcher::createResourceForLoading(Fetch
WTF_LOG(ResourceLoading, "Loading Resource for '%s'.", request.resourceRequest().url().elidedString().latin1().data());
initializeResourceRequest(request.mutableResourceRequest(), factory.type());
- RefPtrWillBeRawPtr<Resource> resource = factory.create(request.resourceRequest(), charset);
+ ResourcePtr<Resource> resource = factory.create(request.resourceRequest(), charset);
resource->setAvoidBlockingOnLoad(request.avoidBlockingOnLoad());
resource->setCacheIdentifier(cacheIdentifier);
@@ -813,7 +816,7 @@ void ResourceFetcher::preloadStarted(Resource* resource)
resource->increasePreloadCount();
if (!m_preloads)
- m_preloads = adoptPtrWillBeNoop(new WillBeHeapListHashSet<RefPtrWillBeMember<Resource>>);
+ m_preloads = adoptPtrWillBeNoop(new WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>);
m_preloads->add(resource);
#if PRELOAD_DEBUG
@@ -843,8 +846,9 @@ void ResourceFetcher::clearPreloads(ClearPreloadsPolicy policy)
for (auto resource : *m_preloads) {
resource->decreasePreloadCount();
+ bool deleted = resource->deleteIfPossible();
// avoidBlockingOnLoad is only set on non speculative preloads (i.e. <link rel=preload> triggered preloads)
- if (resource->preloadResult() == Resource::PreloadNotReferenced && (policy == ClearAllPreloads || !resource->avoidBlockingOnLoad()))
+ if (!deleted && resource->preloadResult() == Resource::PreloadNotReferenced && (policy == ClearAllPreloads || !resource->avoidBlockingOnLoad()))
memoryCache()->remove(resource.get());
}
m_preloads.clear();
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
index 828382b..b12db11 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.h
@@ -33,6 +33,7 @@
#include "core/fetch/FetchRequest.h"
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/SubstituteData.h"
#include "platform/Timer.h"
#include "platform/network/ResourceError.h"
@@ -73,7 +74,7 @@ public:
virtual ~ResourceFetcher();
DECLARE_VIRTUAL_TRACE();
- PassRefPtrWillBeRawPtr<Resource> requestResource(FetchRequest&, const ResourceFactory&, const SubstituteData& = SubstituteData());
+ ResourcePtr<Resource> requestResource(FetchRequest&, const ResourceFactory&, const SubstituteData& = SubstituteData());
Resource* cachedResource(const KURL&) const;
@@ -151,7 +152,7 @@ public:
void updateAllImageResourcePriorities();
// This is only exposed for testing purposes.
- WillBeHeapListHashSet<RefPtrWillBeMember<Resource>>* preloads() { return m_preloads.get(); }
+ WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>* preloads() { return m_preloads.get(); }
private:
friend class ResourceCacheValidationSuppressor;
@@ -159,10 +160,10 @@ private:
explicit ResourceFetcher(FetchContext*);
void initializeRevalidation(const FetchRequest&, Resource*);
- PassRefPtrWillBeRawPtr<Resource> createResourceForLoading(FetchRequest&, const String& charset, const ResourceFactory&);
+ ResourcePtr<Resource> createResourceForLoading(FetchRequest&, const String& charset, const ResourceFactory&);
void storeResourceTimingInitiatorInformation(Resource*);
bool scheduleArchiveLoad(Resource*, const ResourceRequest&);
- void preCacheData(const FetchRequest&, const ResourceFactory&, const SubstituteData&);
+ ResourcePtr<Resource> preCacheData(const FetchRequest&, const ResourceFactory&, const SubstituteData&);
// RevalidationPolicy enum values are used in UMAs https://crbug.com/579496.
enum RevalidationPolicy { Use, Revalidate, Reload, Load };
@@ -187,11 +188,18 @@ private:
HashSet<String> m_validatedURLs;
mutable DocumentResourceMap m_documentResources;
- OwnPtrWillBeMember<WillBeHeapListHashSet<RefPtrWillBeMember<Resource>>> m_preloads;
+ // We intentionally use a Member instead of a ResourcePtr.
+ // Using a ResourcePtrs can lead to a wrong behavior because
+ // the underlying Resource of the ResourcePtr is updated when the Resource
+ // is revalidated. What we really want to hold here is not the ResourcePtr
+ // but the underlying Resource.
+ OwnPtrWillBeMember<WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>> m_preloads;
RefPtrWillBeMember<MHTMLArchive> m_archive;
Timer<ResourceFetcher> m_resourceTimingReportTimer;
+ // We intentionally use a Member instead of a ResourcePtr.
+ // See the comment on m_preloads.
using ResourceTimingInfoMap = WillBeHeapHashMap<RawPtrWillBeMember<Resource>, OwnPtr<ResourceTimingInfo>>;
ResourceTimingInfoMap m_resourceTimingInfoMap;
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp
index ffc0a0c..784cc6f 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcherTest.cpp
@@ -35,6 +35,7 @@
#include "core/fetch/FetchRequest.h"
#include "core/fetch/MemoryCache.h"
#include "core/fetch/ResourceLoader.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/exported/WrappedResourceResponse.h"
#include "platform/heap/Handle.h"
#include "platform/network/ResourceRequest.h"
@@ -79,9 +80,9 @@ public:
TestResourceFactory(Resource::Type type = Resource::Raw)
: ResourceFactory(type) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return Resource::create(request, type());
+ return new Resource(request, type());
}
};
@@ -92,7 +93,7 @@ TEST_F(ResourceFetcherTest, StartLoadAfterFrameDetach)
// and no resource should be present in the cache.
ResourceFetcher* fetcher = ResourceFetcher::create(nullptr);
FetchRequest fetchRequest = FetchRequest(ResourceRequest(secureURL), FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> resource = fetcher->requestResource(fetchRequest, TestResourceFactory());
+ ResourcePtr<Resource> resource = fetcher->requestResource(fetchRequest, TestResourceFactory());
EXPECT_EQ(resource.get(), static_cast<Resource*>(nullptr));
EXPECT_EQ(memoryCache()->resourceForURL(secureURL), static_cast<Resource*>(nullptr));
}
@@ -102,7 +103,7 @@ TEST_F(ResourceFetcherTest, UseExistingResource)
ResourceFetcher* fetcher = ResourceFetcher::create(ResourceFetcherTestMockFetchContext::create());
KURL url(ParsedURLString, "http://127.0.0.1:8000/foo.html");
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(url, Resource::Image);
+ ResourcePtr<Resource> resource = new Resource(url, Resource::Image);
memoryCache()->add(resource.get());
ResourceResponse response;
response.setURL(url);
@@ -112,7 +113,7 @@ TEST_F(ResourceFetcherTest, UseExistingResource)
resource->finish();
FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Image));
+ ResourcePtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Image));
EXPECT_EQ(resource, newResource);
memoryCache()->remove(resource.get());
}
@@ -120,7 +121,7 @@ TEST_F(ResourceFetcherTest, UseExistingResource)
TEST_F(ResourceFetcherTest, Vary)
{
KURL url(ParsedURLString, "http://127.0.0.1:8000/foo.html");
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(url, Resource::Raw);
+ ResourcePtr<Resource> resource = new Resource(url, Resource::Raw);
memoryCache()->add(resource.get());
ResourceResponse response;
response.setURL(url);
@@ -134,7 +135,7 @@ TEST_F(ResourceFetcherTest, Vary)
ResourceFetcher* fetcher = ResourceFetcher::create(ResourceFetcherTestMockFetchContext::create());
FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo());
Platform::current()->unitTestSupport()->registerMockedURL(url, WebURLResponse(), "");
- RefPtrWillBeRawPtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory());
+ ResourcePtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory());
EXPECT_NE(resource, newResource);
newResource->loader()->cancel();
memoryCache()->remove(newResource.get());
@@ -150,7 +151,7 @@ TEST_F(ResourceFetcherTest, VaryOnBack)
ResourceFetcher* fetcher = ResourceFetcher::create(context);
KURL url(ParsedURLString, "http://127.0.0.1:8000/foo.html");
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(url, Resource::Raw);
+ ResourcePtr<Resource> resource = new Resource(url, Resource::Raw);
memoryCache()->add(resource.get());
ResourceResponse response;
response.setURL(url);
@@ -162,7 +163,7 @@ TEST_F(ResourceFetcherTest, VaryOnBack)
ASSERT_TRUE(resource->hasVaryHeader());
FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory());
+ ResourcePtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory());
EXPECT_EQ(resource, newResource);
memoryCache()->remove(newResource.get());
@@ -181,13 +182,13 @@ TEST_F(ResourceFetcherTest, VaryImage)
URLTestHelpers::registerMockedURLLoadWithCustomResponse(url, "white-1x1.png", WebString::fromUTF8(""), WrappedResourceResponse(response));
FetchRequest fetchRequestOriginal = FetchRequest(url, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> resource = fetcher->requestResource(fetchRequestOriginal, TestResourceFactory(Resource::Image));
+ ResourcePtr<Resource> resource = fetcher->requestResource(fetchRequestOriginal, TestResourceFactory(Resource::Image));
ASSERT_TRUE(resource.get());
Platform::current()->unitTestSupport()->serveAsynchronousMockedRequests();
ASSERT_TRUE(resource->hasVaryHeader());
FetchRequest fetchRequest = FetchRequest(url, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Image));
+ ResourcePtr<Resource> newResource = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Image));
EXPECT_EQ(resource, newResource);
memoryCache()->remove(newResource.get());
@@ -203,7 +204,7 @@ TEST_F(ResourceFetcherTest, RevalidateWhileLoading)
ResourceRequest request1(url);
request1.setHTTPHeaderField(HTTPNames::Cache_Control, "no-cache");
FetchRequest fetchRequest1 = FetchRequest(request1, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> resource1 = fetcher1->requestResource(fetchRequest1, TestResourceFactory(Resource::Image));
+ ResourcePtr<Resource> resource1 = fetcher1->requestResource(fetchRequest1, TestResourceFactory(Resource::Image));
ResourceResponse response;
response.setURL(url);
response.setHTTPStatusCode(200);
@@ -216,7 +217,7 @@ TEST_F(ResourceFetcherTest, RevalidateWhileLoading)
context->setCachePolicy(CachePolicyRevalidate);
ResourceFetcher* fetcher2 = ResourceFetcher::create(context);
FetchRequest fetchRequest2(url, FetchInitiatorInfo());
- RefPtrWillBeRawPtr<Resource> resource2 = fetcher2->requestResource(fetchRequest2, TestResourceFactory(Resource::Image));
+ ResourcePtr<Resource> resource2 = fetcher2->requestResource(fetchRequest2, TestResourceFactory(Resource::Image));
EXPECT_EQ(resource1, resource2);
// Tidily(?) shut down the ResourceLoader.
@@ -231,8 +232,8 @@ TEST_F(ResourceFetcherTest, DontReuseMediaDataUrl)
ResourceLoaderOptions options;
options.dataBufferingPolicy = DoNotBufferData;
FetchRequest fetchRequest = FetchRequest(request, FetchInitiatorTypeNames::internal, options);
- RefPtrWillBeRawPtr<Resource> resource1 = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Media));
- RefPtrWillBeRawPtr<Resource> resource2 = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Media));
+ ResourcePtr<Resource> resource1 = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Media));
+ ResourcePtr<Resource> resource2 = fetcher->requestResource(fetchRequest, TestResourceFactory(Resource::Media));
EXPECT_NE(resource1.get(), resource2.get());
memoryCache()->remove(resource2.get());
}
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
index d53920a..153d175 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.cpp
@@ -32,6 +32,7 @@
#include "core/fetch/CSSStyleSheetResource.h"
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/Logging.h"
#include "platform/SharedBuffer.h"
#include "platform/ThreadedDataReceiver.h"
@@ -98,6 +99,7 @@ void ResourceLoader::releaseResources()
if (m_state == Terminated)
return;
m_resource->clearLoader();
+ m_resource->deleteIfPossible();
m_resource = nullptr;
ASSERT(m_state != Terminated);
@@ -130,7 +132,7 @@ void ResourceLoader::start()
ASSERT(!m_request.isNull());
ASSERT(m_deferredRequest.isNull());
- m_fetcher->willStartLoadingResource(m_resource.get(), m_request);
+ m_fetcher->willStartLoadingResource(m_resource, m_request);
if (m_options.synchronousPolicy == RequestSynchronously) {
requestSynchronously();
@@ -194,7 +196,7 @@ void ResourceLoader::didDownloadData(WebURLLoader*, int length, int encodedDataL
{
ASSERT(m_state != Terminated);
RELEASE_ASSERT(m_connectionState == ConnectionStateReceivedResponse);
- m_fetcher->didDownloadData(m_resource.get(), length, encodedDataLength);
+ m_fetcher->didDownloadData(m_resource, length, encodedDataLength);
if (m_state == Terminated)
return;
m_resource->didDownloadData(length);
@@ -210,7 +212,7 @@ void ResourceLoader::didFinishLoadingOnePart(double finishTime, int64_t encodedD
if (m_notifiedLoadComplete)
return;
m_notifiedLoadComplete = true;
- m_fetcher->didFinishLoading(m_resource.get(), finishTime, encodedDataLength);
+ m_fetcher->didFinishLoading(m_resource, finishTime, encodedDataLength);
}
void ResourceLoader::didChangePriority(ResourceLoadPriority loadPriority, int intraPriorityValue)
@@ -257,7 +259,7 @@ void ResourceLoader::cancel(const ResourceError& error)
if (!m_notifiedLoadComplete) {
m_notifiedLoadComplete = true;
- m_fetcher->didFailLoading(m_resource.get(), nonNullError);
+ m_fetcher->didFailLoading(m_resource, nonNullError);
}
if (m_state == Finishing)
@@ -276,14 +278,14 @@ void ResourceLoader::willFollowRedirect(WebURLLoader*, WebURLRequest& passedNewR
const ResourceResponse& redirectResponse(passedRedirectResponse.toResourceResponse());
ASSERT(!redirectResponse.isNull());
newRequest.setFollowedRedirect(true);
- if (!isManualRedirectFetchRequest(m_resource->resourceRequest()) && !m_fetcher->canAccessRedirect(m_resource.get(), newRequest, redirectResponse, m_options)) {
+ if (!isManualRedirectFetchRequest(m_resource->resourceRequest()) && !m_fetcher->canAccessRedirect(m_resource, newRequest, redirectResponse, m_options)) {
cancel(ResourceError::cancelledDueToAccessCheckError(newRequest.url()));
return;
}
ASSERT(m_state != Terminated);
applyOptions(newRequest); // canAccessRedirect() can modify m_options so we should re-apply it.
- m_fetcher->redirectReceived(m_resource.get(), redirectResponse);
+ m_fetcher->redirectReceived(m_resource, redirectResponse);
ASSERT(m_state != Terminated);
m_resource->willFollowRedirect(newRequest, redirectResponse);
if (newRequest.isNull() || m_state == Terminated)
@@ -345,10 +347,14 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
return;
}
} else {
- if (!m_resource->isCacheValidator() || resourceResponse.httpStatusCode() != 304)
+ // If the response successfully validated a cached resource, perform
+ // the access control with respect to it. Need to do this right here
+ // before the resource switches clients over to that validated resource.
+ Resource* resource = m_resource;
+ if (!resource->isCacheValidator() || resourceResponse.httpStatusCode() != 304)
m_resource->setResponse(resourceResponse);
- if (!m_fetcher->canAccessResource(m_resource.get(), m_options.securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors)) {
- m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse);
+ if (!m_fetcher->canAccessResource(resource, m_options.securityOrigin.get(), response.url(), ResourceFetcher::ShouldLogAccessControlErrors)) {
+ m_fetcher->didReceiveResponse(m_resource, resourceResponse);
cancel(ResourceError::cancelledDueToAccessCheckError(KURL(response.url())));
return;
}
@@ -359,7 +365,7 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
if (m_state == Terminated)
return;
- m_fetcher->didReceiveResponse(m_resource.get(), resourceResponse);
+ m_fetcher->didReceiveResponse(m_resource, resourceResponse);
if (m_state == Terminated)
return;
@@ -386,7 +392,7 @@ void ResourceLoader::didReceiveResponse(WebURLLoader*, const WebURLResponse& res
if (!m_notifiedLoadComplete) {
m_notifiedLoadComplete = true;
- m_fetcher->didFailLoading(m_resource.get(), ResourceError::cancelledError(m_request.url()));
+ m_fetcher->didFailLoading(m_resource, ResourceError::cancelledError(m_request.url()));
}
ASSERT(m_state != Terminated);
@@ -414,7 +420,7 @@ void ResourceLoader::didReceiveData(WebURLLoader*, const char* data, int length,
// FIXME: If we get a resource with more than 2B bytes, this code won't do the right thing.
// However, with today's computers and networking speeds, this won't happen in practice.
// Could be an issue with a giant local file.
- m_fetcher->didReceiveData(m_resource.get(), data, length, encodedDataLength);
+ m_fetcher->didReceiveData(m_resource, data, length, encodedDataLength);
if (m_state == Terminated)
return;
RELEASE_ASSERT(length >= 0);
@@ -430,7 +436,7 @@ void ResourceLoader::didFinishLoading(WebURLLoader*, double finishTime, int64_t
ASSERT(m_state != Terminated);
WTF_LOG(ResourceLoading, "Received '%s'.", m_resource->url().string().latin1().data());
- RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get());
+ ResourcePtr<Resource> protectResource(m_resource);
m_state = Finishing;
m_resource->setLoadFinishTime(finishTime);
didFinishLoadingOnePart(finishTime, encodedDataLength);
@@ -451,13 +457,13 @@ void ResourceLoader::didFail(WebURLLoader*, const WebURLError& error)
ASSERT(m_state != Terminated);
WTF_LOG(ResourceLoading, "Failed to load '%s'.\n", m_resource->url().string().latin1().data());
- RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get());
+ ResourcePtr<Resource> protectResource(m_resource);
m_state = Finishing;
m_resource->setResourceError(error);
if (!m_notifiedLoadComplete) {
m_notifiedLoadComplete = true;
- m_fetcher->didFailLoading(m_resource.get(), error);
+ m_fetcher->didFailLoading(m_resource, error);
}
if (m_state == Terminated)
return;
@@ -483,7 +489,7 @@ void ResourceLoader::requestSynchronously()
// downloadToFile is not supported for synchronous requests.
ASSERT(!m_request.downloadToFile());
- RefPtrWillBeRawPtr<Resource> protectResource(m_resource.get());
+ ResourcePtr<Resource> protectResource(m_resource);
RELEASE_ASSERT(m_connectionState == ConnectionStateNew);
m_connectionState = ConnectionStateStarted;
@@ -515,7 +521,7 @@ void ResourceLoader::requestSynchronously()
// empty buffer is a noop in most cases, but is destructive in the case of
// a 304, where it will overwrite the cached data we should be reusing.
if (dataOut.size()) {
- m_fetcher->didReceiveData(m_resource.get(), dataOut.data(), dataOut.size(), encodedDataLength);
+ m_fetcher->didReceiveData(m_resource, dataOut.data(), dataOut.size(), encodedDataLength);
m_resource->setResourceBuffer(dataOut);
}
didFinishLoading(0, monotonicallyIncreasingTime(), encodedDataLength);
diff --git a/third_party/WebKit/Source/core/fetch/ResourceLoader.h b/third_party/WebKit/Source/core/fetch/ResourceLoader.h
index 320c896..734da2a 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceLoader.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceLoader.h
@@ -61,7 +61,7 @@ public:
void cancel(const ResourceError&);
void cancelIfNotFinishing();
- Resource* cachedResource() { return m_resource.get(); }
+ Resource* cachedResource() { return m_resource; }
const ResourceRequest& originalRequest() const { return m_originalRequest; }
void setDefersLoading(bool);
@@ -134,7 +134,7 @@ private:
ConnectionStateFailed,
};
- RefPtrWillBeMember<Resource> m_resource;
+ RawPtrWillBeMember<Resource> m_resource;
ResourceLoaderState m_state;
// Used for sanity checking to make sure we don't experience illegal state
diff --git a/third_party/WebKit/Source/core/fetch/ResourceOwner.h b/third_party/WebKit/Source/core/fetch/ResourceOwner.h
index 2fb6fe5..69822c1 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceOwner.h
+++ b/third_party/WebKit/Source/core/fetch/ResourceOwner.h
@@ -31,57 +31,54 @@
#ifndef ResourceOwner_h
#define ResourceOwner_h
-#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
namespace blink {
+
template<class R, class C = typename R::ClientType>
class ResourceOwner : public WillBeGarbageCollectedMixin, public C {
- WILL_BE_USING_PRE_FINALIZER(ResourceOwner, clearResource);
public:
using ResourceType = R;
virtual ~ResourceOwner();
ResourceType* resource() const { return m_resource.get(); }
- DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_resource); }
+ DEFINE_INLINE_VIRTUAL_TRACE() {}
protected:
ResourceOwner();
- void setResource(const PassRefPtrWillBeRawPtr<ResourceType>&);
+ void setResource(const ResourcePtr<ResourceType>&);
void clearResource() { setResource(nullptr); }
private:
- RefPtrWillBeMember<ResourceType> m_resource;
+ ResourcePtr<ResourceType> m_resource;
};
template<class R, class C>
inline ResourceOwner<R, C>::ResourceOwner()
{
-#if ENABLE(OILPAN)
- ThreadState::current()->registerPreFinalizer(this);
-#endif
}
template<class R, class C>
inline ResourceOwner<R, C>::~ResourceOwner()
{
-#if !ENABLE(OILPAN)
clearResource();
-#endif
}
template<class R, class C>
-inline void ResourceOwner<R, C>::setResource(const PassRefPtrWillBeRawPtr<R>& newResource)
+inline void ResourceOwner<R, C>::setResource(const ResourcePtr<R>& newResource)
{
if (newResource == m_resource)
return;
// Some ResourceClient implementations reenter this so
// we need to prevent double removal.
- if (RefPtrWillBeRawPtr<ResourceType> oldResource = m_resource.release())
+ if (ResourcePtr<ResourceType> oldResource = m_resource) {
+ m_resource.clear();
oldResource->removeClient(this);
+ }
if (newResource) {
m_resource = newResource;
diff --git a/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp b/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp
new file mode 100644
index 0000000..8e0624e
--- /dev/null
+++ b/third_party/WebKit/Source/core/fetch/ResourcePtr.cpp
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2008 Apple 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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 "core/fetch/ResourcePtr.h"
+
+namespace blink {
+
+void ResourcePtrBase::setResource(Resource* resource)
+{
+ if (resource == m_resource)
+ return;
+ if (m_resource)
+ m_resource->unregisterHandle(this);
+ m_resource = resource;
+ if (m_resource)
+ m_resource->registerHandle(this);
+}
+
+} // namespace blink
diff --git a/third_party/WebKit/Source/core/fetch/ResourcePtr.h b/third_party/WebKit/Source/core/fetch/ResourcePtr.h
new file mode 100644
index 0000000..77d2901
--- /dev/null
+++ b/third_party/WebKit/Source/core/fetch/ResourcePtr.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (C) 2008 Apple 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:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``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 APPLE INC. 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.
+ */
+
+#ifndef ResourcePtr_h
+#define ResourcePtr_h
+
+#include "core/CoreExport.h"
+#include "core/fetch/Resource.h"
+#include "wtf/Allocator.h"
+
+namespace blink {
+
+class CORE_EXPORT ResourcePtrBase {
+ DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
+public:
+ Resource* get() const { return m_resource; }
+ bool operator!() const { return !m_resource; }
+ void clear() { setResource(nullptr); }
+
+ // This conversion operator allows implicit conversion to bool but not to other integer types.
+ typedef Resource* ResourcePtrBase::*UnspecifiedBoolType;
+ operator UnspecifiedBoolType() const { return m_resource ? &ResourcePtrBase::m_resource : nullptr; }
+
+protected:
+ ResourcePtrBase() : m_resource(nullptr) { }
+ explicit ResourcePtrBase(Resource*);
+ explicit ResourcePtrBase(const ResourcePtrBase&);
+ ~ResourcePtrBase();
+
+ void setResource(Resource*);
+
+private:
+ friend class Resource;
+ ResourcePtrBase& operator=(const ResourcePtrBase&) = delete;
+
+ // The lifetime of the Resource object is explicitly managed by
+ // reference-counting.
+ GC_PLUGIN_IGNORE("503485")
+ Resource* m_resource;
+};
+
+inline ResourcePtrBase::ResourcePtrBase(Resource* res)
+ : m_resource(res)
+{
+ if (m_resource)
+ m_resource->registerHandle(this);
+}
+
+inline ResourcePtrBase::~ResourcePtrBase()
+{
+ if (m_resource)
+ m_resource->unregisterHandle(this);
+}
+
+inline ResourcePtrBase::ResourcePtrBase(const ResourcePtrBase& o)
+ : m_resource(o.m_resource)
+{
+ if (m_resource)
+ m_resource->registerHandle(this);
+}
+
+template <class R> class ResourcePtr final : public ResourcePtrBase {
+public:
+ ResourcePtr() { }
+ ResourcePtr(R* res) : ResourcePtrBase(res) { }
+ ResourcePtr(const ResourcePtr<R>& o) : ResourcePtrBase(o) { }
+ template<typename U> ResourcePtr(const ResourcePtr<U>& o) : ResourcePtrBase(cast(o.get())) { }
+
+ R* get() const { return static_cast<R*>(ResourcePtrBase::get()); }
+ R* operator->() const { return get(); }
+
+ ResourcePtr& operator=(R* res) { setResource(res); return *this; }
+ ResourcePtr& operator=(const ResourcePtr& o) { setResource(o.get()); return *this; }
+ template<typename U> ResourcePtr& operator=(const ResourcePtr<U>& o) { setResource(cast(o.get())); return *this; }
+
+ bool operator==(const ResourcePtrBase& o) const { return get() == o.get(); }
+ bool operator!=(const ResourcePtrBase& o) const { return get() != o.get(); }
+private:
+ template<typename U> static R* cast(U* u) { return u; }
+};
+
+template <class R, class RR> bool operator==(const ResourcePtr<R>& h, const RR* res)
+{
+ return h.get() == res;
+}
+template <class R, class RR> bool operator==(const RR* res, const ResourcePtr<R>& h)
+{
+ return h.get() == res;
+}
+template <class R, class RR> bool operator!=(const ResourcePtr<R>& h, const RR* res)
+{
+ return h.get() != res;
+}
+template <class R, class RR> bool operator!=(const RR* res, const ResourcePtr<R>& h)
+{
+ return h.get() != res;
+}
+} // namespace blink
+
+#endif
diff --git a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
index 42dd25d..ae04c9b 100644
--- a/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
+++ b/third_party/WebKit/Source/core/fetch/ResourceTest.cpp
@@ -4,6 +4,7 @@
#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/network/ResourceRequest.h"
#include "platform/network/ResourceResponse.h"
#include "platform/testing/TestingPlatformSupport.h"
@@ -47,7 +48,7 @@ ResourceResponse createTestResourceResponse()
void createTestResourceAndSetCachedMetadata(const ResourceResponse& response)
{
const char testData[] = "test data";
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(ResourceRequest(response.url()), Resource::Raw);
+ ResourcePtr<Resource> resource = new Resource(ResourceRequest(response.url()), Resource::Raw);
resource->setResponse(response);
resource->cacheHandler()->setCachedMetadata(100, testData, sizeof(testData), CachedMetadataHandler::SendToPlatform);
return;
diff --git a/third_party/WebKit/Source/core/fetch/ScriptResource.cpp b/third_party/WebKit/Source/core/fetch/ScriptResource.cpp
index 0dbe1fe..c78a639 100644
--- a/third_party/WebKit/Source/core/fetch/ScriptResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/ScriptResource.cpp
@@ -37,14 +37,14 @@
namespace blink {
-PassRefPtrWillBeRawPtr<ScriptResource> ScriptResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<ScriptResource> ScriptResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(request.resourceRequest().frameType() == WebURLRequest::FrameTypeNone);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextScript);
- RefPtrWillBeRawPtr<ScriptResource> resource = toScriptResource(fetcher->requestResource(request, ScriptResourceFactory()));
+ ResourcePtr<ScriptResource> resource = toScriptResource(fetcher->requestResource(request, ScriptResourceFactory()));
if (resource && !request.integrityMetadata().isEmpty())
resource->setIntegrityMetadata(request.integrityMetadata());
- return resource.release();
+ return resource;
}
ScriptResource::ScriptResource(const ResourceRequest& resourceRequest, const String& charset)
diff --git a/third_party/WebKit/Source/core/fetch/ScriptResource.h b/third_party/WebKit/Source/core/fetch/ScriptResource.h
index c49f1c0..3cab8be 100644
--- a/third_party/WebKit/Source/core/fetch/ScriptResource.h
+++ b/third_party/WebKit/Source/core/fetch/ScriptResource.h
@@ -49,13 +49,10 @@ public:
class CORE_EXPORT ScriptResource final : public TextResource {
public:
using ClientType = ScriptResourceClient;
- static PassRefPtrWillBeRawPtr<ScriptResource> fetch(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<ScriptResource> fetch(FetchRequest&, ResourceFetcher*);
// Public for testing
- static PassRefPtrWillBeRawPtr<ScriptResource> create(const ResourceRequest& request, const String& charset)
- {
- return adoptRefWillBeNoop(new ScriptResource(request, charset));
- }
+ ScriptResource(const ResourceRequest&, const String& charset);
~ScriptResource() override;
@@ -84,14 +81,12 @@ private:
ScriptResourceFactory()
: ResourceFactory(Resource::Script) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new ScriptResource(request, charset));
+ return new ScriptResource(request, charset);
}
};
- ScriptResource(const ResourceRequest&, const String& charset);
-
bool m_integrityChecked;
IntegrityMetadataSet m_integrityMetadata;
diff --git a/third_party/WebKit/Source/core/fetch/TextResource.h b/third_party/WebKit/Source/core/fetch/TextResource.h
index c24b261..f180511 100644
--- a/third_party/WebKit/Source/core/fetch/TextResource.h
+++ b/third_party/WebKit/Source/core/fetch/TextResource.h
@@ -6,7 +6,7 @@
#define TextResource_h
#include "core/CoreExport.h"
-#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
namespace blink {
diff --git a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp
index 1aab297..54dcf49 100644
--- a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp
+++ b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.cpp
@@ -35,20 +35,20 @@
namespace blink {
-PassRefPtrWillBeRawPtr<XSLStyleSheetResource> XSLStyleSheetResource::fetchSynchronously(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<XSLStyleSheetResource> XSLStyleSheetResource::fetchSynchronously(FetchRequest& request, ResourceFetcher* fetcher)
{
request.mutableResourceRequest().setTimeoutInterval(10);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextXSLT);
ResourceLoaderOptions options(request.options());
options.synchronousPolicy = RequestSynchronously;
request.setOptions(options);
- RefPtrWillBeRawPtr<XSLStyleSheetResource> resource = toXSLStyleSheetResource(fetcher->requestResource(request, XSLStyleSheetResourceFactory()));
+ ResourcePtr<XSLStyleSheetResource> resource = toXSLStyleSheetResource(fetcher->requestResource(request, XSLStyleSheetResourceFactory()));
if (resource && resource->m_data)
resource->m_sheet = resource->decodedText();
return resource;
}
-PassRefPtrWillBeRawPtr<XSLStyleSheetResource> XSLStyleSheetResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
+ResourcePtr<XSLStyleSheetResource> XSLStyleSheetResource::fetch(FetchRequest& request, ResourceFetcher* fetcher)
{
ASSERT(RuntimeEnabledFeatures::xsltEnabled());
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextXSLT);
diff --git a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h
index 3368728..f5a2332 100644
--- a/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h
+++ b/third_party/WebKit/Source/core/fetch/XSLStyleSheetResource.h
@@ -26,6 +26,7 @@
#ifndef XSLStyleSheetResource_h
#define XSLStyleSheetResource_h
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/StyleSheetResource.h"
namespace blink {
@@ -35,8 +36,8 @@ class ResourceFetcher;
class XSLStyleSheetResource final : public StyleSheetResource {
public:
- static PassRefPtrWillBeRawPtr<XSLStyleSheetResource> fetchSynchronously(FetchRequest&, ResourceFetcher*);
- static PassRefPtrWillBeRawPtr<XSLStyleSheetResource> fetch(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<XSLStyleSheetResource> fetchSynchronously(FetchRequest&, ResourceFetcher*);
+ static ResourcePtr<XSLStyleSheetResource> fetch(FetchRequest&, ResourceFetcher*);
const String& sheet() const { return m_sheet; }
@@ -48,9 +49,9 @@ protected:
XSLStyleSheetResourceFactory()
: ResourceFactory(Resource::XSLStyleSheet) { }
- PassRefPtrWillBeRawPtr<Resource> create(const ResourceRequest& request, const String& charset) const override
+ Resource* create(const ResourceRequest& request, const String& charset) const override
{
- return adoptRefWillBeNoop(new XSLStyleSheetResource(request, charset));
+ return new XSLStyleSheetResource(request, charset);
}
};
XSLStyleSheetResource(const ResourceRequest&, const String& charset);
diff --git a/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp b/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
index b08bba6..0b6aa4a 100644
--- a/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
+++ b/third_party/WebKit/Source/core/frame/ImageBitmapTest.cpp
@@ -36,6 +36,7 @@
#include "core/fetch/ImageResource.h"
#include "core/fetch/MemoryCache.h"
#include "core/fetch/MockImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/html/HTMLCanvasElement.h"
#include "core/html/HTMLImageElement.h"
#include "core/html/HTMLVideoElement.h"
@@ -81,8 +82,7 @@ protected:
TEST_F(ImageBitmapTest, ImageResourceConsistency)
{
RefPtrWillBeRawPtr<HTMLImageElement> imageElement = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> image = ImageResource::create(StaticBitmapImage::create(m_image).get());
- imageElement->setImageResource(image.get());
+ imageElement->setImageResource(new ImageResource(StaticBitmapImage::create(m_image).get()));
RefPtrWillBeRawPtr<ImageBitmap> imageBitmapNoCrop = ImageBitmap::create(imageElement.get(),
IntRect(0, 0, m_image->width(), m_image->height()),
@@ -110,22 +110,22 @@ TEST_F(ImageBitmapTest, ImageResourceConsistency)
TEST_F(ImageBitmapTest, ImageBitmapLiveResourcePriority)
{
RefPtrWillBePersistent<HTMLImageElement> imageNoCrop = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> cachedImageNoCrop = ImageResource::create(ResourceRequest("http://foo.com/1"),
+ ResourcePtr<ImageResource> cachedImageNoCrop = new ImageResource(ResourceRequest("http://foo.com/1"),
StaticBitmapImage::create(m_image).get());
imageNoCrop->setImageResource(cachedImageNoCrop.get());
RefPtrWillBePersistent<HTMLImageElement> imageInteriorCrop = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> cachedImageInteriorCrop = ImageResource::create(ResourceRequest("http://foo.com/2"),
+ ResourcePtr<ImageResource> cachedImageInteriorCrop = new ImageResource(ResourceRequest("http://foo.com/2"),
StaticBitmapImage::create(m_image).get());
imageInteriorCrop->setImageResource(cachedImageInteriorCrop.get());
RefPtrWillBePersistent<HTMLImageElement> imageExteriorCrop = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> cachedImageExteriorCrop = ImageResource::create(ResourceRequest("http://foo.com/3"),
+ ResourcePtr<ImageResource> cachedImageExteriorCrop = new ImageResource(ResourceRequest("http://foo.com/3"),
StaticBitmapImage::create(m_image).get());
imageExteriorCrop->setImageResource(cachedImageExteriorCrop.get());
RefPtrWillBePersistent<HTMLImageElement> imageOutsideCrop = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> cachedImageOutsideCrop = ImageResource::create(ResourceRequest("http://foo.com/4"),
+ ResourcePtr<ImageResource> cachedImageOutsideCrop = new ImageResource(ResourceRequest("http://foo.com/4"),
StaticBitmapImage::create(m_image).get());
imageOutsideCrop->setImageResource(cachedImageOutsideCrop.get());
@@ -191,7 +191,7 @@ TEST_F(ImageBitmapTest, ImageBitmapLiveResourcePriority)
TEST_F(ImageBitmapTest, ImageBitmapSourceChanged)
{
RefPtrWillBeRawPtr<HTMLImageElement> image = HTMLImageElement::create(*Document::create().get());
- RefPtrWillBeRawPtr<ImageResource> originalImageResource = ImageResource::create(
+ ResourcePtr<ImageResource> originalImageResource = new ImageResource(
StaticBitmapImage::create(m_image).get());
image->setImageResource(originalImageResource.get());
@@ -200,7 +200,7 @@ TEST_F(ImageBitmapTest, ImageBitmapSourceChanged)
&(image->document()));
ASSERT_EQ(imageBitmap->bitmapImage()->imageForCurrentFrame(), originalImageResource->image()->imageForCurrentFrame());
- RefPtrWillBeRawPtr<ImageResource> newImageResource = ImageResource::create(
+ ResourcePtr<ImageResource> newImageResource = new ImageResource(
StaticBitmapImage::create(m_image2).get());
image->setImageResource(newImageResource.get());
diff --git a/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp b/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp
index c7c1f87..02d673d 100644
--- a/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp
+++ b/third_party/WebKit/Source/core/frame/SubresourceIntegrityTest.cpp
@@ -8,6 +8,7 @@
#include "core/dom/Document.h"
#include "core/fetch/IntegrityMetadata.h"
#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/html/HTMLScriptElement.h"
#include "platform/Crypto.h"
#include "platform/weborigin/KURL.h"
@@ -159,7 +160,7 @@ protected:
EXPECT_FALSE(SubresourceIntegrity::CheckSubresourceIntegrity(*scriptElement, script, size, url, *createTestResource(url, requestorUrl, corsStatus).get()));
}
- PassRefPtrWillBeRawPtr<Resource> createTestResource(const KURL& url, const KURL& allowOriginUrl, CorsStatus corsStatus)
+ ResourcePtr<Resource> createTestResource(const KURL& url, const KURL& allowOriginUrl, CorsStatus corsStatus)
{
ResourceResponse response;
response.setURL(url);
@@ -168,7 +169,7 @@ protected:
response.setHTTPHeaderField("access-control-allow-origin", SecurityOrigin::create(allowOriginUrl)->toAtomicString());
response.setHTTPHeaderField("access-control-allow-credentials", "true");
}
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(ResourceRequest(response.url()), Resource::Raw);
+ ResourcePtr<Resource> resource = new Resource(ResourceRequest(response.url()), Resource::Raw);
resource->setResponse(response);
return resource;
}
diff --git a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
index 3c01b67..febee26 100644
--- a/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
+++ b/third_party/WebKit/Source/core/html/HTMLImageElement.cpp
@@ -370,8 +370,8 @@ void HTMLImageElement::attach(const AttachContext& context)
if (m_isFallbackImage) {
float deviceScaleFactor = blink::deviceScaleFactor(layoutImage->frame());
std::pair<Image*, float> brokenImageAndImageScaleFactor = ImageResource::brokenImage(deviceScaleFactor);
- RefPtrWillBeRawPtr<ImageResource> newImageResource = ImageResource::create(brokenImageAndImageScaleFactor.first);
- layoutImage->imageResource()->setImageResource(newImageResource.get());
+ ImageResource* newImageResource = new ImageResource(brokenImageAndImageScaleFactor.first);
+ layoutImage->imageResource()->setImageResource(newImageResource);
}
if (layoutImageResource->hasImage())
return;
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp
index 4cca829..3b3665d 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp
@@ -69,7 +69,7 @@ void HTMLImportLoader::dispose()
clearResource();
}
-void HTMLImportLoader::startLoading(const PassRefPtrWillBeRawPtr<RawResource>& resource)
+void HTMLImportLoader::startLoading(const ResourcePtr<RawResource>& resource)
{
setResource(resource);
}
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
index 1351f2d..412f9b1 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.h
@@ -86,7 +86,7 @@ public:
bool hasError() const { return m_state == StateError; }
bool shouldBlockScriptExecution() const;
- void startLoading(const PassRefPtrWillBeRawPtr<RawResource>&);
+ void startLoading(const ResourcePtr<RawResource>&);
// Tells the loader that all of the import's stylesheets finished
// loading.
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
index ade5d0e..733d5f1 100644
--- a/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
+++ b/third_party/WebKit/Source/core/html/imports/HTMLImportsController.cpp
@@ -125,7 +125,7 @@ HTMLImportChild* HTMLImportsController::load(HTMLImport* parent, HTMLImportChild
}
request.setCrossOriginAccessControl(master()->securityOrigin(), CrossOriginAttributeAnonymous);
- RefPtrWillBeRawPtr<RawResource> resource = RawResource::fetchImport(request, parent->document()->fetcher());
+ ResourcePtr<RawResource> resource = RawResource::fetchImport(request, parent->document()->fetcher());
if (!resource)
return nullptr;
diff --git a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
index 931506a..92af5b6 100644
--- a/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
+++ b/third_party/WebKit/Source/core/html/parser/HTMLScriptRunner.cpp
@@ -387,7 +387,7 @@ bool HTMLScriptRunner::requestPendingScript(PendingScript* pendingScript, Elemen
ASSERT(!pendingScript->element());
pendingScript->setElement(script);
// This should correctly return 0 for empty or invalid srcValues.
- ScriptResource* resource = toScriptLoaderIfPossible(script)->resource();
+ ScriptResource* resource = toScriptLoaderIfPossible(script)->resource().get();
if (!resource) {
notImplemented(); // Dispatch error event.
return false;
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
index 0e6f1cd..dec7526 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.cpp
@@ -111,12 +111,12 @@ void continueWithPolicyIgnoreImpl(LocalFrame* frame, DocumentLoader* loader, uns
didReceiveResourceResponseButCanceledImpl(frame, loader, identifier, r);
}
-void removedResourceFromMemoryCacheImpl(Resource* cachedResource)
+void willDestroyResourceImpl(Resource* cachedResource)
{
ASSERT(isMainThread());
for (InstrumentingAgents* instrumentingAgents: instrumentingAgentsSet()) {
if (InspectorResourceAgent* inspectorResourceAgent = instrumentingAgents->inspectorResourceAgent())
- inspectorResourceAgent->removedResourceFromMemoryCache(cachedResource);
+ inspectorResourceAgent->willDestroyResource(cachedResource);
}
}
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
index f6b2497..1bafa9d 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
+++ b/third_party/WebKit/Source/core/inspector/InspectorInstrumentation.idl
@@ -327,7 +327,7 @@ interface InspectorInstrumentation {
void didRunJavaScriptDialog(const InspectorInstrumentationCookie&, bool result);
[Inline=Forward]
- void removedResourceFromMemoryCache(Resource* cachedResource);
+ void willDestroyResource(Resource* cachedResource);
[AsyncCallTracker, DOMDebugger]
void didRequestAnimationFrame([Keep] ExecutionContext*, int callbackId);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
index 0fef05e..dff07c5 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorPageAgent.cpp
@@ -125,7 +125,7 @@ static bool decodeBuffer(const char* buffer, unsigned size, const String& textEn
static bool prepareResourceBuffer(Resource* cachedResource, bool* hasZeroSize)
{
*hasZeroSize = false;
- if (!cachedResource)
+ if (!cachedResource || cachedResource->wasPurged())
return false;
if (cachedResource->dataBufferingPolicy() == DoNotBufferData)
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
index d873050..732cf7f 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.cpp
@@ -550,12 +550,7 @@ void InspectorResourceAgent::didReceiveResourceResponse(LocalFrame* frame, unsig
if (type == InspectorPageAgent::DocumentResource && loader && loader->substituteData().isValid())
return;
- // It's only safe to reference a Resource in m_resourcesData if it's in the
- // cache at this point. Resources are added to NetworkResourcesData here
- // and removed in removedResourceFromMemoryCache(), so if the Resource isn't
- // in the cache here, NetworkResourceData's strong reference to the
- // Resource will keep it alive indefinitely.
- if (cachedResource && memoryCache()->contains(cachedResource))
+ if (cachedResource)
m_resourcesData->addResource(requestId, cachedResource);
String frameId = IdentifiersFactory::frameId(frame);
String loaderId = loader ? IdentifiersFactory::loaderId(loader) : "";
@@ -739,13 +734,13 @@ void InspectorResourceAgent::didFinishEventSourceRequest(ThreadableLoaderClient*
m_pendingRequest = nullptr;
}
-void InspectorResourceAgent::removedResourceFromMemoryCache(Resource* cachedResource)
+void InspectorResourceAgent::willDestroyResource(Resource* cachedResource)
{
String content;
bool base64Encoded;
bool hasContent = InspectorPageAgent::cachedResourceContent(cachedResource, &content, &base64Encoded);
Vector<String> requestIds = m_resourcesData->removeResource(cachedResource);
- if (hasContent && !isErrorStatusCode(cachedResource->response().httpStatusCode())) {
+ if (hasContent) {
for (auto& request : requestIds)
m_resourcesData->setResourceContent(request, content, base64Encoded);
}
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
index fa06e2e..d266102 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceAgent.h
@@ -109,7 +109,7 @@ public:
void willDispachEventSourceEvent(ThreadableLoaderClient*, const AtomicString& eventName, const AtomicString& eventId, const Vector<UChar>& data);
void didFinishEventSourceRequest(ThreadableLoaderClient*);
- void removedResourceFromMemoryCache(Resource*);
+ void willDestroyResource(Resource*);
void applyUserAgentOverride(String* userAgent);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
index b428c73..49fff9b 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.cpp
@@ -12,6 +12,7 @@
#include "core/fetch/RawResource.h"
#include "core/fetch/Resource.h"
#include "core/fetch/ResourceFetcher.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/StyleSheetResourceClient.h"
#include "core/frame/LocalFrame.h"
#include "core/inspector/InspectedFrames.h"
@@ -113,7 +114,7 @@ void InspectorResourceContentLoader::start()
if (!resourceRequest.url().string().isEmpty()) {
urlsToFetch.add(resourceRequest.url().string());
FetchRequest request(resourceRequest, FetchInitiatorTypeNames::internal);
- RefPtrWillBeRawPtr<Resource> resource = RawResource::fetch(request, document->fetcher());
+ ResourcePtr<Resource> resource = RawResource::fetch(request, document->fetcher());
if (resource) {
// Prevent garbage collection by holding a reference to this resource.
m_resources.append(resource.get());
@@ -134,7 +135,7 @@ void InspectorResourceContentLoader::start()
urlsToFetch.add(url);
FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::internal);
request.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextInternal);
- RefPtrWillBeRawPtr<Resource> resource = CSSStyleSheetResource::fetch(request, document->fetcher());
+ ResourcePtr<Resource> resource = CSSStyleSheetResource::fetch(request, document->fetcher());
if (!resource)
continue;
// Prevent garbage collection by holding a reference to this resource.
@@ -167,7 +168,6 @@ DEFINE_TRACE(InspectorResourceContentLoader)
#if ENABLE(OILPAN)
visitor->trace(m_inspectedFrame);
visitor->trace(m_pendingResourceClients);
- visitor->trace(m_resources);
#endif
}
diff --git a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.h b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.h
index f22b146..ff9ab12 100644
--- a/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.h
+++ b/third_party/WebKit/Source/core/inspector/InspectorResourceContentLoader.h
@@ -6,7 +6,7 @@
#define InspectorResourceContentLoader_h
#include "core/CoreExport.h"
-#include "core/fetch/Resource.h"
+#include "core/fetch/ResourcePtr.h"
#include "wtf/Functional.h"
#include "wtf/HashSet.h"
#include "wtf/Noncopyable.h"
@@ -47,7 +47,7 @@ private:
bool m_started;
RawPtrWillBeMember<LocalFrame> m_inspectedFrame;
WillBeHeapHashSet<RawPtrWillBeMember<ResourceClient>> m_pendingResourceClients;
- WillBeHeapVector<RefPtrWillBeMember<Resource>> m_resources;
+ Vector<ResourcePtr<Resource>> m_resources;
friend class ResourceClient;
};
diff --git a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
index cce304a..22e746d 100644
--- a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
+++ b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.cpp
@@ -29,7 +29,6 @@
#include "core/inspector/NetworkResourcesData.h"
#include "core/dom/DOMImplementation.h"
-#include "core/fetch/MemoryCache.h"
#include "core/fetch/Resource.h"
#include "platform/SharedBuffer.h"
#include "platform/network/ResourceResponse.h"
@@ -273,7 +272,6 @@ void NetworkResourcesData::maybeDecodeDataToContent(const String& requestId)
void NetworkResourcesData::addResource(const String& requestId, Resource* cachedResource)
{
- ASSERT(memoryCache()->contains(cachedResource));
ResourceData* resourceData = resourceDataForRequestId(requestId);
if (!resourceData)
return;
diff --git a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.h b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.h
index c4ee8b4..3f2a4fb 100644
--- a/third_party/WebKit/Source/core/inspector/NetworkResourcesData.h
+++ b/third_party/WebKit/Source/core/inspector/NetworkResourcesData.h
@@ -124,7 +124,7 @@ public:
PassRefPtr<SharedBuffer> buffer() const { return m_buffer; }
void setBuffer(PassRefPtr<SharedBuffer> buffer) { m_buffer = buffer; }
- Resource* cachedResource() const { return m_cachedResource.get(); }
+ Resource* cachedResource() const { return m_cachedResource; }
void setResource(Resource* cachedResource) { m_cachedResource = cachedResource; }
XHRReplayData* xhrReplayData() const { return m_xhrReplayData.get(); }
@@ -157,7 +157,7 @@ public:
OwnPtr<TextResourceDecoder> m_decoder;
RefPtr<SharedBuffer> m_buffer;
- RefPtrWillBeMember<Resource> m_cachedResource;
+ RawPtrWillBeMember<Resource> m_cachedResource;
RefPtr<BlobDataHandle> m_downloadedFileBlob;
};
diff --git a/third_party/WebKit/Source/core/layout/LayoutImageResource.h b/third_party/WebKit/Source/core/layout/LayoutImageResource.h
index 9680c5a..a83178b 100644
--- a/third_party/WebKit/Source/core/layout/LayoutImageResource.h
+++ b/third_party/WebKit/Source/core/layout/LayoutImageResource.h
@@ -27,6 +27,7 @@
#define LayoutImageResource_h
#include "core/fetch/ImageResource.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/style/StyleImage.h"
namespace blink {
@@ -63,12 +64,12 @@ public:
virtual WrappedImagePtr imagePtr() const { return m_cachedImage.get(); }
- DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_cachedImage); }
+ DEFINE_INLINE_VIRTUAL_TRACE() { }
protected:
LayoutImageResource();
LayoutObject* m_layoutObject;
- RefPtrWillBeMember<ImageResource> m_cachedImage;
+ ResourcePtr<ImageResource> m_cachedImage;
};
} // namespace blink
diff --git a/third_party/WebKit/Source/core/layout/LayoutImageResourceStyleImage.cpp b/third_party/WebKit/Source/core/layout/LayoutImageResourceStyleImage.cpp
index be7e3e0..36add16 100644
--- a/third_party/WebKit/Source/core/layout/LayoutImageResourceStyleImage.cpp
+++ b/third_party/WebKit/Source/core/layout/LayoutImageResourceStyleImage.cpp
@@ -41,7 +41,6 @@ LayoutImageResourceStyleImage::LayoutImageResourceStyleImage(StyleImage* styleIm
LayoutImageResourceStyleImage::~LayoutImageResourceStyleImage()
{
- ASSERT(!m_cachedImage);
}
void LayoutImageResourceStyleImage::initialize(LayoutObject* layoutObject)
@@ -58,7 +57,7 @@ void LayoutImageResourceStyleImage::shutdown()
{
ASSERT(m_layoutObject);
m_styleImage->removeClient(m_layoutObject);
- m_cachedImage = nullptr;
+ m_cachedImage = 0;
}
PassRefPtr<Image> LayoutImageResourceStyleImage::image(const IntSize& size, float zoom) const
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
index ab016f4..29ba34b 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.cpp
@@ -123,7 +123,7 @@ DEFINE_TRACE(DocumentLoader)
{
visitor->trace(m_frame);
visitor->trace(m_fetcher);
- visitor->trace(m_mainResource);
+ // TODO(sof): start tracing ResourcePtr<>s (and m_mainResource.)
visitor->trace(m_writer);
visitor->trace(m_documentLoadTiming);
visitor->trace(m_applicationCacheHost);
@@ -157,9 +157,9 @@ const KURL& DocumentLoader::url() const
return m_request.url();
}
-Resource* DocumentLoader::startPreload(Resource::Type type, FetchRequest& request)
+ResourcePtr<Resource> DocumentLoader::startPreload(Resource::Type type, FetchRequest& request)
{
- RefPtrWillBeRawPtr<Resource> resource = nullptr;
+ ResourcePtr<Resource> resource;
switch (type) {
case Resource::Image:
resource = ImageResource::fetch(request, fetcher());
@@ -193,7 +193,7 @@ Resource* DocumentLoader::startPreload(Resource::Type type, FetchRequest& reques
if (resource)
fetcher()->preloadStarted(resource.get());
- return resource.get();
+ return resource;
}
void DocumentLoader::didChangePerformanceTiming()
diff --git a/third_party/WebKit/Source/core/loader/DocumentLoader.h b/third_party/WebKit/Source/core/loader/DocumentLoader.h
index f13f8d9..7d1f482 100644
--- a/third_party/WebKit/Source/core/loader/DocumentLoader.h
+++ b/third_party/WebKit/Source/core/loader/DocumentLoader.h
@@ -35,6 +35,7 @@
#include "core/fetch/ClientHintsPreferences.h"
#include "core/fetch/RawResource.h"
#include "core/fetch/ResourceLoaderOptions.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/SubstituteData.h"
#include "core/frame/csp/ContentSecurityPolicy.h"
#include "core/loader/DocumentLoadTiming.h"
@@ -143,7 +144,7 @@ public:
bool loadingMultipartContent() const;
- Resource* startPreload(Resource::Type, FetchRequest&);
+ ResourcePtr<Resource> startPreload(Resource::Type, FetchRequest&);
DECLARE_VIRTUAL_TRACE();
@@ -188,7 +189,7 @@ private:
RawPtrWillBeMember<LocalFrame> m_frame;
PersistentWillBeMember<ResourceFetcher> m_fetcher;
- RefPtrWillBeMember<RawResource> m_mainResource;
+ ResourcePtr<RawResource> m_mainResource;
RefPtrWillBeMember<DocumentWriter> m_writer;
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
index f6afbf0..a225253 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.cpp
@@ -818,7 +818,7 @@ void DocumentThreadableLoader::loadRequest(const ResourceRequest& request, Resou
FetchRequest fetchRequest(request, m_options.initiator, resourceLoaderOptions);
if (m_options.crossOriginRequestPolicy == AllowCrossOriginRequests)
fetchRequest.setOriginRestriction(FetchRequest::NoOriginRestriction);
- RefPtrWillBeRawPtr<Resource> resource = RawResource::fetchSynchronously(fetchRequest, document().fetcher());
+ ResourcePtr<Resource> resource = RawResource::fetchSynchronously(fetchRequest, document().fetcher());
ResourceResponse response = resource ? resource->response() : ResourceResponse();
unsigned long identifier = resource ? resource->identifier() : std::numeric_limits<unsigned long>::max();
ResourceError error = resource ? resource->resourceError() : ResourceError();
diff --git a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
index b46bc61..7907c2e 100644
--- a/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
+++ b/third_party/WebKit/Source/core/loader/DocumentThreadableLoader.h
@@ -153,20 +153,22 @@ class CORE_EXPORT DocumentThreadableLoader final : public ThreadableLoader, priv
// this re-implementation of ResourceOwner.
RawResource* resource() const { return m_resource.get(); }
void clearResource() { setResource(nullptr); }
- void setResource(const PassRefPtrWillBeRawPtr<RawResource>& newResource)
+ void setResource(const ResourcePtr<RawResource>& newResource)
{
if (newResource == m_resource)
return;
- if (PassRefPtrWillBeRawPtr<RawResource> oldResource = m_resource.release())
+ if (ResourcePtr<RawResource> oldResource = m_resource) {
+ m_resource.clear();
oldResource->removeClient(this);
+ }
if (newResource) {
m_resource = newResource;
m_resource->addClient(this);
}
}
- RefPtrWillBePersistent<RawResource> m_resource;
+ ResourcePtr<RawResource> m_resource;
// End of ResourceOwner re-implementation, see above.
SecurityOrigin* securityOrigin() const;
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
index 8f51fa4..2dd2c83 100644
--- a/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
+++ b/third_party/WebKit/Source/core/loader/FrameFetchContextTest.cpp
@@ -575,7 +575,7 @@ TEST_F(FrameFetchContextDisplayedCertificateErrorsTest, MemoryCacheCertificateEr
response.setURL(url);
response.setSecurityInfo(securityInfo);
response.setHasMajorCertificateErrors(true);
- RefPtrWillBeRawPtr<Resource> resource = Resource::create(resourceRequest, Resource::Image);
+ ResourcePtr<Resource> resource = new Resource(resourceRequest, Resource::Image);
resource->setResponse(response);
fetchContext->dispatchDidLoadResourceFromMemoryCache(resource.get(), WebURLRequest::FrameTypeNone, WebURLRequest::RequestContextImage);
}
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.cpp b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
index 7266759..94ba386 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.cpp
@@ -142,6 +142,7 @@ private:
ImageLoader::ImageLoader(Element* element)
: m_element(element)
+ , m_image(0)
, m_derefElementTimer(this, &ImageLoader::timerFired)
, m_hasPendingLoadEvent(false)
, m_hasPendingErrorEvent(false)
@@ -179,10 +180,8 @@ void ImageLoader::dispose()
willRemoveClient(*client);
#endif
- if (m_image) {
+ if (m_image)
m_image->removeClient(this);
- m_image = nullptr;
- }
#if !ENABLE(OILPAN)
ASSERT(m_hasPendingLoadEvent || !loadEventSender().hasPendingEvents(this));
@@ -212,7 +211,6 @@ void ImageLoader::clearWeakMembers(Visitor* visitor)
DEFINE_TRACE(ImageLoader)
{
- visitor->trace(m_image);
visitor->trace(m_element);
#if ENABLE(OILPAN)
visitor->template registerWeakMembers<ImageLoader, &ImageLoader::clearWeakMembers>(this);
@@ -312,7 +310,7 @@ void ImageLoader::doUpdateFromElement(BypassMainWorldBehavior bypassBehavior, Up
AtomicString imageSourceURL = m_element->imageSourceURL();
KURL url = imageSourceToKURL(imageSourceURL);
- RefPtrWillBeRawPtr<ImageResource> newImage = nullptr;
+ ResourcePtr<ImageResource> newImage = 0;
RefPtrWillBeRawPtr<Element> protectElement(m_element.get());
if (!url.isNull()) {
// Unlike raw <img>, we block mixed content inside of <picture> or <img srcset>.
@@ -362,7 +360,7 @@ void ImageLoader::doUpdateFromElement(BypassMainWorldBehavior bypassBehavior, Up
noImageResourceToLoad();
}
- RefPtrWillBeRawPtr<ImageResource> oldImage = m_image.get();
+ ImageResource* oldImage = m_image.get();
if (updateBehavior == UpdateSizeChanged && m_element->layoutObject() && m_element->layoutObject()->isImage() && newImage == oldImage) {
toLayoutImage(m_element->layoutObject())->intrinsicSizeChanged();
} else {
diff --git a/third_party/WebKit/Source/core/loader/ImageLoader.h b/third_party/WebKit/Source/core/loader/ImageLoader.h
index fd3ca94..ec8c8a9 100644
--- a/third_party/WebKit/Source/core/loader/ImageLoader.h
+++ b/third_party/WebKit/Source/core/loader/ImageLoader.h
@@ -26,6 +26,7 @@
#include "core/CoreExport.h"
#include "core/fetch/ImageResource.h"
#include "core/fetch/ImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "platform/heap/Handle.h"
#include "wtf/HashSet.h"
#include "wtf/WeakPtr.h"
@@ -168,7 +169,7 @@ private:
#endif
RawPtrWillBeMember<Element> m_element;
- RefPtrWillBeMember<ImageResource> m_image;
+ ResourcePtr<ImageResource> m_image;
// FIXME: Oilpan: We might be able to remove this Persistent hack when
// ImageResourceClient is traceable.
GC_PLUGIN_IGNORE("http://crbug.com/383741")
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
index 5b4b3a1..339e617 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -187,35 +187,35 @@ Resource::Type LinkLoader::getTypeFromAsAttribute(const String& as, Document* do
return Resource::LinkPreload;
}
-void LinkLoader::createLinkPreloadResourceClient(Resource* resource)
+void LinkLoader::createLinkPreloadResourceClient(ResourcePtr<Resource> resource)
{
if (!resource)
return;
switch (resource->type()) {
case Resource::Image:
- m_linkPreloadResourceClient = LinkPreloadImageResourceClient::create(this, toImageResource(resource));
+ m_linkPreloadResourceClient = LinkPreloadImageResourceClient::create(this, toImageResource(resource.get()));
break;
case Resource::Script:
- m_linkPreloadResourceClient = LinkPreloadScriptResourceClient::create(this, toScriptResource(resource));
+ m_linkPreloadResourceClient = LinkPreloadScriptResourceClient::create(this, toScriptResource(resource.get()));
break;
case Resource::CSSStyleSheet:
- m_linkPreloadResourceClient = LinkPreloadStyleResourceClient::create(this, toCSSStyleSheetResource(resource));
+ m_linkPreloadResourceClient = LinkPreloadStyleResourceClient::create(this, toCSSStyleSheetResource(resource.get()));
break;
case Resource::Font:
- m_linkPreloadResourceClient = LinkPreloadFontResourceClient::create(this, toFontResource(resource));
+ m_linkPreloadResourceClient = LinkPreloadFontResourceClient::create(this, toFontResource(resource.get()));
break;
case Resource::Media:
case Resource::TextTrack:
case Resource::Raw:
case Resource::LinkPreload:
- m_linkPreloadResourceClient = LinkPreloadRawResourceClient::create(this, toRawResource(resource));
+ m_linkPreloadResourceClient = LinkPreloadRawResourceClient::create(this, toRawResource(resource.get()));
break;
default:
ASSERT_NOT_REACHED();
}
}
-static Resource* preloadIfNeeded(const LinkRelAttribute& relAttribute, const KURL& href, Document& document, const String& as, LinkCaller caller)
+static ResourcePtr<Resource> preloadIfNeeded(const LinkRelAttribute& relAttribute, const KURL& href, Document& document, const String& as, LinkCaller caller)
{
if (!document.loader() || !relAttribute.isLinkPreload())
return nullptr;
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.h b/third_party/WebKit/Source/core/loader/LinkLoader.h
index 8ac23b4..a872886 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoader.h
+++ b/third_party/WebKit/Source/core/loader/LinkLoader.h
@@ -85,7 +85,7 @@ private:
void linkLoadTimerFired(Timer<LinkLoader>*);
void linkLoadingErrorTimerFired(Timer<LinkLoader>*);
- void createLinkPreloadResourceClient(Resource*);
+ void createLinkPreloadResourceClient(ResourcePtr<Resource>);
RawPtrWillBeMember<LinkLoaderClient> m_client;
diff --git a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
index e1244a6..aef1938 100644
--- a/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
+++ b/third_party/WebKit/Source/core/loader/LinkLoaderTest.cpp
@@ -121,7 +121,7 @@ TEST(LinkLoaderTest, Preload)
dummyPageHolder->document(),
NetworkHintsMock());
ASSERT(dummyPageHolder->document().fetcher());
- WillBeHeapListHashSet<RefPtrWillBeMember<Resource>>* preloads = dummyPageHolder->document().fetcher()->preloads();
+ WillBeHeapListHashSet<RawPtrWillBeMember<Resource>>* preloads = dummyPageHolder->document().fetcher()->preloads();
if (testCase.shouldLoad)
ASSERT_NE(nullptr, preloads);
if (preloads) {
diff --git a/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h b/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
index 07e2021..ebb1824 100644
--- a/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
+++ b/third_party/WebKit/Source/core/paint/PaintLayerFilterInfo.h
@@ -103,7 +103,7 @@ private:
// Same as m_internalSVGReferences, except that the reference belongs to a
// different document.
- WillBePersistentHeapVector<RefPtrWillBeMember<DocumentResource>> m_externalSVGReferences;
+ Vector<ResourcePtr<DocumentResource>> m_externalSVGReferences;
};
} // namespace blink
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
index 70d0093..6f69be2 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.cpp
@@ -53,7 +53,6 @@ StyleFetchedImage::~StyleFetchedImage()
void StyleFetchedImage::dispose()
{
m_image->removeClient(this);
- m_image = nullptr;
}
WrappedImagePtr StyleFetchedImage::data() const
@@ -145,7 +144,6 @@ bool StyleFetchedImage::knownToBeOpaque(const LayoutObject* layoutObject) const
DEFINE_TRACE(StyleFetchedImage)
{
- visitor->trace(m_image);
visitor->trace(m_document);
StyleImage::trace(visitor);
}
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImage.h b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
index 7150261..9f9fdd4 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImage.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImage.h
@@ -25,6 +25,7 @@
#define StyleFetchedImage_h
#include "core/fetch/ImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/style/StyleImage.h"
namespace blink {
@@ -69,7 +70,7 @@ private:
void dispose();
- RefPtrWillBeMember<ImageResource> m_image;
+ ResourcePtr<ImageResource> m_image;
RawPtrWillBeMember<Document> m_document;
const KURL m_url;
};
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
index c02f13b..bab09b1 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.cpp
@@ -55,7 +55,6 @@ StyleFetchedImageSet::~StyleFetchedImageSet()
void StyleFetchedImageSet::dispose()
{
m_bestFitImage->removeClient(this);
- m_bestFitImage = nullptr;
}
WrappedImagePtr StyleFetchedImageSet::data() const
@@ -141,7 +140,6 @@ bool StyleFetchedImageSet::knownToBeOpaque(const LayoutObject* layoutObject) con
DEFINE_TRACE(StyleFetchedImageSet)
{
- visitor->trace(m_bestFitImage);
visitor->trace(m_imageSetValue);
StyleImage::trace(visitor);
}
diff --git a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
index a11d001..640aea5 100644
--- a/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
+++ b/third_party/WebKit/Source/core/style/StyleFetchedImageSet.h
@@ -27,6 +27,7 @@
#define StyleFetchedImageSet_h
#include "core/fetch/ImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/style/StyleImage.h"
#include "platform/geometry/LayoutSize.h"
@@ -82,7 +83,7 @@ private:
String debugName() const override { return "StyleFetchedImageSet"; }
- RefPtrWillBeMember<ImageResource> m_bestFitImage;
+ ResourcePtr<ImageResource> m_bestFitImage;
float m_imageScaleFactor;
RawPtrWillBeMember<CSSImageSetValue> m_imageSetValue; // Not retained; it owns us.
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
index 5cfd956..06768c7 100644
--- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.cpp
@@ -47,7 +47,7 @@ SVGFEImageElement::~SVGFEImageElement()
#if ENABLE(OILPAN)
if (m_cachedImage) {
m_cachedImage->removeClient(this);
- m_cachedImage = nullptr;
+ m_cachedImage = 0;
}
#else
clearResourceReferences();
@@ -57,7 +57,6 @@ SVGFEImageElement::~SVGFEImageElement()
DEFINE_TRACE(SVGFEImageElement)
{
visitor->trace(m_preserveAspectRatio);
- visitor->trace(m_cachedImage);
SVGFilterPrimitiveStandardAttributes::trace(visitor);
SVGURIReference::trace(visitor);
}
@@ -74,7 +73,7 @@ void SVGFEImageElement::clearResourceReferences()
{
if (m_cachedImage) {
m_cachedImage->removeClient(this);
- m_cachedImage = nullptr;
+ m_cachedImage = 0;
}
removeAllOutgoingReferences();
diff --git a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
index 4df7845..fe54161 100644
--- a/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGFEImageElement.h
@@ -24,6 +24,7 @@
#include "core/SVGNames.h"
#include "core/fetch/ImageResource.h"
#include "core/fetch/ImageResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/svg/SVGAnimatedPreserveAspectRatio.h"
#include "core/svg/SVGFilterPrimitiveStandardAttributes.h"
#include "core/svg/SVGURIReference.h"
@@ -66,7 +67,7 @@ private:
RefPtrWillBeMember<SVGAnimatedPreserveAspectRatio> m_preserveAspectRatio;
- RefPtrWillBeMember<ImageResource> m_cachedImage;
+ ResourcePtr<ImageResource> m_cachedImage;
};
} // namespace blink
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
index f1023a8..453af10 100644
--- a/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
+++ b/third_party/WebKit/Source/core/svg/SVGUseElement.cpp
@@ -66,10 +66,6 @@ inline SVGUseElement::SVGUseElement(Document& document)
addToPropertyMap(m_y);
addToPropertyMap(m_width);
addToPropertyMap(m_height);
-
-#if ENABLE(OILPAN)
- ThreadState::current()->registerPreFinalizer(this);
-#endif
}
PassRefPtrWillBeRawPtr<SVGUseElement> SVGUseElement::create(Document& document)
@@ -82,19 +78,14 @@ PassRefPtrWillBeRawPtr<SVGUseElement> SVGUseElement::create(Document& document)
SVGUseElement::~SVGUseElement()
{
+ setDocumentResource(0);
#if !ENABLE(OILPAN)
clearShadowTree();
cancelShadowTreeRecreation();
svgUseLoadEventSender().cancelEvent(this);
- dispose();
#endif
}
-void SVGUseElement::dispose()
-{
- setDocumentResource(nullptr);
-}
-
DEFINE_TRACE(SVGUseElement)
{
visitor->trace(m_x);
@@ -102,7 +93,6 @@ DEFINE_TRACE(SVGUseElement)
visitor->trace(m_width);
visitor->trace(m_height);
visitor->trace(m_targetElementInstance);
- visitor->trace(m_resource);
SVGGraphicsElement::trace(visitor);
SVGURIReference::trace(visitor);
}
@@ -242,7 +232,7 @@ void SVGUseElement::svgAttributeChanged(const QualifiedName& attrName)
setDocumentResource(DocumentResource::fetchSVGDocument(request, document().fetcher()));
}
} else {
- setDocumentResource(nullptr);
+ setDocumentResource(0);
}
invalidateShadowTree();
@@ -818,7 +808,7 @@ bool SVGUseElement::instanceTreeIsLoading(const SVGElement* targetInstance)
return false;
}
-void SVGUseElement::setDocumentResource(PassRefPtrWillBeRawPtr<DocumentResource> resource)
+void SVGUseElement::setDocumentResource(ResourcePtr<DocumentResource> resource)
{
if (m_resource == resource)
return;
diff --git a/third_party/WebKit/Source/core/svg/SVGUseElement.h b/third_party/WebKit/Source/core/svg/SVGUseElement.h
index 0dacc19..cb7702f 100644
--- a/third_party/WebKit/Source/core/svg/SVGUseElement.h
+++ b/third_party/WebKit/Source/core/svg/SVGUseElement.h
@@ -39,7 +39,6 @@ class SVGUseElement final : public SVGGraphicsElement,
DEFINE_WRAPPERTYPEINFO();
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(SVGUseElement);
- WILL_BE_USING_PRE_FINALIZER(SVGUseElement, dispose);
public:
static PassRefPtrWillBeRawPtr<SVGUseElement> create(Document&);
~SVGUseElement() override;
@@ -65,8 +64,6 @@ public:
private:
explicit SVGUseElement(Document&);
- void dispose();
-
FloatRect getBBox() override;
bool isPresentationAttribute(const QualifiedName&) const override;
@@ -107,7 +104,7 @@ private:
void notifyFinished(Resource*) override;
String debugName() const override { return "SVGUseElement"; }
TreeScope* referencedScope() const;
- void setDocumentResource(PassRefPtrWillBeRawPtr<DocumentResource>);
+ void setDocumentResource(ResourcePtr<DocumentResource>);
RefPtrWillBeMember<SVGAnimatedLength> m_x;
RefPtrWillBeMember<SVGAnimatedLength> m_y;
@@ -117,7 +114,7 @@ private:
bool m_haveFiredLoadEvent;
bool m_needsShadowTreeRecreation;
RefPtrWillBeMember<SVGElement> m_targetElementInstance;
- RefPtrWillBeMember<DocumentResource> m_resource;
+ ResourcePtr<DocumentResource> m_resource;
};
} // namespace blink
diff --git a/third_party/WebKit/Source/core/xml/XSLImportRule.cpp b/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
index f3e47ea..b45755f 100644
--- a/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
+++ b/third_party/WebKit/Source/core/xml/XSLImportRule.cpp
@@ -100,7 +100,7 @@ void XSLImportRule::loadSheet()
ResourceLoaderOptions fetchOptions(ResourceFetcher::defaultResourceOptions());
FetchRequest request(ResourceRequest(ownerDocument->completeURL(absHref)), FetchInitiatorTypeNames::xml, fetchOptions);
request.setOriginRestriction(FetchRequest::RestrictToSameOrigin);
- RefPtrWillBeRawPtr<XSLStyleSheetResource> resource = XSLStyleSheetResource::fetchSynchronously(request, ownerDocument->fetcher());
+ ResourcePtr<XSLStyleSheetResource> resource = XSLStyleSheetResource::fetchSynchronously(request, ownerDocument->fetcher());
if (!resource || !resource->sheet())
return;
diff --git a/third_party/WebKit/Source/core/xml/XSLImportRule.h b/third_party/WebKit/Source/core/xml/XSLImportRule.h
index c023f78..e9f70fe 100644
--- a/third_party/WebKit/Source/core/xml/XSLImportRule.h
+++ b/third_party/WebKit/Source/core/xml/XSLImportRule.h
@@ -23,6 +23,7 @@
#ifndef XSLImportRule_h
#define XSLImportRule_h
+#include "core/fetch/ResourcePtr.h"
#include "core/xml/XSLStyleSheet.h"
#include "platform/RuntimeEnabledFeatures.h"
#include "wtf/PassOwnPtr.h"
diff --git a/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp b/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
index 62f3115..c973b57 100644
--- a/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
+++ b/third_party/WebKit/Source/core/xml/XSLTProcessorLibxslt.cpp
@@ -103,7 +103,7 @@ static xmlDocPtr docLoaderFunc(
ResourceLoaderOptions fetchOptions(ResourceFetcher::defaultResourceOptions());
FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::xml, fetchOptions);
request.setOriginRestriction(FetchRequest::RestrictToSameOrigin);
- RefPtrWillBeRawPtr<Resource> resource = RawResource::fetchSynchronously(request, globalResourceFetcher);
+ ResourcePtr<Resource> resource = RawResource::fetchSynchronously(request, globalResourceFetcher);
if (!resource || !globalProcessor)
return nullptr;
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
index 84c25a9..49193da 100644
--- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
+++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.cpp
@@ -416,10 +416,6 @@ bool XMLDocumentParser::updateLeafTextNode()
void XMLDocumentParser::detach()
{
- if (m_pendingScript) {
- m_pendingScript->removeClient(this);
- m_pendingScript = nullptr;
- }
clearCurrentNodeStack();
ScriptableDocumentParser::detach();
}
@@ -490,7 +486,7 @@ void XMLDocumentParser::notifyFinished(Resource* unusedResource)
bool wasCanceled = m_pendingScript->wasCanceled();
m_pendingScript->removeClient(this);
- m_pendingScript = nullptr;
+ m_pendingScript = 0;
RefPtrWillBeRawPtr<Element> e = m_scriptElement;
m_scriptElement = nullptr;
@@ -677,7 +673,7 @@ static void* openFunc(const char* uri)
XMLDocumentParserScope scope(0);
// FIXME: We should restore the original global error handler as well.
FetchRequest request(ResourceRequest(url), FetchInitiatorTypeNames::xml, ResourceFetcher::defaultResourceOptions());
- RefPtrWillBeRawPtr<Resource> resource = RawResource::fetchSynchronously(request, document->fetcher());
+ ResourcePtr<Resource> resource = RawResource::fetchSynchronously(request, document->fetcher());
if (resource && !resource->errorOccurred()) {
data = resource->resourceBuffer();
finalURL = resource->response().url();
@@ -806,6 +802,7 @@ XMLDocumentParser::XMLDocumentParser(Document& document, FrameView* frameView)
, m_requestingScript(false)
, m_finishCalled(false)
, m_xmlErrors(&document)
+ , m_pendingScript(0)
, m_scriptStartPosition(TextPosition::belowRangePosition())
, m_parsingFragment(false)
{
@@ -829,6 +826,7 @@ XMLDocumentParser::XMLDocumentParser(DocumentFragment* fragment, Element* parent
, m_requestingScript(false)
, m_finishCalled(false)
, m_xmlErrors(&fragment->document())
+ , m_pendingScript(0)
, m_scriptStartPosition(TextPosition::belowRangePosition())
, m_parsingFragment(true)
{
@@ -875,12 +873,15 @@ XMLParserContext::~XMLParserContext()
XMLDocumentParser::~XMLDocumentParser()
{
- ASSERT(!m_pendingScript);
#if !ENABLE(OILPAN)
// The XMLDocumentParser will always be detached before being destroyed.
ASSERT(m_currentNodeStack.isEmpty());
ASSERT(!m_currentNode);
#endif
+
+ // FIXME: m_pendingScript handling should be moved into XMLDocumentParser.cpp!
+ if (m_pendingScript)
+ m_pendingScript->removeClient(this);
}
DEFINE_TRACE(XMLDocumentParser)
@@ -891,7 +892,6 @@ DEFINE_TRACE(XMLDocumentParser)
#endif
visitor->trace(m_leafTextNode);
visitor->trace(m_xmlErrors);
- visitor->trace(m_pendingScript);
visitor->trace(m_scriptElement);
ScriptableDocumentParser::trace(visitor);
}
diff --git a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
index 8eb344d..b35376b 100644
--- a/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
+++ b/third_party/WebKit/Source/core/xml/parser/XMLDocumentParser.h
@@ -28,6 +28,7 @@
#include "core/dom/ParserContentPolicy.h"
#include "core/dom/ScriptableDocumentParser.h"
#include "core/fetch/ResourceClient.h"
+#include "core/fetch/ResourcePtr.h"
#include "core/fetch/ScriptResource.h"
#include "core/xml/parser/XMLErrors.h"
#include "platform/heap/Handle.h"
@@ -184,7 +185,7 @@ private:
XMLErrors m_xmlErrors;
- RefPtrWillBeMember<ScriptResource> m_pendingScript;
+ ResourcePtr<ScriptResource> m_pendingScript;
RefPtrWillBeMember<Element> m_scriptElement;
TextPosition m_scriptStartPosition;
diff --git a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
index 2e165f3..d700a1c 100644
--- a/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
+++ b/third_party/WebKit/Source/web/tests/WebFrameTest.cpp
@@ -6722,7 +6722,7 @@ TEST_P(ParameterizedWebFrameTest, NotifyManifestChange)
EXPECT_EQ(14, webFrameClient.manifestChangeCount());
}
-static PassRefPtrWillBeRawPtr<Resource> fetchManifest(Document* document, const KURL& url)
+static ResourcePtr<Resource> fetchManifest(Document* document, const KURL& url)
{
FetchRequest fetchRequest = FetchRequest(ResourceRequest(url), FetchInitiatorInfo());
fetchRequest.mutableResourceRequest().setRequestContext(WebURLRequest::RequestContextManifest);
@@ -6739,7 +6739,7 @@ TEST_P(ParameterizedWebFrameTest, ManifestFetch)
webViewHelper.initializeAndLoad(m_baseURL + "foo.html");
Document* document = toWebLocalFrameImpl(webViewHelper.webViewImpl()->mainFrame())->frame()->document();
- RefPtrWillBeRawPtr<Resource> resource = fetchManifest(document, toKURL(m_baseURL + "link-manifest-fetch.json"));
+ ResourcePtr<Resource> resource = fetchManifest(document, toKURL(m_baseURL + "link-manifest-fetch.json"));
EXPECT_TRUE(resource->isLoaded());
}
@@ -6753,7 +6753,7 @@ TEST_P(ParameterizedWebFrameTest, ManifestCSPFetchAllow)
webViewHelper.initializeAndLoad(m_baseURL + "foo.html");
Document* document = toWebLocalFrameImpl(webViewHelper.webViewImpl()->mainFrame())->frame()->document();
- RefPtrWillBeRawPtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
+ ResourcePtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
EXPECT_TRUE(resource->isLoaded());
}
@@ -6767,7 +6767,7 @@ TEST_P(ParameterizedWebFrameTest, ManifestCSPFetchSelf)
webViewHelper.initializeAndLoad(m_baseURL + "foo.html");
Document* document = toWebLocalFrameImpl(webViewHelper.webViewImpl()->mainFrame())->frame()->document();
- RefPtrWillBeRawPtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
+ ResourcePtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
EXPECT_EQ(0, resource.get()); // Fetching resource wasn't allowed.
}
@@ -6781,7 +6781,7 @@ TEST_P(ParameterizedWebFrameTest, ManifestCSPFetchSelfReportOnly)
webViewHelper.initializeAndLoad(m_baseURL + "foo.html");
Document* document = toWebLocalFrameImpl(webViewHelper.webViewImpl()->mainFrame())->frame()->document();
- RefPtrWillBeRawPtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
+ ResourcePtr<Resource> resource = fetchManifest(document, toKURL(m_notBaseURL + "link-manifest-fetch.json"));
EXPECT_TRUE(resource->isLoaded());
}