Bug 1287007 - Fix some flaws in ProxyAPIImplementation draft
authorRob Wu <rob@robwu.nl>
Thu, 01 Sep 2016 21:10:18 -0700
changeset 428415 8ed21785223558d2c7804eab94c97e4c0f4e5b71
parent 428413 a9a41b69f3f9be494ae0653601c08aa388d9afe4
child 428416 b545457a9fb030e66b3d2510cc7beae2b60882f3
push id33305
push userbmo:rob@robwu.nl
push dateSun, 23 Oct 2016 20:56:25 +0000
bugs1287007
milestone52.0a1
Bug 1287007 - Fix some flaws in ProxyAPIImplementation - removeListener: There is no set.remove, use set.delete. - Async callbacks: Do not unconditionally turn the result in a SpreadArgs because it causes the result to unconditionally be wrapped in an array (+test). MozReview-Commit-ID: LqwtBsHWJJr
toolkit/components/extensions/ExtensionUtils.jsm
toolkit/components/extensions/test/mochitest/test_ext_storage_content.html
--- a/toolkit/components/extensions/ExtensionUtils.jsm
+++ b/toolkit/components/extensions/ExtensionUtils.jsm
@@ -452,16 +452,18 @@ class BaseContext {
     } else {
       return new this.cloneScope.Promise((resolve, reject) => {
         promise.then(
           value => {
             if (this.unloaded) {
               dump(`Promise resolved after context unloaded\n`);
             } else if (!this.active) {
               dump(`Promise resolved while context is inactive\n`);
+            } else if (value instanceof SpreadArgs) {
+              runSafe(resolve, value.length == 1 ? value[0] : value);
             } else {
               runSafe(resolve, value);
             }
           },
           value => {
             if (this.unloaded) {
               dump(`Promise rejected after context unloaded: ${value && value.message}\n`);
             } else if (!this.active) {
@@ -1739,17 +1741,17 @@ class ProxyAPIImplementation extends Sch
     }
   }
 
   removeListener(listener) {
     let set = this.childApiManager.listeners.get(this.path);
     if (!set) {
       return;
     }
-    set.remove(listener);
+    set.delete(listener);
 
     if (set.size == 0) {
       this.childApiManager.messageManager.sendAsyncMessage("API:RemoveListener", {
         childId: this.childApiManager.id,
         path: this.path,
       });
     }
   }
--- a/toolkit/components/extensions/test/mochitest/test_ext_storage_content.html
+++ b/toolkit/components/extensions/test/mochitest/test_ext_storage_content.html
@@ -45,16 +45,19 @@ function contentScript() {
     }).then(data => {
       browser.test.assertEq(data[prop], value, "string getter worked for " + prop);
       return get([prop]);
     }).then(data => {
       browser.test.assertEq(data[prop], value, "array getter worked for " + prop);
       return get({[prop]: undefined});
     }).then(data => {
       browser.test.assertEq(data[prop], value, "object getter worked for " + prop);
+      return browser.storage.local.get(prop).then(data => {
+        browser.test.assertEq(data[prop], value, "promise getter worked for " + prop);
+      });
     });
   }
 
   let globalChanges = {};
 
   browser.storage.onChanged.addListener((changes, storage) => {
     browser.test.assertEq(storage, "local", "storage is local");
     Object.assign(globalChanges, changes);