Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(25)

Side by Side Diff: mojo/bindings/js/waiting_callback.cc

Issue 276093002: Two fixes for mojo JS bindings (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: alias Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/bindings/js/waiting_callback.h ('k') | mojo/common/message_pump_mojo.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "mojo/bindings/js/waiting_callback.h" 5 #include "mojo/bindings/js/waiting_callback.h"
6 6
7 #include "gin/per_context_data.h" 7 #include "gin/per_context_data.h"
8 #include "mojo/public/cpp/environment/default_async_waiter.h"
8 9
9 namespace mojo { 10 namespace mojo {
10 namespace js { 11 namespace js {
11 12
12 namespace { 13 namespace {
13 14
14 v8::Handle<v8::String> GetHiddenPropertyName(v8::Isolate* isolate) { 15 v8::Handle<v8::String> GetHiddenPropertyName(v8::Isolate* isolate) {
15 return gin::StringToSymbol(isolate, "::mojo::js::WaitingCallback"); 16 return gin::StringToSymbol(isolate, "::mojo::js::WaitingCallback");
16 } 17 }
17 18
18 } // namespace 19 } // namespace
19 20
20 gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin }; 21 gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin };
21 22
23 // static
24 gin::Handle<WaitingCallback> WaitingCallback::Create(
25 v8::Isolate* isolate,
26 v8::Handle<v8::Function> callback,
27 mojo::Handle handle,
28 MojoWaitFlags flags) {
29 gin::Handle<WaitingCallback> waiting_callback =
30 gin::CreateHandle(isolate, new WaitingCallback(isolate, callback));
31 MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
32 waiting_callback->wait_id_ = waiter->AsyncWait(
33 waiter,
34 handle.value(),
35 flags,
36 MOJO_DEADLINE_INDEFINITE,
37 &WaitingCallback::CallOnHandleReady,
38 waiting_callback.get());
39 return waiting_callback;
40 }
41
42 void WaitingCallback::Cancel() {
43 if (!wait_id_)
44 return;
45
46 MojoAsyncWaiter* waiter = GetDefaultAsyncWaiter();
47 waiter->CancelWait(waiter, wait_id_);
48 wait_id_ = 0;
49 }
50
22 WaitingCallback::WaitingCallback(v8::Isolate* isolate, 51 WaitingCallback::WaitingCallback(v8::Isolate* isolate,
23 v8::Handle<v8::Function> callback) 52 v8::Handle<v8::Function> callback)
24 : wait_id_() { 53 : wait_id_() {
25 v8::Handle<v8::Context> context = isolate->GetCurrentContext(); 54 v8::Handle<v8::Context> context = isolate->GetCurrentContext();
26 runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr(); 55 runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
27 GetWrapper(isolate)->SetHiddenValue(GetHiddenPropertyName(isolate), callback); 56 GetWrapper(isolate)->SetHiddenValue(GetHiddenPropertyName(isolate), callback);
28 } 57 }
29 58
30 WaitingCallback::~WaitingCallback() { 59 WaitingCallback::~WaitingCallback() {
31 DCHECK(!wait_id_) << "Waiting callback was destroyed before being cancelled."; 60 Cancel();
32 }
33
34 gin::Handle<WaitingCallback> WaitingCallback::Create(
35 v8::Isolate* isolate, v8::Handle<v8::Function> callback) {
36 return gin::CreateHandle(isolate, new WaitingCallback(isolate, callback));
37 } 61 }
38 62
39 // static 63 // static
40 void WaitingCallback::CallOnHandleReady(void* closure, MojoResult result) { 64 void WaitingCallback::CallOnHandleReady(void* closure, MojoResult result) {
41 static_cast<WaitingCallback*>(closure)->OnHandleReady(result); 65 static_cast<WaitingCallback*>(closure)->OnHandleReady(result);
42 } 66 }
43 67
44 void WaitingCallback::OnHandleReady(MojoResult result) { 68 void WaitingCallback::OnHandleReady(MojoResult result) {
45 wait_id_ = 0; 69 wait_id_ = 0;
46 70
47 if (!runner_) 71 if (!runner_)
48 return; 72 return;
49 73
50 gin::Runner::Scope scope(runner_.get()); 74 gin::Runner::Scope scope(runner_.get());
51 v8::Isolate* isolate = runner_->GetContextHolder()->isolate(); 75 v8::Isolate* isolate = runner_->GetContextHolder()->isolate();
52 76
53 v8::Handle<v8::Value> hidden_value = 77 v8::Handle<v8::Value> hidden_value =
54 GetWrapper(isolate)->GetHiddenValue(GetHiddenPropertyName(isolate)); 78 GetWrapper(isolate)->GetHiddenValue(GetHiddenPropertyName(isolate));
55 v8::Handle<v8::Function> callback; 79 v8::Handle<v8::Function> callback;
56 CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback)); 80 CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback));
57 81
58 v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) }; 82 v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) };
59 runner_->Call(callback, runner_->global(), 1, args); 83 runner_->Call(callback, runner_->global(), 1, args);
60 } 84 }
61 85
62 } // namespace js 86 } // namespace js
63 } // namespace mojo 87 } // namespace mojo
OLDNEW
« no previous file with comments | « mojo/bindings/js/waiting_callback.h ('k') | mojo/common/message_pump_mojo.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698