зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1449317 - Update the default string in the address bar. r=florian
MozReview-Commit-ID: C00zxCTJmHY --HG-- extra : rebase_source : 459e7e14370a0c884bb394bde4ec5bf3edf1aadc
This commit is contained in:
Родитель
bf5ac484c7
Коммит
1f4fe4c185
|
@ -1267,6 +1267,8 @@ var gBrowserInit = {
|
|||
remoteType, sameProcessAsFrameLoader
|
||||
});
|
||||
|
||||
BrowserSearch.initPlaceHolder();
|
||||
|
||||
// Hack to ensure that the about:home favicon is loaded
|
||||
// instantaneously, to avoid flickering and improve perceived performance.
|
||||
this._callWithURIToLoad(uriToLoad => {
|
||||
|
@ -1462,6 +1464,7 @@ var gBrowserInit = {
|
|||
UpdateUrlbarSearchSplitterState();
|
||||
|
||||
BookmarkingUI.init();
|
||||
BrowserSearch.delayedStartupInit();
|
||||
AutoShowBookmarksToolbar.init();
|
||||
|
||||
Services.prefs.addObserver(gHomeButton.prefDomain, gHomeButton);
|
||||
|
@ -3767,10 +3770,25 @@ const DOMEventHandler = {
|
|||
};
|
||||
|
||||
const BrowserSearch = {
|
||||
_searchInitComplete: false,
|
||||
|
||||
init() {
|
||||
Services.obs.addObserver(this, "browser-search-engine-modified");
|
||||
},
|
||||
|
||||
delayedStartupInit() {
|
||||
// Asynchronously initialize the search service if necessary, to get the
|
||||
// current engine for working out the placeholder.
|
||||
Services.search.init(rv => {
|
||||
if (Components.isSuccessCode(rv)) {
|
||||
// Delay the update for this until so that we don't change it while
|
||||
// the user is looking at it / isn't expecting it.
|
||||
this._updateURLBarPlaceholder(Services.search.currentEngine, true);
|
||||
this._searchInitComplete = true;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
uninit() {
|
||||
Services.obs.removeObserver(this, "browser-search-engine-modified");
|
||||
},
|
||||
|
@ -3797,6 +3815,11 @@ const BrowserSearch = {
|
|||
// browser's offered engines.
|
||||
this._removeMaybeOfferedEngine(engineName);
|
||||
break;
|
||||
case "engine-current":
|
||||
if (this._searchInitComplete) {
|
||||
this._updateURLBarPlaceholder(engine);
|
||||
}
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -3844,6 +3867,88 @@ const BrowserSearch = {
|
|||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Initializes the urlbar placeholder to the pre-saved engine name. We do this
|
||||
* via a preference, to avoid needing to synchronously init the search service.
|
||||
*
|
||||
* This should be called around the time of DOMContentLoaded, so that it is
|
||||
* initialized quickly before the user sees anything.
|
||||
*
|
||||
* Note: If the preference doesn't exist, we don't do anything as the default
|
||||
* placeholder is a string which doesn't have the engine name.
|
||||
*/
|
||||
initPlaceHolder() {
|
||||
let engineName = Services.prefs.getStringPref("browser.urlbar.placeholderName", "");
|
||||
if (engineName) {
|
||||
// We can do this directly, since we know we're at DOMContentLoaded.
|
||||
this._setURLBarPlaceholder(engineName);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Updates the URLBar placeholder for the specified engine, delaying the
|
||||
* update if required. This also saves the current engine name in preferences
|
||||
* for the next restart.
|
||||
*
|
||||
* Note: The engine name will only be displayed for built-in engines, as we
|
||||
* know they should have short names.
|
||||
*
|
||||
* @param {nsISearchEngine} engine The search engine to use for the update.
|
||||
* @param {Boolean} delayUpdate Set to true, to delay update until the
|
||||
* placeholder is not displayed.
|
||||
*/
|
||||
_updateURLBarPlaceholder(engine, delayUpdate = false) {
|
||||
if (!engine) {
|
||||
throw new Error("Expected an engine to be specified");
|
||||
}
|
||||
|
||||
let engineName = "";
|
||||
if (Services.search.getDefaultEngines().includes(engine)) {
|
||||
engineName = engine.name;
|
||||
Services.prefs.setStringPref("browser.urlbar.placeholderName", engineName);
|
||||
} else {
|
||||
Services.prefs.clearUserPref("browser.urlbar.placeholderName");
|
||||
}
|
||||
|
||||
// Only delay if requested, and we're not displaying text in the URL bar
|
||||
// currently.
|
||||
if (delayUpdate && !gURLBar.value) {
|
||||
// Delays changing the URL Bar placeholder until the user is not going to be
|
||||
// seeing it, e.g. when there is a value entered in the bar, or if there is
|
||||
// a tab switch to a tab which has a url loaded.
|
||||
let placeholderUpdateListener = () => {
|
||||
if (gURLBar.value) {
|
||||
this._setURLBarPlaceholder(engineName);
|
||||
gURLBar.removeEventListener("input", placeholderUpdateListener);
|
||||
gBrowser.tabContainer.removeEventListener("TabSelect", placeholderUpdateListener);
|
||||
}
|
||||
};
|
||||
|
||||
gURLBar.addEventListener("input", placeholderUpdateListener);
|
||||
gBrowser.tabContainer.addEventListener("TabSelect", placeholderUpdateListener);
|
||||
} else {
|
||||
this._setURLBarPlaceholder(engineName);
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Sets the URLBar placeholder to either something based on the engine name,
|
||||
* or the default placeholder.
|
||||
*
|
||||
* @param {String} name The name of the engine to use, an empty string if to
|
||||
* use the default placeholder.
|
||||
*/
|
||||
_setURLBarPlaceholder(name) {
|
||||
let placeholder;
|
||||
if (name) {
|
||||
placeholder = gBrowserBundle.formatStringFromName("urlbar.placeholder",
|
||||
[name], 1);
|
||||
} else {
|
||||
placeholder = gURLBar.getAttribute("defaultPlaceholder");
|
||||
}
|
||||
gURLBar.setAttribute("placeholder", placeholder);
|
||||
},
|
||||
|
||||
addEngine(browser, engine, uri) {
|
||||
// Check to see whether we've already added an engine with this title
|
||||
if (browser.engines) {
|
||||
|
|
|
@ -777,6 +777,7 @@
|
|||
class="chromeclass-location" overflows="false">
|
||||
<textbox id="urlbar" flex="1"
|
||||
placeholder="&urlbar.placeholder2;"
|
||||
defaultPlaceholder="&urlbar.placeholder2;"
|
||||
focused="true"
|
||||
type="autocomplete"
|
||||
autocompletesearch="unifiedcomplete"
|
||||
|
|
|
@ -92,6 +92,10 @@ support-files =
|
|||
searchSuggestionEngine.xml
|
||||
searchSuggestionEngine.sjs
|
||||
[browser_urlbarOneOffs_searchSuggestions.js]
|
||||
support-files =
|
||||
searchSuggestionEngine.xml
|
||||
searchSuggestionEngine.sjs
|
||||
[browser_urlbarPlaceholder.js]
|
||||
support-files =
|
||||
searchSuggestionEngine.xml
|
||||
searchSuggestionEngine.sjs
|
||||
|
|
|
@ -0,0 +1,93 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
/**
|
||||
* This test ensures the placeholder is set correctly for different search
|
||||
* engines.
|
||||
*/
|
||||
|
||||
"use strict";
|
||||
|
||||
const TEST_ENGINE_BASENAME = "searchSuggestionEngine.xml";
|
||||
|
||||
const originalEngine = Services.search.currentEngine;
|
||||
const expectedString = gBrowserBundle.formatStringFromName("urlbar.placeholder",
|
||||
[originalEngine.name], 1);
|
||||
var extraEngine;
|
||||
var tabs = [];
|
||||
|
||||
add_task(async function setup() {
|
||||
extraEngine = await promiseNewSearchEngine(TEST_ENGINE_BASENAME);
|
||||
|
||||
// Force display of a tab with a URL bar, to clear out any possible placeholder
|
||||
// initialization listeners that happen on startup.
|
||||
let urlTab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
|
||||
BrowserTestUtils.removeTab(urlTab);
|
||||
|
||||
registerCleanupFunction(() => {
|
||||
Services.search.currentEngine = originalEngine;
|
||||
for (let tab of tabs) {
|
||||
BrowserTestUtils.removeTab(tab);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
add_task(async function test_change_default_engine_updates_placeholder() {
|
||||
tabs.push(await BrowserTestUtils.openNewForegroundTab(gBrowser));
|
||||
|
||||
Services.search.currentEngine = extraEngine;
|
||||
|
||||
await TestUtils.waitForCondition(
|
||||
() => gURLBar.getAttribute("placeholder") == gURLBar.getAttribute("defaultPlaceholder"),
|
||||
"The placeholder should match the default placeholder for non-built-in engines.");
|
||||
|
||||
Services.search.currentEngine = originalEngine;
|
||||
|
||||
await TestUtils.waitForCondition(
|
||||
() => gURLBar.getAttribute("placeholder") == expectedString,
|
||||
"The placeholder should include the engine name for built-in engines.");
|
||||
});
|
||||
|
||||
add_task(async function test_delayed_update_placeholder() {
|
||||
// Since we can't easily test for startup changes, we'll at least test the delay
|
||||
// of update for the placeholder works.
|
||||
let urlTab = await BrowserTestUtils.openNewForegroundTab(gBrowser, "about:mozilla");
|
||||
tabs.push(urlTab);
|
||||
|
||||
// Open a tab with a blank URL bar.
|
||||
let blankTab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
|
||||
tabs.push(blankTab);
|
||||
|
||||
// Pretend we've "initialized".
|
||||
BrowserSearch._updateURLBarPlaceholder(extraEngine, true);
|
||||
|
||||
Assert.equal(gURLBar.getAttribute("placeholder"), expectedString,
|
||||
"Placeholder should be unchanged.");
|
||||
|
||||
// Now switch to a tab with something in the URL Bar.
|
||||
await BrowserTestUtils.switchTab(gBrowser, urlTab);
|
||||
|
||||
await TestUtils.waitForCondition(
|
||||
() => gURLBar.getAttribute("placeholder") == gURLBar.getAttribute("defaultPlaceholder"),
|
||||
"The placeholder should have updated in the background.");
|
||||
|
||||
// Do it the other way to check both named engine and fallback code paths.
|
||||
await BrowserTestUtils.switchTab(gBrowser, blankTab);
|
||||
|
||||
BrowserSearch._updateURLBarPlaceholder(originalEngine, true);
|
||||
|
||||
Assert.equal(gURLBar.getAttribute("placeholder"), gURLBar.getAttribute("defaultPlaceholder"),
|
||||
"Placeholder should be unchanged.");
|
||||
|
||||
await BrowserTestUtils.switchTab(gBrowser, urlTab);
|
||||
|
||||
await TestUtils.waitForCondition(
|
||||
() => gURLBar.getAttribute("placeholder") == expectedString,
|
||||
"The placeholder should include the engine name for built-in engines.");
|
||||
|
||||
// Now check when we have a URL displayed, the placeholder is updated straight away.
|
||||
BrowserSearch._updateURLBarPlaceholder(extraEngine);
|
||||
|
||||
Assert.equal(gURLBar.getAttribute("placeholder"), gURLBar.getAttribute("defaultPlaceholder"),
|
||||
"Placeholder should be the default.");
|
||||
});
|
|
@ -434,7 +434,6 @@ These should match what Safari and other Apple applications use on OS X Lion. --
|
|||
|
||||
<!ENTITY openCmd.commandkey "l">
|
||||
<!ENTITY urlbar.placeholder2 "Search or enter address">
|
||||
<!ENTITY urlbar.placeholder3 "Enter search terms and addresses here">
|
||||
<!ENTITY urlbar.accesskey "d">
|
||||
<!-- LOCALIZATION NOTE (urlbar.extension.label): Used to indicate that a selected autocomplete entry is provided by an extension. -->
|
||||
<!ENTITY urlbar.extension.label "Extension:">
|
||||
|
|
Загрузка…
Ссылка в новой задаче