diff options
Diffstat (limited to 'browser/base/content/test/general/browser_bookmark_popup.js')
-rw-r--r-- | browser/base/content/test/general/browser_bookmark_popup.js | 431 |
1 files changed, 431 insertions, 0 deletions
diff --git a/browser/base/content/test/general/browser_bookmark_popup.js b/browser/base/content/test/general/browser_bookmark_popup.js new file mode 100644 index 000000000..c1ddd725e --- /dev/null +++ b/browser/base/content/test/general/browser_bookmark_popup.js @@ -0,0 +1,431 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +"use strict"; + +/** + * Test opening and closing the bookmarks panel. + */ + +let bookmarkPanel = document.getElementById("editBookmarkPanel"); +let bookmarkStar = document.getElementById("bookmarks-menu-button"); +let bookmarkPanelTitle = document.getElementById("editBookmarkPanelTitle"); +let editBookmarkPanelRemoveButtonRect; + +StarUI._closePanelQuickForTesting = true; + +function* test_bookmarks_popup({isNewBookmark, popupShowFn, popupEditFn, + shouldAutoClose, popupHideFn, isBookmarkRemoved}) { + yield BrowserTestUtils.withNewTab({gBrowser, url: "about:home"}, function*(browser) { + try { + if (!isNewBookmark) { + yield PlacesUtils.bookmarks.insert({ + parentGuid: PlacesUtils.bookmarks.unfiledGuid, + url: "about:home", + title: "Home Page" + }); + } + + info(`BookmarkingUI.status is ${BookmarkingUI.status}`); + yield BrowserTestUtils.waitForCondition( + () => BookmarkingUI.status != BookmarkingUI.STATUS_UPDATING, + "BookmarkingUI should not be updating"); + + is(bookmarkStar.hasAttribute("starred"), !isNewBookmark, + "Page should only be starred prior to popupshown if editing bookmark"); + is(bookmarkPanel.state, "closed", "Panel should be 'closed' to start test"); + let shownPromise = promisePopupShown(bookmarkPanel); + yield popupShowFn(browser); + yield shownPromise; + is(bookmarkPanel.state, "open", "Panel should be 'open' after shownPromise is resolved"); + + editBookmarkPanelRemoveButtonRect = + document.getElementById("editBookmarkPanelRemoveButton").getBoundingClientRect(); + + if (popupEditFn) { + yield popupEditFn(); + } + let bookmarks = []; + yield PlacesUtils.bookmarks.fetch({url: "about:home"}, bm => bookmarks.push(bm)); + is(bookmarks.length, 1, "Only one bookmark should exist"); + is(bookmarkStar.getAttribute("starred"), "true", "Page is starred"); + is(bookmarkPanelTitle.value, + isNewBookmark ? + gNavigatorBundle.getString("editBookmarkPanel.pageBookmarkedTitle") : + gNavigatorBundle.getString("editBookmarkPanel.editBookmarkTitle"), + "title should match isEditingBookmark state"); + + if (!shouldAutoClose) { + yield new Promise(resolve => setTimeout(resolve, 400)); + is(bookmarkPanel.state, "open", "Panel should still be 'open' for non-autoclose"); + } + + let hiddenPromise = promisePopupHidden(bookmarkPanel); + if (popupHideFn) { + yield popupHideFn(); + } + yield hiddenPromise; + is(bookmarkStar.hasAttribute("starred"), !isBookmarkRemoved, + "Page is starred after closing"); + } finally { + let bookmark = yield PlacesUtils.bookmarks.fetch({url: "about:home"}); + is(!!bookmark, !isBookmarkRemoved, + "bookmark should not be present if a panel action should've removed it"); + if (bookmark) { + yield PlacesUtils.bookmarks.remove(bookmark); + } + } + }); +} + +add_task(function* panel_shown_for_new_bookmarks_and_autocloses() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + shouldAutoClose: true, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_once_for_doubleclick_on_new_bookmark_star_and_autocloses() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + EventUtils.synthesizeMouse(bookmarkStar, 10, 10, { clickCount: 2 }, + window); + }, + shouldAutoClose: true, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_once_for_slow_doubleclick_on_new_bookmark_star_and_autocloses() { + todo(false, "bug 1250267, may need to add some tracking state to " + + "browser-places.js for this."); + return; + + /* + yield test_bookmarks_popup({ + isNewBookmark: true, + *popupShowFn() { + EventUtils.synthesizeMouse(bookmarkStar, 10, 10, window); + yield new Promise(resolve => setTimeout(resolve, 300)); + EventUtils.synthesizeMouse(bookmarkStar, 10, 10, window); + }, + shouldAutoClose: true, + isBookmarkRemoved: false, + }); + */ +}); + +add_task(function* panel_shown_for_keyboardshortcut_on_new_bookmark_star_and_autocloses() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + EventUtils.synthesizeKey("D", {accelKey: true}, window); + }, + shouldAutoClose: true, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_new_bookmarks_mousemove_mouseout() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + *popupEditFn() { + let mouseMovePromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mousemove"); + EventUtils.synthesizeMouseAtCenter(bookmarkPanel, {type: "mousemove"}); + info("Waiting for mousemove event"); + yield mouseMovePromise; + info("Got mousemove event"); + + yield new Promise(resolve => setTimeout(resolve, 400)); + is(bookmarkPanel.state, "open", "Panel should still be open on mousemove"); + }, + *popupHideFn() { + let mouseOutPromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mouseout"); + EventUtils.synthesizeMouse(bookmarkPanel, 0, 0, {type: "mouseout"}); + EventUtils.synthesizeMouseAtCenter(document.documentElement, {type: "mousemove"}); + info("Waiting for mouseout event"); + yield mouseOutPromise; + info("Got mouseout event, should autoclose now"); + }, + shouldAutoClose: false, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_new_bookmark_no_autoclose_close_with_ESC() { + yield test_bookmarks_popup({ + isNewBookmark: false, + popupShowFn() { + bookmarkStar.click(); + }, + shouldAutoClose: false, + popupHideFn() { + EventUtils.synthesizeKey("VK_ESCAPE", {accelKey: true}, window); + }, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_editing_no_autoclose_close_with_ESC() { + yield test_bookmarks_popup({ + isNewBookmark: false, + popupShowFn() { + bookmarkStar.click(); + }, + shouldAutoClose: false, + popupHideFn() { + EventUtils.synthesizeKey("VK_ESCAPE", {accelKey: true}, window); + }, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_new_bookmark_keypress_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + popupEditFn() { + EventUtils.sendChar("VK_TAB", window); + }, + shouldAutoClose: false, + popupHideFn() { + bookmarkPanel.hidePopup(); + }, + isBookmarkRemoved: false, + }); +}); + + +add_task(function* panel_shown_for_new_bookmark_compositionstart_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + *popupEditFn() { + let compositionStartPromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "compositionstart"); + EventUtils.synthesizeComposition({ type: "compositionstart" }, window); + info("Waiting for compositionstart event"); + yield compositionStartPromise; + info("Got compositionstart event"); + }, + shouldAutoClose: false, + popupHideFn() { + EventUtils.synthesizeComposition({ type: "compositioncommitasis" }); + bookmarkPanel.hidePopup(); + }, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_new_bookmark_compositionstart_mouseout_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + *popupEditFn() { + let mouseMovePromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mousemove"); + EventUtils.synthesizeMouseAtCenter(bookmarkPanel, {type: "mousemove"}); + info("Waiting for mousemove event"); + yield mouseMovePromise; + info("Got mousemove event"); + + let compositionStartPromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "compositionstart"); + EventUtils.synthesizeComposition({ type: "compositionstart" }, window); + info("Waiting for compositionstart event"); + yield compositionStartPromise; + info("Got compositionstart event"); + + let mouseOutPromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mouseout"); + EventUtils.synthesizeMouse(bookmarkPanel, 0, 0, {type: "mouseout"}); + EventUtils.synthesizeMouseAtCenter(document.documentElement, {type: "mousemove"}); + info("Waiting for mouseout event"); + yield mouseOutPromise; + info("Got mouseout event, but shouldn't run autoclose"); + }, + shouldAutoClose: false, + popupHideFn() { + EventUtils.synthesizeComposition({ type: "compositioncommitasis" }); + bookmarkPanel.hidePopup(); + }, + isBookmarkRemoved: false, + }); +}); + +add_task(function* panel_shown_for_new_bookmark_compositionend_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn() { + bookmarkStar.click(); + }, + *popupEditFn() { + let mouseMovePromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mousemove"); + EventUtils.synthesizeMouseAtCenter(bookmarkPanel, {type: "mousemove"}); + info("Waiting for mousemove event"); + yield mouseMovePromise; + info("Got mousemove event"); + + EventUtils.synthesizeComposition({ type: "compositioncommit", data: "committed text" }); + }, + popupHideFn() { + bookmarkPanel.hidePopup(); + }, + shouldAutoClose: false, + isBookmarkRemoved: false, + }); +}); + +add_task(function* contextmenu_new_bookmark_keypress_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + *popupShowFn(browser) { + let contextMenu = document.getElementById("contentAreaContextMenu"); + let awaitPopupShown = BrowserTestUtils.waitForEvent(contextMenu, + "popupshown"); + let awaitPopupHidden = BrowserTestUtils.waitForEvent(contextMenu, + "popuphidden"); + yield BrowserTestUtils.synthesizeMouseAtCenter("body", { + type: "contextmenu", + button: 2 + }, browser); + yield awaitPopupShown; + document.getElementById("context-bookmarkpage").click(); + contextMenu.hidePopup(); + yield awaitPopupHidden; + }, + popupEditFn() { + EventUtils.sendChar("VK_TAB", window); + }, + shouldAutoClose: false, + popupHideFn() { + bookmarkPanel.hidePopup(); + }, + isBookmarkRemoved: false, + }); +}); + +add_task(function* bookmarks_menu_new_bookmark_remove_bookmark() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn(browser) { + document.getElementById("menu_bookmarkThisPage").doCommand(); + }, + shouldAutoClose: true, + popupHideFn() { + document.getElementById("editBookmarkPanelRemoveButton").click(); + }, + isBookmarkRemoved: true, + }); +}); + +add_task(function* ctrl_d_edit_bookmark_remove_bookmark() { + yield test_bookmarks_popup({ + isNewBookmark: false, + popupShowFn(browser) { + EventUtils.synthesizeKey("D", {accelKey: true}, window); + }, + shouldAutoClose: true, + popupHideFn() { + document.getElementById("editBookmarkPanelRemoveButton").click(); + }, + isBookmarkRemoved: true, + }); +}); + +add_task(function* enter_on_remove_bookmark_should_remove_bookmark() { + if (AppConstants.platform == "macosx") { + // "Full Keyboard Access" is disabled by default, and thus doesn't allow + // keyboard navigation to the "Remove Bookmarks" button by default. + return; + } + + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn(browser) { + EventUtils.synthesizeKey("D", {accelKey: true}, window); + }, + shouldAutoClose: true, + popupHideFn() { + while (!document.activeElement || + document.activeElement.id != "editBookmarkPanelRemoveButton") { + EventUtils.sendChar("VK_TAB", window); + } + EventUtils.sendChar("VK_RETURN", window); + }, + isBookmarkRemoved: true, + }); +}); + +add_task(function* ctrl_d_new_bookmark_mousedown_mouseout_no_autoclose() { + yield test_bookmarks_popup({ + isNewBookmark: true, + popupShowFn(browser) { + EventUtils.synthesizeKey("D", {accelKey: true}, window); + }, + *popupEditFn() { + let mouseMovePromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mousemove"); + EventUtils.synthesizeMouseAtCenter(bookmarkPanel, {type: "mousemove"}); + info("Waiting for mousemove event"); + yield mouseMovePromise; + info("Got mousemove event"); + + yield new Promise(resolve => setTimeout(resolve, 400)); + is(bookmarkPanel.state, "open", "Panel should still be open on mousemove"); + + EventUtils.synthesizeMouseAtCenter(bookmarkPanelTitle, {button: 1, type: "mousedown"}); + + let mouseOutPromise = BrowserTestUtils.waitForEvent(bookmarkPanel, "mouseout"); + EventUtils.synthesizeMouse(bookmarkPanel, 0, 0, {type: "mouseout"}); + EventUtils.synthesizeMouseAtCenter(document.documentElement, {type: "mousemove"}); + info("Waiting for mouseout event"); + yield mouseOutPromise; + }, + shouldAutoClose: false, + popupHideFn() { + document.getElementById("editBookmarkPanelRemoveButton").click(); + }, + isBookmarkRemoved: true, + }); +}); + +add_task(function* mouse_hovering_panel_should_prevent_autoclose() { + if (AppConstants.platform != "win") { + // This test requires synthesizing native mouse movement which is + // best supported on Windows. + return; + } + yield test_bookmarks_popup({ + isNewBookmark: true, + *popupShowFn(browser) { + yield new Promise(resolve => { + EventUtils.synthesizeNativeMouseMove( + document.documentElement, + editBookmarkPanelRemoveButtonRect.left, + editBookmarkPanelRemoveButtonRect.top, + resolve); + }); + EventUtils.synthesizeKey("D", {accelKey: true}, window); + }, + shouldAutoClose: false, + popupHideFn() { + document.getElementById("editBookmarkPanelRemoveButton").click(); + }, + isBookmarkRemoved: true, + }); +}); + +registerCleanupFunction(function() { + delete StarUI._closePanelQuickForTesting; +}); |