зеркало из https://github.com/mozilla/gecko-dev.git
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:
Родитель
10388d6226
Коммит
b154c13b46
|
@ -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>
|
||||||
|
|
Загрузка…
Ссылка в новой задаче