summaryrefslogtreecommitdiffstats
path: root/browser/components/urlbar/tests/browser/browser_urlbar_selection.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/urlbar/tests/browser/browser_urlbar_selection.js')
-rw-r--r--browser/components/urlbar/tests/browser/browser_urlbar_selection.js307
1 files changed, 307 insertions, 0 deletions
diff --git a/browser/components/urlbar/tests/browser/browser_urlbar_selection.js b/browser/components/urlbar/tests/browser/browser_urlbar_selection.js
new file mode 100644
index 0000000000..3440c35e6f
--- /dev/null
+++ b/browser/components/urlbar/tests/browser/browser_urlbar_selection.js
@@ -0,0 +1,307 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+"use strict";
+
+const exampleSearch = "f oo bar";
+const exampleUrl = "https://example.com/1";
+
+function click(target) {
+ let promise = BrowserTestUtils.waitForEvent(target, "click");
+ EventUtils.synthesizeMouseAtCenter(target, {}, target.ownerGlobal);
+ return promise;
+}
+
+function openContextMenu(target) {
+ let popupShownPromise = BrowserTestUtils.waitForEvent(
+ target.ownerGlobal,
+ "contextmenu"
+ );
+
+ EventUtils.synthesizeMouseAtCenter(
+ target,
+ {
+ type: "contextmenu",
+ button: 2,
+ },
+ target.ownerGlobal
+ );
+ return popupShownPromise;
+}
+
+function drag(target, fromX, fromY, toX, toY) {
+ let promise = BrowserTestUtils.waitForEvent(target, "mouseup");
+ EventUtils.synthesizeMouse(
+ target,
+ fromX,
+ fromY,
+ { type: "mousemove" },
+ target.ownerGlobal
+ );
+ EventUtils.synthesizeMouse(
+ target,
+ fromX,
+ fromY,
+ { type: "mousedown" },
+ target.ownerGlobal
+ );
+ EventUtils.synthesizeMouse(
+ target,
+ toX,
+ toY,
+ { type: "mousemove" },
+ target.ownerGlobal
+ );
+ EventUtils.synthesizeMouse(
+ target,
+ toX,
+ toY,
+ { type: "mouseup" },
+ target.ownerGlobal
+ );
+ return promise;
+}
+
+function resetPrimarySelection(val = "") {
+ if (
+ Services.clipboard.isClipboardTypeSupported(
+ Services.clipboard.kSelectionClipboard
+ )
+ ) {
+ // Reset the clipboard.
+ clipboardHelper.copyStringToClipboard(
+ val,
+ Services.clipboard.kSelectionClipboard
+ );
+ }
+}
+
+function checkPrimarySelection(expectedVal = "") {
+ if (
+ Services.clipboard.isClipboardTypeSupported(
+ Services.clipboard.kSelectionClipboard
+ )
+ ) {
+ let primaryAsText = SpecialPowers.getClipboardData(
+ "text/plain",
+ SpecialPowers.Ci.nsIClipboard.kSelectionClipboard
+ );
+ Assert.equal(primaryAsText, expectedVal);
+ }
+}
+
+add_setup(async function () {
+ // On macOS, we must "warm up" the Urlbar to get the first test to pass.
+ gURLBar.value = "";
+ await click(gURLBar.inputField);
+ gURLBar.blur();
+});
+
+add_task(async function leftClickSelectsAll() {
+ resetPrimarySelection();
+ gURLBar.value = exampleSearch;
+ await click(gURLBar.inputField);
+ Assert.equal(
+ gURLBar.selectionStart,
+ 0,
+ "The entire search term should be selected."
+ );
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleSearch.length,
+ "The entire search term should be selected."
+ );
+ gURLBar.blur();
+ checkPrimarySelection();
+});
+
+add_task(async function leftClickSelectsUrl() {
+ resetPrimarySelection();
+ gURLBar.value = exampleUrl;
+ await click(gURLBar.inputField);
+ Assert.equal(gURLBar.selectionStart, 0, "The entire url should be selected.");
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleUrl.length,
+ "The entire url should be selected."
+ );
+ gURLBar.blur();
+ checkPrimarySelection();
+});
+
+add_task(async function rightClickSelectsAll() {
+ gURLBar.inputField.focus();
+ gURLBar.value = exampleUrl;
+
+ // Remove the selection so the focus() call above doesn't influence the test.
+ gURLBar.selectionStart = gURLBar.selectionEnd = 0;
+
+ resetPrimarySelection();
+
+ await openContextMenu(gURLBar.inputField);
+
+ Assert.equal(gURLBar.selectionStart, 0, "The entire URL should be selected.");
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleUrl.length,
+ "The entire URL should be selected."
+ );
+
+ checkPrimarySelection();
+
+ let contextMenu = gURLBar.querySelector("moz-input-box").menupopup;
+
+ // While the context menu is open, test the "Select All" button.
+ let contextMenuItem = contextMenu.firstElementChild;
+ while (
+ contextMenuItem.nextElementSibling &&
+ contextMenuItem.getAttribute("cmd") != "cmd_selectAll"
+ ) {
+ contextMenuItem = contextMenuItem.nextElementSibling;
+ }
+ Assert.ok(
+ contextMenuItem,
+ "The context menu should have the select all menu item."
+ );
+
+ let controller = document.commandDispatcher.getControllerForCommand(
+ contextMenuItem.getAttribute("cmd")
+ );
+ let enabled = controller.isCommandEnabled(
+ contextMenuItem.getAttribute("cmd")
+ );
+ Assert.ok(enabled, "The context menu select all item should be enabled.");
+
+ await click(contextMenuItem);
+ Assert.equal(
+ gURLBar.selectionStart,
+ 0,
+ "The entire URL should be selected after clicking selectAll button."
+ );
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleUrl.length,
+ "The entire URL should be selected after clicking selectAll button."
+ );
+
+ gURLBar.querySelector("moz-input-box").menupopup.hidePopup();
+ gURLBar.blur();
+ checkPrimarySelection(gURLBar.value);
+ await SpecialPowers.popPrefEnv();
+});
+
+add_task(async function contextMenuDoesNotCancelSelection() {
+ gURLBar.inputField.focus();
+ gURLBar.value = exampleUrl;
+
+ gURLBar.selectionStart = 3;
+ gURLBar.selectionEnd = 7;
+
+ resetPrimarySelection();
+
+ await openContextMenu(gURLBar.inputField);
+
+ Assert.equal(
+ gURLBar.selectionStart,
+ 3,
+ "The selection should not have changed."
+ );
+ Assert.equal(
+ gURLBar.selectionEnd,
+ 7,
+ "The selection should not have changed."
+ );
+
+ gURLBar.querySelector("moz-input-box").menupopup.hidePopup();
+ gURLBar.blur();
+ checkPrimarySelection();
+});
+
+add_task(async function dragSelect() {
+ resetPrimarySelection();
+ gURLBar.value = exampleSearch.repeat(10);
+ // Drags from an artibrary offset of 30 to test for bug 1562145: that the
+ // selection does not start at the beginning.
+ await drag(gURLBar.inputField, 30, 0, 60, 0);
+ Assert.greater(
+ gURLBar.selectionStart,
+ 0,
+ "Selection should not start at the beginning of the string."
+ );
+
+ let selectedVal = gURLBar.value.substring(
+ gURLBar.selectionStart,
+ gURLBar.selectionEnd
+ );
+ gURLBar.blur();
+ checkPrimarySelection(selectedVal);
+});
+
+/**
+ * Testing for bug 1571018: that the entire Urlbar isn't selected when the
+ * Urlbar is dragged following a selectsAll event then a blur.
+ */
+add_task(async function dragAfterSelectAll() {
+ resetPrimarySelection();
+ gURLBar.value = exampleSearch.repeat(10);
+ await click(gURLBar.inputField);
+ Assert.equal(
+ gURLBar.selectionStart,
+ 0,
+ "The entire search term should be selected."
+ );
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleSearch.repeat(10).length,
+ "The entire search term should be selected."
+ );
+
+ gURLBar.blur();
+ checkPrimarySelection();
+
+ // The offset of 30 is arbitrary.
+ await drag(gURLBar.inputField, 30, 0, 60, 0);
+
+ Assert.notEqual(
+ gURLBar.selectionStart,
+ 0,
+ "Only part of the search term should be selected."
+ );
+ Assert.notEqual(
+ gURLBar.selectionEnd,
+ exampleSearch.repeat(10).length,
+ "Only part of the search term should be selected."
+ );
+
+ checkPrimarySelection(
+ gURLBar.value.substring(gURLBar.selectionStart, gURLBar.selectionEnd)
+ );
+});
+
+/**
+ * Testing for bug 1571018: that the entire Urlbar is selected when the Urlbar
+ * is refocused following a partial text selection then a blur.
+ */
+add_task(async function selectAllAfterDrag() {
+ gURLBar.value = exampleSearch;
+
+ gURLBar.selectionStart = 3;
+ gURLBar.selectionEnd = 7;
+
+ gURLBar.blur();
+
+ await click(gURLBar.inputField);
+
+ Assert.equal(
+ gURLBar.selectionStart,
+ 0,
+ "The entire search term should be selected."
+ );
+ Assert.equal(
+ gURLBar.selectionEnd,
+ exampleSearch.length,
+ "The entire search term should be selected."
+ );
+
+ gURLBar.blur();
+});