Cancel callback in OnComplete event

This commit is contained in:
Cheng Zhao 2015-12-22 23:46:25 +08:00
parent c8c4381085
commit 3e1edfc9d0
2 changed files with 40 additions and 31 deletions

View file

@ -185,32 +185,6 @@ void ReadFromResponseObject(const base::DictionaryValue& response,
} }
} }
// Deal with the results of Listener.
template<typename T>
void OnListenerResultInIO(const net::CompletionCallback& callback,
T out,
scoped_ptr<base::DictionaryValue> response) {
// The request has been destroyed.
if (callback.is_null())
return;
ReadFromResponseObject(*response.get(), out);
bool cancel = false;
response->GetBoolean("cancel", &cancel);
callback.Run(cancel ? net::ERR_BLOCKED_BY_CLIENT : net::OK);
}
template<typename T>
void OnListenerResultInUI(const net::CompletionCallback& callback,
T out,
const base::DictionaryValue& response) {
scoped_ptr<base::DictionaryValue> copy = response.CreateDeepCopy();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(OnListenerResultInIO<T>, callback, out, base::Passed(&copy)));
}
} // namespace } // namespace
AtomNetworkDelegate::AtomNetworkDelegate() { AtomNetworkDelegate::AtomNetworkDelegate() {
@ -313,6 +287,9 @@ void AtomNetworkDelegate::OnResponseStarted(net::URLRequest* request) {
} }
void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) { void AtomNetworkDelegate::OnCompleted(net::URLRequest* request, bool started) {
// OnCompleted may happen before other events.
callbacks_.erase(request->identifier());
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.
@ -365,11 +342,11 @@ int AtomNetworkDelegate::HandleResponseEvent(
FillDetailsObject(details.get(), request, args...); FillDetailsObject(details.get(), request, args...);
// The |request| could be destroyed before the |callback| is called. // The |request| could be destroyed before the |callback| is called.
callbacks_[request->identifier()].Reset(callback); callbacks_[request->identifier()] = callback;
const auto& cancelable = callbacks_[request->identifier()].callback();
ResponseCallback response = ResponseCallback response =
base::Bind(OnListenerResultInUI<Out>, cancelable, out); base::Bind(&AtomNetworkDelegate::OnListenerResultInUI<Out>,
base::Unretained(this), request->identifier(), 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),
@ -392,4 +369,28 @@ void AtomNetworkDelegate::HandleSimpleEvent(
base::Bind(RunSimpleListener, info.listener, base::Passed(&details))); base::Bind(RunSimpleListener, info.listener, base::Passed(&details)));
} }
template<typename T>
void AtomNetworkDelegate::OnListenerResultInIO(
uint64_t id, T out, scoped_ptr<base::DictionaryValue> response) {
// The request has been destroyed.
if (!ContainsKey(callbacks_, id))
return;
ReadFromResponseObject(*response.get(), out);
bool cancel = false;
response->GetBoolean("cancel", &cancel);
callbacks_[id].Run(cancel ? net::ERR_BLOCKED_BY_CLIENT : net::OK);
}
template<typename T>
void AtomNetworkDelegate::OnListenerResultInUI(
uint64_t id, T out, const base::DictionaryValue& response) {
scoped_ptr<base::DictionaryValue> copy = response.CreateDeepCopy();
BrowserThread::PostTask(
BrowserThread::IO, FROM_HERE,
base::Bind(&AtomNetworkDelegate::OnListenerResultInIO<T>,
base::Unretained(this), id, out, base::Passed(&copy)));
}
} // namespace atom } // namespace atom

View file

@ -9,7 +9,7 @@
#include <set> #include <set>
#include "brightray/browser/network_delegate.h" #include "brightray/browser/network_delegate.h"
#include "base/cancelable_callback.h" #include "base/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"
@ -101,9 +101,17 @@ class AtomNetworkDelegate : public brightray::NetworkDelegate {
Out out, Out out,
Args... args); Args... args);
// Deal with the results of Listener.
template<typename T>
void OnListenerResultInIO(
uint64_t id, T out, scoped_ptr<base::DictionaryValue> response);
template<typename T>
void OnListenerResultInUI(
uint64_t id, T out, const base::DictionaryValue& response);
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_; std::map<uint64_t, net::CompletionCallback> callbacks_;
DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate); DISALLOW_COPY_AND_ASSIGN(AtomNetworkDelegate);
}; };