| 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-2017 eyeo GmbH |    3  * Copyright (C) 2006-2017 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 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  105     timerTaskIterator->arguments.emplace_back(new v8::Persistent<v8::Value>(jsEn
     gine->GetIsolate(), arguments[i])); |  105     timerTaskIterator->arguments.emplace_back(new v8::Persistent<v8::Value>(jsEn
     gine->GetIsolate(), arguments[i])); | 
|  106  |  106  | 
|  107   std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |  107   std::weak_ptr<JsEngine> weakJsEngine = jsEngine; | 
|  108   jsEngine->timer->SetTimer(std::chrono::milliseconds(arguments[1]->IntegerValue
     ()), [weakJsEngine, timerTaskIterator] |  108   jsEngine->timer->SetTimer(std::chrono::milliseconds(arguments[1]->IntegerValue
     ()), [weakJsEngine, timerTaskIterator] | 
|  109   { |  109   { | 
|  110     if (auto jsEngine = weakJsEngine.lock()) |  110     if (auto jsEngine = weakJsEngine.lock()) | 
|  111       jsEngine->CallTimerTask(timerTaskIterator); |  111       jsEngine->CallTimerTask(timerTaskIterator); | 
|  112   }); |  112   }); | 
|  113 } |  113 } | 
|  114  |  114  | 
|  115 void JsEngine::CallTimerTask(TimerTasks::const_iterator timerTaskIterator) |  115 void JsEngine::CallTimerTask(const TimerTasks::const_iterator& timerTaskIterator
     ) | 
|  116 { |  116 { | 
|  117   const JsContext context(shared_from_this()); |  117   const JsContext context(shared_from_this()); | 
|  118   JsValue callback(shared_from_this(), v8::Local<v8::Value>::New(GetIsolate(), *
     timerTaskIterator->arguments[0])); |  118   JsValue callback(shared_from_this(), v8::Local<v8::Value>::New(GetIsolate(), *
     timerTaskIterator->arguments[0])); | 
|  119   JsConstValueList callbackArgs; |  119   JsConstValueList callbackArgs; | 
|  120   for (int i = 2; i < timerTaskIterator->arguments.size(); i++) |  120   for (int i = 2; i < timerTaskIterator->arguments.size(); i++) | 
|  121     callbackArgs.emplace_back(new JsValue(shared_from_this(), |  121     callbackArgs.emplace_back(new JsValue(shared_from_this(), | 
|  122     v8::Local<v8::Value>::New(GetIsolate(), *timerTaskIterator->arguments[i]))); |  122     v8::Local<v8::Value>::New(GetIsolate(), *timerTaskIterator->arguments[i]))); | 
|  123   callback.Call(callbackArgs); |  123   callback.Call(callbackArgs); | 
|  124   timerTasks.erase(timerTaskIterator); |  124   timerTasks.erase(timerTaskIterator); | 
|  125 } |  125 } | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  138   const ScopedV8IsolatePtr& isolate) |  138   const ScopedV8IsolatePtr& isolate) | 
|  139 { |  139 { | 
|  140   JsEnginePtr result(new JsEngine(isolate, std::move(timer))); |  140   JsEnginePtr result(new JsEngine(isolate, std::move(timer))); | 
|  141  |  141  | 
|  142   const v8::Locker locker(result->GetIsolate()); |  142   const v8::Locker locker(result->GetIsolate()); | 
|  143   const v8::Isolate::Scope isolateScope(result->GetIsolate()); |  143   const v8::Isolate::Scope isolateScope(result->GetIsolate()); | 
|  144   const v8::HandleScope handleScope(result->GetIsolate()); |  144   const v8::HandleScope handleScope(result->GetIsolate()); | 
|  145  |  145  | 
|  146   result->context.reset(new v8::Persistent<v8::Context>(result->GetIsolate(), |  146   result->context.reset(new v8::Persistent<v8::Context>(result->GetIsolate(), | 
|  147     v8::Context::New(result->GetIsolate()))); |  147     v8::Context::New(result->GetIsolate()))); | 
|  148   AdblockPlus::GlobalJsObject::Setup(result, appInfo, result->GetGlobalObject())
     ; |  148   AdblockPlus::GlobalJsObject::Setup(*result, appInfo, result->GetGlobalObject()
     ); | 
|  149   return result; |  149   return result; | 
|  150 } |  150 } | 
|  151  |  151  | 
|  152 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::GetGlobalObject() |  152 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::GetGlobalObject() | 
|  153 { |  153 { | 
|  154   JsContext context(shared_from_this()); |  154   JsContext context(shared_from_this()); | 
|  155   return JsValuePtr(new JsValue(shared_from_this(), context.GetV8Context()->Glob
     al())); |  155   return JsValuePtr(new JsValue(shared_from_this(), context.GetV8Context()->Glob
     al())); | 
|  156 } |  156 } | 
|  157  |  157  | 
|  158 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::Evaluate(const std::string& sourc
     e, |  158 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::Evaluate(const std::string& sourc
     e, | 
|  159     const std::string& filename) |  159     const std::string& filename) | 
|  160 { |  160 { | 
|  161   const JsContext context(shared_from_this()); |  161   const JsContext context(shared_from_this()); | 
|  162   const v8::TryCatch tryCatch; |  162   const v8::TryCatch tryCatch; | 
|  163   const v8::Handle<v8::Script> script = CompileScript(GetIsolate(), source, |  163   const v8::Handle<v8::Script> script = CompileScript(GetIsolate(), source, | 
|  164     filename); |  164     filename); | 
|  165   CheckTryCatch(tryCatch); |  165   CheckTryCatch(tryCatch); | 
|  166   v8::Local<v8::Value> result = script->Run(); |  166   v8::Local<v8::Value> result = script->Run(); | 
|  167   CheckTryCatch(tryCatch); |  167   CheckTryCatch(tryCatch); | 
|  168   return JsValuePtr(new JsValue(shared_from_this(), result)); |  168   return JsValuePtr(new JsValue(shared_from_this(), result)); | 
|  169 } |  169 } | 
|  170  |  170  | 
|  171 void AdblockPlus::JsEngine::SetEventCallback(const std::string& eventName, |  171 void AdblockPlus::JsEngine::SetEventCallback(const std::string& eventName, | 
|  172     AdblockPlus::JsEngine::EventCallback callback) |  172     const AdblockPlus::JsEngine::EventCallback& callback) | 
|  173 { |  173 { | 
|  174   if (!callback) |  174   if (!callback) | 
|  175   { |  175   { | 
|  176     RemoveEventCallback(eventName); |  176     RemoveEventCallback(eventName); | 
|  177     return; |  177     return; | 
|  178   } |  178   } | 
|  179   std::lock_guard<std::mutex> lock(eventCallbacksMutex); |  179   std::lock_guard<std::mutex> lock(eventCallbacksMutex); | 
|  180   eventCallbacks[eventName] = callback; |  180   eventCallbacks[eventName] = callback; | 
|  181 } |  181 } | 
|  182  |  182  | 
|  183 void AdblockPlus::JsEngine::RemoveEventCallback(const std::string& eventName) |  183 void AdblockPlus::JsEngine::RemoveEventCallback(const std::string& eventName) | 
|  184 { |  184 { | 
|  185   std::lock_guard<std::mutex> lock(eventCallbacksMutex); |  185   std::lock_guard<std::mutex> lock(eventCallbacksMutex); | 
|  186   eventCallbacks.erase(eventName); |  186   eventCallbacks.erase(eventName); | 
|  187 } |  187 } | 
|  188  |  188  | 
|  189 void AdblockPlus::JsEngine::TriggerEvent(const std::string& eventName, AdblockPl
     us::JsValueList& params) |  189 void AdblockPlus::JsEngine::TriggerEvent(const std::string& eventName, const Adb
     lockPlus::JsValueList& params) | 
|  190 { |  190 { | 
|  191   EventCallback callback; |  191   EventCallback callback; | 
|  192   { |  192   { | 
|  193     std::lock_guard<std::mutex> lock(eventCallbacksMutex); |  193     std::lock_guard<std::mutex> lock(eventCallbacksMutex); | 
|  194     auto it = eventCallbacks.find(eventName); |  194     auto it = eventCallbacks.find(eventName); | 
|  195     if (it == eventCallbacks.end()) |  195     if (it == eventCallbacks.end()) | 
|  196       return; |  196       return; | 
|  197     callback = it->second; |  197     callback = it->second; | 
|  198   } |  198   } | 
|  199   callback(params); |  199   callback(params); | 
| (...skipping 24 matching lines...) Expand all  Loading... | 
|  224   return JsValuePtr(new JsValue(shared_from_this(), v8::Boolean::New(val))); |  224   return JsValuePtr(new JsValue(shared_from_this(), v8::Boolean::New(val))); | 
|  225 } |  225 } | 
|  226  |  226  | 
|  227 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewObject() |  227 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewObject() | 
|  228 { |  228 { | 
|  229   const JsContext context(shared_from_this()); |  229   const JsContext context(shared_from_this()); | 
|  230   return JsValuePtr(new JsValue(shared_from_this(), v8::Object::New())); |  230   return JsValuePtr(new JsValue(shared_from_this(), v8::Object::New())); | 
|  231 } |  231 } | 
|  232  |  232  | 
|  233 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewCallback( |  233 AdblockPlus::JsValuePtr AdblockPlus::JsEngine::NewCallback( | 
|  234     v8::InvocationCallback callback) |  234     const v8::InvocationCallback& callback) | 
|  235 { |  235 { | 
|  236   const JsContext context(shared_from_this()); |  236   const JsContext context(shared_from_this()); | 
|  237  |  237  | 
|  238   // Note: we are leaking this weak pointer, no obvious way to destroy it when |  238   // Note: we are leaking this weak pointer, no obvious way to destroy it when | 
|  239   // it's no longer used |  239   // it's no longer used | 
|  240   std::weak_ptr<JsEngine>* data = |  240   std::weak_ptr<JsEngine>* data = | 
|  241       new std::weak_ptr<JsEngine>(shared_from_this()); |  241       new std::weak_ptr<JsEngine>(shared_from_this()); | 
|  242   v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(callback, |  242   v8::Local<v8::FunctionTemplate> templ = v8::FunctionTemplate::New(callback, | 
|  243       v8::External::New(data)); |  243       v8::External::New(data)); | 
|  244   return JsValuePtr(new JsValue(shared_from_this(), templ->GetFunction())); |  244   return JsValuePtr(new JsValue(shared_from_this(), templ->GetFunction())); | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
|  263   for (int i = 0; i < arguments.Length(); i++) |  263   for (int i = 0; i < arguments.Length(); i++) | 
|  264     list.push_back(JsValuePtr(new JsValue(shared_from_this(), arguments[i]))); |  264     list.push_back(JsValuePtr(new JsValue(shared_from_this(), arguments[i]))); | 
|  265   return list; |  265   return list; | 
|  266 } |  266 } | 
|  267  |  267  | 
|  268 AdblockPlus::FileSystemPtr AdblockPlus::JsEngine::GetFileSystem() const |  268 AdblockPlus::FileSystemPtr AdblockPlus::JsEngine::GetFileSystem() const | 
|  269 { |  269 { | 
|  270   return fileSystem; |  270   return fileSystem; | 
|  271 } |  271 } | 
|  272  |  272  | 
|  273 void AdblockPlus::JsEngine::SetFileSystem(AdblockPlus::FileSystemPtr val) |  273 void AdblockPlus::JsEngine::SetFileSystem(const AdblockPlus::FileSystemPtr& val) | 
|  274 { |  274 { | 
|  275   if (!val) |  275   if (!val) | 
|  276     throw std::runtime_error("FileSystem cannot be null"); |  276     throw std::runtime_error("FileSystem cannot be null"); | 
|  277  |  277  | 
|  278   fileSystem = val; |  278   fileSystem = val; | 
|  279 } |  279 } | 
|  280  |  280  | 
|  281 AdblockPlus::WebRequestPtr AdblockPlus::JsEngine::GetWebRequest() const |  281 AdblockPlus::WebRequestPtr AdblockPlus::JsEngine::GetWebRequest() const | 
|  282 { |  282 { | 
|  283   return webRequest; |  283   return webRequest; | 
|  284 } |  284 } | 
|  285  |  285  | 
|  286 void AdblockPlus::JsEngine::SetWebRequest(AdblockPlus::WebRequestPtr val) |  286 void AdblockPlus::JsEngine::SetWebRequest(const AdblockPlus::WebRequestPtr& val) | 
|  287 { |  287 { | 
|  288   if (!val) |  288   if (!val) | 
|  289     throw std::runtime_error("WebRequest cannot be null"); |  289     throw std::runtime_error("WebRequest cannot be null"); | 
|  290  |  290  | 
|  291   webRequest = val; |  291   webRequest = val; | 
|  292 } |  292 } | 
|  293  |  293  | 
|  294 void AdblockPlus::JsEngine::SetIsConnectionAllowedCallback(const IsConnectionAll
     owedCallback& callback) |  294 void AdblockPlus::JsEngine::SetIsConnectionAllowedCallback(const IsConnectionAll
     owedCallback& callback) | 
|  295 { |  295 { | 
|  296   std::lock_guard<std::mutex> lock(isConnectionAllowedMutex); |  296   std::lock_guard<std::mutex> lock(isConnectionAllowedMutex); | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
|  309     localCopy = isConnectionAllowed; |  309     localCopy = isConnectionAllowed; | 
|  310   } |  310   } | 
|  311   return !localCopy || localCopy(); |  311   return !localCopy || localCopy(); | 
|  312 } |  312 } | 
|  313  |  313  | 
|  314 AdblockPlus::LogSystemPtr AdblockPlus::JsEngine::GetLogSystem() const |  314 AdblockPlus::LogSystemPtr AdblockPlus::JsEngine::GetLogSystem() const | 
|  315 { |  315 { | 
|  316   return logSystem; |  316   return logSystem; | 
|  317 } |  317 } | 
|  318  |  318  | 
|  319 void AdblockPlus::JsEngine::SetLogSystem(AdblockPlus::LogSystemPtr val) |  319 void AdblockPlus::JsEngine::SetLogSystem(const AdblockPlus::LogSystemPtr& val) | 
|  320 { |  320 { | 
|  321   if (!val) |  321   if (!val) | 
|  322     throw std::runtime_error("LogSystem cannot be null"); |  322     throw std::runtime_error("LogSystem cannot be null"); | 
|  323  |  323  | 
|  324   logSystem = val; |  324   logSystem = val; | 
|  325 } |  325 } | 
|  326  |  326  | 
|  327  |  327  | 
|  328 void AdblockPlus::JsEngine::SetGlobalProperty(const std::string& name, |  328 void AdblockPlus::JsEngine::SetGlobalProperty(const std::string& name, | 
|  329                                               AdblockPlus::JsValuePtr value) |  329                                               const AdblockPlus::JsValuePtr& val
     ue) | 
|  330 { |  330 { | 
|  331   auto global = GetGlobalObject(); |  331   auto global = GetGlobalObject(); | 
|  332   if (!global) |  332   if (!global) | 
|  333     throw std::runtime_error("Global object cannot be null"); |  333     throw std::runtime_error("Global object cannot be null"); | 
|  334   global->SetProperty(name, value); |  334   global->SetProperty(name, value); | 
|  335 } |  335 } | 
| OLD | NEW |