Bug 1287229 - port.disconnect should not throw
MozReview-Commit-ID: 7d8Zmb4OAd0
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -1041,17 +1041,19 @@ Port.prototype = {
}
this.handleDisconnection();
}
},
disconnect() {
if (this.disconnected) {
- throw new this.context.contentWindow.Error("Attempt to disconnect() a disconnected port");
+ // disconnect() may be called without side effects even after the port is
+ // closed - https://developer.chrome.com/extensions/runtime#type-Port
+ return;
}
this.handleDisconnection();
this.messageManager.sendAsyncMessage(this.disconnectName);
},
close() {
this.disconnect();
},
--- a/toolkit/components/extensions/test/mochitest/test_ext_runtime_disconnect.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_runtime_disconnect.html
@@ -12,16 +12,19 @@
<script type="text/javascript">
"use strict";
function backgroundScript() {
browser.runtime.onConnect.addListener(port => {
browser.test.assertEq(port.name, "ernie", "port name correct");
port.onDisconnect.addListener(() => {
+ // Closing an already-disconnected port is a no-op.
+ port.disconnect();
+ port.disconnect();
browser.test.sendMessage("disconnected");
});
browser.test.sendMessage("connected");
});
}
function contentScript() {
browser.runtime.connect({name: "ernie"});