Index: gin/modules/timer.cc |
diff --git a/gin/modules/timer.cc b/gin/modules/timer.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9aaa68c1c4ed4292a18473d0a8df84a54addc034 |
--- /dev/null |
+++ b/gin/modules/timer.cc |
@@ -0,0 +1,94 @@ |
+// Copyright 2013 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "gin/modules/timer.h" |
+ |
+#include "base/bind.h" |
+#include "gin/object_template_builder.h" |
+#include "gin/per_context_data.h" |
+ |
+namespace gin { |
+ |
+namespace { |
+ |
+v8::Handle<v8::String> GetHiddenPropertyName(v8::Isolate* isolate) { |
+ return gin::StringToSymbol(isolate, "::mojo::js::Timer"); |
abarth-chromium
2013/12/21 03:37:06
::gin::Timer probably. We don't want to mention "
|
+} |
abarth-chromium
2013/12/21 03:37:06
I talked with danno a bit about this pattern. App
Aaron Boodman
2013/12/21 21:34:41
Wow, cool. Note to self: http://webreflection.blog
Aaron Boodman
2013/12/21 22:02:18
Actually, i'm still not clear on how that would wo
|
+ |
+} // namespace |
+ |
+// Timer |
+ |
+gin::WrapperInfo Timer::kWrapperInfo = { gin::kEmbedderNativeGin }; |
+ |
+// static |
+Handle<Timer> Timer::Create(TimerType type, v8::Isolate* isolate, int delay_ms, |
+ v8::Handle<v8::Function> function) { |
+ return CreateHandle(isolate, new Timer(isolate, type == TYPE_REPEATING, |
+ delay_ms, function)); |
+} |
+ |
+ObjectTemplateBuilder Timer::GetObjectTemplateBuilder(v8::Isolate* isolate) { |
+ return Wrappable<Timer>::GetObjectTemplateBuilder(isolate) |
+ .SetMethod("cancel", |
+ base::Bind(&base::Timer::Stop, base::Unretained(&timer_))) |
+ .SetMethod("reset", |
+ base::Bind(&base::Timer::Reset, base::Unretained(&timer_))); |
+} |
+ |
+Timer::Timer(v8::Isolate* isolate, bool repeating, int delay_ms, |
+ v8::Handle<v8::Function> function) |
+ : weak_factory_(this), |
+ timer_(false, repeating), |
+ runner_(PerContextData::From( |
+ isolate->GetCurrentContext())->runner()->GetWeakPtr()) { |
+ GetWrapper(runner_->isolate())->SetHiddenValue(GetHiddenPropertyName(isolate), |
+ function); |
+ timer_.Start(FROM_HERE, base::TimeDelta::FromMilliseconds(delay_ms), |
+ base::Bind(&Timer::OnTimerFired, weak_factory_.GetWeakPtr())); |
+} |
+ |
+Timer::~Timer() { |
+} |
+ |
+void Timer::OnTimerFired() { |
+ Runner::Scope scope(runner_.get()); |
abarth-chromium
2013/12/21 03:37:06
Should we check the runner_ for null?
Aaron Boodman
2013/12/21 21:34:41
I believe that cannot happen if everyone is playin
Aaron Boodman
2013/12/21 23:39:11
I made a test for this to prove I was right. You w
|
+ v8::Handle<v8::Function> function = v8::Handle<v8::Function>::Cast( |
+ GetWrapper(runner_->isolate())->GetHiddenValue( |
+ GetHiddenPropertyName(runner_->isolate()))); |
+ v8::Handle<v8::Value> argv[] = {}; |
+ runner_->Call(function, v8::Undefined(runner_->isolate()), 0, argv); |
+} |
+ |
+ |
+// TimerModule |
+ |
+WrapperInfo TimerModule::kWrapperInfo = { kEmbedderNativeGin }; |
+ |
+// static |
+Handle<TimerModule> TimerModule::Create(v8::Isolate* isolate) { |
+ return CreateHandle(isolate, new TimerModule()); |
+} |
+ |
+// static |
+v8::Local<v8::Value> TimerModule::GetModule(v8::Isolate* isolate) { |
+ return Create(isolate)->GetWrapper(isolate); |
+} |
+ |
+TimerModule::TimerModule() { |
+} |
+ |
+TimerModule::~TimerModule() { |
+} |
+ |
+ObjectTemplateBuilder TimerModule::GetObjectTemplateBuilder( |
+ v8::Isolate* isolate) { |
+ return Wrappable<TimerModule>::GetObjectTemplateBuilder(isolate) |
+ .SetMethod("createOneShot", |
+ base::Bind(&Timer::Create, Timer::TYPE_ONE_SHOT)) |
+ .SetMethod("createRepeating", |
+ base::Bind(&Timer::Create, Timer::TYPE_REPEATING)); |
+} |
+ |
+} // namespace gin |