From 565ea12254084972e4234673cc6d6cbc25d77557 Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Thu, 17 Feb 2011 13:25:59 -0800 Subject: [PATCH] Bug 633575 - Preference/tools panels are broken if opened during initial page load [r=mfinkle] --HG-- extra : rebase_source : 73b6cc16c4a0f7cfde9b86e830ba685127a2837a --- mobile/chrome/content/browser-ui.js | 20 ++++++++++++++++++-- mobile/chrome/content/console.js | 17 ++++------------- mobile/chrome/content/downloads.js | 13 +++---------- mobile/chrome/content/extensions.js | 13 +++---------- mobile/chrome/content/preferences.js | 21 ++------------------- mobile/chrome/tests/browser_addons.js | 2 +- 6 files changed, 31 insertions(+), 55 deletions(-) diff --git a/mobile/chrome/content/browser-ui.js b/mobile/chrome/content/browser-ui.js index c08a9e4dbcf..144021e1520 100644 --- a/mobile/chrome/content/browser-ui.js +++ b/mobile/chrome/content/browser-ui.js @@ -500,10 +500,9 @@ var BrowserUI = { Elements.tabs.addEventListener("TabOpen", BrowserUI, true); Elements.tabs.addEventListener("TabRemove", BrowserUI, true); - // Init the views + // Init the tool panel views ExtensionsView.init(); DownloadsView.init(); - PreferencesView.init(); ConsoleView.init(); #ifdef MOZ_IPC @@ -535,6 +534,23 @@ var BrowserUI = { #endif }, false); + let panels = document.getElementById("panel-items"); + let panelViews = { // Use strings to avoid lazy-loading objects too soon. + "prefs-container": "PreferencesView", + "downloads-container": "DownloadsView", + "addons-container": "ExtensionsView", + "console-container": "ConsoleView" + }; + + // Some initialization can be delayed until a panel is selected. + panels.addEventListener("select", function(aEvent) { + if (aEvent.target != panels) + return; + let viewName = panelViews[panels.selectedPanel.id]; + if (viewName) + window[viewName].delayedInit(); + }, true); + #ifndef MOZ_OFFICIAL_BRANDING setTimeout(function() { let startup = Cc["@mozilla.org/toolkit/app-startup;1"].getService(Ci.nsIAppStartup_MOZILLA_2_0).getStartupInfo(); diff --git a/mobile/chrome/content/console.js b/mobile/chrome/content/console.js index 8c8bf4b17b2..de0ce20d6f2 100644 --- a/mobile/chrome/content/console.js +++ b/mobile/chrome/content/console.js @@ -56,16 +56,6 @@ let ConsoleView = { this._count = 0; this.limit = 250; - let self = this; - let panels = document.getElementById("panel-items"); - - panels.addEventListener("select", - function(aEvent) { - if (panels.selectedPanel.id == "console-container") - self._delayedInit(); - }, - false); - try { // update users using the legacy pref if (Services.prefs.getBoolPref("browser.console.showInPanel")) { @@ -79,11 +69,13 @@ let ConsoleView = { Services.prefs.addObserver(this._enabledPref, this, false); }, - _delayedInit: function cv__delayedInit() { + delayedInit: function cv__delayedInit() { if (this._inited) return; this._inited = true; + this.init(); // In case the panel is selected before init has been called. + Services.console.registerListener(this); this.appendInitialItems(); @@ -94,8 +86,7 @@ let ConsoleView = { this._evalFrame.collapsed = true; document.getElementById("console-container").appendChild(this._evalFrame); - let self = this; - this._evalFrame.addEventListener("load", function() { self.loadOrDisplayResult(); }, true); + this._evalFrame.addEventListener("load", this.loadOrDisplayResult.bind(this), true); }, uninit: function cv_uninit() { diff --git a/mobile/chrome/content/downloads.js b/mobile/chrome/content/downloads.js index 4aea6d4c7b2..75001b595b6 100644 --- a/mobile/chrome/content/downloads.js +++ b/mobile/chrome/content/downloads.js @@ -146,21 +146,14 @@ var DownloadsView = { // Monitor downloads being removed by the download manager (non-UI) os.addObserver(this, "download-manager-remove-download", true); - - let self = this; - let panels = document.getElementById("panel-items"); - panels.addEventListener("select", - function(aEvent) { - if (panels.selectedPanel.id == "downloads-container") - self._delayedInit(); - }, - false); }, - _delayedInit: function dv__delayedInit() { + delayedInit: function dv__delayedInit() { if (this._list) return; + this.init(); // In case the panel is selected before init has been called. + this._list = document.getElementById("downloads-list"); if (this._dlmgr == null) diff --git a/mobile/chrome/content/extensions.js b/mobile/chrome/content/extensions.js index 9f2c0e9dba8..6069540eb68 100644 --- a/mobile/chrome/content/extensions.js +++ b/mobile/chrome/content/extensions.js @@ -225,15 +225,6 @@ var ExtensionsView = { if (!Services.prefs.getBoolPref("extensions.hideUpdateButton")) document.getElementById("addons-update-all").hidden = false; - let self = this; - let panels = document.getElementById("panel-items"); - panels.addEventListener("select", - function(aEvent) { - if (panels.selectedPanel.id == "addons-container") - self._delayedInit(); - }, - false); - #ifdef ANDROID // Hide the notification let alertsService = Cc["@mozilla.org/alerts-service;1"].getService(Ci.nsIAlertsService); @@ -243,10 +234,12 @@ var ExtensionsView = { #endif }, - _delayedInit: function ev__delayedInit() { + delayedInit: function ev__delayedInit() { if (this._list) return; + this.init(); // In case the panel is selected before init has been called. + this._list = document.getElementById("addons-list"); this._localItem = document.getElementById("addons-local"); this._repoItem = document.getElementById("addons-repo"); diff --git a/mobile/chrome/content/preferences.js b/mobile/chrome/content/preferences.js index 359c39cd37b..25c144000eb 100644 --- a/mobile/chrome/content/preferences.js +++ b/mobile/chrome/content/preferences.js @@ -97,28 +97,11 @@ var PreferencesView = { } }, - init: function ev_init() { - if (this._msg) - return; - - this._msg = document.getElementById("prefs-messages"); - - let self = this; - let panels = document.getElementById("panel-items"); - panels.addEventListener("select", - function(aEvent) { - if (aEvent.target != panels) - return; - if (panels.selectedPanel.id == "prefs-container") - self._delayedInit(); - }, - false); - }, - - _delayedInit: function pv__delayedInit() { + delayedInit: function pv__delayedInit() { if (this._languages) return; + this._msg = document.getElementById("prefs-messages"); this._languages = document.getElementById("prefs-languages"); this._loadLocales(); diff --git a/mobile/chrome/tests/browser_addons.js b/mobile/chrome/tests/browser_addons.js index c12aa5adde2..00d14a8252c 100644 --- a/mobile/chrome/tests/browser_addons.js +++ b/mobile/chrome/tests/browser_addons.js @@ -269,7 +269,7 @@ function open_manager(aView, aCallback) { BrowserUI.showPanel("addons-container"); ExtensionsView.init(); - ExtensionsView._delayedInit(); + ExtensionsView.delayedInit(); window.addEventListener("ViewChanged", function() { window.removeEventListener("ViewChanged", arguments.callee, true);