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

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

Issue 1777673003: [mojo-bindings] Use Watcher API for JS bindings (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: minus HandleWatcher Created 4 years, 9 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
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/edk/js/waiting_callback.h" 5 #include "mojo/edk/js/waiting_callback.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "gin/per_context_data.h" 9 #include "gin/per_context_data.h"
10 10
(...skipping 10 matching lines...) Expand all
21 21
22 } // namespace 22 } // namespace
23 23
24 gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin }; 24 gin::WrapperInfo WaitingCallback::kWrapperInfo = { gin::kEmbedderNativeGin };
25 25
26 // static 26 // static
27 gin::Handle<WaitingCallback> WaitingCallback::Create( 27 gin::Handle<WaitingCallback> WaitingCallback::Create(
28 v8::Isolate* isolate, 28 v8::Isolate* isolate,
29 v8::Handle<v8::Function> callback, 29 v8::Handle<v8::Function> callback,
30 gin::Handle<HandleWrapper> handle_wrapper, 30 gin::Handle<HandleWrapper> handle_wrapper,
31 MojoHandleSignals signals) { 31 MojoHandleSignals signals,
32 bool one_shot) {
32 gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle( 33 gin::Handle<WaitingCallback> waiting_callback = gin::CreateHandle(
33 isolate, new WaitingCallback(isolate, callback, handle_wrapper)); 34 isolate, new WaitingCallback(isolate, callback, one_shot));
34 35 waiting_callback->watcher_.Start(
35 waiting_callback->handle_watcher_.Start( 36 handle_wrapper->get(), signals,
36 handle_wrapper->get(), signals, MOJO_DEADLINE_INDEFINITE,
37 base::Bind(&WaitingCallback::OnHandleReady, 37 base::Bind(&WaitingCallback::OnHandleReady,
38 base::Unretained(waiting_callback.get()))); 38 base::Unretained(waiting_callback.get())));
39 return waiting_callback; 39 return waiting_callback;
40 } 40 }
41 41
42 void WaitingCallback::Cancel() { 42 void WaitingCallback::Cancel() {
43 if (!handle_watcher_.is_watching()) 43 if (!watcher_.IsWatching())
44 return; 44 return;
45 45
46 RemoveHandleCloseObserver(); 46 watcher_.Cancel();
47 handle_watcher_.Stop();
48 } 47 }
49 48
50 WaitingCallback::WaitingCallback(v8::Isolate* isolate, 49 WaitingCallback::WaitingCallback(v8::Isolate* isolate,
51 v8::Handle<v8::Function> callback, 50 v8::Handle<v8::Function> callback,
52 gin::Handle<HandleWrapper> handle_wrapper) 51 bool one_shot)
53 : handle_wrapper_(handle_wrapper.get()), 52 : one_shot_(one_shot),
54 weak_factory_(this) { 53 weak_factory_(this) {
55 handle_wrapper_->AddCloseObserver(this);
56 v8::Handle<v8::Context> context = isolate->GetCurrentContext(); 54 v8::Handle<v8::Context> context = isolate->GetCurrentContext();
57 runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr(); 55 runner_ = gin::PerContextData::From(context)->runner()->GetWeakPtr();
58 GetWrapper(isolate) 56 GetWrapper(isolate)
59 ->SetPrivate(context, GetHiddenPropertyName(isolate), callback) 57 ->SetPrivate(context, GetHiddenPropertyName(isolate), callback)
60 .FromJust(); 58 .FromJust();
61 } 59 }
62 60
63 WaitingCallback::~WaitingCallback() { 61 WaitingCallback::~WaitingCallback() {
64 Cancel(); 62 Cancel();
65 } 63 }
66 64
67 void WaitingCallback::RemoveHandleCloseObserver() {
68 handle_wrapper_->RemoveCloseObserver(this);
69 handle_wrapper_ = nullptr;
70 }
71
72 void WaitingCallback::OnHandleReady(MojoResult result) { 65 void WaitingCallback::OnHandleReady(MojoResult result) {
yzshen1 2016/03/08 23:02:42 Nit: this method could be removed, because it only
73 RemoveHandleCloseObserver();
74 CallCallback(result); 66 CallCallback(result);
75 } 67 }
76 68
77 void WaitingCallback::CallCallback(MojoResult result) { 69 void WaitingCallback::CallCallback(MojoResult result) {
78 DCHECK(!handle_watcher_.is_watching());
79 DCHECK(!handle_wrapper_);
80
81 if (!runner_) 70 if (!runner_)
82 return; 71 return;
83 72
73 DCHECK(watcher_.IsWatching() || result == MOJO_RESULT_CANCELLED);
74
84 gin::Runner::Scope scope(runner_.get()); 75 gin::Runner::Scope scope(runner_.get());
85 v8::Isolate* isolate = runner_->GetContextHolder()->isolate(); 76 v8::Isolate* isolate = runner_->GetContextHolder()->isolate();
86 77
87 v8::Handle<v8::Value> hidden_value = 78 v8::Handle<v8::Value> hidden_value =
88 GetWrapper(isolate) 79 GetWrapper(isolate)
89 ->GetPrivate(runner_->GetContextHolder()->context(), 80 ->GetPrivate(runner_->GetContextHolder()->context(),
90 GetHiddenPropertyName(isolate)) 81 GetHiddenPropertyName(isolate))
91 .ToLocalChecked(); 82 .ToLocalChecked();
92 v8::Handle<v8::Function> callback; 83 v8::Handle<v8::Function> callback;
93 CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback)); 84 CHECK(gin::ConvertFromV8(isolate, hidden_value, &callback));
94 85
95 v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) }; 86 v8::Handle<v8::Value> args[] = { gin::ConvertToV8(isolate, result) };
96 runner_->Call(callback, runner_->global(), 1, args); 87 runner_->Call(callback, runner_->global(), 1, args);
97 }
98 88
99 void WaitingCallback::OnWillCloseHandle() { 89 if (one_shot_) {
100 handle_watcher_.Stop(); 90 runner_.reset();
101 91 Cancel();
102 // This may be called from GC, so we can't execute Javascript now, call 92 }
103 // RemoveHandleCloseObserver explicitly, and CallCallback asynchronously.
104 RemoveHandleCloseObserver();
105 base::MessageLoop::current()->PostTask(
106 FROM_HERE,
107 base::Bind(&WaitingCallback::CallCallback, weak_factory_.GetWeakPtr(),
108 MOJO_RESULT_INVALID_ARGUMENT));
109 } 93 }
110 94
111 } // namespace js 95 } // namespace js
112 } // namespace edk 96 } // namespace edk
113 } // namespace mojo 97 } // namespace mojo
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698