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

Side by Side Diff: mojo/public/js/lib/interface_endpoint_client.js

Issue 2744963002: Introduce InterfaceEndpointClient(IEC), InterfaceEndpointHandle and (Closed)
Patch Set: Add binding.html layout test for connection error with reason. Reset IEC when reset() or close()… Created 3 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
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 define("mojo/public/js/lib/interface_endpoint_client", [
6 "console",
7 "mojo/public/js/codec",
8 "mojo/public/js/lib/control_message_handler",
9 "mojo/public/js/lib/control_message_proxy",
10 "mojo/public/js/lib/interface_endpoint_handle",
11 "mojo/public/js/validator",
12 "timer",
13 ], function(console, codec, controlMessageHandler, controlMessageProxy,
yzshen1 2017/03/24 21:20:12 Style nit: For function definitions (as opposed to
wangjimmy 2017/03/27 16:51:28 Done.
14 interfaceEndpointHandle, validator, timer) {
15
16 var ControlMessageHandler = controlMessageHandler.ControlMessageHandler;
17 var ControlMessageProxy = controlMessageProxy.ControlMessageProxy;
18 var MessageReader = codec.MessageReader;
19 var Validator = validator.Validator;
20 var InterfaceEndpointHandle = interfaceEndpointHandle.InterfaceEndpointHandle;
21
22 function InterfaceEndpointClient(interfaceEndpointHandle, receiver,
23 interfaceVersion) {
24 this.controller_ = null;
25 this.encounteredError_ = false;
26 this.handle_ = interfaceEndpointHandle;
27 this.incomingReceiver_ = receiver;
28
29 if (interfaceEndpointHandle.pendingAssociation()) {
yzshen1 2017/03/24 21:20:13 Please move this block to the end, after declarati
wangjimmy 2017/03/27 16:51:27 Done.
30 interfaceEndpointHandle.setAssociationEventHandler(
31 this.onAssociationEvent.bind(this));
32 } else {
33 this.initControllerIfNecessary();
34 }
35
36 if (interfaceVersion !== undefined) {
37 this.controlMessageHandler_ = new ControlMessageHandler(
38 interfaceVersion);
39 } else {
40 this.controlMessageProxy_ = new ControlMessageProxy(this);
41 }
42
43 this.nextRequestID_ = 0;
44 this.completers_ = new Map();
45 this.payloadValidators_ = [];
46 this.connectionErrorHandler_ = undefined;
yzshen1 2017/03/24 21:20:13 I noticed that some fields are inited as "undefine
wangjimmy 2017/03/27 16:51:28 Done. I was trying to use undefined for callbacks.
47 }
48
49 InterfaceEndpointClient.prototype.initControllerIfNecessary = function() {
yzshen1 2017/03/24 21:20:12 private functions should end with trailing undersc
wangjimmy 2017/03/27 16:51:27 Done.
50 if (this.controller_ || this.handle_.pendingAssociation()) {
51 return;
52 }
53
54 this.controller_ = this.handle_.groupController().attachEndpointClient(
55 this.handle_, this);
56 };
57
58 InterfaceEndpointClient.prototype.onAssociationEvent = function(
59 associationEvent) {
60 if (associationEvent ===
61 InterfaceEndpointHandle.AssociationEvent.ASSOCIATED) {
yzshen1 2017/03/24 21:20:12 Indent should be 4 spaces.
wangjimmy 2017/03/27 16:51:28 Done.
62 this.initControllerIfNecessary();
63 } else if (associationEvent ===
64 InterfaceEndpointHandle.AssociationEvent.PEER_CLOSED_BEFORE_ASSOCIATION) {
yzshen1 2017/03/24 21:20:12 ditto
wangjimmy 2017/03/27 16:51:27 Done.
65 timer.createOneShot(0, this.notifyError.bind(this,
66 this.handle_.disconnectReason()));
67 }
68 };
69
70 InterfaceEndpointClient.prototype.passHandle = function() {
71 if (!this.handle_.isValid()) {
72 return new InterfaceEndpointHandle();
73 }
74
75 // Used to clear the previously set callback.
76 this.handle_.setAssociationEventHandler(undefined);
77
78 if (this.controller_) {
79 this.controller_ = null;
80 this.handle_.groupController().detachEndpointClient(this.handle_);
81 }
82 var handle = this.handle_;
83 this.handle_ = null;
84 return handle;
85 };
86
87 InterfaceEndpointClient.prototype.closeWithReason = function(reason) {
88 var handle = this.passHandle();
89 handle.reset(reason);
90 };
91
92 InterfaceEndpointClient.prototype.accept = function(message) {
93 if (this.encounteredError_) {
94 return false;
95 }
96
97 this.initControllerIfNecessary();
98 return this.controller_.sendMessage(message);
99 };
100
101 InterfaceEndpointClient.prototype.acceptAndExpectResponse = function(message)
102 {
yzshen1 2017/03/24 21:20:12 { should be on the same line as the parameter list
wangjimmy 2017/03/27 16:51:27 Done.
103 if (this.encounteredError_) {
104 return Promise.reject();
105 }
106
107 this.initControllerIfNecessary();
108
109 // Reserve 0 in case we want it to convey special meaning in the future.
110 var requestID = this.nextRequestID_++;
111 if (requestID === 0)
112 requestID = this.nextRequestID_++;
113
114 message.setRequestID(requestID);
115 var result = this.controller_.sendMessage(message);
116 if (!result)
117 return Promise.reject(Error("Connection error"));
118
119 var completer = {};
120 this.completers_.set(requestID, completer);
121 return new Promise(function(resolve, reject) {
122 completer.resolve = resolve;
123 completer.reject = reject;
124 });
125 };
126
127 InterfaceEndpointClient.prototype.reject = function(message) {
yzshen1 2017/03/24 21:20:13 How is this used?
wangjimmy 2017/03/27 16:51:27 This method is never used. Looking at the git blam
128 // TODO(mpcomplete): no way to trasmit errors over a Connection.
129 };
130
131 InterfaceEndpointClient.prototype.setPayloadValidators = function(
132 payloadValidators) {
yzshen1 2017/03/24 21:20:12 4-space indent.
wangjimmy 2017/03/27 16:51:27 Done.
133 this.payloadValidators_ = payloadValidators;
134 };
135
136 InterfaceEndpointClient.prototype.setIncomingReceiver = function(receiver) {
137 this.incomingReceiver_ = receiver;
138 };
139
140 InterfaceEndpointClient.prototype.setConnectionErrorHandler =
141 function(handler) {
yzshen1 2017/03/24 21:20:12 ditto
wangjimmy 2017/03/27 16:51:27 Done.
142 this.connectionErrorHandler_ = handler;
143 };
144
145 InterfaceEndpointClient.prototype.handleIncomingMessage_ = function(message)
146 {
yzshen1 2017/03/24 21:20:12 { should be on the same line as parameter list.
wangjimmy 2017/03/27 16:51:27 Done.
147 var noError = validator.validationError.NONE;
148 var messageValidator = new Validator(message);
149 var err = noError;
150 for (var i = 0; err === noError && i < this.payloadValidators_.length; ++i)
151 err = this.payloadValidators_[i](messageValidator);
152
153 if (err == noError) {
154 return this.handleValidIncomingMessage_(message);
155 }
156 else {
yzshen1 2017/03/24 21:20:12 This should be on the same line as the previous "}
wangjimmy 2017/03/27 16:51:27 Done.
157 validator.reportValidationError(err);
158 return false;
159 }
160 };
161
162 InterfaceEndpointClient.prototype.handleValidIncomingMessage_ = function(
163 message) {
164 if (validator.isTestingMode()) {
165 return true;
166 }
167
168 if (this.encounteredError_) {
169 return false;
170 }
171
172 var ok = false;
173
174 if (message.expectsResponse()) {
175 if (controlMessageHandler.isControlMessage(message) &&
176 this.controlMessageHandler_) {
177 ok = this.controlMessageHandler_.acceptWithResponder(message, this);
178 } else if (this.incomingReceiver_) {
179 ok = this.incomingReceiver_.acceptWithResponder(message, this);
180 }
181 } else if (message.isResponse()) {
182 var reader = new MessageReader(message);
183 var requestID = reader.requestID;
184 var completer = this.completers_.get(requestID);
185 if (completer) {
186 this.completers_.delete(requestID);
187 completer.resolve(message);
188 ok = true;
189 } else {
190 console.log("Unexpected response with request ID: " + requestID);
191 }
192 } else {
193 if (controlMessageHandler.isControlMessage(message) &&
194 this.controlMessageHandler_) {
yzshen1 2017/03/24 21:20:13 wrong indent.
wangjimmy 2017/03/27 16:51:27 Done.
195 ok = this.controlMessageHandler_.accept(message);
196 } else if (this.incomingReceiver_) {
197 ok = this.incomingReceiver_.accept(message);
198 }
199 }
200 return ok;
201 };
202
203 InterfaceEndpointClient.prototype.notifyError = function(reason) {
204 if (this.encounteredError_) {
205 return;
206 }
207 this.encounteredError_ = true;
208
209 this.completers_.forEach(function(value) {
210 value.reject();
211 });
212 this.completers_.clear(); // Drop any responders.
213
214 if (this.connectionErrorHandler_) {
215 this.connectionErrorHandler_(reason);
216 }
217 };
218
219 InterfaceEndpointClient.prototype.queryVersion = function() {
220 return this.controlMessageProxy_.queryVersion();
221 };
222
223 InterfaceEndpointClient.prototype.requireVersion = function(version) {
224 this.controlMessageProxy_.requireVersion(version);
225 };
226
227 var exports = {};
228 exports.InterfaceEndpointClient = InterfaceEndpointClient;
229
230 return exports;
231 });
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698