Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1469)

Unified Diff: Source/core/xml/XMLHttpRequest.cpp

Issue 23005006: Fix XMLHttpRequest leak document when send() is called multiple times. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: try to sync unsetPendingActivity where possible Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/xml/XMLHttpRequest.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/xml/XMLHttpRequest.cpp
diff --git a/Source/core/xml/XMLHttpRequest.cpp b/Source/core/xml/XMLHttpRequest.cpp
index 9dc97ee7509cd4ae2a148c472ff68bf20c0d3840..e38f50ef7dae361e9ae342b1b463411d523ea649 100644
--- a/Source/core/xml/XMLHttpRequest.cpp
+++ b/Source/core/xml/XMLHttpRequest.cpp
@@ -445,7 +445,7 @@ void XMLHttpRequest::open(const String& method, const KURL& url, ExceptionState&
void XMLHttpRequest::open(const String& method, const KURL& url, bool async, ExceptionState& es)
{
- internalAbort();
+ internalAbort(false);
State previousState = m_state;
m_state = UNSENT;
m_error = false;
@@ -756,6 +756,7 @@ void XMLHttpRequest::createRequest(ExceptionState& es)
// Neither this object nor the JavaScript wrapper should be deleted while
// a request is in progress because we need to keep the listeners alive,
// and they are referenced by the JavaScript wrapper.
+ ASSERT(!hasPendingActivity());
haraken 2013/08/14 02:35:07 Would you add a comment on this line?
kouhei (in TOK) 2013/08/14 03:19:30 Done.
setPendingActivity(this);
}
} else {
@@ -778,7 +779,7 @@ void XMLHttpRequest::abort()
bool sendFlag = m_loader;
- internalAbort();
+ internalAbort(false);
clearResponseBuffers();
@@ -801,7 +802,7 @@ void XMLHttpRequest::abort()
}
}
-void XMLHttpRequest::internalAbort()
+void XMLHttpRequest::internalAbort(bool dropProtectionAsync)
haraken 2013/08/14 02:35:07 Instead of bool, could you use a more descriptive
kouhei (in TOK) 2013/08/14 03:19:30 Done.
{
bool hadLoader = m_loader;
@@ -819,8 +820,12 @@ void XMLHttpRequest::internalAbort()
InspectorInstrumentation::didFailXHRLoading(scriptExecutionContext(), this);
- if (hadLoader)
- dropProtectionSoon();
+ if (hadLoader) {
+ if (dropProtectionAsync)
+ dropProtectionSoon();
+ else
+ dropProtection();
+ }
}
void XMLHttpRequest::clearResponse()
@@ -864,7 +869,7 @@ void XMLHttpRequest::networkError()
m_upload->dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::create(eventNames().errorEvent));
}
m_progressEventThrottle.dispatchEventAndLoadEnd(XMLHttpRequestProgressEvent::create(eventNames().errorEvent));
- internalAbort();
+ internalAbort(false);
}
void XMLHttpRequest::abortError()
@@ -1181,7 +1186,7 @@ void XMLHttpRequest::didTimeout()
{
// internalAbort() calls dropProtection(), which may release the last reference.
RefPtr<XMLHttpRequest> protect(this);
- internalAbort();
+ internalAbort(false);
clearResponse();
clearRequest();
@@ -1222,7 +1227,7 @@ void XMLHttpRequest::resume()
void XMLHttpRequest::stop()
{
- internalAbort();
+ internalAbort(true);
}
void XMLHttpRequest::contextDestroyed()
« no previous file with comments | « Source/core/xml/XMLHttpRequest.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698