Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Side by Side Diff: src/GlobalJsObject.cpp

Issue 10085006: Implement setTimeout (Closed)
Patch Set: Created April 8, 2013, 1:07 p.m.
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff | Download patch
« no previous file with comments | « libadblockplus.gyp ('k') | src/JsEngine.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #include <vector>
2 #include <stdexcept>
3
1 #include "GlobalJsObject.h" 4 #include "GlobalJsObject.h"
5 #include "Thread.h"
2 6
3 using namespace AdblockPlus; 7 using namespace AdblockPlus;
4 8
9 namespace
10 {
11 class TimeoutThread : public Thread
12 {
13 public:
14 TimeoutThread(v8::Isolate* const isolate, const v8::Arguments& arguments)
15 : isolate(isolate)
16 {
17 if (arguments.Length() < 2)
18 throw std::runtime_error("setTimeout requires at least 2 parameters");
19
20 const v8::Local<v8::Value> functionValue = arguments[0];
21 if (!functionValue->IsFunction())
22 throw std::runtime_error("No valid function passed to setTimeout");
Wladimir Palant 2013/04/08 14:03:47 Nit: I think the canonical message is: "First argu
23
24 const v8::Local<v8::Value> delayValue = arguments[1];
25 if (!delayValue->IsNumber())
26 throw std::runtime_error("No valid delay passed to setTimeout");
Wladimir Palant 2013/04/08 14:03:47 Nit: I think the canonical message is: "Second arg
27
28 function = v8::Persistent<v8::Function>::New(
29 isolate, v8::Local<v8::Function>::Cast(functionValue));
30 delay = delayValue->ToNumber()->Value();
31 for (int i = 2; i < arguments.Length(); i++)
32 {
33 const Value argument = Value::New(isolate, arguments[i]);
34 functionArguments.push_back(argument);
35 }
36 }
37
38 ~TimeoutThread()
39 {
40 function.Dispose(isolate);
41 for (Values::iterator it = functionArguments.begin();
42 it != functionArguments.end(); it++)
43 it->Dispose(isolate);
44 }
45
46 void Run()
47 {
48 Sleep(delay);
49 const v8::Locker locker(isolate);
50 const v8::HandleScope handleScope;
51 function->Call(function, functionArguments.size(), &functionArguments[0]);
52 delete this;
53 }
54
55 private:
56 typedef v8::Persistent<v8::Value> Value;
57 typedef std::vector<Value> Values;
58
59 v8::Isolate* const isolate;
60 v8::Persistent<v8::Function> function;
61 int delay;
62 Values functionArguments;
63 };
64
65 v8::Handle<v8::Value> SetTimeoutCallback(const v8::Arguments& arguments)
66 {
67 TimeoutThread* timeoutThread;
68 try
69 {
70 timeoutThread = new TimeoutThread(v8::Isolate::GetCurrent(), arguments);
71 }
72 catch (const std::exception& e)
73 {
74 return v8::ThrowException(v8::String::New(e.what()));
75 }
76 timeoutThread->Start();
77
78 // We should actually return the timer ID here, which could be
79 // used via clearTimeout(). But since we don't seem to need
80 // clearTimeout(), we can save that for later.
81 return v8::Undefined();
82 }
83 }
84
5 v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create( 85 v8::Handle<v8::ObjectTemplate> GlobalJsObject::Create(
6 ErrorCallback& errorCallback) 86 ErrorCallback& errorCallback)
7 { 87 {
8 const v8::Locker locker(v8::Isolate::GetCurrent()); 88 const v8::Locker locker(v8::Isolate::GetCurrent());
9 v8::HandleScope handleScope; 89 v8::HandleScope handleScope;
10 const v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New(); 90 const v8::Handle<v8::ObjectTemplate> global = v8::ObjectTemplate::New();
11 const v8::Handle<v8::ObjectTemplate> console = 91 const v8::Handle<v8::ObjectTemplate> console =
12 AdblockPlus::ConsoleJsObject::Create(errorCallback); 92 AdblockPlus::ConsoleJsObject::Create(errorCallback);
13 global->Set(v8::String::New("console"), console); 93 global->Set(v8::String::New("console"), console);
94 const v8::Handle<v8::FunctionTemplate> setTimeoutFunction =
95 v8::FunctionTemplate::New(SetTimeoutCallback);
96 global->Set(v8::String::New("setTimeout"), setTimeoutFunction);
14 return handleScope.Close(global); 97 return handleScope.Close(global);
15 } 98 }
OLDNEW
« no previous file with comments | « libadblockplus.gyp ('k') | src/JsEngine.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld