From 0882dc9bf45cda59102d76fe3567530cd033a2f5 Mon Sep 17 00:00:00 2001 From: Coroiu Cristina Date: Wed, 17 Jul 2019 12:12:21 +0300 Subject: [PATCH] Backed out changeset cf34b2e8ac53 (bug 1513337) for test client failure --- .../events/browser_test_focus_browserui.js | 6 +- .../events/browser_test_focus_urlbar.js | 2 +- .../browser/events/browser_test_textcaret.js | 2 +- .../browser/general/browser_test_urlbar.js | 2 +- browser/base/content/browser.css | 17 ++-- browser/base/content/browser.js | 8 +- browser/base/content/browser.xhtml | 35 ++----- .../contextMenu/browser_contextmenu_touch.js | 6 +- .../test/performance/browser_appmenu.js | 4 +- .../test/performance/browser_tabopen.js | 12 ++- .../performance/browser_tabopen_squeeze.js | 4 +- .../browser_tabstrip_overflow_underflow.js | 12 ++- .../test/performance/browser_windowclose.js | 8 +- browser/base/content/test/performance/head.js | 19 +++- .../content/test/popups/browser_popupUI.js | 7 +- browser/base/content/urlbarBindings.xml | 54 +++++++++++ browser/base/jar.mn | 1 + browser/components/urlbar/UrlbarInput.jsm | 96 ++++++++++--------- .../urlbar/UrlbarValueFormatter.jsm | 6 +- .../urlbar/tests/UrlbarTestUtils.jsm | 6 +- .../tests/browser/browser_dropmarker.js | 7 +- .../tests/browser/browser_pasteAndGo.js | 12 ++- .../browser_switchTab_closesUrlbarPopup.js | 7 +- .../browser/browser_urlbarPlaceholder.js | 25 +++-- .../themes/shared/urlbar-searchbar.inc.css | 25 ++++- .../browser_focus_steal_from_chrome.js | 2 +- ...ocus_steal_from_chrome_during_mousedown.js | 6 +- .../tests/puppeteer/test_toolbars.py | 6 ++ .../firefox_puppeteer/ui/browser/toolbars.py | 40 +++++++- .../browser/browser_ext_themes_highlight.js | 3 +- .../browser/browser_formless_submit_chrome.js | 18 +++- .../harness/telemetry_harness/testcase.py | 2 +- .../tests/client/test_event_ping.py | 2 +- toolkit/content/editMenuOverlay.js | 1 - toolkit/content/widgets/textbox.js | 16 ++-- 35 files changed, 336 insertions(+), 143 deletions(-) create mode 100644 browser/base/content/urlbarBindings.xml diff --git a/accessible/tests/browser/events/browser_test_focus_browserui.js b/accessible/tests/browser/events/browser_test_focus_browserui.js index 616f1e908e6f..b6762aec6338 100644 --- a/accessible/tests/browser/events/browser_test_focus_browserui.js +++ b/accessible/tests/browser/events/browser_test_focus_browserui.js @@ -32,10 +32,8 @@ async function runTests(browser, accDoc) { evt = await onFocus; testStates(evt.accessible, STATE_FOCUSED); - onFocus = waitForEvent( - EVENT_FOCUS, - event => event.accessible.DOMNode == gURLBar.inputField - ); + let inputField = browser.ownerDocument.getElementById("urlbar").inputField; + onFocus = waitForEvent(EVENT_FOCUS, getAccessible(inputField)); EventUtils.synthesizeKey("t", { accelKey: true }, browser.ownerGlobal); evt = await onFocus; testStates(evt.accessible, STATE_FOCUSED); diff --git a/accessible/tests/browser/events/browser_test_focus_urlbar.js b/accessible/tests/browser/events/browser_test_focus_urlbar.js index 1e945712ad6c..379c65be76f9 100644 --- a/accessible/tests/browser/events/browser_test_focus_urlbar.js +++ b/accessible/tests/browser/events/browser_test_focus_urlbar.js @@ -52,7 +52,7 @@ async function runTests() { let focused = waitForEvent( EVENT_FOCUS, - event => event.accessible.role == ROLE_EDITCOMBOBOX + event => event.accessible.role == ROLE_ENTRY ); gURLBar.focus(); let event = await focused; diff --git a/accessible/tests/browser/events/browser_test_textcaret.js b/accessible/tests/browser/events/browser_test_textcaret.js index 8d187ec0f8da..b053af264712 100644 --- a/accessible/tests/browser/events/browser_test_textcaret.js +++ b/accessible/tests/browser/events/browser_test_textcaret.js @@ -30,7 +30,7 @@ async function checkURLBarCaretEvents() { }); info("Loaded " + kURL); - let urlbarInputEl = newWin.gURLBar.inputField; + let urlbarInputEl = newWin.document.getElementById("urlbar").inputField; let urlbarInput = getAccessible(urlbarInputEl, [nsIAccessibleText]); let onCaretMove = waitForEvents([ diff --git a/accessible/tests/browser/general/browser_test_urlbar.js b/accessible/tests/browser/general/browser_test_urlbar.js index 42989fbbd7eb..63244f80413b 100644 --- a/accessible/tests/browser/general/browser_test_urlbar.js +++ b/accessible/tests/browser/general/browser_test_urlbar.js @@ -21,7 +21,7 @@ add_task(async function testAutocompleteRichResult() { value: "a", }); - info("Waiting for accessibility to be created for the results list"); + info("Waiting for accessibility to be created for the richlistbox"); let resultsView; resultsView = gURLBar.view.panel.querySelector("#urlbarView-results"); await BrowserTestUtils.waitForCondition(() => diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css index dc59e4cc8943..3e9aef4594c9 100644 --- a/browser/base/content/browser.css +++ b/browser/base/content/browser.css @@ -529,6 +529,11 @@ toolbar:not(#TabsToolbar) > #personal-bookmarks { min-width: 1px; } + +#urlbar[quantumbar="true"] { + -moz-binding: url(chrome://browser/content/urlbarBindings.xml#urlbar); +} + /* Display URLs left-to-right but right aligned in RTL mode. */ html|input.urlbar-input:-moz-locale-dir(rtl) { direction: ltr !important; @@ -578,18 +583,18 @@ html|input.urlbar-scheme { /* Visible if the urlbar is not focused and it overflows at the start. Uses the required-valid trick to check if it contains a value */ -#urlbar[textoverflow="start"]:not([focused]) > .urlbar-input-box > html|input.urlbar-scheme:valid { +html|input.urlbar-scheme[textoverflow="start"]:not([focused]):valid { visibility: visible; } /* Fade out URL on overflow This mask may be overriden when a Contextual Feature Recommendation is shown, see browser/themes/shared/urlbar-searchbar.inc.css for details */ -#urlbar[textoverflow="end"]:not([focused]) > .urlbar-input-box > html|input.urlbar-input { +html|input.urlbar-input[textoverflow="end"]:not([focused]) { mask-image: linear-gradient(to left, transparent, black 3ch); } -#urlbar[textoverflow="start"]:not([focused]) > .urlbar-input-box > html|input.urlbar-input { +html|input.urlbar-input[textoverflow="start"]:not([focused]) { mask-image: linear-gradient(to right, transparent var(--urlbar-scheme-size), black calc(var(--urlbar-scheme-size) + 3ch)); } @@ -650,9 +655,9 @@ html|input.urlbar-input { #urlbar[pageproxystate=invalid] > #page-action-buttons > .urlbar-page-action, #identity-box.chromeUI ~ #page-action-buttons > .urlbar-page-action:not(#star-button-box), -#urlbar[usertyping] > .urlbar-history-dropmarker, -#urlbar:not([usertyping]) > .urlbar-go-button, -#urlbar:not([focused]) > .urlbar-go-button { +.urlbar-history-dropmarker[usertyping], +.urlbar-go-button:not([usertyping]), +.urlbar-go-button:not([parentfocused="true"]) { display: none; } diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 341cc1b09389..5cb12b0f6696 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -1620,6 +1620,10 @@ var gBrowserInit = { }, onBeforeInitialXULLayout() { + // Turn on QuantumBar. This can be removed once the quantumbar attribute is gone. + let urlbar = document.getElementById("urlbar"); + urlbar.setAttribute("quantumbar", true); + // Set a sane starting width/height for all resolutions on new profiles. if (Services.prefs.getBoolPref("privacy.resistFingerprinting")) { // When the fingerprinting resistance is enabled, making sure that we don't @@ -1795,7 +1799,7 @@ var gBrowserInit = { if (!window.toolbar.visible) { // adjust browser UI for popups - gURLBar.readOnly = true; + gURLBar.setAttribute("readonly", "true"); } // Misc. inits. @@ -4524,7 +4528,7 @@ const BrowserSearch = { } else { placeholder = gURLBar.getAttribute("defaultPlaceholder"); } - gURLBar.placeholder = placeholder; + gURLBar.setAttribute("placeholder", placeholder); }, addEngine(browser, engine, uri) { diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml index 1ed5342c7e52..1a4c74ec67c1 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml @@ -68,7 +68,7 @@ screenX="4" screenY="4" fullscreenbutton="true" sizemode="normal" - retargetdocumentfocus="urlbar-input" + retargetdocumentfocus="urlbar" persist="screenX screenY width height sizemode" > @@ -841,10 +841,11 @@ removable="false" class="chromeclass-location" overflows="false"> - + - - - - - - - + diff --git a/browser/base/content/test/contextMenu/browser_contextmenu_touch.js b/browser/base/content/test/contextMenu/browser_contextmenu_touch.js index 532936cd6e8b..0cb0cfbe3459 100644 --- a/browser/base/content/test/contextMenu/browser_contextmenu_touch.js +++ b/browser/base/content/test/contextMenu/browser_contextmenu_touch.js @@ -85,7 +85,11 @@ add_task(async function test_toolbar_contextmenu_touch() { // Test the urlbar input context menu. add_task(async function test_urlbar_contextmenu_touch() { let urlbar = document.getElementById("urlbar"); - let textBox = urlbar.querySelector("moz-input-box"); + let textBox = document.getAnonymousElementByAttribute( + urlbar, + "anonid", + "moz-input-box" + ); let menu = textBox.menupopup; await openAndCheckContextMenu(menu, textBox); }); diff --git a/browser/base/content/test/performance/browser_appmenu.js b/browser/base/content/test/performance/browser_appmenu.js index e7383a99e68e..e98cbd54b9e8 100644 --- a/browser/base/content/test/performance/browser_appmenu.js +++ b/browser/base/content/test/performance/browser_appmenu.js @@ -45,8 +45,8 @@ const EXPECTED_APPMENU_OPEN_REFLOWS = [ add_task(async function() { await ensureNoPreloadedBrowser(); - let textBoxRect = gURLBar - .querySelector("moz-input-box") + let textBoxRect = document + .getAnonymousElementByAttribute(gURLBar.textbox, "anonid", "moz-input-box") .getBoundingClientRect(); let menuButtonRect = document .getElementById("PanelUI-menu-button") diff --git a/browser/base/content/test/performance/browser_tabopen.js b/browser/base/content/test/performance/browser_tabopen.js index 307db5f616f0..d8994c8495ed 100644 --- a/browser/base/content/test/performance/browser_tabopen.js +++ b/browser/base/content/test/performance/browser_tabopen.js @@ -32,10 +32,16 @@ add_task(async function() { let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect(); let firstTabRect = gBrowser.selectedTab.getBoundingClientRect(); let firstTabLabelRect = gBrowser.selectedTab.textLabel.getBoundingClientRect(); - let textBoxRect = gURLBar - .querySelector("moz-input-box") + let textBoxRect = document + .getAnonymousElementByAttribute(gURLBar.textbox, "anonid", "moz-input-box") + .getBoundingClientRect(); + let historyDropmarkerRect = document + .getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ) .getBoundingClientRect(); - let historyDropmarkerRect = gURLBar.dropmarker.getBoundingClientRect(); let inRange = (val, min, max) => min <= val && val <= max; diff --git a/browser/base/content/test/performance/browser_tabopen_squeeze.js b/browser/base/content/test/performance/browser_tabopen_squeeze.js index 126d3bff2262..0c3ca5bf8eb2 100644 --- a/browser/base/content/test/performance/browser_tabopen_squeeze.js +++ b/browser/base/content/test/performance/browser_tabopen_squeeze.js @@ -34,8 +34,8 @@ add_task(async function() { await ensureFocusedUrlbar(); let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect(); - let textBoxRect = gURLBar - .querySelector("moz-input-box") + let textBoxRect = document + .getAnonymousElementByAttribute(gURLBar.textbox, "anonid", "moz-input-box") .getBoundingClientRect(); await withPerfObserver( diff --git a/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js b/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js index 1fc71a63413b..6afc3a647b5d 100644 --- a/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js +++ b/browser/base/content/test/performance/browser_tabstrip_overflow_underflow.js @@ -38,10 +38,16 @@ add_task(async function() { await ensureFocusedUrlbar(); let tabStripRect = gBrowser.tabContainer.arrowScrollbox.getBoundingClientRect(); - let textBoxRect = gURLBar - .querySelector("moz-input-box") + let textBoxRect = document + .getAnonymousElementByAttribute(gURLBar.textbox, "anonid", "moz-input-box") + .getBoundingClientRect(); + let urlbarDropmarkerRect = document + .getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ) .getBoundingClientRect(); - let urlbarDropmarkerRect = gURLBar.dropmarker.getBoundingClientRect(); let ignoreTabstripRects = { filter: rects => diff --git a/browser/base/content/test/performance/browser_windowclose.js b/browser/base/content/test/performance/browser_windowclose.js index 5165f11ab879..dcc678cf5d60 100644 --- a/browser/base/content/test/performance/browser_windowclose.js +++ b/browser/base/content/test/performance/browser_windowclose.js @@ -43,7 +43,13 @@ add_task(async function() { "We shouldn't have added any new expected reflows for window close." ); - let dropmarkerRect = gURLBar.dropmarker.getBoundingClientRect(); + let dropmarkerRect = document + .getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ) + .getBoundingClientRect(); await withPerfObserver( async function() { diff --git a/browser/base/content/test/performance/head.js b/browser/base/content/test/performance/head.js index d38be2122eef..8e4eea06252c 100644 --- a/browser/base/content/test/performance/head.js +++ b/browser/base/content/test/performance/head.js @@ -298,8 +298,13 @@ async function ensureFocusedUrlbar() { () => !gURLBar.hasAttribute("switchingtabs") ); + let dropmarker = document.getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ); let opacityPromise = BrowserTestUtils.waitForEvent( - gURLBar.dropmarker, + dropmarker, "transitionend", false, e => e.propertyName === "opacity" @@ -816,9 +821,15 @@ async function runUrlbarTest( await UrlbarTestUtils.promisePopupClose(win); }; - let dropmarkerRect = URLBar.dropmarker.getBoundingClientRect(); - let textBoxRect = gURLBar - .querySelector("moz-input-box") + let dropmarkerRect = win.document + .getAnonymousElementByAttribute( + URLBar.textbox, + "anonid", + "historydropmarker" + ) + .getBoundingClientRect(); + let textBoxRect = win.document + .getAnonymousElementByAttribute(URLBar.textbox, "anonid", "moz-input-box") .getBoundingClientRect(); let expectedRects = { filter: rects => diff --git a/browser/base/content/test/popups/browser_popupUI.js b/browser/base/content/test/popups/browser_popupUI.js index a393902838ee..9d4d625c219b 100644 --- a/browser/base/content/test/popups/browser_popupUI.js +++ b/browser/base/content/test/popups/browser_popupUI.js @@ -24,8 +24,13 @@ add_task(async function toolbar_ui_visibility() { "'open location' command is not disabled in the popup" ); + let historyButton = doc.getAnonymousElementByAttribute( + win.gURLBar.textbox, + "anonid", + "historydropmarker" + ); is( - win.gURLBar.dropmarker.clientWidth, + historyButton.clientWidth, 0, "history dropdown button is hidden in the popup" ); diff --git a/browser/base/content/urlbarBindings.xml b/browser/base/content/urlbarBindings.xml new file mode 100644 index 000000000000..85ed733223ad --- /dev/null +++ b/browser/base/content/urlbarBindings.xml @@ -0,0 +1,54 @@ + + + + + +%browserDTD; +]> + + + + + + + + + + + + + + + + + diff --git a/browser/base/jar.mn b/browser/base/jar.mn index 12d48a7a39e9..11057de4897d 100644 --- a/browser/base/jar.mn +++ b/browser/base/jar.mn @@ -94,6 +94,7 @@ browser.jar: content/browser/tabbrowser.js (content/tabbrowser.js) content/browser/tabbrowser-tab.js (content/tabbrowser-tab.js) content/browser/tabbrowser-tabs.js (content/tabbrowser-tabs.js) + content/browser/urlbarBindings.xml (content/urlbarBindings.xml) content/browser/utilityOverlay.js (content/utilityOverlay.js) content/browser/webext-panels.js (content/webext-panels.js) * content/browser/webext-panels.xul (content/webext-panels.xul) diff --git a/browser/components/urlbar/UrlbarInput.jsm b/browser/components/urlbar/UrlbarInput.jsm index 6c80f4512322..1ee9c02e983b 100644 --- a/browser/components/urlbar/UrlbarInput.jsm +++ b/browser/components/urlbar/UrlbarInput.jsm @@ -111,21 +111,17 @@ class UrlbarInput { // This exists only for tests. this._enableAutofillPlaceholder = true; - // Forward certain methods and properties. - const CONTAINER_METHODS = [ + // Forward textbox methods and properties. + const METHODS = [ + "addEventListener", + "removeEventListener", "getAttribute", "hasAttribute", - "querySelector", "setAttribute", "removeAttribute", "toggleAttribute", ]; - const INPUT_METHODS = [ - "addEventListener", - "blur", - "focus", - "removeEventListener", - ]; + const READ_ONLY_PROPERTIES = ["inputField", "editor"]; const READ_WRITE_PROPERTIES = [ "placeholder", "readOnly", @@ -133,33 +129,33 @@ class UrlbarInput { "selectionEnd", ]; - for (let method of CONTAINER_METHODS) { + for (let method of METHODS) { this[method] = (...args) => { return this.textbox[method](...args); }; } - for (let method of INPUT_METHODS) { - this[method] = (...args) => { - return this.inputField[method](...args); - }; + for (let property of READ_ONLY_PROPERTIES) { + Object.defineProperty(this, property, { + enumerable: true, + get() { + return this.textbox && this.textbox[property]; + }, + }); } for (let property of READ_WRITE_PROPERTIES) { Object.defineProperty(this, property, { enumerable: true, get() { - return this.inputField[property]; + return this.textbox && this.textbox[property]; }, set(val) { - return (this.inputField[property] = val); + return (this.textbox[property] = val); }, }); } - this.inputField = this.querySelector(".urlbar-input"); - this.dropmarker = this.querySelector(".urlbar-history-dropmarker"); - XPCOMUtils.defineLazyGetter(this, "valueFormatter", () => { return new UrlbarValueFormatter(this); }); @@ -167,7 +163,7 @@ class UrlbarInput { // If the toolbar is not visible in this window or the urlbar is readonly, // we'll stop here, so that most properties of the input object are valid, // but we won't handle events. - if (!this.window.toolbar.visible || this.readOnly) { + if (!this.window.toolbar.visible || this.hasAttribute("readonly")) { return; } @@ -199,10 +195,12 @@ class UrlbarInput { "select", ]; for (let name of this._inputFieldEvents) { - this.addEventListener(name, this); + this.inputField.addEventListener(name, this); } - this.dropmarker.addEventListener("mousedown", this); + // This is needed for the dropmarker. Once we remove that (i.e. make + // openViewOnFocus = true the default), this won't be needed anymore. + this.addEventListener("mousedown", this); this.view.panel.addEventListener("popupshowing", this); this.view.panel.addEventListener("popuphidden", this); @@ -229,9 +227,9 @@ class UrlbarInput { uninit() { this.window.removeEventListener("unload", this); for (let name of this._inputFieldEvents) { - this.removeEventListener(name, this); + this.inputField.removeEventListener(name, this); } - this.dropmarker.removeEventListener("mousedown", this); + this.removeEventListener("mousedown", this); this.view.panel.remove(); @@ -266,7 +264,6 @@ class UrlbarInput { delete this.view; delete this.controller; delete this.textbox; - delete this.inputField; } /** @@ -304,6 +301,14 @@ class UrlbarInput { } } + focus() { + this.inputField.focus(); + } + + blur() { + this.inputField.blur(); + } + select() { // See _on_select(). HTMLInputElement.select() dispatches a "select" // event but does not set the primary selection. @@ -780,16 +785,16 @@ class UrlbarInput { // Getters and Setters below. - get editor() { - return this.inputField.editor; - } - get focused() { - return this.getAttribute("focused") == "true"; + return this.textbox.getAttribute("focused") == "true"; } get goButton() { - return this.querySelector(".urlbar-go-button"); + return this.document.getAnonymousElementByAttribute( + this.textbox, + "anonid", + "urlbar-go-button" + ); } get textValue() { @@ -817,7 +822,7 @@ class UrlbarInput { this._openViewOnFocus = Services.prefs.getBoolPref( "browser.urlbar.openViewOnFocus" ); - this.dropmarker.hidden = this._openViewOnFocus; + this.toggleAttribute("hidedropmarker", this._openViewOnFocus); } _setValue(val, allowTrim) { @@ -1317,7 +1322,13 @@ class UrlbarInput { } _initPasteAndGo() { - let inputBox = this.querySelector("moz-input-box"); + let inputBox = this.document.getAnonymousElementByAttribute( + this.textbox, + "anonid", + "moz-input-box" + ); + // Force the Custom Element to upgrade until Bug 1470242 handles this: + this.window.customElements.upgrade(inputBox); let contextMenu = inputBox.menupopup; let insertLocation = contextMenu.firstElementChild; while ( @@ -1394,14 +1405,11 @@ class UrlbarInput { // Event handlers below. _on_blur(event) { - this.removeAttribute("focused"); - this.formatValue(); - this._resetSearchState(); - // In certain cases, like holding an override key and confirming an entry, // we don't key a keyup event for the override key, thus we make this // additional cleanup on blur. this._clearActionOverride(); + this.formatValue(); // The extension input sessions depends more on blur than on the fact we // actually cancel a running query, so we do it here. @@ -1414,11 +1422,11 @@ class UrlbarInput { if (!UrlbarPrefs.get("ui.popup.disable_autohide")) { this.view.close(); } - // We may have hidden popup notifications, show them again if necessary. if (this.getAttribute("pageproxystate") != "valid") { this.window.UpdatePopupNotificationsVisibility(); } + this._resetSearchState(); } _on_click(event) { @@ -1442,7 +1450,6 @@ class UrlbarInput { } _on_focus(event) { - this.setAttribute("focused", "true"); this._updateUrlTooltip(); this.formatValue(); @@ -1476,7 +1483,10 @@ class UrlbarInput { return; } - if (event.currentTarget == this.dropmarker && event.button == 0) { + if ( + event.originalTarget.classList.contains("urlbar-history-dropmarker") && + event.button == 0 + ) { if (this.view.isOpen) { this.view.close(); } else { @@ -1701,11 +1711,11 @@ class UrlbarInput { } _on_popupshowing() { - this.dropmarker.setAttribute("open", "true"); + this.setAttribute("open", "true"); } _on_popuphidden() { - this.dropmarker.removeAttribute("open"); + this.removeAttribute("open"); } _on_dragstart(event) { @@ -1714,7 +1724,7 @@ class UrlbarInput { event.originalTarget ); if ( - event.target != this.inputField && + this.inputField != event.originalTarget && !(nodePosition & Node.DOCUMENT_POSITION_CONTAINED_BY) ) { return; diff --git a/browser/components/urlbar/UrlbarValueFormatter.jsm b/browser/components/urlbar/UrlbarValueFormatter.jsm index a1cd764892d1..36dbff3519a8 100644 --- a/browser/components/urlbar/UrlbarValueFormatter.jsm +++ b/browser/components/urlbar/UrlbarValueFormatter.jsm @@ -46,7 +46,11 @@ class UrlbarValueFormatter { } get scheme() { - return this.urlbarInput.textbox.querySelector(".urlbar-scheme"); + return this.document.getAnonymousElementByAttribute( + this.urlbarInput.textbox, + "anonid", + "scheme" + ); } update() { diff --git a/browser/components/urlbar/tests/UrlbarTestUtils.jsm b/browser/components/urlbar/tests/UrlbarTestUtils.jsm index 4c7cf824e88d..6ce6b96344fb 100644 --- a/browser/components/urlbar/tests/UrlbarTestUtils.jsm +++ b/browser/components/urlbar/tests/UrlbarTestUtils.jsm @@ -216,7 +216,11 @@ var UrlbarTestUtils = { }, getDropMarker(win) { - return win.gURLBar.dropmarker; + return win.document.getAnonymousElementByAttribute( + win.gURLBar.textbox, + "anonid", + "historydropmarker" + ); }, /** diff --git a/browser/components/urlbar/tests/browser/browser_dropmarker.js b/browser/components/urlbar/tests/browser/browser_dropmarker.js index b2cb141b33c0..da930867eff2 100644 --- a/browser/components/urlbar/tests/browser/browser_dropmarker.js +++ b/browser/components/urlbar/tests/browser/browser_dropmarker.js @@ -50,7 +50,12 @@ add_task(async function proxyState() { async function clickDropmarker() { await UrlbarTestUtils.promisePopupOpen(window, () => { - EventUtils.synthesizeMouseAtCenter(gURLBar.dropmarker, {}, window); + let historyDropMarker = window.document.getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ); + EventUtils.synthesizeMouseAtCenter(historyDropMarker, {}, window); }); let queryContext = await gURLBar.lastQueryContextPromise; return queryContext; diff --git a/browser/components/urlbar/tests/browser/browser_pasteAndGo.js b/browser/components/urlbar/tests/browser/browser_pasteAndGo.js index bc1b0d4ab0b1..e40ba4cb52b5 100644 --- a/browser/components/urlbar/tests/browser/browser_pasteAndGo.js +++ b/browser/components/urlbar/tests/browser/browser_pasteAndGo.js @@ -30,7 +30,11 @@ add_task(async function() { () => reject(new Error(`Failed to copy string '${url}' to clipboard`)) ); }); - let textBox = gURLBar.querySelector("moz-input-box"); + let textBox = document.getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "moz-input-box" + ); let cxmenu = textBox.menupopup; let cxmenuPromise = BrowserTestUtils.waitForEvent(cxmenu, "popupshown"); EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, { @@ -67,7 +71,11 @@ add_task(async function() { () => reject(new Error(`Failed to copy string '${url}' to clipboard`)) ); }); - let textBox = gURLBar.querySelector("moz-input-box"); + let textBox = document.getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "moz-input-box" + ); let cxmenu = textBox.menupopup; let cxmenuPromise = BrowserTestUtils.waitForEvent(cxmenu, "popupshown"); EventUtils.synthesizeMouseAtCenter(gURLBar.inputField, { diff --git a/browser/components/urlbar/tests/browser/browser_switchTab_closesUrlbarPopup.js b/browser/components/urlbar/tests/browser/browser_switchTab_closesUrlbarPopup.js index e3b15b6886c8..e21d86d38e73 100644 --- a/browser/components/urlbar/tests/browser/browser_switchTab_closesUrlbarPopup.js +++ b/browser/components/urlbar/tests/browser/browser_switchTab_closesUrlbarPopup.js @@ -31,7 +31,12 @@ add_task(async function() { await BrowserTestUtils.switchTab(gBrowser, tab1); // Now open the popup by the history marker. await UrlbarTestUtils.promisePopupOpen(window, () => { - EventUtils.synthesizeMouseAtCenter(gURLBar.dropmarker, {}, window); + let historyDropMarker = window.document.getAnonymousElementByAttribute( + gURLBar.textbox, + "anonid", + "historydropmarker" + ); + EventUtils.synthesizeMouseAtCenter(historyDropMarker, {}, window); }); // Check that the popup closes when we switch tab. await UrlbarTestUtils.promisePopupClose(window, () => { diff --git a/browser/components/urlbar/tests/browser/browser_urlbarPlaceholder.js b/browser/components/urlbar/tests/browser/browser_urlbarPlaceholder.js index 4afac8aa86ac..648979c96d4a 100644 --- a/browser/components/urlbar/tests/browser/browser_urlbarPlaceholder.js +++ b/browser/components/urlbar/tests/browser/browser_urlbarPlaceholder.js @@ -46,18 +46,23 @@ add_task(async function test_change_default_engine_updates_placeholder() { await Services.search.setDefault(extraEngine); await TestUtils.waitForCondition( - () => gURLBar.placeholder == gURLBar.getAttribute("defaultPlaceholder"), + () => + gURLBar.getAttribute("placeholder") == + gURLBar.getAttribute("defaultPlaceholder"), "The placeholder should match the default placeholder for non-built-in engines." ); - Assert.equal(gURLBar.placeholder, gURLBar.getAttribute("defaultPlaceholder")); + Assert.equal( + gURLBar.getAttribute("placeholder"), + gURLBar.getAttribute("defaultPlaceholder") + ); await Services.search.setDefault(originalEngine); await TestUtils.waitForCondition( - () => gURLBar.placeholder == expectedString, + () => gURLBar.getAttribute("placeholder") == expectedString, "The placeholder should include the engine name for built-in engines." ); - Assert.equal(gURLBar.placeholder, expectedString); + Assert.equal(gURLBar.getAttribute("placeholder"), expectedString); }); add_task(async function test_delayed_update_placeholder() { @@ -77,7 +82,7 @@ add_task(async function test_delayed_update_placeholder() { BrowserSearch._updateURLBarPlaceholder(extraEngine.name, true); Assert.equal( - gURLBar.placeholder, + gURLBar.getAttribute("placeholder"), expectedString, "Placeholder should be unchanged." ); @@ -86,7 +91,9 @@ add_task(async function test_delayed_update_placeholder() { await BrowserTestUtils.switchTab(gBrowser, urlTab); await TestUtils.waitForCondition( - () => gURLBar.placeholder == gURLBar.getAttribute("defaultPlaceholder"), + () => + gURLBar.getAttribute("placeholder") == + gURLBar.getAttribute("defaultPlaceholder"), "The placeholder should have updated in the background." ); @@ -97,7 +104,7 @@ add_task(async function test_delayed_update_placeholder() { await TestUtils.waitForTick(); Assert.equal( - gURLBar.placeholder, + gURLBar.getAttribute("placeholder"), gURLBar.getAttribute("defaultPlaceholder"), "Placeholder should be unchanged." ); @@ -105,7 +112,7 @@ add_task(async function test_delayed_update_placeholder() { await BrowserTestUtils.switchTab(gBrowser, urlTab); await TestUtils.waitForCondition( - () => gURLBar.placeholder == expectedString, + () => gURLBar.getAttribute("placeholder") == expectedString, "The placeholder should include the engine name for built-in engines." ); @@ -114,7 +121,7 @@ add_task(async function test_delayed_update_placeholder() { await TestUtils.waitForTick(); Assert.equal( - gURLBar.placeholder, + gURLBar.getAttribute("placeholder"), gURLBar.getAttribute("defaultPlaceholder"), "Placeholder should be the default." ); diff --git a/browser/themes/shared/urlbar-searchbar.inc.css b/browser/themes/shared/urlbar-searchbar.inc.css index 4e3a9716c4e8..087bf7590470 100644 --- a/browser/themes/shared/urlbar-searchbar.inc.css +++ b/browser/themes/shared/urlbar-searchbar.inc.css @@ -316,18 +316,24 @@ height: 30px; } -:not(.urlbar-icon-wrapper) > .urlbar-icon:not([disabled]):hover, +.urlbar-icon:not([disabled]):hover, .urlbar-icon-wrapper:not([disabled]):hover { background-color: hsla(0,0%,70%,.2); } -:not(.urlbar-icon-wrapper) > .urlbar-icon:not([disabled])[open], -:not(.urlbar-icon-wrapper) > .urlbar-icon:not([disabled]):hover:active, -.urlbar-icon-wrapper:not([disabled])[open], -.urlbar-icon-wrapper:not([disabled]):hover:active { +.urlbar-icon[open], +.urlbar-icon-wrapper[open], +.urlbar-icon:not([disabled]):hover:active, +.urlbar-icon-wrapper:hover:active { background-color: hsla(0,0%,70%,.3); } +.urlbar-icon-wrapper[open] > .urlbar-icon, +.urlbar-icon-wrapper > .urlbar-icon:hover, +.urlbar-icon-wrapper > .urlbar-icon:hover:active { + background-color: transparent; +} + .urlbar-icon:-moz-focusring, .urlbar-icon-wrapper:-moz-focusring { outline: var(--toolbarbutton-focus-outline); @@ -350,6 +356,15 @@ transition: opacity 0.15s ease; } +#urlbar[hidedropmarker] > .urlbar-history-dropmarker { + display: none; +} + +/* Avoid re-opening the popup when the dropmarker is clicked while the popup is still open. */ +#urlbar[quantumbar="false"] > .urlbar-history-dropmarker[open] { + pointer-events: none; +} + #urlbar[switchingtabs] > .urlbar-history-dropmarker { transition: none; } diff --git a/dom/tests/browser/browser_focus_steal_from_chrome.js b/dom/tests/browser/browser_focus_steal_from_chrome.js index 54f932bebd21..47735ef65de3 100644 --- a/dom/tests/browser/browser_focus_steal_from_chrome.js +++ b/dom/tests/browser/browser_focus_steal_from_chrome.js @@ -142,7 +142,7 @@ add_task(async function() { } // Focus chrome - gURLBar.focus(); + document.getElementById("urlbar").focus(); let originalFocus = Services.focus.focusedElement; // Load about:blank just to make sure that everything works nicely diff --git a/dom/tests/browser/browser_focus_steal_from_chrome_during_mousedown.js b/dom/tests/browser/browser_focus_steal_from_chrome_during_mousedown.js index ffd16abf189e..ee4ed2156b2f 100644 --- a/dom/tests/browser/browser_focus_steal_from_chrome_during_mousedown.js +++ b/dom/tests/browser/browser_focus_steal_from_chrome_during_mousedown.js @@ -17,11 +17,11 @@ add_task(async function test() { for (var button = 0; button < 3; button++) { // Set focus to a chrome element before synthesizing a mouse down event. - gURLBar.focus(); + document.getElementById("urlbar").focus(); is( fm.focusedElement, - gURLBar.inputField, + document.getElementById("urlbar").inputField, "Failed to move focus to search bar: button=" + button ); @@ -31,7 +31,7 @@ add_task(async function test() { isnot( fm.focusedElement, - gURLBar.inputField, + document.getElementById("urlbar").inputField, "Failed to move focus away from search bar: button=" + button ); diff --git a/testing/firefox-ui/tests/puppeteer/test_toolbars.py b/testing/firefox-ui/tests/puppeteer/test_toolbars.py index b0f278d7cef6..689746db65e9 100644 --- a/testing/firefox-ui/tests/puppeteer/test_toolbars.py +++ b/testing/firefox-ui/tests/puppeteer/test_toolbars.py @@ -95,11 +95,17 @@ class TestLocationBar(PuppeteerMixin, MarionetteTestCase): self.assertEqual(self.locationbar.identity_organization_label.get_property('localName'), 'label') self.assertEqual(self.locationbar.identity_icon.get_property('localName'), 'image') + self.assertEqual(self.locationbar.history_drop_marker.get_property('localName'), + 'dropmarker') self.assertEqual(self.locationbar.reload_button.get_property('localName'), 'toolbarbutton') self.assertEqual(self.locationbar.stop_button.get_property('localName'), 'toolbarbutton') + self.assertEqual(self.locationbar.contextmenu.get_property('localName'), 'menupopup') + self.assertEqual(self.locationbar.get_contextmenu_entry('paste').get_attribute('cmd'), + 'cmd_paste') + def test_reload(self): event_types = ["shortcut", "shortcut2", "button"] for event in event_types: diff --git a/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/browser/toolbars.py b/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/browser/toolbars.py index 16ea6c74128e..2728b9afafc8 100644 --- a/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/browser/toolbars.py +++ b/testing/marionette/puppeteer/firefox/firefox_puppeteer/ui/browser/toolbars.py @@ -90,6 +90,11 @@ class LocationBar(UIBaseLib): lambda _: self.value == '', message='Contents of location bar could not be cleared.') + def close_context_menu(self): + """Closes the Location Bar context menu by a key event.""" + # TODO: This method should be implemented via the menu API. + self.contextmenu.send_keys(keys.Keys.ESCAPE) + @property def connection_icon(self): """ Provides access to the urlbar connection icon. @@ -98,6 +103,16 @@ class LocationBar(UIBaseLib): """ return self.marionette.find_element(By.ID, 'connection-icon') + @property + def contextmenu(self): + """Provides access to the urlbar context menu. + + :returns: Reference to the urlbar context menu. + """ + # TODO: This method should be implemented via the menu API. + parent = self.urlbar.find_element(By.ANON_ATTRIBUTE, {'anonid': 'moz-input-box'}) + return parent.find_element(By.ANON_ATTRIBUTE, {'anonid': 'input-box-contextmenu'}) + @property def focused(self): """Checks the focus state of the location bar. @@ -132,6 +147,27 @@ class LocationBar(UIBaseLib): lambda _: self.focused, message='Location bar has not be focused.') + def get_contextmenu_entry(self, action): + """Retrieves the urlbar context menu entry corresponding + to the given action. + + :param action: The action corresponding to the retrieved value. + :returns: Reference to the urlbar contextmenu entry. + """ + # TODO: This method should be implemented via the menu API. + entries = self.contextmenu.find_elements(By.CSS_SELECTOR, 'menuitem') + filter_on = 'cmd_%s' % action + found = [e for e in entries if e.get_attribute('cmd') == filter_on] + return found[0] if len(found) else None + + @property + def history_drop_marker(self): + """Provides access to the history drop marker. + + :returns: Reference to the history drop marker. + """ + return self.urlbar.find_element(By.ANON_ATTRIBUTE, {'anonid': 'historydropmarker'}) + @property def identity_box(self): """The DOM element which represents the identity box. @@ -243,7 +279,7 @@ class LocationBar(UIBaseLib): :returns: Reference to the urlbar input. """ - return self.urlbar.find_element(By.CLASS_NAME, 'urlbar-input') + return self.urlbar.find_element(By.ANON_ATTRIBUTE, {'anonid': 'input'}) @property def value(self): @@ -251,7 +287,7 @@ class LocationBar(UIBaseLib): :returns: The urlbar value. """ - return self.urlbar_input.get_property('value') + return self.urlbar.get_property('value') class AutocompleteResults(UIBaseLib): diff --git a/toolkit/components/extensions/test/browser/browser_ext_themes_highlight.js b/toolkit/components/extensions/test/browser/browser_ext_themes_highlight.js index a7a1bd2a7051..4f41fa1cb8cc 100644 --- a/toolkit/components/extensions/test/browser/browser_ext_themes_highlight.js +++ b/toolkit/components/extensions/test/browser/browser_ext_themes_highlight.js @@ -29,9 +29,10 @@ add_task(async function test_support_selection() { }); await extension.startup(); + let urlBar = document.querySelector("#urlbar"); let fields = [ - gURLBar.inputField, + document.getAnonymousElementByAttribute(urlBar, "anonid", "input"), document.querySelector("#searchbar .searchbar-textbox"), ].filter(field => { let bounds = field.getBoundingClientRect(); diff --git a/toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js b/toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js index 9aa4217a1f18..c7fdfe103854 100644 --- a/toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js +++ b/toolkit/components/passwordmgr/test/browser/browser_formless_submit_chrome.js @@ -77,6 +77,18 @@ add_task(async function test_backButton_forwardButton() { ); await fillTestPage(aBrowser); + let forwardButton = document.getElementById("forward-button"); + + let forwardTransitionPromise; + if (forwardButton.nextElementSibling == gURLBar) { + // We need to wait for the forward button transition to complete before we + // can click it, so we hook up a listener to wait for it to be ready. + forwardTransitionPromise = BrowserTestUtils.waitForEvent( + forwardButton, + "transitionend" + ); + } + let backPromise = BrowserTestUtils.browserStopped(aBrowser); EventUtils.synthesizeMouseAtCenter( document.getElementById("back-button"), @@ -91,7 +103,11 @@ add_task(async function test_backButton_forwardButton() { // Now go forward again after filling await fillTestPage(aBrowser); - let forwardButton = document.getElementById("forward-button"); + if (forwardTransitionPromise) { + await forwardTransitionPromise; + info("transition done"); + } + await BrowserTestUtils.waitForCondition(() => { return !forwardButton.disabled; }); diff --git a/toolkit/components/telemetry/tests/marionette/harness/telemetry_harness/testcase.py b/toolkit/components/telemetry/tests/marionette/harness/telemetry_harness/testcase.py index 56dc6097e3b4..a380e3b3db41 100755 --- a/toolkit/components/telemetry/tests/marionette/harness/telemetry_harness/testcase.py +++ b/toolkit/components/telemetry/tests/marionette/harness/telemetry_harness/testcase.py @@ -63,7 +63,7 @@ class TelemetryTestCase(WindowManagerMixin, MarionetteTestCase): """Perform a search via the browser's URL bar.""" with self.marionette.using_context(self.marionette.CONTEXT_CHROME): - urlbar = self.marionette.find_element(By.ID, "urlbar-input") + urlbar = self.marionette.find_element(By.ID, "urlbar") urlbar.send_keys(keys.Keys.DELETE) urlbar.send_keys(text + keys.Keys.ENTER) diff --git a/toolkit/components/telemetry/tests/marionette/tests/client/test_event_ping.py b/toolkit/components/telemetry/tests/marionette/tests/client/test_event_ping.py index 1225897c889e..3619f0196c97 100644 --- a/toolkit/components/telemetry/tests/marionette/tests/client/test_event_ping.py +++ b/toolkit/components/telemetry/tests/marionette/tests/client/test_event_ping.py @@ -46,7 +46,7 @@ class TestEventPing(TelemetryTestCase): self.enable_search_events() self.wait_for_search_service_init() - self.search_in_new_tab("mozilla firefox") + self.search("mozilla firefox") payload = self.wait_for_ping(self.restart_browser, EVENT_PING)["payload"] diff --git a/toolkit/content/editMenuOverlay.js b/toolkit/content/editMenuOverlay.js index 21a43ca7b652..9b18260b9bd9 100644 --- a/toolkit/content/editMenuOverlay.js +++ b/toolkit/content/editMenuOverlay.js @@ -74,7 +74,6 @@ window.addEventListener("contextmenu", e => { let needsContextMenu = e.target.ownerDocument == document && !e.defaultPrevented && - e.target.parentNode.nodeName != "moz-input-box" && ((["textarea", "input"].includes(e.target.localName) && e.target.namespaceURI == HTML_NS) || e.target.closest("textbox[is='search-textbox']")); diff --git a/toolkit/content/widgets/textbox.js b/toolkit/content/widgets/textbox.js index fe2114aa609d..bcbeeb67391f 100644 --- a/toolkit/content/widgets/textbox.js +++ b/toolkit/content/widgets/textbox.js @@ -88,7 +88,7 @@ this.menupopup = this.querySelector(".textbox-contextmenu"); this.menupopup.addEventListener("popupshowing", event => { - let input = this._input; + var input = this.getElementsByAttribute("anonid", "input")[0]; if (document.commandDispatcher.focusedElement != input) { input.focus(); } @@ -196,13 +196,18 @@ return null; } + var textbox = document.getBindingParent(this); + if (!textbox || textbox.localName != "textbox") { + return null; + } + try { ChromeUtils.import( "resource://gre/modules/InlineSpellChecker.jsm", this ); this.InlineSpellCheckerUI = new this.InlineSpellChecker( - this._input.editor + textbox.editor ); } catch (ex) {} } @@ -224,13 +229,6 @@ ); controller.doCommand(command); } - - get _input() { - return ( - this.getElementsByAttribute("anonid", "input")[0] || - this.querySelector(".textbox-input") - ); - } } customElements.define("moz-input-box", MozInputBox);