| Index: src/GlobalJsObject.cpp |
| =================================================================== |
| --- a/src/GlobalJsObject.cpp |
| +++ b/src/GlobalJsObject.cpp |
| @@ -1,7 +1,68 @@ |
| +#include <vector> |
| + |
| #include "GlobalJsObject.h" |
| +#include "Thread.h" |
| using namespace AdblockPlus; |
| +namespace |
| +{ |
| + class TimeoutThread : public Thread |
| + { |
| + public: |
| + TimeoutThread(v8::Isolate* const isolate, const v8::Arguments& arguments) |
| + : isolate(isolate) |
| + { |
| + function = v8::Persistent<v8::Function>::New( |
| + isolate, v8::Local<v8::Function>::Cast(arguments[0])); |
|
Felix Dahlke
2013/04/08 13:07:49
Phew, good find. V8 isn't exactly documented but I
|
| + delay = arguments[1]->ToNumber()->Value(); |
| + for (int i = 2; i < arguments.Length(); i++) |
| + { |
| + const Value argument = Value::New(isolate, arguments[i]); |
| + functionArguments.push_back(argument); |
| + } |
| + } |
| + |
| + ~TimeoutThread() |
| + { |
| + function.Dispose(isolate); |
| + for (Values::iterator it = functionArguments.begin(); |
| + it != functionArguments.end(); it++) |
| + it->Dispose(isolate); |
| + } |
| + |
| + void Run() |
| + { |
| + Sleep(delay); |
| + const v8::Locker locker(isolate); |
|
Wladimir Palant
2013/04/08 08:36:00
Does this really lock when this line is reached or
|
| + const v8::HandleScope handleScope; |
| + function->Call(function, functionArguments.size(), &functionArguments[0]); |
| + delete this; |
|
Wladimir Palant
2013/04/08 08:36:00
Self-deleting object?
1) Is that a good practice?
Felix Dahlke
2013/04/08 13:07:49
1) Depends. It's not generally considered a bad pr
Wladimir Palant
2013/04/08 14:03:47
I checked, delete is actually thread-safe - so no
|
| + } |
| + |
| + private: |
| + typedef v8::Persistent<v8::Value> Value; |
| + typedef std::vector<Value> Values; |
| + |
| + v8::Isolate* const isolate; |
| + v8::Persistent<v8::Function> function; |
| + int delay; |
| + Values functionArguments; |
| + }; |
| + |
| + v8::Handle<v8::Value> SetTimeoutCallback(const v8::Arguments& arguments) |
| + { |
| + TimeoutThread* const timeoutThread = |
| + new TimeoutThread(v8::Isolate::GetCurrent(), arguments); |
| + timeoutThread->Start(); |
| + |
| + // We should actually return the timer ID here, which could be |
| + // used via clearTimeout(). But since we don't seem to need |
| + // clearTimeout(), we can safe that for later. |
|
Wladimir Palant
2013/04/08 08:36:00
safe => save?
Felix Dahlke
2013/04/08 13:07:49
Yes, of course.
|
| + return v8::Undefined(); |
| + } |
| +} |
| + |
| v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create( |
| ErrorCallback& errorCallback) |
| { |
| @@ -11,5 +72,8 @@ |
| const v8::Handle<v8::ObjectTemplate> console = |
| AdblockPlus::ConsoleJsObject::Create(errorCallback); |
| global->Set(v8::String::New("console"), console); |
| + const v8::Handle<v8::FunctionTemplate> setTimeoutFunction = |
| + v8::FunctionTemplate::New(SetTimeoutCallback); |
| + global->Set(v8::String::New("setTimeout"), setTimeoutFunction); |
| return handleScope.Close(global); |
| } |