Cancel callback when URLRequest is destroyed
This commit is contained in:
parent
e14d472934
commit
c8c4381085
2 changed files with 27 additions and 10 deletions
|
@ -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),
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
Loading…
Add table
Reference in a new issue