| OLD | NEW | 
|---|
| 1 #include <vector> | 1 #include <vector> | 
| 2 #include <stdexcept> | 2 #include <stdexcept> | 
| 3 | 3 | 
|  | 4 #include <AdblockPlus/JsEngine.h> | 
|  | 5 #include <AdblockPlus/JsValue.h> | 
| 4 #include "ConsoleJsObject.h" | 6 #include "ConsoleJsObject.h" | 
| 5 #include "FileSystemJsObject.h" | 7 #include "FileSystemJsObject.h" | 
| 6 #include "GlobalJsObject.h" | 8 #include "GlobalJsObject.h" | 
| 7 #include "ConsoleJsObject.h" | 9 #include "ConsoleJsObject.h" | 
| 8 #include "WebRequestJsObject.h" | 10 #include "WebRequestJsObject.h" | 
| 9 #include "Thread.h" | 11 #include "Thread.h" | 
| 10 | 12 | 
| 11 using namespace AdblockPlus; | 13 using namespace AdblockPlus; | 
| 12 | 14 | 
| 13 namespace | 15 namespace | 
| 14 { | 16 { | 
| 15   class TimeoutThread : public Thread | 17   class TimeoutThread : public Thread | 
| 16   { | 18   { | 
| 17   public: | 19   public: | 
| 18     TimeoutThread(v8::Isolate* const isolate, const v8::Arguments& arguments) | 20     TimeoutThread(JsValueList& arguments) | 
| 19       : isolate(isolate) |  | 
| 20     { | 21     { | 
| 21       if (arguments.Length() < 2) | 22       if (arguments.size() < 2) | 
| 22         throw std::runtime_error("setTimeout requires at least 2 parameters"); | 23         throw std::runtime_error("setTimeout requires at least 2 parameters"); | 
| 23 | 24 | 
| 24       const v8::Local<v8::Value> functionValue = arguments[0]; | 25       if (!arguments[0]->IsFunction()) | 
| 25       if (!functionValue->IsFunction()) |  | 
| 26         throw std::runtime_error( | 26         throw std::runtime_error( | 
| 27           "First argument to setTimeout must be a function"); | 27           "First argument to setTimeout must be a function"); | 
| 28 | 28 | 
| 29       const v8::Local<v8::Value> delayValue = arguments[1]; | 29       function = arguments[0]; | 
| 30       if (!delayValue->IsNumber()) | 30       delay = arguments[1]->AsInt(); | 
| 31         throw std::runtime_error( | 31       for (size_t i = 2; i < arguments.size(); i++) | 
| 32           "Second argument to setTimeout must be a number"); | 32         functionArguments.push_back(arguments[i]); | 
| 33 |  | 
| 34       function = v8::Persistent<v8::Function>::New( |  | 
| 35         isolate, v8::Local<v8::Function>::Cast(functionValue)); |  | 
| 36       delay = delayValue->ToNumber()->Value(); |  | 
| 37       for (int i = 2; i < arguments.Length(); i++) |  | 
| 38       { |  | 
| 39         const Value argument = Value::New(isolate, arguments[i]); |  | 
| 40         functionArguments.push_back(argument); |  | 
| 41       } |  | 
| 42     } |  | 
| 43 |  | 
| 44     ~TimeoutThread() |  | 
| 45     { |  | 
| 46       function.Dispose(isolate); |  | 
| 47       for (Values::iterator it = functionArguments.begin(); |  | 
| 48            it != functionArguments.end(); it++) |  | 
| 49         it->Dispose(isolate); |  | 
| 50     } | 33     } | 
| 51 | 34 | 
| 52     void Run() | 35     void Run() | 
| 53     { | 36     { | 
| 54       Sleep(delay); | 37       Sleep(delay); | 
| 55       const v8::Locker locker(isolate); | 38 | 
| 56       const v8::HandleScope handleScope; | 39       function->Call(functionArguments); | 
| 57       v8::Handle<v8::Value>* argv = functionArguments.empty() ? 0 : &(functionAr
     guments.front()); |  | 
| 58       function->Call(function, functionArguments.size(), argv); |  | 
| 59       delete this; |  | 
| 60     } | 40     } | 
| 61 | 41 | 
| 62   private: | 42   private: | 
| 63     typedef v8::Persistent<v8::Value> Value; | 43     JsValuePtr function; | 
| 64     typedef std::vector<Value> Values; |  | 
| 65 |  | 
| 66     v8::Isolate* const isolate; |  | 
| 67     v8::Persistent<v8::Function> function; |  | 
| 68     int delay; | 44     int delay; | 
| 69     Values functionArguments; | 45     JsValueList functionArguments; | 
| 70   }; | 46   }; | 
| 71 | 47 | 
| 72   v8::Handle<v8::Value> SetTimeoutCallback(const v8::Arguments& arguments) | 48   v8::Handle<v8::Value> SetTimeoutCallback(const v8::Arguments& arguments) | 
| 73   { | 49   { | 
| 74     TimeoutThread* timeoutThread; | 50     TimeoutThread* timeoutThread; | 
| 75     try | 51     try | 
| 76     { | 52     { | 
| 77       timeoutThread = new TimeoutThread(v8::Isolate::GetCurrent(), arguments); | 53       AdblockPlus::JsValueList converted = | 
|  | 54           AdblockPlus::JsEngine::FromArguments(arguments) | 
|  | 55           .ConvertArguments(arguments); | 
|  | 56       timeoutThread = new TimeoutThread(converted); | 
| 78     } | 57     } | 
| 79     catch (const std::exception& e) | 58     catch (const std::exception& e) | 
| 80     { | 59     { | 
| 81       return v8::ThrowException(v8::String::New(e.what())); | 60       return v8::ThrowException(v8::String::New(e.what())); | 
| 82     } | 61     } | 
| 83     timeoutThread->Start(); | 62     timeoutThread->Start(); | 
| 84 | 63 | 
| 85     // We should actually return the timer ID here, which could be | 64     // We should actually return the timer ID here, which could be | 
| 86     // used via clearTimeout(). But since we don't seem to need | 65     // used via clearTimeout(). But since we don't seem to need | 
| 87     // clearTimeout(), we can save that for later. | 66     // clearTimeout(), we can save that for later. | 
| 88     return v8::Undefined(); | 67     return v8::Undefined(); | 
| 89   } | 68   } | 
| 90 } | 69 } | 
| 91 | 70 | 
| 92 v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create( | 71 v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create( | 
| 93   FileSystem& fileSystem, WebRequest& webRequest, ErrorCallback& errorCallback) | 72   JsEngine& jsEngine) | 
| 94 { | 73 { | 
| 95   const v8::Locker locker(v8::Isolate::GetCurrent()); | 74   const v8::Locker locker(v8::Isolate::GetCurrent()); | 
| 96   v8::HandleScope handleScope; | 75   v8::HandleScope handleScope; | 
| 97   const v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); | 76   const v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); | 
| 98   const v8::Handle<v8::FunctionTemplate> setTimeoutFunction = | 77   const v8::Handle<v8::FunctionTemplate> setTimeoutFunction = | 
| 99     v8::FunctionTemplate::New(SetTimeoutCallback); | 78     v8::FunctionTemplate::New(SetTimeoutCallback, | 
|  | 79                               v8::External::New(&jsEngine)); | 
| 100   global->Set(v8::String::New("setTimeout"), setTimeoutFunction); | 80   global->Set(v8::String::New("setTimeout"), setTimeoutFunction); | 
| 101   const v8::Handle<v8::ObjectTemplate> fileSystemObject = | 81   const v8::Handle<v8::ObjectTemplate> fileSystemObject = | 
| 102     FileSystemJsObject::Create(fileSystem); | 82     FileSystemJsObject::Create(jsEngine); | 
| 103   global->Set(v8::String::New("_fileSystem"), fileSystemObject); | 83   global->Set(v8::String::New("_fileSystem"), fileSystemObject); | 
| 104   const v8::Handle<v8::ObjectTemplate> webRequestObject = | 84   const v8::Handle<v8::ObjectTemplate> webRequestObject = | 
| 105     WebRequestJsObject::Create(webRequest); | 85     WebRequestJsObject::Create(jsEngine); | 
| 106   global->Set(v8::String::New("_webRequest"), webRequestObject); | 86   global->Set(v8::String::New("_webRequest"), webRequestObject); | 
| 107   const v8::Handle<v8::ObjectTemplate> consoleObject = | 87   const v8::Handle<v8::ObjectTemplate> consoleObject = | 
| 108     ConsoleJsObject::Create(errorCallback); | 88     ConsoleJsObject::Create(jsEngine); | 
| 109   global->Set(v8::String::New("console"), consoleObject); | 89   global->Set(v8::String::New("console"), consoleObject); | 
| 110   return handleScope.Close(global); | 90   return handleScope.Close(global); | 
| 111 } | 91 } | 
| OLD | NEW | 
|---|