| OLD | NEW |
| 1 /* | 1 /* |
| 2 * This file is part of Adblock Plus <https://adblockplus.org/>, | 2 * This file is part of Adblock Plus <https://adblockplus.org/>, |
| 3 * Copyright (C) 2006-2016 Eyeo GmbH | 3 * Copyright (C) 2006-2016 Eyeo GmbH |
| 4 * | 4 * |
| 5 * Adblock Plus is free software: you can redistribute it and/or modify | 5 * Adblock Plus is free software: you can redistribute it and/or modify |
| 6 * it under the terms of the GNU General Public License version 3 as | 6 * it under the terms of the GNU General Public License version 3 as |
| 7 * published by the Free Software Foundation. | 7 * published by the Free Software Foundation. |
| 8 * | 8 * |
| 9 * Adblock Plus is distributed in the hope that it will be useful, | 9 * Adblock Plus is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "JsEngineTransition.h" | 23 #include "JsEngineTransition.h" |
| 24 #include "Utils.h" | 24 #include "Utils.h" |
| 25 #include "Scheduler.h" | 25 #include "Scheduler.h" |
| 26 #include "V8Upgrade.h" | 26 #include "V8Upgrade.h" |
| 27 #include "Value.h" | 27 #include "Value.h" |
| 28 #include "WebRequestJsObject.h" | 28 #include "WebRequestJsObject.h" |
| 29 | 29 |
| 30 namespace | 30 namespace |
| 31 { | 31 { |
| 32 class WebRequestTask | 32 class WebRequestTask |
| 33 : public TaskFunctionInterface |
| 33 { | 34 { |
| 34 public: | 35 public: |
| 35 WebRequestTask( | 36 WebRequestTask( |
| 36 JsEngineInternal *engine, | 37 JsEngineInternal *engine, |
| 37 std::string url, | 38 std::string url, |
| 38 AdblockPlus::HeaderList headers, | 39 AdblockPlus::HeaderList headers, |
| 39 V8PersistentNG<v8::Function> callbackFunction | 40 V8PersistentNG<v8::Function> callbackFunction |
| 40 ) | 41 ) |
| 41 : jsEngine(engine->shared_from_this()), | 42 : engine(engine), |
| 42 url(url), headers(headers), callbackFunction(callbackFunction) | 43 url(url), headers(headers), callbackFunction(callbackFunction) |
| 43 {} | 44 {} |
| 44 | 45 |
| 45 void operator()() | 46 void operator()() override |
| 46 { | 47 { |
| 47 auto engine = ToInternal(jsEngine); // temporary statement while task keep
s its own engine alive | |
| 48 /* | 48 /* |
| 49 * Synchronous HTTP GET request is arbitrary-duration and not interruptibl
e | 49 * Synchronous HTTP GET request is arbitrary-duration and not interruptibl
e |
| 50 */ | 50 */ |
| 51 AdblockPlus::ServerResponse result = engine->GetWebRequest()->GET(url, hea
ders); | 51 AdblockPlus::ServerResponse result = engine->GetWebRequest()->GET(url, hea
ders); |
| 52 /* | 52 /* |
| 53 * Instantiate our scope after the long-lived operation above. | 53 * Instantiate our scope after the long-lived operation above. |
| 54 */ | 54 */ |
| 55 V8ExecutionScope sentry(engine); | 55 V8ExecutionScope sentry(engine); |
| 56 auto isolate = engine->GetIsolate(); | 56 auto isolate = engine->GetIsolate(); |
| 57 | 57 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 70 // Call the callback | 70 // Call the callback |
| 71 auto args = AllocatedArray<v8::Local<v8::Value>>(1); | 71 auto args = AllocatedArray<v8::Local<v8::Value>>(1); |
| 72 args[0] = response; | 72 args[0] = response; |
| 73 engine->ApplyFunction(callbackFunction.Get(isolate), std::move(args)); | 73 engine->ApplyFunction(callbackFunction.Get(isolate), std::move(args)); |
| 74 } | 74 } |
| 75 | 75 |
| 76 private: | 76 private: |
| 77 /** | 77 /** |
| 78 * Engine pointer keeps engine in existence across thread boundary | 78 * Engine pointer keeps engine in existence across thread boundary |
| 79 */ | 79 */ |
| 80 AdblockPlus::JsEnginePtr jsEngine; | 80 JsEngineInternal *engine; |
| 81 std::string url; | 81 std::string url; |
| 82 AdblockPlus::HeaderList headers; | 82 AdblockPlus::HeaderList headers; |
| 83 V8PersistentNG<v8::Function> callbackFunction; | 83 V8PersistentNG<v8::Function> callbackFunction; |
| 84 }; | 84 }; |
| 85 } | 85 } |
| 86 | 86 |
| 87 /** | 87 /** |
| 88 * Implementing function for JS "<global>._webrequest.GET()". | 88 * Implementing function for JS "<global>._webrequest.GET()". |
| 89 * | 89 * |
| 90 * Used in "compat.js" to implement "XMLHttpRequest.send()" for GET requests. | 90 * Used in "compat.js" to implement "XMLHttpRequest.send()" for GET requests. |
| 91 * | 91 * |
| 92 * \par JavaScript arguments | 92 * \par JavaScript arguments |
| 93 * 1. url. | 93 * 1. url. |
| 94 * The URL of the resource to which the request will be sent. | 94 * The URL of the resource to which the request will be sent. |
| 95 * 2. requestHeaders. | 95 * 2. requestHeaders. |
| 96 * An object whose properties represent HTTP GET request headers. | 96 * An object whose properties represent HTTP GET request headers. |
| 97 * These properties are added to the GET request. | 97 * These properties are added to the GET request. |
| 98 * 3. readyCallback. | 98 * 3. readyCallback. |
| 99 * A function to be executed when the GET response is ready. | 99 * A function to be executed when the GET response is ready. |
| 100 * The argument of this call is an object encoding the GET response. | 100 * The argument of this call is an object encoding the GET response. |
| 101 */ | 101 */ |
| 102 v8::Handle<v8::Value> GETCallback(const v8::Arguments& arguments) | 102 v8::Handle<v8::Value> GETCallback(const v8::Arguments& arguments) |
| 103 { | 103 { |
| 104 auto engine = JsEngineInternal::ExtractEngine(arguments); | 104 auto engine = JsEngineInternal::ExtractEngine(arguments); |
| 105 V8ExecutionScope sentry(engine); | 105 V8ExecutionScope sentry(engine); |
| 106 | 106 |
| 107 /* | 107 /* |
| 108 * Factory block for WebRequest tasks. | 108 * Factory block for WebRequest tasks. |
| 109 */ | 109 */ |
| 110 std::shared_ptr<WebRequestTask> task; | |
| 111 try | 110 try |
| 112 { | 111 { |
| 113 std::string url; | 112 std::string url; |
| 114 if (arguments.Length() != 3u) | 113 if (arguments.Length() != 3u) |
| 115 { | 114 { |
| 116 throw std::runtime_error("GET requires exactly 3 arguments"); | 115 throw std::runtime_error("GET requires exactly 3 arguments"); |
| 117 } | 116 } |
| 118 bool b; | 117 bool b; |
| 119 std::tie(b, url) = ConvertString(arguments[0]); | 118 std::tie(b, url) = ConvertString(arguments[0]); |
| 120 if (!b) | 119 if (!b) |
| (...skipping 24 matching lines...) Expand all Loading... |
| 145 { | 144 { |
| 146 headers.push_back(std::make_pair(propertyName, propertyValue)); | 145 headers.push_back(std::make_pair(propertyName, propertyValue)); |
| 147 } | 146 } |
| 148 } | 147 } |
| 149 | 148 |
| 150 auto callbackArg = arguments[2]; | 149 auto callbackArg = arguments[2]; |
| 151 if (!callbackArg->IsFunction()) | 150 if (!callbackArg->IsFunction()) |
| 152 { | 151 { |
| 153 throw std::runtime_error("Third argument to GET must be a function"); | 152 throw std::runtime_error("Third argument to GET must be a function"); |
| 154 } | 153 } |
| 155 task = std::make_shared<WebRequestTask>(engine, url, headers, | 154 WebRequestTask task(engine, url, headers, |
| 156 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>
::Cast(arguments[2]))); | 155 V8PersistentNG<v8::Function>(engine->GetIsolate(), v8::Local<v8::Function>
::Cast(arguments[2]))); |
| 156 /* |
| 157 * Run the task |
| 158 */ |
| 159 engine->ScheduleTask(std::move(task), ImmediateSingleUseThread); |
| 160 return v8::Undefined(); |
| 157 } | 161 } |
| 158 catch (const std::exception& e) | 162 catch (const std::exception& e) |
| 159 { | 163 { |
| 160 using AdblockPlus::Utils::ToV8String; | 164 using AdblockPlus::Utils::ToV8String; |
| 161 v8::Isolate* isolate = arguments.GetIsolate(); | 165 v8::Isolate* isolate = arguments.GetIsolate(); |
| 162 return v8::ThrowException(ToV8String(isolate, e.what())); | 166 return v8::ThrowException(ToV8String(isolate, e.what())); |
| 163 } | 167 } |
| 164 /* | |
| 165 * Run the task | |
| 166 */ | |
| 167 engine->Schedule(AdblockPlus::MakeHeapFunction(task), AdblockPlus::ImmediateSi
ngleUseThread); | |
| 168 return v8::Undefined(); | |
| 169 } | 168 } |
| OLD | NEW |