| 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); | 
| } | 
|  |