1 // Copyright (c) 2015 GitHub, Inc.
2 // Use of this source code is governed by the MIT license that can be
3 // found in the LICENSE file.
5 #include "atom/browser/api/atom_api_web_request.h"
7 #include "atom/browser/atom_browser_context.h"
8 #include "atom/browser/net/atom_network_delegate.h"
9 #include "atom/common/native_mate_converters/callback.h"
10 #include "atom/common/native_mate_converters/net_converter.h"
11 #include "atom/common/native_mate_converters/value_converter.h"
12 #include "content/public/browser/browser_thread.h"
13 #include "native_mate/dictionary.h"
14 #include "native_mate/object_template_builder.h"
16 using content::BrowserThread;
22 WebRequest::WebRequest(AtomBrowserContext* browser_context)
23 : browser_context_(browser_context) {
26 WebRequest::~WebRequest() {
29 template<AtomNetworkDelegate::EventTypes type>
30 void WebRequest::SetListener(mate::Arguments* args) {
31 scoped_ptr<base::DictionaryValue> filter(new base::DictionaryValue);
32 args->GetNext(filter.get());
34 v8::Local<v8::Value> value;
35 AtomNetworkDelegate::Listener callback;
36 if (!args->GetNext(&callback) &&
37 !(args->GetNext(&value) && value->IsNull())) {
38 args->ThrowError("Must pass null or a Function");
42 auto delegate = browser_context_->network_delegate();
43 BrowserThread::PostTask(BrowserThread::IO, FROM_HERE,
44 base::Bind(&AtomNetworkDelegate::SetListenerInIO,
45 base::Unretained(delegate),
46 type, base::Passed(&filter), callback));
50 mate::Handle<WebRequest> WebRequest::Create(
52 AtomBrowserContext* browser_context) {
53 return mate::CreateHandle(isolate, new WebRequest(browser_context));
57 void WebRequest::BuildPrototype(v8::Isolate* isolate,
58 v8::Local<v8::ObjectTemplate> prototype) {
59 mate::ObjectTemplateBuilder(isolate, prototype)
60 .SetMethod("onBeforeRequest",
61 &WebRequest::SetListener<
62 AtomNetworkDelegate::kOnBeforeRequest>)
63 .SetMethod("onBeforeSendHeaders",
64 &WebRequest::SetListener<
65 AtomNetworkDelegate::kOnBeforeSendHeaders>)
66 .SetMethod("onSendHeaders",
67 &WebRequest::SetListener<
68 AtomNetworkDelegate::kOnSendHeaders>)
69 .SetMethod("onHeadersReceived",
70 &WebRequest::SetListener<
71 AtomNetworkDelegate::kOnHeadersReceived>)
72 .SetMethod("onBeforeRedirect",
73 &WebRequest::SetListener<
74 AtomNetworkDelegate::kOnBeforeRedirect>)
75 .SetMethod("onResponseStarted",
76 &WebRequest::SetListener<
77 AtomNetworkDelegate::kOnResponseStarted>)
78 .SetMethod("onCompleted",
79 &WebRequest::SetListener<
80 AtomNetworkDelegate::kOnCompleted>)
81 .SetMethod("onErrorOccurred",
82 &WebRequest::SetListener<
83 AtomNetworkDelegate::kOnErrorOccurred>);