| 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 | 
|   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|   12  * GNU General Public License for more details. |   12  * GNU General Public License for more details. | 
|   13  * |   13  * | 
|   14  * You should have received a copy of the GNU General Public License |   14  * You should have received a copy of the GNU General Public License | 
|   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. |   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|   16  */ |   16  */ | 
|   17  |   17  | 
|   18 #include <vector> |   18 #include <vector> | 
|   19 #include <AdblockPlus.h> |   19 #include <AdblockPlus.h> | 
|   20  |   20  | 
|   21 #include "JsContext.h" |   21 #include "JsContext.h" | 
|   22 #include "JsError.h" |   22 #include "JsError.h" | 
|   23 #include "Utils.h" |   23 #include "Utils.h" | 
|   24  |   24  | 
|   25 AdblockPlus::JsValue::JsValue(AdblockPlus::JsEnginePtr jsEngine, |   25 AdblockPlus::JsValue::JsValue(AdblockPlus::JsEnginePtr jsEngine, | 
|   26       v8::Handle<v8::Value> value) |   26       v8::Handle<v8::Value> value) | 
|   27     : jsEngine(jsEngine), |   27     : jsEngine(jsEngine), | 
|   28       value(jsEngine->isolate, value) |   28       value(new v8::Persistent<v8::Value>(jsEngine->isolate, value)) | 
|   29 { |   29 { | 
|   30 } |   30 } | 
|   31  |   31  | 
|   32 AdblockPlus::JsValue::JsValue(AdblockPlus::JsValuePtr value) |   32 AdblockPlus::JsValue::JsValue(AdblockPlus::JsValue&& src) | 
|   33     : jsEngine(value->jsEngine), |   33     : jsEngine(src.jsEngine), | 
|   34       value(value->value) |   34       value(std::move(src.value)) | 
|   35 { |   35 { | 
|   36 } |   36 } | 
|   37  |   37  | 
|   38 AdblockPlus::JsValue::~JsValue() |   38 AdblockPlus::JsValue::~JsValue() | 
|   39 { |   39 { | 
|   40 } |   40 } | 
|   41  |   41  | 
|   42 bool AdblockPlus::JsValue::IsUndefined() const |   42 bool AdblockPlus::JsValue::IsUndefined() const | 
|   43 { |   43 { | 
|   44   const JsContext context(jsEngine); |   44   const JsContext context(jsEngine); | 
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  156   if (!IsObject()) |  156   if (!IsObject()) | 
|  157     throw new std::runtime_error("Attempting to set property on a non-object"); |  157     throw new std::runtime_error("Attempting to set property on a non-object"); | 
|  158  |  158  | 
|  159   v8::Local<v8::String> property = Utils::ToV8String(jsEngine->isolate, name); |  159   v8::Local<v8::String> property = Utils::ToV8String(jsEngine->isolate, name); | 
|  160   v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(UnwrapValue()); |  160   v8::Local<v8::Object> obj = v8::Local<v8::Object>::Cast(UnwrapValue()); | 
|  161   obj->Set(property, val); |  161   obj->Set(property, val); | 
|  162 } |  162 } | 
|  163  |  163  | 
|  164 v8::Local<v8::Value> AdblockPlus::JsValue::UnwrapValue() const |  164 v8::Local<v8::Value> AdblockPlus::JsValue::UnwrapValue() const | 
|  165 { |  165 { | 
|  166   return v8::Local<v8::Value>::New(jsEngine->isolate, value); |  166   return v8::Local<v8::Value>::New(jsEngine->isolate, *value); | 
|  167 } |  167 } | 
|  168  |  168  | 
|  169 void AdblockPlus::JsValue::SetProperty(const std::string& name, const std::strin
     g& val) |  169 void AdblockPlus::JsValue::SetProperty(const std::string& name, const std::strin
     g& val) | 
|  170 { |  170 { | 
|  171   const JsContext context(jsEngine); |  171   const JsContext context(jsEngine); | 
|  172   SetProperty(name, Utils::ToV8String(jsEngine->isolate, val)); |  172   SetProperty(name, Utils::ToV8String(jsEngine->isolate, val)); | 
|  173 } |  173 } | 
|  174  |  174  | 
|  175 void AdblockPlus::JsValue::SetProperty(const std::string& name, int64_t val) |  175 void AdblockPlus::JsValue::SetProperty(const std::string& name, int64_t val) | 
|  176 { |  176 { | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  201 } |  201 } | 
|  202  |  202  | 
|  203 AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call(const JsValueList& params, Js
     ValuePtr thisPtr) const |  203 AdblockPlus::JsValuePtr AdblockPlus::JsValue::Call(const JsValueList& params, Js
     ValuePtr thisPtr) const | 
|  204 { |  204 { | 
|  205   if (!IsFunction()) |  205   if (!IsFunction()) | 
|  206     throw new std::runtime_error("Attempting to call a non-function"); |  206     throw new std::runtime_error("Attempting to call a non-function"); | 
|  207  |  207  | 
|  208   const JsContext context(jsEngine); |  208   const JsContext context(jsEngine); | 
|  209   if (!thisPtr) |  209   if (!thisPtr) | 
|  210   { |  210   { | 
|  211     v8::Local<v8::Context> localContext = v8::Local<v8::Context>::New(jsEngine->
     isolate, jsEngine->context); |  211     v8::Local<v8::Context> localContext = v8::Local<v8::Context>::New( | 
 |  212       jsEngine->isolate, *jsEngine->context); | 
|  212     thisPtr = JsValuePtr(new JsValue(jsEngine, localContext->Global())); |  213     thisPtr = JsValuePtr(new JsValue(jsEngine, localContext->Global())); | 
|  213   } |  214   } | 
|  214   if (!thisPtr->IsObject()) |  215   if (!thisPtr->IsObject()) | 
|  215     throw new std::runtime_error("`this` pointer has to be an object"); |  216     throw new std::runtime_error("`this` pointer has to be an object"); | 
|  216   v8::Local<v8::Object> thisObj = v8::Local<v8::Object>::Cast(thisPtr->UnwrapVal
     ue()); |  217   v8::Local<v8::Object> thisObj = v8::Local<v8::Object>::Cast(thisPtr->UnwrapVal
     ue()); | 
|  217  |  218  | 
|  218   std::vector<v8::Handle<v8::Value>> argv; |  219   std::vector<v8::Handle<v8::Value>> argv; | 
|  219   for (JsValueList::const_iterator it = params.begin(); it != params.end(); ++it
     ) |  220   for (JsValueList::const_iterator it = params.begin(); it != params.end(); ++it
     ) | 
|  220     argv.push_back((*it)->UnwrapValue()); |  221     argv.push_back((*it)->UnwrapValue()); | 
|  221  |  222  | 
|  222   const v8::TryCatch tryCatch; |  223   const v8::TryCatch tryCatch; | 
|  223   v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(UnwrapValue()); |  224   v8::Local<v8::Function> func = v8::Local<v8::Function>::Cast(UnwrapValue()); | 
|  224   v8::Local<v8::Value> result = func->Call(thisObj, argv.size(), |  225   v8::Local<v8::Value> result = func->Call(thisObj, argv.size(), | 
|  225       argv.size() ? &argv.front() : 0); |  226       argv.size() ? &argv.front() : 0); | 
|  226  |  227  | 
|  227   if (tryCatch.HasCaught()) |  228   if (tryCatch.HasCaught()) | 
|  228     throw JsError(tryCatch.Exception(), tryCatch.Message()); |  229     throw JsError(tryCatch.Exception(), tryCatch.Message()); | 
|  229  |  230  | 
|  230   return JsValuePtr(new JsValue(jsEngine, result)); |  231   return JsValuePtr(new JsValue(jsEngine, result)); | 
|  231 } |  232 } | 
| OLD | NEW |