зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1579002
- Retained results: megabar should shown again pending search results on refocus. r=dao
Differential Revision: https://phabricator.services.mozilla.com/D46606 --HG-- extra : moz-landing-system : lando
This commit is contained in:
Родитель
43a807dc30
Коммит
7d77f1ccc3
|
@ -80,6 +80,13 @@ class UrlbarController {
|
||||||
this.engagementEvent = new TelemetryEvent(options.eventTelemetryCategory);
|
this.engagementEvent = new TelemetryEvent(options.eventTelemetryCategory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uninit() {
|
||||||
|
this.browserWindow = null;
|
||||||
|
this.input = null;
|
||||||
|
this.view = null;
|
||||||
|
this._listeners.clear();
|
||||||
|
}
|
||||||
|
|
||||||
get NOTIFICATIONS() {
|
get NOTIFICATIONS() {
|
||||||
return NOTIFICATIONS;
|
return NOTIFICATIONS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -270,6 +270,8 @@ class UrlbarInput {
|
||||||
|
|
||||||
Services.prefs.removeObserver("browser.urlbar.openViewOnFocus", this);
|
Services.prefs.removeObserver("browser.urlbar.openViewOnFocus", this);
|
||||||
|
|
||||||
|
this.controller.uninit();
|
||||||
|
|
||||||
delete this.document;
|
delete this.document;
|
||||||
delete this.window;
|
delete this.window;
|
||||||
delete this.eventBufferer;
|
delete this.eventBufferer;
|
||||||
|
@ -956,11 +958,12 @@ class UrlbarInput {
|
||||||
|
|
||||||
get openViewOnFocusForCurrentTab() {
|
get openViewOnFocusForCurrentTab() {
|
||||||
return (
|
return (
|
||||||
this._openViewOnFocus &&
|
this._openViewOnFocusAndSearchString ||
|
||||||
!["about:newtab", "about:home"].includes(
|
(this._openViewOnFocus &&
|
||||||
this.window.gBrowser.currentURI.spec
|
!["about:newtab", "about:home"].includes(
|
||||||
) &&
|
this.window.gBrowser.currentURI.spec
|
||||||
!this.isPrivate
|
) &&
|
||||||
|
!this.isPrivate)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1016,6 +1019,14 @@ class UrlbarInput {
|
||||||
|
|
||||||
// Private methods below.
|
// Private methods below.
|
||||||
|
|
||||||
|
get _openViewOnFocusAndSearchString() {
|
||||||
|
return (
|
||||||
|
this.megabar &&
|
||||||
|
this.value &&
|
||||||
|
this.getAttribute("pageproxystate") != "valid"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
async _updateLayoutBreakoutDimensions() {
|
async _updateLayoutBreakoutDimensions() {
|
||||||
// When this method gets called a second time before the first call
|
// When this method gets called a second time before the first call
|
||||||
// finishes, we need to disregard the first one.
|
// finishes, we need to disregard the first one.
|
||||||
|
|
|
@ -314,6 +314,9 @@ class Query {
|
||||||
// Nothing should be failing above, since we catch all the promises, thus
|
// Nothing should be failing above, since we catch all the promises, thus
|
||||||
// this is not in a finally for now.
|
// this is not in a finally for now.
|
||||||
this.complete = true;
|
this.complete = true;
|
||||||
|
|
||||||
|
// Break cycles with the controller to avoid leaks.
|
||||||
|
this.controller = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -90,6 +90,7 @@ support-files = redirect_error.sjs
|
||||||
[browser_removeUnsafeProtocolsFromURLBarPaste.js]
|
[browser_removeUnsafeProtocolsFromURLBarPaste.js]
|
||||||
tags = clipboard
|
tags = clipboard
|
||||||
[browser_restoreEmptyInput.js]
|
[browser_restoreEmptyInput.js]
|
||||||
|
[browser_retainedResultsOnFocus.js]
|
||||||
[browser_search_favicon.js]
|
[browser_search_favicon.js]
|
||||||
skip-if = true # Bug 1526222 - Doesn't currently work with QuantumBar
|
skip-if = true # Bug 1526222 - Doesn't currently work with QuantumBar
|
||||||
[browser_searchTelemetry.js]
|
[browser_searchTelemetry.js]
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
/* Any copyright is dedicated to the Public Domain.
|
||||||
|
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||||
|
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
// Tests "megabar" redesign approach with retained results.
|
||||||
|
// When there is a pending search (user typed a search string and blurred
|
||||||
|
// without picking a result), on focus we should the search results again.
|
||||||
|
|
||||||
|
// Note: this is similar to openViewOnFocus, but has a different behavior:
|
||||||
|
// * Private browsing windows work the same as normal windows
|
||||||
|
// * Opens the panel only if there is a user typed search string
|
||||||
|
|
||||||
|
async function checkOpensOnFocus(win = window) {
|
||||||
|
Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
|
||||||
|
win.gURLBar.blur();
|
||||||
|
|
||||||
|
info("Check the keyboard shortcut.");
|
||||||
|
await UrlbarTestUtils.promisePopupOpen(win, () => {
|
||||||
|
win.document.getElementById("Browser:OpenLocation").doCommand();
|
||||||
|
});
|
||||||
|
await UrlbarTestUtils.promisePopupClose(win, () => {
|
||||||
|
win.gURLBar.blur();
|
||||||
|
});
|
||||||
|
info("Focus with the mouse.");
|
||||||
|
await UrlbarTestUtils.promisePopupOpen(win, () => {
|
||||||
|
EventUtils.synthesizeMouseAtCenter(win.gURLBar.inputField, {}, win);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function checkDoesNotOpenOnFocus(win = window) {
|
||||||
|
Assert.ok(
|
||||||
|
!win.gURLBar.openViewOnFocusForCurrentTab,
|
||||||
|
"openViewOnFocusForCurrentTab should be false"
|
||||||
|
);
|
||||||
|
Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
|
||||||
|
win.gURLBar.blur();
|
||||||
|
|
||||||
|
info("Check the keyboard shortcut.");
|
||||||
|
win.document.getElementById("Browser:OpenLocation").doCommand();
|
||||||
|
// Because the panel opening may not be immediate, we must wait a bit.
|
||||||
|
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 500));
|
||||||
|
Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
|
||||||
|
win.gURLBar.blur();
|
||||||
|
info("Focus with the mouse.");
|
||||||
|
EventUtils.synthesizeMouseAtCenter(win.gURLBar.inputField, {}, win);
|
||||||
|
// Because the panel opening may not be immediate, we must wait a bit.
|
||||||
|
// eslint-disable-next-line mozilla/no-arbitrary-setTimeout
|
||||||
|
await new Promise(resolve => setTimeout(resolve, 500));
|
||||||
|
Assert.ok(!win.gURLBar.view.isOpen, "check urlbar panel is not open");
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async function setup() {
|
||||||
|
await SpecialPowers.pushPrefEnv({
|
||||||
|
set: [["browser.urlbar.megabar", true]],
|
||||||
|
});
|
||||||
|
// Add some history for the empty panel.
|
||||||
|
await PlacesTestUtils.addVisits([
|
||||||
|
{
|
||||||
|
uri: "http://mochi.test:8888/",
|
||||||
|
transition: PlacesUtils.history.TRANSITIONS.TYPED,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
registerCleanupFunction(PlacesUtils.history.clear);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function test_window(win) {
|
||||||
|
for (let url of ["about:newtab", "about:home", "http://example.com/"]) {
|
||||||
|
// withNewTab may hang on preloaded pages, thus instead of waiting for load
|
||||||
|
// we just wait for the expected currentURI value.
|
||||||
|
await BrowserTestUtils.withNewTab(
|
||||||
|
{ gBrowser: win.gBrowser, url, waitForLoad: false },
|
||||||
|
async browser => {
|
||||||
|
await TestUtils.waitForCondition(
|
||||||
|
() => win.gBrowser.currentURI.spec == url,
|
||||||
|
"Ensure we're on the expected page"
|
||||||
|
);
|
||||||
|
|
||||||
|
info("The panel should not open on the page by default");
|
||||||
|
await checkDoesNotOpenOnFocus(win);
|
||||||
|
|
||||||
|
await UrlbarTestUtils.promiseAutocompleteResultPopup({
|
||||||
|
window: win,
|
||||||
|
waitForFocus,
|
||||||
|
value: "foo",
|
||||||
|
});
|
||||||
|
await UrlbarTestUtils.promisePopupClose(win, () => {
|
||||||
|
win.gURLBar.blur();
|
||||||
|
});
|
||||||
|
|
||||||
|
info("The panel should open when there's a search string");
|
||||||
|
await checkOpensOnFocus(win);
|
||||||
|
|
||||||
|
await UrlbarTestUtils.promisePopupClose(win, () => {
|
||||||
|
win.gURLBar.blur();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
add_task(async function test_normalWindow() {
|
||||||
|
// The megabar works properly in a new window.
|
||||||
|
let win = await BrowserTestUtils.openNewBrowserWindow();
|
||||||
|
await test_window(win);
|
||||||
|
await BrowserTestUtils.closeWindow(win);
|
||||||
|
});
|
||||||
|
|
||||||
|
add_task(async function privateWindow() {
|
||||||
|
let privateWin = await BrowserTestUtils.openNewBrowserWindow({
|
||||||
|
private: true,
|
||||||
|
});
|
||||||
|
await test_window(privateWin);
|
||||||
|
await BrowserTestUtils.closeWindow(privateWin);
|
||||||
|
});
|
Загрузка…
Ссылка в новой задаче