44
55#include " atom/browser/api/atom_api_web_request.h"
66
7+ #include < string>
8+
79#include " atom/browser/atom_browser_context.h"
810#include " atom/browser/net/atom_network_delegate.h"
911#include " atom/common/native_mate_converters/callback.h"
1517
1618using content::BrowserThread;
1719
20+ namespace mate {
21+
22+ template <>
23+ struct Converter <extensions::URLPattern> {
24+ static bool FromV8 (v8::Isolate* isolate, v8::Local<v8::Value> val,
25+ extensions::URLPattern* out) {
26+ std::string pattern;
27+ if (!ConvertFromV8 (isolate, val, &pattern))
28+ return false ;
29+ return out->Parse (pattern) == extensions::URLPattern::PARSE_SUCCESS;
30+ }
31+ };
32+
33+ } // namespace mate
34+
1835namespace atom {
1936
2037namespace api {
@@ -26,23 +43,38 @@ WebRequest::WebRequest(AtomBrowserContext* browser_context)
2643WebRequest::~WebRequest () {
2744}
2845
29- template <AtomNetworkDelegate::EventTypes type>
30- void WebRequest::SetListener (mate::Arguments* args) {
31- DCHECK_CURRENTLY_ON (BrowserThread::UI);
46+ template <AtomNetworkDelegate::SimpleEvent type>
47+ void WebRequest::SetSimpleListener (mate::Arguments* args) {
48+ SetListener<AtomNetworkDelegate::SimpleListener>(
49+ &AtomNetworkDelegate::SetSimpleListenerInIO, type, args);
50+ }
3251
33- scoped_ptr<base::DictionaryValue> filter (new base::DictionaryValue ());
34- args->GetNext (filter.get ());
35- AtomNetworkDelegate::Listener callback;
36- if (!args->GetNext (&callback)) {
37- args->ThrowError (" Must pass null or a function" );
52+ template <AtomNetworkDelegate::ResponseEvent type>
53+ void WebRequest::SetResponseListener (mate::Arguments* args) {
54+ SetListener<AtomNetworkDelegate::ResponseListener>(
55+ &AtomNetworkDelegate::SetResponseListenerInIO, type, args);
56+ }
57+
58+ template <typename Listener, typename Method, typename Event>
59+ void WebRequest::SetListener (Method method, Event type, mate::Arguments* args) {
60+ // { urls }.
61+ URLPatterns patterns;
62+ mate::Dictionary dict;
63+ args->GetNext (&dict) && dict.Get (" urls" , &patterns);
64+
65+ // Function or null.
66+ v8::Local<v8::Value> value;
67+ Listener listener;
68+ if (!args->GetNext (&listener) &&
69+ !(args->GetNext (&value) && value->IsNull ())) {
70+ args->ThrowError (" Must pass null or a Function" );
3871 return ;
3972 }
4073
4174 auto delegate = browser_context_->network_delegate ();
4275 BrowserThread::PostTask (BrowserThread::IO, FROM_HERE,
43- base::Bind (&AtomNetworkDelegate::SetListenerInIO,
44- base::Unretained (delegate),
45- type, base::Passed (&filter), callback));
76+ base::Bind (method, base::Unretained (delegate), type,
77+ patterns, listener));
4678}
4779
4880// static
@@ -57,28 +89,28 @@ void WebRequest::BuildPrototype(v8::Isolate* isolate,
5789 v8::Local<v8::ObjectTemplate> prototype) {
5890 mate::ObjectTemplateBuilder (isolate, prototype)
5991 .SetMethod (" onBeforeRequest" ,
60- &WebRequest::SetListener <
92+ &WebRequest::SetResponseListener <
6193 AtomNetworkDelegate::kOnBeforeRequest >)
6294 .SetMethod (" onBeforeSendHeaders" ,
63- &WebRequest::SetListener <
95+ &WebRequest::SetResponseListener <
6496 AtomNetworkDelegate::kOnBeforeSendHeaders >)
65- .SetMethod (" onSendHeaders" ,
66- &WebRequest::SetListener<
67- AtomNetworkDelegate::kOnSendHeaders >)
6897 .SetMethod (" onHeadersReceived" ,
69- &WebRequest::SetListener <
98+ &WebRequest::SetResponseListener <
7099 AtomNetworkDelegate::kOnHeadersReceived >)
100+ .SetMethod (" onSendHeaders" ,
101+ &WebRequest::SetSimpleListener<
102+ AtomNetworkDelegate::kOnSendHeaders >)
71103 .SetMethod (" onBeforeRedirect" ,
72- &WebRequest::SetListener <
104+ &WebRequest::SetSimpleListener <
73105 AtomNetworkDelegate::kOnBeforeRedirect >)
74106 .SetMethod (" onResponseStarted" ,
75- &WebRequest::SetListener <
107+ &WebRequest::SetSimpleListener <
76108 AtomNetworkDelegate::kOnResponseStarted >)
77109 .SetMethod (" onCompleted" ,
78- &WebRequest::SetListener <
110+ &WebRequest::SetSimpleListener <
79111 AtomNetworkDelegate::kOnCompleted >)
80112 .SetMethod (" onErrorOccurred" ,
81- &WebRequest::SetListener <
113+ &WebRequest::SetSimpleListener <
82114 AtomNetworkDelegate::kOnErrorOccurred >);
83115}
84116
0 commit comments