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

Side by Side Diff: mojo/public/js/connector.js

Issue 2842073003: Handle error in connector and close handle and swap with dummy handle. (Closed)
Patch Set: Formatting. Add early return in HandleError if |this.handle_| is null. Created 3 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
« no previous file with comments | « no previous file | mojo/public/js/router.js » ('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 define("mojo/public/js/connector", [ 5 define("mojo/public/js/connector", [
6 "mojo/public/js/buffer", 6 "mojo/public/js/buffer",
7 "mojo/public/js/codec", 7 "mojo/public/js/codec",
8 "mojo/public/js/core", 8 "mojo/public/js/core",
9 "mojo/public/js/support", 9 "mojo/public/js/support",
10 ], function(buffer, codec, core, support) { 10 "mojo/public/js/validator",
11 ], function(buffer, codec, core, support, validator) {
11 12
12 function Connector(handle) { 13 function Connector(handle) {
13 if (!core.isHandle(handle)) 14 if (!core.isHandle(handle))
14 throw new Error("Connector: not a handle " + handle); 15 throw new Error("Connector: not a handle " + handle);
15 this.handle_ = handle; 16 this.handle_ = handle;
16 this.dropWrites_ = false; 17 this.dropWrites_ = false;
17 this.error_ = false; 18 this.error_ = false;
18 this.incomingReceiver_ = null; 19 this.incomingReceiver_ = null;
19 this.readWatcher_ = null; 20 this.readWatcher_ = null;
20 this.errorHandler_ = null; 21 this.errorHandler_ = null;
21 this.paused_ = false; 22 this.paused_ = false;
22 23
23 if (handle) { 24 this.waitToReadMore();
24 this.readWatcher_ = support.watch(handle,
25 core.HANDLE_SIGNAL_READABLE,
26 this.readMore_.bind(this));
27 }
28 } 25 }
29 26
30 Connector.prototype.close = function() { 27 Connector.prototype.close = function() {
31 if (this.readWatcher_) { 28 this.cancelWait();
32 support.cancelWatch(this.readWatcher_);
33 this.readWatcher_ = null;
34 }
35 if (this.handle_ != null) { 29 if (this.handle_ != null) {
36 core.close(this.handle_); 30 core.close(this.handle_);
37 this.handle_ = null; 31 this.handle_ = null;
38 } 32 }
39 }; 33 };
40 34
41 Connector.prototype.pauseIncomingMethodCallProcessing = function() { 35 Connector.prototype.pauseIncomingMethodCallProcessing = function() {
42 if (this.paused_) { 36 if (this.paused_) {
43 return; 37 return;
44 } 38 }
45 this.paused_= true; 39 this.paused_= true;
46 40 this.cancelWait();
47 if (this.readWatcher_) {
48 support.cancelWatch(this.readWatcher_);
49 this.readWatcher_ = null;
50 }
51 }; 41 };
52 42
53 Connector.prototype.resumeIncomingMethodCallProcessing = function() { 43 Connector.prototype.resumeIncomingMethodCallProcessing = function() {
54 if (!this.paused_) { 44 if (!this.paused_) {
55 return; 45 return;
56 } 46 }
57 this.paused_= false; 47 this.paused_= false;
58 48 this.waitToReadMore();
59 if (this.handle_) {
60 this.readWatcher_ = support.watch(this.handle_,
61 core.HANDLE_SIGNAL_READABLE,
62 this.readMore_.bind(this));
63 }
64 }; 49 };
65 50
66 Connector.prototype.accept = function(message) { 51 Connector.prototype.accept = function(message) {
67 if (this.error_) 52 if (this.error_)
68 return false; 53 return false;
69 54
70 if (this.dropWrites_) 55 if (this.dropWrites_)
71 return true; 56 return true;
72 57
73 var result = core.writeMessage(this.handle_, 58 var result = core.writeMessage(this.handle_,
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
115 return; 100 return;
116 } 101 }
117 102
118 var read = core.readMessage(this.handle_, 103 var read = core.readMessage(this.handle_,
119 core.READ_MESSAGE_FLAG_NONE); 104 core.READ_MESSAGE_FLAG_NONE);
120 if (this.handle_ == null) // The connector has been closed. 105 if (this.handle_ == null) // The connector has been closed.
121 return; 106 return;
122 if (read.result == core.RESULT_SHOULD_WAIT) 107 if (read.result == core.RESULT_SHOULD_WAIT)
123 return; 108 return;
124 if (read.result != core.RESULT_OK) { 109 if (read.result != core.RESULT_OK) {
125 // TODO(wangjimmy): Add a handleError method to swap the handle to be 110 this.handleError(read.result !== core.RESULT_FAILED_PRECONDITION,
126 // closed with a dummy handle in the case when 111 false);
127 // read.result != MOJO_RESULT_FAILED_PRECONDITION
128 this.error_ = true;
129 if (this.errorHandler_)
130 this.errorHandler_.onError();
131 return; 112 return;
132 } 113 }
133 var messageBuffer = new buffer.Buffer(read.buffer); 114 var messageBuffer = new buffer.Buffer(read.buffer);
134 var message = new codec.Message(messageBuffer, read.handles); 115 var message = new codec.Message(messageBuffer, read.handles);
135 if (this.incomingReceiver_) 116 var receiverResult = this.incomingReceiver_ &&
136 this.incomingReceiver_.accept(message); 117 this.incomingReceiver_.accept(message);
118
119 // Handle invalid incoming message.
120 if (!validator.isTestingMode() && !receiverResult) {
121 // TODO(yzshen): Consider notifying the embedder.
122 this.handleError(true, false);
123 }
137 } 124 }
138 }; 125 };
139 126
127 Connector.prototype.cancelWait = function() {
128 if (this.readWatcher_) {
129 support.cancelWatch(this.readWatcher_);
130 this.readWatcher_ = null;
131 }
132 };
133
134 Connector.prototype.waitToReadMore = function() {
135 if (this.handle_) {
136 this.readWatcher_ = support.watch(this.handle_,
137 core.HANDLE_SIGNAL_READABLE,
138 this.readMore_.bind(this));
139 }
140 };
141
142 Connector.prototype.handleError = function(forcePipeReset,
143 forceAsyncHandler) {
144 if (this.error_ || this.handle_ === null) {
145 return;
146 }
147
148 if (this.paused_) {
149 // Enforce calling the error handler asynchronously if the user has
150 // paused receiving messages. We need to wait until the user starts
151 // receiving messages again.
152 forceAsyncHandler = true;
153 }
154
155 if (!forcePipeReset && forceAsyncHandler) {
156 forcePipeReset = true;
157 }
158
159 this.cancelWait();
160 if (forcePipeReset) {
161 core.close(this.handle_);
162 var dummyPipe = core.createMessagePipe();
163 this.handle_ = dummyPipe.handle0;
164 }
165
166 if (forceAsyncHandler) {
167 if (!this.paused_) {
168 this.waitToReadMore();
169 }
170 } else {
171 this.error_ = true;
172 if (this.errorHandler_) {
173 this.errorHandler_.onError();
174 }
175 }
176 };
177
140 var exports = {}; 178 var exports = {};
141 exports.Connector = Connector; 179 exports.Connector = Connector;
142 return exports; 180 return exports;
143 }); 181 });
OLDNEW
« no previous file with comments | « no previous file | mojo/public/js/router.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698