Bug 1280582 - Implement browser.history.onTitleChanged. r?bsilverberg draft
authorTushar Saini (:shatur) <tushar.saini1285@gmail.com>
Wed, 08 Mar 2017 21:18:19 +0530
changeset 496746 483374cb6902f8f763ed05aea58ecd910cfb676c
parent 494872 58753259bfeb3b818eac7870871b0aae1f8de64a
child 548693 8befb5a1cdac2e264b69450e8026cf8bae68ded3
push id48684
push userbmo:tushar.saini1285@gmail.com
push dateFri, 10 Mar 2017 17:01:13 +0000
reviewersbsilverberg
bugs1280582
milestone55.0a1
Bug 1280582 - Implement browser.history.onTitleChanged. r?bsilverberg MozReview-Commit-ID: jzil9lDYnN
browser/components/extensions/ext-history.js
browser/components/extensions/schemas/history.json
browser/components/extensions/test/xpcshell/test_ext_history.js
--- a/browser/components/extensions/ext-history.js
+++ b/browser/components/extensions/ext-history.js
@@ -108,17 +108,19 @@ function getObserver() {
           lastVisitTime: time / 1000,  // time from Places is microseconds,
           visitCount,
           typedCount: typed,
         };
         this.emit("visited", data);
       },
       onBeginUpdateBatch: function() {},
       onEndUpdateBatch: function() {},
-      onTitleChanged: function() {},
+      onTitleChanged: function(uri, title) {
+        this.emit("titleChanged", {url: uri.spec, title: title});
+      },
       onClearHistory: function() {
         this.emit("visitRemoved", {allHistory: true, urls: []});
       },
       onPageChanged: function() {},
       onFrecencyChanged: function() {},
       onManyFrecenciesChanged: function() {},
       onDeleteVisits: function(uri, time, guid, reason) {
         this.emit("visitRemoved", {allHistory: false, urls: [uri.spec]});
@@ -236,11 +238,22 @@ extensions.registerSchemaAPI("history", 
           fire.sync(data);
         };
 
         getObserver().on("visitRemoved", listener);
         return () => {
           getObserver().off("visitRemoved", listener);
         };
       }).api(),
+
+      onTitleChanged: new SingletonEventManager(context, "history.onTitleChanged", fire => {
+        let listener = (event, data) => {
+          fire.sync(data);
+        };
+
+        getObserver().on("titleChanged", listener);
+        return () => {
+          getObserver().off("titleChanged", listener);
+        };
+      }).api(),
     },
   };
 });
--- a/browser/components/extensions/schemas/history.json
+++ b/browser/components/extensions/schemas/history.json
@@ -305,12 +305,33 @@
                 "type": "array",
                 "items": {
                   "type": "string"
                 }
               }
             }
           }
         ]
+      },
+      {
+        "name": "onTitleChanged",
+        "type": "function",
+        "description": "Fired when the title of a URL is changed in the browser history.",
+        "parameters": [
+          {
+            "name": "changed",
+            "type": "object",
+            "properties": {
+              "url": {
+                "type": "string",
+                "description": "The URL for which the title has changed"
+              },
+              "title": {
+                "type": "string",
+                "description": "The new title for the URL."
+              }
+            }
+          }
+        ]
       }
     ]
   }
 ]
--- a/browser/components/extensions/test/xpcshell/test_ext_history.js
+++ b/browser/components/extensions/test/xpcshell/test_ext_history.js
@@ -417,31 +417,43 @@ add_task(function* test_on_visited() {
     {
       url: DOUBLE_VISIT_URL,
       title: `visit to ${DOUBLE_VISIT_URL}`,
       visits: [
         {date: new Date(visitDate += 1000)},
         {date: new Date(visitDate += 1000)},
       ],
     },
+    {
+      url: SINGLE_VISIT_URL,
+      title: "Title Changed",
+      visits: [
+        {date: new Date(visitDate)},
+      ],
+    },
   ];
 
   function background() {
     let onVisitedData = [];
 
     browser.history.onVisited.addListener(data => {
       if (data.url.includes("moz-extension")) {
         return;
       }
       onVisitedData.push(data);
-      if (onVisitedData.length == 3) {
+      if (onVisitedData.length == 4) {
         browser.test.sendMessage("on-visited-data", onVisitedData);
       }
     });
 
+    // Verifying onTitleChange Event along with onVisited event
+    browser.history.onTitleChanged.addListener(data => {
+      browser.test.sendMessage("on-title-changed-data", data);
+    });
+
     browser.test.sendMessage("ready");
   }
 
   let extension = ExtensionTestUtils.loadExtension({
     manifest: {
       permissions: ["history"],
     },
     background: `(${background})()`,
@@ -478,10 +490,19 @@ add_task(function* test_on_visited() {
   expected.title = PAGE_INFOS[1].title;
   expected.time = PAGE_INFOS[1].visits[0].date.getTime();
   checkOnVisitedData(1, expected);
 
   expected.time = PAGE_INFOS[1].visits[1].date.getTime();
   expected.visitCount = 2;
   checkOnVisitedData(2, expected);
 
+  expected.url = PAGE_INFOS[2].url;
+  expected.title = PAGE_INFOS[2].title;
+  expected.time = PAGE_INFOS[2].visits[0].date.getTime();
+  expected.visitCount = 2;
+  checkOnVisitedData(3, expected);
+
+  let onTitleChangedData = yield extension.awaitMessage("on-title-changed-data");
+  equal(onTitleChangedData.title, "Title Changed", "ontitleChanged received the expected title.");
+
   yield extension.unload();
 });