| 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 | 
|---|