Ref: A smart pointer for the reference age.
<https://webkit.org/b/120570>
Reviewed by Antti Koivisto.
Source/WebCore:
Use Ref<T> for various stack guards where null checking isn't needed.
Source/WTF:
Add a very simple simple Ref<T> smart pointer class that is never null.
It's initialized by passing a T& to the constructor and cannot be assigned to.
operator-> is not overloaded, to prevent unsafe-looking code.
The value is extracted by "T& get()", since C++ does not let you override operator.()
* wtf/Ref.h:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@154962 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebCore/loader/DocumentLoader.cpp b/Source/WebCore/loader/DocumentLoader.cpp
index 8df25ae..a6d9a1a 100644
--- a/Source/WebCore/loader/DocumentLoader.cpp
+++ b/Source/WebCore/loader/DocumentLoader.cpp
@@ -62,6 +62,7 @@
#include "SubresourceLoader.h"
#include "TextResourceDecoder.h"
#include <wtf/Assertions.h>
+#include <wtf/Ref.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
#include <wtf/unicode/Unicode.h>
@@ -249,7 +250,7 @@
void DocumentLoader::stopLoading()
{
RefPtr<Frame> protectFrame(m_frame);
- RefPtr<DocumentLoader> protectLoader(this);
+ Ref<DocumentLoader> protectLoader(*this);
// In some rare cases, calling FrameLoader::stopLoading could cause isLoading() to return false.
// (This can happen when there's a single XMLHttpRequest currently loading and stopLoading causes it
@@ -361,7 +362,7 @@
ASSERT(!m_frame->page()->defersLoading() || InspectorInstrumentation::isDebuggerPaused(m_frame));
#endif
- RefPtr<DocumentLoader> protect(this);
+ Ref<DocumentLoader> protect(*this);
if (m_identifierForLoadWithoutResourceLoader) {
// A didFinishLoading delegate might try to cancel the load (despite it
@@ -561,7 +562,7 @@
void DocumentLoader::responseReceived(CachedResource* resource, const ResourceResponse& response)
{
ASSERT_UNUSED(resource, m_mainResource == resource);
- RefPtr<DocumentLoader> protect(this);
+ Ref<DocumentLoader> protect(*this);
bool willLoadFallback = m_applicationCacheHost->maybeLoadFallbackForMainResponse(request(), response);
// The memory cache doesn't understand the application cache or its caching rules. So if a main resource is served
@@ -731,7 +732,7 @@
// Both unloading the old page and parsing the new page may execute JavaScript which destroys the datasource
// by starting a new load, so retain temporarily.
RefPtr<Frame> protectFrame(m_frame);
- RefPtr<DocumentLoader> protectLoader(this);
+ Ref<DocumentLoader> protectLoader(*this);
commitIfReady();
FrameLoader* frameLoader = DocumentLoader::frameLoader();
@@ -914,7 +915,7 @@
{
ASSERT(m_frame);
RefPtr<Frame> protectFrame(m_frame);
- RefPtr<DocumentLoader> protectLoader(this);
+ Ref<DocumentLoader> protectLoader(*this);
// It never makes sense to have a document loader that is detached from its
// frame have any loads active, so go ahead and kill all the loads.
@@ -1419,7 +1420,7 @@
void DocumentLoader::cancelMainResourceLoad(const ResourceError& resourceError)
{
- RefPtr<DocumentLoader> protect(this);
+ Ref<DocumentLoader> protect(*this);
ResourceError error = resourceError.isNull() ? frameLoader()->cancelledError(m_request) : resourceError;
m_dataLoadTimer.stop();
diff --git a/Source/WebCore/loader/DocumentThreadableLoader.cpp b/Source/WebCore/loader/DocumentThreadableLoader.cpp
index c924853..3fe56f3 100644
--- a/Source/WebCore/loader/DocumentThreadableLoader.cpp
+++ b/Source/WebCore/loader/DocumentThreadableLoader.cpp
@@ -48,6 +48,7 @@
#include "SubresourceLoader.h"
#include "ThreadableLoaderClient.h"
#include <wtf/Assertions.h>
+#include <wtf/Ref.h>
#if ENABLE(INSPECTOR)
#include "ProgressTracker.h"
@@ -144,7 +145,7 @@
void DocumentThreadableLoader::cancel()
{
- RefPtr<DocumentThreadableLoader> protect(this);
+ Ref<DocumentThreadableLoader> protect(*this);
// Cancel can re-enter and m_resource might be null here as a result.
if (m_client && m_resource) {
@@ -180,7 +181,7 @@
ASSERT(m_client);
ASSERT_UNUSED(resource, resource == m_resource);
- RefPtr<DocumentThreadableLoader> protect(this);
+ Ref<DocumentThreadableLoader> protect(*this);
// Allow same origin requests to continue after allowing clients to audit the redirect.
if (isAllowedRedirect(request.url())) {
if (m_client->isDocumentThreadableLoaderClient())
diff --git a/Source/WebCore/loader/DocumentWriter.cpp b/Source/WebCore/loader/DocumentWriter.cpp
index 4631c78..1ac1474 100644
--- a/Source/WebCore/loader/DocumentWriter.cpp
+++ b/Source/WebCore/loader/DocumentWriter.cpp
@@ -46,6 +46,7 @@
#include "Settings.h"
#include "SinkDocument.h"
#include "TextResourceDecoder.h"
+#include <wtf/Ref.h>
namespace WebCore {
@@ -233,7 +234,7 @@
// http://bugs.webkit.org/show_bug.cgi?id=10854
// The frame's last ref may be removed and it can be deleted by checkCompleted(),
// so we'll add a protective refcount
- RefPtr<Frame> protector(m_frame);
+ Ref<Frame> protect(*m_frame);
if (!m_parser)
return;
diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp
index 36d88d4..ae050bd 100644
--- a/Source/WebCore/loader/FrameLoader.cpp
+++ b/Source/WebCore/loader/FrameLoader.cpp
@@ -108,6 +108,7 @@
#include "WindowFeatures.h"
#include "XMLDocumentParser.h"
#include <wtf/CurrentTime.h>
+#include <wtf/Ref.h>
#include <wtf/StdLibExtras.h>
#include <wtf/text/CString.h>
#include <wtf/text/WTFString.h>
@@ -303,7 +304,7 @@
{
ASSERT(!m_suppressOpenerInNewFrame);
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
FrameLoadRequest frameRequest(passedRequest);
if (m_frame.script().executeIfJavaScriptURL(frameRequest.resourceRequest().url(), shouldReplaceDocumentIfJavaScriptURL))
@@ -476,7 +477,7 @@
{
// http://bugs.webkit.org/show_bug.cgi?id=10854
// The frame's last ref may be removed and it will be deleted by checkCompleted().
- RefPtr<Frame> protector(&m_frame);
+ Ref<Frame> protect(m_frame);
if (DocumentParser* parser = m_frame.document()->parser()) {
parser->stopParsing();
@@ -757,7 +758,7 @@
void FrameLoader::checkCompleted()
{
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
m_shouldCallCheckCompleted = false;
if (m_frame.view())
@@ -802,7 +803,7 @@
void FrameLoader::checkTimerFired(Timer<FrameLoader>*)
{
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
if (Page* page = m_frame.page()) {
if (page->defersLoading())
@@ -1089,7 +1090,7 @@
void FrameLoader::completed()
{
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
for (Frame* descendant = m_frame.tree().traverseNext(&m_frame); descendant; descendant = descendant->tree().traverseNext(&m_frame))
descendant->navigationScheduler().startTimer();
@@ -1154,7 +1155,7 @@
PassRefPtr<Event> event, PassRefPtr<FormState> formState, ShouldSendReferrer shouldSendReferrer)
{
// Protect frame from getting blown away inside dispatchBeforeLoadEvent in loadWithDocumentLoader.
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
KURL url = request.resourceRequest().url();
@@ -1365,7 +1366,7 @@
void FrameLoader::loadWithDocumentLoader(DocumentLoader* loader, FrameLoadType type, PassRefPtr<FormState> prpFormState)
{
// Retain because dispatchBeforeLoadEvent may release the last reference to it.
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
ASSERT(m_client.hasWebView());
@@ -1562,7 +1563,7 @@
// Calling stopLoading() on the provisional document loader can blow away
// the frame from underneath.
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
m_inStopAllLoaders = true;
@@ -1700,7 +1701,7 @@
{
RefPtr<CachedPage> cachedPage = m_loadingFromCachedPage ? pageCache()->get(history().provisionalItem()) : 0;
RefPtr<DocumentLoader> pdl = m_provisionalDocumentLoader;
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
LOG(PageCache, "WebCoreLoading %s: About to commit provisional load from previous URL '%s' to new URL '%s'", m_frame.tree().uniqueName().string().utf8().data(),
m_frame.document() ? m_frame.document()->url().stringCenterEllipsizedToLength().utf8().data() : "",
@@ -2614,7 +2615,7 @@
void FrameLoader::receivedMainResourceError(const ResourceError& error)
{
// Retain because the stop may release the last reference to it.
- RefPtr<Frame> protect(&m_frame);
+ Ref<Frame> protect(m_frame);
RefPtr<DocumentLoader> loader = activeDocumentLoader();
// FIXME: Don't want to do this if an entirely new load is going, so should check
diff --git a/Source/WebCore/loader/NavigationScheduler.cpp b/Source/WebCore/loader/NavigationScheduler.cpp
index ce2fca1..80877c1 100644
--- a/Source/WebCore/loader/NavigationScheduler.cpp
+++ b/Source/WebCore/loader/NavigationScheduler.cpp
@@ -50,6 +50,7 @@
#include "ScriptController.h"
#include "UserGestureIndicator.h"
#include <wtf/CurrentTime.h>
+#include <wtf/Ref.h>
namespace WebCore {
@@ -420,7 +421,7 @@
return;
}
- RefPtr<Frame> protect(m_frame);
+ Ref<Frame> protect(*m_frame);
OwnPtr<ScheduledNavigation> redirect(m_redirect.release());
redirect->fire(m_frame);
@@ -431,7 +432,7 @@
{
ASSERT(m_frame->page());
- RefPtr<Frame> protect(m_frame);
+ Ref<Frame> protect(*m_frame);
// If a redirect was scheduled during a load, then stop the current load.
// Otherwise when the current load transitions from a provisional to a
diff --git a/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp b/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
index 9525bae..7a7cf36 100644
--- a/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
+++ b/Source/WebCore/loader/NetscapePlugInStreamLoader.cpp
@@ -32,6 +32,7 @@
#include "DocumentLoader.h"
#include "FrameLoader.h"
#include "FrameLoaderClient.h"
+#include <wtf/Ref.h>
namespace WebCore {
@@ -68,7 +69,7 @@
void NetscapePlugInStreamLoader::didReceiveResponse(const ResourceResponse& response)
{
- RefPtr<NetscapePlugInStreamLoader> protect(this);
+ Ref<NetscapePlugInStreamLoader> protect(*this);
m_client->didReceiveResponse(this, response);
@@ -105,7 +106,7 @@
void NetscapePlugInStreamLoader::didReceiveDataOrBuffer(const char* data, int length, PassRefPtr<SharedBuffer> buffer, long long encodedDataLength, DataPayloadType dataPayloadType)
{
- RefPtr<NetscapePlugInStreamLoader> protect(this);
+ Ref<NetscapePlugInStreamLoader> protect(*this);
m_client->didReceiveData(this, buffer ? buffer->data() : data, buffer ? buffer->size() : length);
@@ -114,7 +115,7 @@
void NetscapePlugInStreamLoader::didFinishLoading(double finishTime)
{
- RefPtr<NetscapePlugInStreamLoader> protect(this);
+ Ref<NetscapePlugInStreamLoader> protect(*this);
m_documentLoader->removePlugInStreamLoader(this);
m_client->didFinishLoading(this);
@@ -123,7 +124,7 @@
void NetscapePlugInStreamLoader::didFail(const ResourceError& error)
{
- RefPtr<NetscapePlugInStreamLoader> protect(this);
+ Ref<NetscapePlugInStreamLoader> protect(*this);
m_documentLoader->removePlugInStreamLoader(this);
m_client->didFail(this, error);
diff --git a/Source/WebCore/loader/ResourceLoader.cpp b/Source/WebCore/loader/ResourceLoader.cpp
index 7916375..5105ab5 100644
--- a/Source/WebCore/loader/ResourceLoader.cpp
+++ b/Source/WebCore/loader/ResourceLoader.cpp
@@ -49,6 +49,7 @@
#include "SecurityOrigin.h"
#include "Settings.h"
#include "SharedBuffer.h"
+#include <wtf/Ref.h>
namespace WebCore {
@@ -77,7 +78,7 @@
// deallocated and release the last reference to this object.
// We need to retain to avoid accessing the object after it
// has been deallocated and also to avoid reentering this method.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
m_frame = 0;
m_documentLoader = 0;
@@ -224,7 +225,7 @@
{
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
ASSERT(!m_reachedTerminalState);
@@ -265,7 +266,7 @@
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
m_response = r;
@@ -299,7 +300,7 @@
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
RefPtr<SharedBuffer> buffer = prpBuffer;
addDataOrBuffer(data, length, buffer.get(), dataPayloadType);
@@ -354,7 +355,7 @@
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
cleanupForError(error);
releaseResources();
@@ -395,7 +396,7 @@
// willCancel() and didFailToLoad() both call out to clients that might do
// something causing the last reference to this object to go away.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
// If we re-enter cancel() from inside willCancel(), we want to pick up from where we left
// off without re-running willCancel()
@@ -510,7 +511,7 @@
if (m_options.allowCredentials == DoNotAllowStoredCredentials)
return false;
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
return frameLoader()->client().shouldUseCredentialStorage(documentLoader(), identifier());
}
@@ -520,7 +521,7 @@
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
if (m_options.allowCredentials == AllowStoredCredentials) {
if (m_options.clientCredentialPolicy == AskClientForAllCredentials || (m_options.clientCredentialPolicy == DoNotAskClientForCrossOriginCredentials && m_frame->document()->securityOrigin()->canRequest(originalRequest().url()))) {
@@ -542,14 +543,14 @@
{
// Protect this in this delegate method since the additional processing can do
// anything including possibly derefing this; one example of this is Radar 3266216.
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
frameLoader()->notifier()->didCancelAuthenticationChallenge(this, challenge);
}
#if USE(PROTECTION_SPACE_AUTH_CALLBACK)
bool ResourceLoader::canAuthenticateAgainstProtectionSpace(const ProtectionSpace& protectionSpace)
{
- RefPtr<ResourceLoader> protector(this);
+ Ref<ResourceLoader> protect(*this);
return frameLoader()->client().canAuthenticateAgainstProtectionSpace(documentLoader(), identifier(), protectionSpace);
}
#endif
diff --git a/Source/WebCore/loader/SubresourceLoader.cpp b/Source/WebCore/loader/SubresourceLoader.cpp
index fafd6e3..e077bfa 100644
--- a/Source/WebCore/loader/SubresourceLoader.cpp
+++ b/Source/WebCore/loader/SubresourceLoader.cpp
@@ -39,6 +39,7 @@
#include "Page.h"
#include "PageActivityAssertionToken.h"
#include "ResourceBuffer.h"
+#include <wtf/Ref.h>
#include <wtf/RefCountedLeakCounter.h>
#include <wtf/StdLibExtras.h>
#include <wtf/text/CString.h>
@@ -123,7 +124,7 @@
{
// Store the previous URL because the call to ResourceLoader::willSendRequest will modify it.
KURL previousURL = request().url();
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
ASSERT(!newRequest.isNull());
if (!redirectResponse.isNull()) {
@@ -158,7 +159,7 @@
void SubresourceLoader::didSendData(unsigned long long bytesSent, unsigned long long totalBytesToBeSent)
{
ASSERT(m_state == Initialized);
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
m_resource->didSendData(bytesSent, totalBytesToBeSent);
}
@@ -169,7 +170,7 @@
// Reference the object in this method since the additional processing can do
// anything including removing the last reference to this object; one example of this is 3266216.
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
if (m_resource->resourceToRevalidate()) {
if (response.httpStatusCode() == 304) {
@@ -240,7 +241,7 @@
ASSERT(m_state == Initialized);
// Reference the object in this method since the additional processing can do
// anything including removing the last reference to this object; one example of this is 3266216.
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
RefPtr<SharedBuffer> buffer = prpBuffer;
ResourceLoader::didReceiveDataOrBuffer(data, length, buffer, encodedDataLength, dataPayloadType);
@@ -274,7 +275,7 @@
ASSERT(!m_resource->errorOccurred());
LOG(ResourceLoading, "Received '%s'.", m_resource->url().string().latin1().data());
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
CachedResourceHandle<CachedResource> protectResource(m_resource);
m_state = Finishing;
m_activityAssertion.clear();
@@ -299,7 +300,7 @@
ASSERT(!reachedTerminalState());
LOG(ResourceLoading, "Failed to load '%s'.\n", m_resource->url().string().latin1().data());
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
CachedResourceHandle<CachedResource> protectResource(m_resource);
m_state = Finishing;
m_activityAssertion.clear();
@@ -323,7 +324,7 @@
ASSERT(!reachedTerminalState());
LOG(ResourceLoading, "Cancelled load of '%s'.\n", m_resource->url().string().latin1().data());
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
m_state = Finishing;
m_activityAssertion.clear();
if (m_resource->resourceToRevalidate())
diff --git a/Source/WebCore/loader/cf/SubresourceLoaderCF.cpp b/Source/WebCore/loader/cf/SubresourceLoaderCF.cpp
index 569a2b9..29fd9f2 100644
--- a/Source/WebCore/loader/cf/SubresourceLoaderCF.cpp
+++ b/Source/WebCore/loader/cf/SubresourceLoaderCF.cpp
@@ -25,6 +25,8 @@
#include "config.h"
#include "SubresourceLoader.h"
+#include <wtf/Ref.h>
+
namespace WebCore {
#if USE(NETWORK_CFDATA_ARRAY_CALLBACK)
@@ -32,7 +34,7 @@
{
// Reference the object in this method since the additional processing can do
// anything including removing the last reference to this object; one example of this is 3266216.
- RefPtr<SubresourceLoader> protect(this);
+ Ref<SubresourceLoader> protect(*this);
ResourceLoader::didReceiveDataArray(dataArray);