// Copyright (c) 2015 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #include "atom/browser/api/atom_api_web_request.h" #include #include "atom/browser/atom_browser_context.h" #include "atom/browser/net/atom_network_delegate.h" #include "atom/common/native_mate_converters/callback.h" #include "atom/common/native_mate_converters/net_converter.h" #include "atom/common/native_mate_converters/value_converter.h" #include "content/public/browser/browser_thread.h" #include "native_mate/dictionary.h" #include "native_mate/object_template_builder.h" using content::BrowserThread; namespace mate { template<> struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, extensions::URLPattern* out) { std::string pattern; if (!ConvertFromV8(isolate, val, &pattern)) return false; return out->Parse(pattern) == extensions::URLPattern::PARSE_SUCCESS; } }; } // namespace mate namespace atom { namespace api { WebRequest::WebRequest(v8::Isolate* isolate, AtomBrowserContext* browser_context) : browser_context_(browser_context) { Init(isolate); } WebRequest::~WebRequest() { } template void WebRequest::SetSimpleListener(mate::Arguments* args) { SetListener( &AtomNetworkDelegate::SetSimpleListenerInIO, type, args); } template void WebRequest::SetResponseListener(mate::Arguments* args) { SetListener( &AtomNetworkDelegate::SetResponseListenerInIO, type, args); } template void WebRequest::SetListener(Method method, Event type, mate::Arguments* args) { // { urls }. URLPatterns patterns; mate::Dictionary dict; args->GetNext(&dict) && dict.Get("urls", &patterns); // Function or null. v8::Local value; Listener listener; if (!args->GetNext(&listener) && !(args->GetNext(&value) && value->IsNull())) { args->ThrowError("Must pass null or a Function"); return; } auto delegate = browser_context_->network_delegate(); BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, base::Bind(method, base::Unretained(delegate), type, patterns, listener)); } // static mate::Handle WebRequest::Create( v8::Isolate* isolate, AtomBrowserContext* browser_context) { return mate::CreateHandle(isolate, new WebRequest(isolate, browser_context)); } // static void WebRequest::BuildPrototype(v8::Isolate* isolate, v8::Local prototype) { mate::ObjectTemplateBuilder(isolate, prototype) .SetMethod("onBeforeRequest", &WebRequest::SetResponseListener< AtomNetworkDelegate::kOnBeforeRequest>) .SetMethod("onBeforeSendHeaders", &WebRequest::SetResponseListener< AtomNetworkDelegate::kOnBeforeSendHeaders>) .SetMethod("onHeadersReceived", &WebRequest::SetResponseListener< AtomNetworkDelegate::kOnHeadersReceived>) .SetMethod("onSendHeaders", &WebRequest::SetSimpleListener< AtomNetworkDelegate::kOnSendHeaders>) .SetMethod("onBeforeRedirect", &WebRequest::SetSimpleListener< AtomNetworkDelegate::kOnBeforeRedirect>) .SetMethod("onResponseStarted", &WebRequest::SetSimpleListener< AtomNetworkDelegate::kOnResponseStarted>) .SetMethod("onCompleted", &WebRequest::SetSimpleListener< AtomNetworkDelegate::kOnCompleted>) .SetMethod("onErrorOccurred", &WebRequest::SetSimpleListener< AtomNetworkDelegate::kOnErrorOccurred>); } } // namespace api } // namespace atom