diff --git a/mozilla/browser/components/sessionstore/src/nsSessionStore.js b/mozilla/browser/components/sessionstore/src/nsSessionStore.js index f9cc8c9b7c7..e618764c89c 100644 --- a/mozilla/browser/components/sessionstore/src/nsSessionStore.js +++ b/mozilla/browser/components/sessionstore/src/nsSessionStore.js @@ -360,6 +360,42 @@ SessionStoreService.prototype = { /* ........ Window Event Handlers .............. */ + /** + * Implement nsIDOMEventListener for handling various window and tab events + */ + handleEvent: function sss_handleEvent(aEvent) { + switch (aEvent.type) { + case "load": + this.onTabLoad(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); + break; + case "pageshow": + this.onTabLoad(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); + break; + case "input": + this.onTabInput(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); + break; + case "DOMAutoComplete": + this.onTabInput(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); + break; + case "TabOpen": + case "TabClose": + var panelID = aEvent.originalTarget.linkedPanel; + var tabpanel = aEvent.originalTarget.ownerDocument.getElementById(panelID); + if (aEvent.type == "TabOpen") { + this.onTabAdd(aEvent.currentTarget.ownerDocument.defaultView, tabpanel); + } + else { + this.onTabClose(aEvent.currentTarget.ownerDocument.defaultView, tabpanel); + this.onTabRemove(aEvent.currentTarget.ownerDocument.defaultView, tabpanel); + } + break; + case "TabSelect": + var tabpanels = aEvent.currentTarget.mPanelContainer; + this.onTabSelect(aEvent.currentTarget.ownerDocument.defaultView, tabpanels); + break; + } + }, + /** * If it's the first window load since app start... * - determine if we're reloading after a crash or a forced-restart @@ -375,7 +411,7 @@ SessionStoreService.prototype = { // ignore non-browser windows if (aWindow.document.documentElement.getAttribute("windowtype") != "navigator:browser") return; - + // assign it a unique identifier (timestamp) aWindow.__SSi = "window" + Date.now(); @@ -411,16 +447,9 @@ SessionStoreService.prototype = { this.onTabAdd(aWindow, tabpanels.childNodes[i], true); } // notification of tab add/remove/selection - tabbrowser.addEventListener("TabOpen", function(aEvent) { - _this.onTabAdd(aEvent.currentTarget.ownerDocument.defaultView, aEvent.target); - }, false); - tabbrowser.addEventListener("TabClose", function(aEvent) { - _this.onTabClose(aEvent.currentTarget.ownerDocument.defaultView, aEvent.originalTarget); - _this.onTabRemove(aEvent.currentTarget.ownerDocument.defaultView, aEvent.target); - }, false); - tabbrowser.addEventListener("TabSelect", function(aEvent) { - _this.onTabSelect(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget); - }, false); + tabbrowser.addEventListener("TabOpen", this, true); + tabbrowser.addEventListener("TabClose", this, true); + tabbrowser.addEventListener("TabSelect", this, true); }, /** @@ -437,6 +466,10 @@ SessionStoreService.prototype = { var tabbrowser = aWindow.getBrowser(); var tabpanels = tabbrowser.mPanelContainer; + + tabbrowser.removeEventListener("TabOpen", this, true); + tabbrowser.removeEventListener("TabClose", this, true); + tabbrowser.removeEventListener("TabSelect", this, true); for (var i = 0; i < tabpanels.childNodes.length; i++) { this.onTabRemove(aWindow, tabpanels.childNodes[i], true); @@ -475,19 +508,10 @@ SessionStoreService.prototype = { * bool Do not save state if we're updating an existing tab */ onTabAdd: function sss_onTabAdd(aWindow, aPanel, aNoNotification) { - var _this = this; - aPanel.addEventListener("load", function(aEvent) { - _this.onTabLoad(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); - }, true); - aPanel.addEventListener("pageshow", function(aEvent) { - _this.onTabLoad(aEvent.currentTarget.ownerDocument.defaultView, aEvent.currentTarget, aEvent); - }, true); - aPanel.addEventListener("input", function(aEvent) { - _this.onTabInput(this.ownerDocument.defaultView, this, aEvent); - }, true); - aPanel.addEventListener("DOMAutoComplete", function(aEvent) { - _this.onTabInput(this.ownerDocument.defaultView, this, aEvent); - }, true); + aPanel.addEventListener("load", this, true); + aPanel.addEventListener("pageshow", this, true); + aPanel.addEventListener("input", this, true); + aPanel.addEventListener("DOMAutoComplete", this, true); if (!aNoNotification) { this.saveStateDelayed(aWindow); @@ -504,10 +528,10 @@ SessionStoreService.prototype = { * bool Do not save state if we're updating an existing tab */ onTabRemove: function sss_onTabRemove(aWindow, aPanel, aNoNotification) { - aPanel.removeEventListener("load", this.onTabLoad_proxy, true); - aPanel.removeEventListener("pageshow", this.onTabLoad_proxy, true); - aPanel.removeEventListener("input", this.onTabInput_proxy, true); - aPanel.removeEventListener("DOMAutoComplete", this.onTabInput_proxy, true); + aPanel.removeEventListener("load", this, true); + aPanel.removeEventListener("pageshow", this, true); + aPanel.removeEventListener("input", this, true); + aPanel.removeEventListener("DOMAutoComplete", this, true); delete aPanel.__SS_data; delete aPanel.__SS_text; @@ -1979,8 +2003,10 @@ SessionStoreService.prototype = { /* ........ QueryInterface .............. */ QueryInterface: function(aIID) { - if (!aIID.equals(Ci.nsISupports) && !aIID.equals(Ci.nsIObserver) && + if (!aIID.equals(Ci.nsISupports) && + !aIID.equals(Ci.nsIObserver) && !aIID.equals(Ci.nsISupportsWeakReference) && + !aIID.equals(Ci.nsIDOMEventListener) && !aIID.equals(Ci.nsISessionStore)) { Components.returnCode = Cr.NS_ERROR_NO_INTERFACE; return null;