Index: src/JsEngine.cpp |
diff --git a/src/JsEngine.cpp b/src/JsEngine.cpp |
index f5a33edbfb964f947ccd4057981c11aa0be67893..1039aa3fb36795b101ca266310cc04a8efba4acf 100644 |
--- a/src/JsEngine.cpp |
+++ b/src/JsEngine.cpp |
@@ -20,6 +20,7 @@ |
#include "JsContext.h" |
#include "JsError.h" |
#include "Utils.h" |
+#include "DefaultTimer.h" |
namespace |
{ |
@@ -66,6 +67,11 @@ namespace |
using namespace AdblockPlus; |
+TimerPtr AdblockPlus::CreateDefaultTimer() |
+{ |
+ return TimerPtr(new DefaultTimer()); |
+} |
+ |
AdblockPlus::ScopedV8Isolate::ScopedV8Isolate() |
{ |
V8Initializer::Init(); |
@@ -78,49 +84,57 @@ AdblockPlus::ScopedV8Isolate::~ScopedV8Isolate() |
isolate = nullptr; |
} |
-JsEngine::TimerTaskInfo::~TimerTaskInfo() |
+JsEngine::TimerTask::~TimerTask() |
{ |
for (auto& arg : arguments) |
arg->Dispose(); |
} |
-JsEngine::TimerTask JsEngine::CreateTimerTask(const v8::Arguments& arguments) |
+void JsEngine::ScheduleTimer(const v8::Arguments& arguments) |
{ |
+ auto jsEngine = FromArguments(arguments); |
if (arguments.Length() < 2) |
throw std::runtime_error("setTimeout requires at least 2 parameters"); |
if (!arguments[0]->IsFunction()) |
throw std::runtime_error("First argument to setTimeout must be a function"); |
- auto timerTaskInfoIterator = timerTaskInfos.emplace(timerTaskInfos.end()); |
- timerTaskInfoIterator->delay = arguments[1]->IntegerValue(); |
+ auto timerTaskIterator = jsEngine->timerTasks.emplace(jsEngine->timerTasks.end()); |
for (int i = 0; i < arguments.Length(); i++) |
- timerTaskInfoIterator->arguments.emplace_back(new v8::Persistent<v8::Value>(GetIsolate(), arguments[i])); |
- TimerTask retValue = { shared_from_this(), timerTaskInfoIterator }; |
- return retValue; |
+ timerTaskIterator->arguments.emplace_back(new v8::Persistent<v8::Value>(jsEngine->GetIsolate(), arguments[i])); |
+ |
+ std::weak_ptr<JsEngine> weakJsEngine = jsEngine; |
+ jsEngine->timer->SetTimer(std::chrono::milliseconds(arguments[1]->IntegerValue()), [weakJsEngine, timerTaskIterator] |
+ { |
+ if (auto jsEngine = weakJsEngine.lock()) |
+ jsEngine->CallTimerTask(timerTaskIterator); |
+ }); |
} |
-void JsEngine::CallTimerTask(TimerTaskInfos::const_iterator timerTaskInfoIterator) |
+void JsEngine::CallTimerTask(TimerTasks::const_iterator timerTaskIterator) |
{ |
const JsContext context(shared_from_this()); |
- JsValue callback(shared_from_this(), v8::Local<v8::Value>::New(GetIsolate(), *timerTaskInfoIterator->arguments[0])); |
+ JsValue callback(shared_from_this(), v8::Local<v8::Value>::New(GetIsolate(), *timerTaskIterator->arguments[0])); |
JsConstValueList callbackArgs; |
- for (int i = 2; i < timerTaskInfoIterator->arguments.size(); i++) |
+ for (int i = 2; i < timerTaskIterator->arguments.size(); i++) |
callbackArgs.emplace_back(new JsValue(shared_from_this(), |
- v8::Local<v8::Value>::New(GetIsolate(), *timerTaskInfoIterator->arguments[i]))); |
+ v8::Local<v8::Value>::New(GetIsolate(), *timerTaskIterator->arguments[i]))); |
callback.Call(callbackArgs); |
- timerTaskInfos.erase(timerTaskInfoIterator); |
+ timerTasks.erase(timerTaskIterator); |
} |
-AdblockPlus::JsEngine::JsEngine(const ScopedV8IsolatePtr& isolate) |
+AdblockPlus::JsEngine::JsEngine(const ScopedV8IsolatePtr& isolate, TimerPtr timer) |
: isolate(isolate) |
+ , timer(std::move(timer)) |
{ |
} |
-AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo, const ScopedV8IsolatePtr& isolate) |
+AdblockPlus::JsEnginePtr AdblockPlus::JsEngine::New(const AppInfo& appInfo, |
+ TimerPtr timer, |
+ const ScopedV8IsolatePtr& isolate) |
{ |
- JsEnginePtr result(new JsEngine(isolate)); |
+ JsEnginePtr result(new JsEngine(isolate, std::move(timer))); |
const v8::Locker locker(result->GetIsolate()); |
const v8::Isolate::Scope isolateScope(result->GetIsolate()); |