Index: src/GlobalJsObject.cpp |
=================================================================== |
--- a/src/GlobalJsObject.cpp |
+++ b/src/GlobalJsObject.cpp |
@@ -1,106 +1,90 @@ |
#include <vector> |
#include <stdexcept> |
+#include <AdblockPlus/JsEngine.h> |
+#include <AdblockPlus/JsValue.h> |
#include "GlobalJsObject.h" |
#include "ConsoleJsObject.h" |
#include "WebRequestJsObject.h" |
#include "Thread.h" |
using namespace AdblockPlus; |
namespace |
{ |
class TimeoutThread : public Thread |
{ |
public: |
- TimeoutThread(v8::Isolate* const isolate, const v8::Arguments& arguments) |
- : isolate(isolate) |
+ TimeoutThread(JsValueList& arguments) |
{ |
- if (arguments.Length() < 2) |
+ if (arguments.size() < 2) |
throw std::runtime_error("setTimeout requires at least 2 parameters"); |
- const v8::Local<v8::Value> functionValue = arguments[0]; |
- if (!functionValue->IsFunction()) |
+ if (!arguments[0]->IsFunction()) |
throw std::runtime_error( |
"First argument to setTimeout must be a function"); |
- const v8::Local<v8::Value> delayValue = arguments[1]; |
- if (!delayValue->IsNumber()) |
- throw std::runtime_error( |
- "Second argument to setTimeout must be a number"); |
- |
- function = v8::Persistent<v8::Function>::New( |
- isolate, v8::Local<v8::Function>::Cast(functionValue)); |
- delay = delayValue->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); |
+ function = arguments[0]; |
+ delay = arguments[1]->AsInt(); |
+ for (size_t i = 2; i < arguments.size(); i++) |
+ functionArguments.push_back(arguments[i]); |
} |
void Run() |
{ |
Sleep(delay); |
- const v8::Locker locker(isolate); |
- const v8::HandleScope handleScope; |
- v8::Handle<v8::Value>* argv = functionArguments.empty() ? 0 : &(functionArguments.front()); |
- function->Call(function, functionArguments.size(), argv); |
+ |
+ function->Call(functionArguments); |
delete this; |
} |
private: |
typedef v8::Persistent<v8::Value> Value; |
typedef std::vector<Value> Values; |
- v8::Isolate* const isolate; |
- v8::Persistent<v8::Function> function; |
+ JsValuePtr function; |
int delay; |
- Values functionArguments; |
+ JsValueList functionArguments; |
}; |
v8::Handle<v8::Value> SetTimeoutCallback(const v8::Arguments& arguments) |
{ |
TimeoutThread* timeoutThread; |
try |
{ |
- timeoutThread = new TimeoutThread(v8::Isolate::GetCurrent(), arguments); |
+ AdblockPlus::JsValueList converted = |
+ AdblockPlus::JsEngine::FromArguments(arguments) |
+ .ConvertArguments(arguments); |
+ timeoutThread = new TimeoutThread(converted); |
} |
catch (const std::exception& e) |
{ |
return v8::ThrowException(v8::String::New(e.what())); |
} |
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 save that for later. |
return v8::Undefined(); |
} |
} |
v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create( |
- ErrorCallback& errorCallback, WebRequest& webRequest) |
+ JsEngine& jsEngine) |
{ |
const v8::Locker locker(v8::Isolate::GetCurrent()); |
v8::HandleScope handleScope; |
const v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); |
const v8::Handle<v8::ObjectTemplate> console = |
- AdblockPlus::ConsoleJsObject::Create(errorCallback); |
+ AdblockPlus::ConsoleJsObject::Create(jsEngine); |
global->Set(v8::String::New("console"), console); |
const v8::Handle<v8::FunctionTemplate> setTimeoutFunction = |
- v8::FunctionTemplate::New(SetTimeoutCallback); |
+ v8::FunctionTemplate::New(::SetTimeoutCallback, |
+ v8::External::New(&jsEngine)); |
global->Set(v8::String::New("setTimeout"), setTimeoutFunction); |
const v8::Handle<v8::ObjectTemplate> request = |
- AdblockPlus::WebRequestJsObject::Create(webRequest); |
+ AdblockPlus::WebRequestJsObject::Create(jsEngine); |
global->Set(v8::String::New("_webRequest"), request); |
return handleScope.Close(global); |
} |