Fix for bug 103883. Add weak ref support for prefs observers to help reduce MLK cycles with preferences. r=ccarlen, darin, gordon, hewitt, mstoltz, srilatha, sspitzer. sr=alecf.

This commit is contained in:
bnesse%netscape.com 2006-09-14 06:00:34 +00:00
Родитель 10388d6226
Коммит b154c13b46
2 изменённых файлов: 72 добавлений и 37 удалений

Просмотреть файл

@ -50,8 +50,7 @@ var gLastValidURL = "";
var gHaveUpdatedToolbarState = false; var gHaveUpdatedToolbarState = false;
var gClickSelectsAll = -1; var gClickSelectsAll = -1;
var pref = Components.classes["@mozilla.org/preferences;1"] var pref = null;
.getService(Components.interfaces.nsIPref);
var appCore = null; var appCore = null;
@ -133,7 +132,7 @@ function UpdateInternetSearchResults(event)
var searchInProgressFlag = search.FindInternetSearchResults(url); var searchInProgressFlag = search.FindInternetSearchResults(url);
if (searchInProgressFlag) { if (searchInProgressFlag) {
var autoOpenSearchPanel = pref.GetBoolPref("browser.search.opensidebarsearchpanel"); var autoOpenSearchPanel = pref.getBoolPref("browser.search.opensidebarsearchpanel");
if (autoOpenSearchPanel) if (autoOpenSearchPanel)
RevealSearchPanel(); RevealSearchPanel();
@ -168,7 +167,8 @@ function getHomePage()
{ {
var url; var url;
try { try {
url = pref.getLocalizedUnicharPref("browser.startup.homepage"); url = pref.getComplexValue("browser.startup.homepage",
Components.interfaces.nsIPrefLocalizedString);
} catch (e) { } catch (e) {
} }
@ -204,7 +204,9 @@ function UpdateBackForwardButtons()
function nsButtonPrefListener() function nsButtonPrefListener()
{ {
try { try {
pref.addObserver(this.domain, this); var pbi = pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.addObserver(this.domain, this, false);
} catch(ex) { } catch(ex) {
dump("Failed to observe prefs: " + ex + "\n"); dump("Failed to observe prefs: " + ex + "\n");
} }
@ -224,7 +226,7 @@ nsButtonPrefListener.prototype =
var buttonId = buttonName + "-button"; var buttonId = buttonName + "-button";
var button = document.getElementById(buttonId); var button = document.getElementById(buttonId);
var show = pref.GetBoolPref(prefName); var show = pref.getBoolPref(prefName);
if (show) if (show)
button.setAttribute("hidden","false"); button.setAttribute("hidden","false");
else else
@ -275,6 +277,13 @@ function Startup()
if (!appCore) if (!appCore)
throw "couldn't create a browser instance"; throw "couldn't create a browser instance";
// Get the preferences service
var prefService = Components.classes["@mozilla.org/preferences-service;1"]
.getService(Components.interfaces.nsIPrefService);
if (!prefService)
throw "couldn't create a preferences service";
pref = prefService.getBranch(null);
webNavigation = getWebNavigation(); webNavigation = getWebNavigation();
if (!webNavigation) if (!webNavigation)
throw "no XBL binding for browser"; throw "no XBL binding for browser";
@ -447,7 +456,9 @@ function Shutdown()
BrowserFlushBookmarksAndHistory(); BrowserFlushBookmarksAndHistory();
// unregister us as a pref listener // unregister us as a pref listener
pref.removeObserver(window.buttonPrefListener.domain, var pbi = pref.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.removeObserver(window.buttonPrefListener.domain,
window.buttonPrefListener); window.buttonPrefListener);
window.browserContentListener.close(); window.browserContentListener.close();
@ -458,8 +469,8 @@ function Shutdown()
function Translate() function Translate()
{ {
var service = pref.CopyCharPref("browser.translation.service"); var service = pref.getCharPref("browser.translation.service");
var serviceDomain = pref.CopyCharPref("browser.translation.serviceDomain"); var serviceDomain = pref.getCharPref("browser.translation.serviceDomain");
// XXX This somehow causes a big leak, back to the old way // XXX This somehow causes a big leak, back to the old way
// till we figure out why. See bug 61886. // till we figure out why. See bug 61886.
@ -685,8 +696,9 @@ function OpenSearch(tabName, forceDialogFlag, searchStr)
var forceAsURL = urlmatch.test(searchStr); var forceAsURL = urlmatch.test(searchStr);
try { try {
autoOpenSearchPanel = pref.GetBoolPref("browser.search.opensidebarsearchpanel"); autoOpenSearchPanel = pref.getBoolPref("browser.search.opensidebarsearchpanel");
defaultSearchURL = pref.getLocalizedUnicharPref("browser.search.defaulturl"); defaultSearchURL = pref.getComplexValue("browser.search.defaulturl",
Components.interfaces.nsIPrefLocalizedString);
} catch (ex) { } catch (ex) {
} }
@ -709,7 +721,7 @@ function OpenSearch(tabName, forceDialogFlag, searchStr)
} else { } else {
var searchMode = 0; var searchMode = 0;
try { try {
searchMode = pref.GetIntPref("browser.search.powermode"); searchMode = pref.getIntPref("browser.search.powermode");
} catch(ex) { } catch(ex) {
} }
if (forceDialogFlag || searchMode == 1) { if (forceDialogFlag || searchMode == 1) {
@ -736,7 +748,7 @@ function OpenSearch(tabName, forceDialogFlag, searchStr)
searchDS.RememberLastSearchText(escapedSearchStr); searchDS.RememberLastSearchText(escapedSearchStr);
try { try {
var searchEngineURI = pref.CopyCharPref("browser.search.defaultengine"); var searchEngineURI = pref.getCharPref("browser.search.defaultengine");
if (searchEngineURI) { if (searchEngineURI) {
var searchURL = getSearchUrl("actionButton"); var searchURL = getSearchUrl("actionButton");
if (searchURL) { if (searchURL) {
@ -944,7 +956,7 @@ function BrowserLoadURL()
if (url.match(/^view-source:/)) { if (url.match(/^view-source:/)) {
BrowserViewSourceOfURL(url.replace(/^view-source:/, ""), null); BrowserViewSourceOfURL(url.replace(/^view-source:/, ""), null);
} else { } else {
if (pref && pref.GetBoolPref("browser.tabs.opentabfor.urlbar") && getBrowser().localName == "tabbrowser") { if (pref && pref.getBoolPref("browser.tabs.opentabfor.urlbar") && getBrowser().localName == "tabbrowser") {
var t = getBrowser().addTab(getShortcutOrURI(url)); // open link in new tab var t = getBrowser().addTab(getShortcutOrURI(url)); // open link in new tab
getBrowser().selectedTab = t; getBrowser().selectedTab = t;
} }
@ -1362,7 +1374,9 @@ function applyTheme(themeName)
chromeRegistry.uninstallSkin( themeName.getAttribute("name"), true ); chromeRegistry.uninstallSkin( themeName.getAttribute("name"), true );
// XXX - this sucks and should only be temporary. // XXX - this sucks and should only be temporary.
pref.SetUnicharPref("general.skins.removelist." + themeName.getAttribute("name"), true); pref.setComplexValue("general.skins.removelist." + themeName.getAttribute("name"),
Components.interfaces.nsISupportsWString,
true);
if (inUse) if (inUse)
chromeRegistry.refreshSkins(); chromeRegistry.refreshSkins();
@ -1374,7 +1388,9 @@ function applyTheme(themeName)
// XXX XXX BAD BAD BAD BAD !! XXX XXX // XXX XXX BAD BAD BAD BAD !! XXX XXX
// we STILL haven't fixed editor skin switch problems // we STILL haven't fixed editor skin switch problems
// hacking around it yet again // hacking around it yet again
pref.SetUnicharPref("general.skins.selectedSkin", themeName.getAttribute("name")); pref.setComplexValue("general.skins.selectedSkin",
Components.interfaces.nsISupportsWString,
themeName.getAttribute("name"));
var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); var observerService = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService);
observerService.notifyObservers(null, "skin-selected", null); observerService.notifyObservers(null, "skin-selected", null);
@ -1398,7 +1414,7 @@ function URLBarFocusHandler(aEvent)
{ {
if (gURLBar) { if (gURLBar) {
if (gClickSelectsAll == -1) if (gClickSelectsAll == -1)
gClickSelectsAll = pref.GetBoolPref("browser.urlbar.clickSelectsAll"); gClickSelectsAll = pref.getBoolPref("browser.urlbar.clickSelectsAll");
if (gClickSelectsAll) if (gClickSelectsAll)
gURLBar.setSelectionRange(0, gURLBar.textLength); gURLBar.setSelectionRange(0, gURLBar.textLength);
} }

Просмотреть файл

@ -8,19 +8,25 @@
<binding id="urlbar" extends="chrome://global/content/autocomplete.xml#autocomplete"> <binding id="urlbar" extends="chrome://global/content/autocomplete.xml#autocomplete">
<implementation> <implementation>
<constructor><![CDATA[ <constructor><![CDATA[
this.mPrefs.addObserver("browser.urlbar", this.mPrefObserver); var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.addObserver("browser.urlbar", this.mPrefObserver, false);
this.updatePref("browser.urlbar.showPopup"); this.updatePref("browser.urlbar.showPopup");
this.updatePref("browser.urlbar.autoFill"); this.updatePref("browser.urlbar.autoFill");
]]></constructor> ]]></constructor>
<destructor><![CDATA[ <destructor><![CDATA[
this.mPrefs.removeObserver("browser.urlbar", this.mPrefObserver); var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
if (pbi)
pbi.removeObserver("browser.urlbar", this.mPrefObserver);
]]></destructor> ]]></destructor>
<property name="mPrefs"> <field name="mPrefs">
Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPref); var svc = Components.classes["@mozilla.org/preferences-service;1"]
</property> .getService(Components.interfaces.nsIPrefService);
svc.getBranch(null);
</field>
<property name="mPrefObserver"><![CDATA[ <property name="mPrefObserver"><![CDATA[
({ ({
@ -37,9 +43,9 @@
<parameter name="aPref"/> <parameter name="aPref"/>
<body><![CDATA[ <body><![CDATA[
if (!aPref.indexOf("browser.urlbar.showPopup")) { if (!aPref.indexOf("browser.urlbar.showPopup")) {
this.showPopup = this.mPrefs.GetBoolPref("browser.urlbar.showPopup"); this.showPopup = this.mPrefs.getBoolPref("browser.urlbar.showPopup");
} else if (!aPref.indexOf("browser.urlbar.autoFill")) { } else if (!aPref.indexOf("browser.urlbar.autoFill")) {
this.autoFill = this.mPrefs.GetBoolPref("browser.urlbar.autoFill"); this.autoFill = this.mPrefs.getBoolPref("browser.urlbar.autoFill");
} }
]]></body> ]]></body>
</method> </method>
@ -60,13 +66,19 @@
<implementation> <implementation>
<constructor><![CDATA[ <constructor><![CDATA[
// listen for changes to default search engine // listen for changes to default search engine
this.mPrefs.addObserver("browser.search", this.mPrefObserver); var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
this.mPrefs.addObserver("browser.urlbar", this.mPrefObserver); if (pbi) {
pbi.addObserver("browser.search", this.mPrefObserver, false);
pbi.addObserver("browser.urlbar", this.mPrefObserver, false);
}
]]></constructor> ]]></constructor>
<destructor><![CDATA[ <destructor><![CDATA[
this.mPrefs.removeObserver("browser.search", this.mPrefObserver); var pbi = this.mPrefs.QueryInterface(Components.interfaces.nsIPrefBranchInternal);
this.mPrefs.removeObserver("browser.urlbar", this.mPrefObserver); if (pbi) {
pbi.removeObserver("browser.search", this.mPrefObserver);
pbi.removeObserver("browser.urlbar", this.mPrefObserver);
}
]]></destructor> ]]></destructor>
<property name="selectedIndex" <property name="selectedIndex"
@ -108,9 +120,11 @@
document.getAnonymousElementByAttribute(this, "role", "search-box"); document.getAnonymousElementByAttribute(this, "role", "search-box");
</property> </property>
<property name="mPrefs"> <field name="mPrefs">
Components.classes["@mozilla.org/preferences;1"].getService(Components.interfaces.nsIPref); var svc = Components.classes["@mozilla.org/preferences-service;1"]
</property> .getService(Components.interfaces.nsIPrefService);
svc.getBranch(null);
</field>
<property name="mPrefObserver"><![CDATA[ <property name="mPrefObserver"><![CDATA[
({ ({
@ -155,7 +169,7 @@
<parameter name="aPref"/> <parameter name="aPref"/>
<body><![CDATA[ <body><![CDATA[
if (!aPref.indexOf("browser.urlbar.showSearch")) if (!aPref.indexOf("browser.urlbar.showSearch"))
this.showSearch = this.mPrefs.GetBoolPref("browser.urlbar.showSearch"); this.showSearch = this.mPrefs.getBoolPref("browser.urlbar.showSearch");
]]></body> ]]></body>
</method> </method>
@ -196,10 +210,12 @@
var defaultEngine = null; var defaultEngine = null;
try { try {
defaultEngine = this.mPrefs.CopyUnicharPref("browser.search.defaultengine"); defaultEngine = this.mPrefs.getComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsWString);
} catch(ex) { } catch(ex) {
this.ensureDefaultEnginePrefs(rdf, ds); this.ensureDefaultEnginePrefs(rdf, ds);
defaultEngine = this.mPrefs.CopyUnicharPref("browser.search.defaultengine"); defaultEngine = this.mPrefs.getComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsWString);
} }
if (defaultEngine) { if (defaultEngine) {
@ -227,7 +243,8 @@
<parameter name="aRDF"/> <parameter name="aRDF"/>
<parameter name="aDS"/> <parameter name="aDS"/>
<body><![CDATA[ <body><![CDATA[
var defaultName = this.mPrefs.getLocalizedUnicharPref("browser.search.defaultenginename"); var defaultName = this.mPrefs.getComplexValue("browser.search.defaultenginename",
Components.interfaces.nsIPrefLocalizedString);
const kNC_Root = aRDF.GetResource("NC:SearchEngineRoot"); const kNC_Root = aRDF.GetResource("NC:SearchEngineRoot");
const kNC_child = aRDF.GetResource("http://home.netscape.com/NC-rdf#child"); const kNC_child = aRDF.GetResource("http://home.netscape.com/NC-rdf#child");
const kNC_Name = aRDF.GetResource("http://home.netscape.com/NC-rdf#Name"); const kNC_Name = aRDF.GetResource("http://home.netscape.com/NC-rdf#Name");
@ -237,7 +254,9 @@
var engineRes = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource); var engineRes = arcs.getNext().QueryInterface(Components.interfaces.nsIRDFResource);
var name = this.readRDFString(aDS, engineRes, kNC_Name); var name = this.readRDFString(aDS, engineRes, kNC_Name);
if (name == defaultName) if (name == defaultName)
this.mPrefs.SetUnicharPref("browser.search.defaultengine", engineRes.Value); this.mPrefs.setComplexValue("browser.search.defaultengine",
Components.interfaces.nsISupportsWString,
engineRes.Value);
} }
]]></body> ]]></body>
</method> </method>