Bug 595395 - Add pin events to AllTabs.jsm [r=dolske, a=dolske]
authorRaymond Lee <raymond@raysquare.com>
Wed, 10 Nov 2010 11:39:31 +0800
changeset 57555 91465c3b341b6697b248bb28c6a4276953e59c80
parent 57554 9b8ee895f234a4a7226f2b8a75e8e399d8ce7777
child 57556 2192654e75c511c17a5bb6d32f409d7b1d65c113
push id1
push usershaver@mozilla.com
push dateTue, 04 Jan 2011 17:58:04 +0000
reviewersdolske, dolske
bugs595395
milestone2.0b8pre
Bug 595395 - Add pin events to AllTabs.jsm [r=dolske, a=dolske]
browser/base/content/tabview/modules/AllTabs.jsm
browser/base/content/tabview/ui.js
browser/base/content/test/tabview/Makefile.in
browser/base/content/test/tabview/browser_tabview_alltabs.js
--- a/browser/base/content/tabview/modules/AllTabs.jsm
+++ b/browser/base/content/tabview/modules/AllTabs.jsm
@@ -54,17 +54,17 @@ let AllTabs = {
     }));
   },
 
   /**
    * Attach a callback for a given tab event.
    *
    * @param eventName
    *        Name of the corresponding Tab* Event; one of "attrModified",
-   *        "close", "move", "open", "select".
+   *        "close", "move", "open", "select", "pinned", "unpinned".
    * @param callback
    *        Callback that gets called with the tab as the first argument and
    *        the event as the second argument.
    * @usage AllTabs.register("change", function handleChange(tab, event) {});
    */
   register: function register(eventName, callback) {
     // Either add additional callbacks or create the first entry
     let listeners = eventListeners[eventName];
@@ -74,17 +74,17 @@ let AllTabs = {
       eventListeners[eventName] = [callback];
   },
 
   /**
    * Remove a callback for a given tab event.
    *
    * @param eventName
    *        Name of the corresponding Tab* Event; one of "attrModified",
-   *        "close", "move", "open", "select".
+   *        "close", "move", "open", "select", "pinned", "unpinned".
    * @param callback
    *        The callback given for the original AllTabs.register call.
    * @usage AllTabs.unregister("close", handleClose);
    */
   unregister: function unregister(eventName, callback) {
     // Nothing to remove for this event
     let listeners = eventListeners[eventName];
     if (!listeners)
@@ -102,17 +102,17 @@ let AllTabs = {
 __defineGetter__("browserWindows", function browserWindows() {
   let browserWindows = [];
   let windows = Services.wm.getEnumerator("navigator:browser");
   while (windows.hasMoreElements())
     browserWindows.push(windows.getNext());
   return browserWindows;
 });
 
-let events = ["attrModified", "close", "move", "open", "select"];
+let events = ["attrModified", "close", "move", "open", "select", "pinned", "unpinned"];
 let eventListeners = {};
 
 function registerBrowserWindow(browserWindow) {
   events.forEach(function(eventName) {
     let tabEvent = "Tab" + eventName[0].toUpperCase() + eventName.slice(1);
     browserWindow.addEventListener(tabEvent, function(event) {
       // Make sure we've gotten listeners before trying to call
       let listeners = eventListeners[eventName];
--- a/browser/base/content/tabview/ui.js
+++ b/browser/base/content/tabview/ui.js
@@ -641,41 +641,37 @@ let UI = {
     // TabSelect
     this._eventListeners.select = function(tab) {
       if (tab.ownerDocument.defaultView != gWindow)
         return;
 
       self.onTabSelect(tab);
     };
 
+    // TabPinned
+    this._eventListeners.pinned = function(tab) {
+      if (tab.ownerDocument.defaultView != gWindow)
+        return;
+
+      TabItems.handleTabPin(tab);
+      GroupItems.addAppTab(tab);
+    };
+
+    // TabUnpinned
+    this._eventListeners.unpinned = function(tab) {
+      if (tab.ownerDocument.defaultView != gWindow)
+        return;
+
+      TabItems.handleTabUnpin(tab);
+      GroupItems.removeAppTab(tab);
+    };
+
     // Actually register the above handlers
     for (let name in this._eventListeners)
       AllTabs.register(name, this._eventListeners[name]);
-
-    // Start watching for tab pin events, and set up our uninit for same.
-    function handleTabPin(event) {
-      TabItems.handleTabPin(event.originalTarget);
-      GroupItems.addAppTab(event.originalTarget);
-    }
-
-    gBrowser.tabContainer.addEventListener("TabPinned", handleTabPin, false);
-    this._cleanupFunctions.push(function() {
-      gBrowser.tabContainer.removeEventListener("TabPinned", handleTabPin, false);
-    });
-
-    // Start watching for tab unpin events, and set up our uninit for same.
-    function handleTabUnpin(event) {
-      TabItems.handleTabUnpin(event.originalTarget);
-      GroupItems.removeAppTab(event.originalTarget);
-    }
-
-    gBrowser.tabContainer.addEventListener("TabUnpinned", handleTabUnpin, false);
-    this._cleanupFunctions.push(function() {
-      gBrowser.tabContainer.removeEventListener("TabUnpinned", handleTabUnpin, false);
-    });
   },
 
   // ----------
   // Function: _removeTabActionHandlers
   // Removes handlers to handle tab actions.
   _removeTabActionHandlers: function UI__removeTabActionHandlers() {
     for (let name in this._eventListeners)
       AllTabs.unregister(name, this._eventListeners[name]);
--- a/browser/base/content/test/tabview/Makefile.in
+++ b/browser/base/content/test/tabview/Makefile.in
@@ -39,16 +39,17 @@ topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 relativesrcdir  = browser/base/content/test/tabview
 
 include $(DEPTH)/config/autoconf.mk
 include $(topsrcdir)/config/rules.mk
 
 _BROWSER_FILES = \
+                 browser_tabview_alltabs.js \
                  browser_tabview_apptabs.js \
                  browser_tabview_bug580412.js \
                  browser_tabview_bug587043.js \
                  browser_tabview_bug587990.js \
                  browser_tabview_bug589324.js \
                  browser_tabview_bug590606.js \
                  browser_tabview_bug591706.js \
                  browser_tabview_bug594176.js \
new file mode 100644
--- /dev/null
+++ b/browser/base/content/test/tabview/browser_tabview_alltabs.js
@@ -0,0 +1,72 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * The Original Code is a test for bug 595395.
+ *
+ * The Initial Developer of the Original Code is
+ * Mozilla Foundation.
+ * Portions created by the Initial Developer are Copyright (C) 2010
+ * the Initial Developer. All Rights Reserved.
+ *
+ * Contributor(s):
+ * Raymond Lee <raymond@appcoast.com>
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+Cu.import("resource:///modules/tabview/AllTabs.jsm");
+
+function test() {
+  waitForExplicitFinish();
+
+  let newTab = gBrowser.addTab();
+
+  // TabPinned
+  let pinned = function(tab) {
+    is(tab, newTab, "The tabs are the same after the tab is pinned");
+    ok(tab.pinned, "The tab gets pinned");
+
+    gBrowser.unpinTab(tab);
+  };
+
+  // TabUnpinned
+  let unpinned = function(tab) {
+    AllTabs.unregister("pinned", pinned);
+    AllTabs.unregister("unpinned", unpinned);
+
+    is(tab, newTab, "The tabs are the same after the tab is unpinned");
+    ok(!tab.pinned, "The tab gets unpinned");
+
+    // clean up and finish
+    gBrowser.removeTab(tab);
+    finish();
+  };
+
+  AllTabs.register("pinned", pinned);
+  AllTabs.register("unpinned", unpinned);
+
+  ok(!newTab.pinned, "The tab is not pinned");
+  gBrowser.pinTab(newTab);
+}
+