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

Unified Diff: mojo/public/js/new_bindings/connector.js

Issue 2893493002: Mojo JS bindings: update the new bindings with the associated interface feature. (Closed)
Patch Set: . 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « mojo/public/js/new_bindings/codec.js ('k') | mojo/public/js/new_bindings/interface_types.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: mojo/public/js/new_bindings/connector.js
diff --git a/mojo/public/js/new_bindings/connector.js b/mojo/public/js/new_bindings/connector.js
index 7fa4822f89efde1f0a289b8216be676ec7dc69f5..2fd40b81ca1fddea1ce8c9ecd842bb5a76c1c1ff 100644
--- a/mojo/public/js/new_bindings/connector.js
+++ b/mojo/public/js/new_bindings/connector.js
@@ -14,24 +14,35 @@
this.incomingReceiver_ = null;
this.readWatcher_ = null;
this.errorHandler_ = null;
+ this.paused_ = false;
- if (handle) {
- this.readWatcher_ = handle.watch({readable: true},
- this.readMore_.bind(this));
- }
+ this.waitToReadMore();
}
Connector.prototype.close = function() {
- if (this.readWatcher_) {
- this.readWatcher_.cancel();
- this.readWatcher_ = null;
- }
+ this.cancelWait();
if (this.handle_ != null) {
this.handle_.close();
this.handle_ = null;
}
};
+ Connector.prototype.pauseIncomingMethodCallProcessing = function() {
+ if (this.paused_) {
+ return;
+ }
+ this.paused_= true;
+ this.cancelWait();
+ };
+
+ Connector.prototype.resumeIncomingMethodCallProcessing = function() {
+ if (!this.paused_) {
+ return;
+ }
+ this.paused_= false;
+ this.waitToReadMore();
+ };
+
Connector.prototype.accept = function(message) {
if (this.error_)
return false;
@@ -71,10 +82,6 @@
this.errorHandler_ = handler;
};
- Connector.prototype.encounteredError = function() {
- return this.error_;
- };
-
Connector.prototype.waitForNextMessageForTesting = function() {
// TODO(yzshen): Change the tests that use this method.
throw new Error("Not supported!");
@@ -82,21 +89,80 @@
Connector.prototype.readMore_ = function(result) {
for (;;) {
+ if (this.paused_) {
+ return;
+ }
+
var read = this.handle_.readMessage();
if (this.handle_ == null) // The connector has been closed.
return;
if (read.result == Mojo.RESULT_SHOULD_WAIT)
return;
if (read.result != Mojo.RESULT_OK) {
- this.error_ = true;
- if (this.errorHandler_)
- this.errorHandler_.onError(read.result);
+ this.handleError(read.result !== Mojo.RESULT_FAILED_PRECONDITION,
+ false);
return;
}
var messageBuffer = new internal.Buffer(read.buffer);
var message = new internal.Message(messageBuffer, read.handles);
- if (this.incomingReceiver_)
- this.incomingReceiver_.accept(message);
+ var receiverResult = this.incomingReceiver_ &&
+ this.incomingReceiver_.accept(message);
+
+ // Handle invalid incoming message.
+ if (!internal.isTestingMode() && !receiverResult) {
+ // TODO(yzshen): Consider notifying the embedder.
+ this.handleError(true, false);
+ }
+ }
+ };
+
+ Connector.prototype.cancelWait = function() {
+ if (this.readWatcher_) {
+ this.readWatcher_.cancel();
+ this.readWatcher_ = null;
+ }
+ };
+
+ Connector.prototype.waitToReadMore = function() {
+ if (this.handle_) {
+ this.readWatcher_ = this.handle_.watch({readable: true},
+ this.readMore_.bind(this));
+ }
+ };
+
+ Connector.prototype.handleError = function(forcePipeReset,
+ forceAsyncHandler) {
+ if (this.error_ || this.handle_ === null) {
+ return;
+ }
+
+ if (this.paused_) {
+ // Enforce calling the error handler asynchronously if the user has
+ // paused receiving messages. We need to wait until the user starts
+ // receiving messages again.
+ forceAsyncHandler = true;
+ }
+
+ if (!forcePipeReset && forceAsyncHandler) {
+ forcePipeReset = true;
+ }
+
+ this.cancelWait();
+ if (forcePipeReset) {
+ this.handle_.close();
+ var dummyPipe = Mojo.createMessagePipe();
+ this.handle_ = dummyPipe.handle0;
+ }
+
+ if (forceAsyncHandler) {
+ if (!this.paused_) {
+ this.waitToReadMore();
+ }
+ } else {
+ this.error_ = true;
+ if (this.errorHandler_) {
+ this.errorHandler_.onError();
+ }
}
};
« no previous file with comments | « mojo/public/js/new_bindings/codec.js ('k') | mojo/public/js/new_bindings/interface_types.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698