Cancel callback when URLRequest is destroyed

This commit is contained in:
Cheng Zhao 2015-12-22 22:08:33 +08:00
parent e14d472934
commit c8c4381085
2 changed files with 27 additions and 10 deletions

View file

@ -190,6 +190,10 @@ template<typename T>
void OnListenerResultInIO(const net::CompletionCallback& callback, void OnListenerResultInIO(const net::CompletionCallback& callback,
T out, T out,
scoped_ptr<base::DictionaryValue> response) { scoped_ptr<base::DictionaryValue> response) {
// The request has been destroyed.
if (callback.is_null())
return;
ReadFromResponseObject(*response.get(), out); ReadFromResponseObject(*response.get(), out);
bool cancel = false; bool cancel = false;
@ -312,10 +316,7 @@ void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
if (request->status().status() == net::URLRequestStatus::FAILED || if (request->status().status() == net::URLRequestStatus::FAILED ||
request->status().status() == net::URLRequestStatus::CANCELED) { request->status().status() == net::URLRequestStatus::CANCELED) {
// Error event. // Error event.
if (ContainsKey(simple_listeners_, kOnErrorOccurred)) OnErrorOccurred(request, started);
OnErrorOccurred(request);
else
brightray::NetworkDelegate::OnCompleted(request, started);
return; return;
} else if (request->response_headers() && } else if (request->response_headers() &&
net::HttpResponseHeaders::IsRedirectResponseCode( net::HttpResponseHeaders::IsRedirectResponseCode(
@ -334,7 +335,17 @@ void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
request->was_cached()); request->was_cached());
} }
void AtomNetworkDelegate::OnErrorOccurred(net::URLRequest* request) { void AtomNetworkDelegate::OnURLRequestDestroyed(net::URLRequest* request) {
callbacks_.erase(request->identifier());
}
void AtomNetworkDelegate::OnErrorOccurred(
net::URLRequest* request, bool started) {
if (!ContainsKey(simple_listeners_, kOnErrorOccurred)) {
brightray::NetworkDelegate::OnCompleted(request, started);
return;
}
HandleSimpleEvent(kOnErrorOccurred, request, request->was_cached(), HandleSimpleEvent(kOnErrorOccurred, request, request->was_cached(),
request->status()); request->status());
} }
@ -353,8 +364,12 @@ int AtomNetworkDelegate::HandleResponseEvent(
scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue); scoped_ptr<base::DictionaryValue> details(new base::DictionaryValue);
FillDetailsObject(details.get(), request, args...); FillDetailsObject(details.get(), request, args...);
// The |request| could be destroyed before the |callback| is called.
callbacks_[request->identifier()].Reset(callback);
const auto& cancelable = callbacks_[request->identifier()].callback();
ResponseCallback response = ResponseCallback response =
base::Bind(OnListenerResultInUI<Out>, callback, out); base::Bind(OnListenerResultInUI<Out>, cancelable, out);
BrowserThread::PostTask( BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE, BrowserThread::UI, FROM_HERE,
base::Bind(RunResponseListener, info.listener, base::Passed(&details), base::Bind(RunResponseListener, info.listener, base::Passed(&details),

View file

@ -9,7 +9,7 @@
#include <set> #include <set>
#include "brightray/browser/network_delegate.h" #include "brightray/browser/network_delegate.h"
#include "base/callback.h" #include "base/cancelable_callback.h"
#include "base/values.h" #include "base/values.h"
#include "extensions/common/url_pattern.h" #include "extensions/common/url_pattern.h"
#include "net/base/net_errors.h" #include "net/base/net_errors.h"
@ -85,10 +85,11 @@ class AtomNetworkDelegate : public brightray::NetworkDelegate {
const GURL& new_location) override; const GURL& new_location) override;
void OnResponseStarted(net::URLRequest* request) override; void OnResponseStarted(net::URLRequest* request) override;
void OnCompleted(net::URLRequest* request, bool started) override; void OnCompleted(net::URLRequest* request, bool started) override;
void OnURLRequestDestroyed(net::URLRequest* request) override;
void OnErrorOccurred(net::URLRequest* request);
private: private:
void OnErrorOccurred(net::URLRequest* request, bool started);
template<typename...Args> template<typename...Args>
void HandleSimpleEvent(SimpleEvent type, void HandleSimpleEvent(SimpleEvent type,
net::URLRequest* request, net::URLRequest* request,
@ -101,7 +102,8 @@ class AtomNetworkDelegate : public brightray::NetworkDelegate {
Args... args); Args... args);
std::map<SimpleEvent, SimpleListenerInfo> simple_listeners_; std::map<SimpleEvent, SimpleListenerInfo> simple_listeners_;
std::map<ResponseEvent, ResponseListenerInfo> response_listeners_;; std::map<ResponseEvent, ResponseListenerInfo> response_listeners_;
std::map<uint64_t, base::CancelableCallback<void(int)>> callbacks_;
DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate); DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate);
}; };