Bug 1265837 - Implement browser.history.deleteUrl, r?aswan draft
authorBob Silverberg <bsilverberg@mozilla.com>
Thu, 28 Apr 2016 08:37:04 -0400
changeset 357284 c0e671a84bc74efd3a310a987cbafe7f9cf98ca7
parent 356939 9496419166c1f105c46936f92492ea7bb1003b70
child 357418 1933fc4f86bf3d40635c93aa70548251453c410b
child 357419 42127cebd356ee27e2dcb194ae2f34a633e95100
child 357421 30224fa60b313264fd385a2c64431a37ea04c4c0
child 357450 485f5183d31bc443442c1302d335730ddaa3cdd3
child 357451 8a2af60231a7daa5c1de5963f15f3b0991c82c8c
child 357830 e82aba28d0b26dd0e9853bfe4f3ac7153647aae6
child 358334 655b596d000236ee8a929af49ac8d5d6e33d5ca6
push id16751
push userbmo:bob.silverberg@gmail.com
push dateThu, 28 Apr 2016 12:39:27 +0000
reviewersaswan
bugs1265837
milestone48.0a1
Bug 1265837 - Implement browser.history.deleteUrl, r?aswan MozReview-Commit-ID: AzVWzviLkGQ
browser/components/extensions/ext-history.js
browser/components/extensions/schemas/history.json
browser/components/extensions/test/browser/browser_ext_history.js
browser/components/extensions/test/browser/head.js
--- a/browser/components/extensions/ext-history.js
+++ b/browser/components/extensions/ext-history.js
@@ -1,9 +1,22 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
+
+XPCOMUtils.defineLazyGetter(this, "History", () => {
+  Cu.import("resource://gre/modules/PlacesUtils.jsm");
+  return PlacesUtils.history;
+});
+
 extensions.registerSchemaAPI("history", "history", (extension, context) => {
   return {
-    history: {},
+    history: {
+      deleteUrl: function(details) {
+        let url = details.url;
+        // History.remove returns a boolean, but our API should return nothing
+        return History.remove(url).then(() => undefined);
+      },
+    },
   };
 });
--- a/browser/components/extensions/schemas/history.json
+++ b/browser/components/extensions/schemas/history.json
@@ -195,17 +195,16 @@
             "type": "function",
             "optional": true,
             "parameters": []
           }
         ]
       },
       {
         "name": "deleteUrl",
-        "unsupported": true,
         "type": "function",
         "description": "Removes all occurrences of the given URL from the history.",
         "async": "callback",
         "parameters": [
           {
             "name": "details",
             "type": "object",
             "properties": {
--- a/browser/components/extensions/test/browser/browser_ext_history.js
+++ b/browser/components/extensions/test/browser/browser_ext_history.js
@@ -1,20 +1,58 @@
 /* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim: set sts=2 sw=2 et tw=80: */
 "use strict";
 
+XPCOMUtils.defineLazyModuleGetter(this, "PlacesTestUtils",
+                                  "resource://testing-common/PlacesTestUtils.jsm");
+
 add_task(function* test_history_schema() {
   function background() {
     browser.test.assertTrue(browser.history, "browser.history API exists");
     browser.test.notifyPass("history-schema");
   }
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       permissions: ["history"],
     },
     background: `(${background})()`,
   });
   yield extension.startup();
   yield extension.awaitFinish("history-schema");
   yield extension.unload();
 });
+
+add_task(function* test_delete_url() {
+  const TEST_URL = `http://example.com/${Math.random()}`;
+
+  function background() {
+    browser.test.onMessage.addListener((msg, url) => {
+      browser.history.deleteUrl({url: url}).then(result => {
+        browser.test.assertEq(undefined, result, "browser.history.deleteUrl returns nothing");
+        browser.test.sendMessage("url-deleted");
+      });
+    });
+
+    browser.test.sendMessage("ready");
+  }
+
+  let extension = ExtensionTestUtils.loadExtension({
+    manifest: {
+      permissions: ["history"],
+    },
+    background: `(${background})()`,
+  });
+
+  yield extension.startup();
+  yield PlacesTestUtils.clearHistory();
+  yield extension.awaitMessage("ready");
+
+  yield PlacesTestUtils.addVisits(TEST_URL);
+  ok(yield PlacesTestUtils.isPageInDB(TEST_URL), `${TEST_URL} found in history database`);
+
+  extension.sendMessage("delete-url", TEST_URL);
+  yield extension.awaitMessage("url-deleted");
+  ok(!(yield PlacesTestUtils.isPageInDB(TEST_URL)), `${TEST_URL} not found in history database`);
+
+  yield extension.unload();
+});
--- a/browser/components/extensions/test/browser/head.js
+++ b/browser/components/extensions/test/browser/head.js
@@ -131,9 +131,8 @@ function closePageAction(extension, win 
   if (node) {
     return promisePopupShown(node).then(() => {
       node.hidePopup();
     });
   }
 
   return Promise.resolve();
 }
-