diff --git a/browser/components/places/content/browserPlacesViews.js b/browser/components/places/content/browserPlacesViews.js index ab7ece211e94..c3a8d2c94533 100644 --- a/browser/components/places/content/browserPlacesViews.js +++ b/browser/components/places/content/browserPlacesViews.js @@ -1625,6 +1625,13 @@ class PlacesToolbar extends PlacesViewBase { dropPoint.beforeIndex = beforeIndex; } } + } else if (elt == this._chevron) { + // If drop on the chevron, insert after the last bookmark. + dropPoint.ip = new PlacesInsertionPoint({ + parentGuid: PlacesUtils.getConcreteItemGuid(this._resultNode), + orientation: Ci.nsITreeView.DROP_BEFORE, + }); + dropPoint.beforeIndex = -1; } else { dropPoint.ip = new PlacesInsertionPoint({ parentGuid: PlacesUtils.getConcreteItemGuid(this._resultNode), diff --git a/browser/components/places/tests/browser/browser.toml b/browser/components/places/tests/browser/browser.toml index fa1e24858784..e07c80afcb6c 100644 --- a/browser/components/places/tests/browser/browser.toml +++ b/browser/components/places/tests/browser/browser.toml @@ -91,7 +91,7 @@ support-files = ["pageopeningwindow.html"] ["browser_bookmarks_toolbar_context_menu_view_options.js"] -["browser_bookmarks_toolbar_drag_from_chevron.js"] +["browser_bookmarks_toolbar_drag_with_chevron.js"] ["browser_bookmarks_toolbar_telemetry.js"] diff --git a/browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_from_chevron.js b/browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_with_chevron.js similarity index 61% rename from browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_from_chevron.js rename to browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_with_chevron.js index 8b20f8c926cb..e04a780ab8d3 100644 --- a/browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_from_chevron.js +++ b/browser/components/places/tests/browser/browser_bookmarks_toolbar_drag_with_chevron.js @@ -9,29 +9,12 @@ add_setup(async function () { set: [["browser.toolbars.bookmarks.visibility", "newtab"]], }); - registerCleanupFunction(async () => { - await PlacesUtils.bookmarks.eraseEverything(); - await PlacesUtils.history.clear(); - }); -}); - -add_task(async function drop_on_tabbar() { - let bookmarksToolbar = document.getElementById("PersonalToolbar"); - let chevronMenu = document.getElementById("PlacesChevron"); - - info("Open about:newtab to show the bookmark toolbar"); - let newTab = await BrowserTestUtils.openNewForegroundTab({ - gBrowser, - opening: "about:newtab", - waitForLoad: false, - }); - await TestUtils.waitForCondition( - () => !bookmarksToolbar.collapsed, - "Wait for toolbar to become visible" - ); + info("Open new tab and bookmarks toolbar"); + let { newTab } = await openNewTabAndBookmarksToolbar(); info("Add bookmarks until showing chevron menu"); - let bookmarkCount = 1; + let chevronMenu = document.getElementById("PlacesChevron"); + let bookmarkCount = 2; for (; ; bookmarkCount++) { let url = `https://example.com/${bookmarkCount}`; await PlacesUtils.bookmarks.insert({ @@ -47,7 +30,7 @@ add_task(async function drop_on_tabbar() { info("Add more bookmarks"); bookmarkCount += 1; - for (let max = bookmarkCount + 5; bookmarkCount < max; bookmarkCount++) { + for (let max = bookmarkCount + 2; bookmarkCount < max; bookmarkCount++) { let url = `https://example.com/${bookmarkCount}`; await PlacesUtils.bookmarks.insert({ parentGuid: PlacesUtils.bookmarks.toolbarGuid, @@ -56,8 +39,21 @@ add_task(async function drop_on_tabbar() { }); } + BrowserTestUtils.removeTab(newTab); + + registerCleanupFunction(async () => { + await PlacesUtils.bookmarks.eraseEverything(); + await PlacesUtils.history.clear(); + }); +}); + +add_task(async function drop_on_tabbar_from_chevron() { + info("Open new tab and bookmarks toolbar"); + let { newTab, bookmarksToolbar } = await openNewTabAndBookmarksToolbar(); + info("Check whether DnD from chevron works"); - await dndTest(chevronMenu); + let chevronMenu = document.getElementById("PlacesChevron"); + await testForDndFromChevron(chevronMenu); info("Open not about:newtab page to collapse the bookmark toolbar"); let contentTab = await BrowserTestUtils.openNewForegroundTab({ @@ -78,13 +74,55 @@ add_task(async function drop_on_tabbar() { ); info("Check whether DnD from chevron works again"); - await dndTest(chevronMenu); + await testForDndFromChevron(chevronMenu); BrowserTestUtils.removeTab(newTab); BrowserTestUtils.removeTab(contentTab); }); -async function dndTest(chevronMenu) { +add_task(async function drop_on_chevron_from_identity_box() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.toolbars.bookmarks.visibility", "always"]], + }); + + const TEST_URL = "https://example.com/404_not_found"; + + info("Open new tab and bookmarks toolbar"); + let { newTab } = await openNewTabAndBookmarksToolbar({ + url: TEST_URL, + }); + + info("Start DnD"); + let chevronMenu = document.getElementById("PlacesChevron"); + let identityBox = document.getElementById("identity-box"); + let chevronPopup = document.getElementById("PlacesChevronPopup"); + + let onChevronPopupShown = BrowserTestUtils.waitForPopupEvent( + chevronPopup, + "shown" + ); + await EventUtils.synthesizePlainDragAndDrop({ + srcElement: identityBox, + destElement: chevronMenu, + }); + await onChevronPopupShown; + + info("Check the last bookmark item"); + await BrowserTestUtils.waitForCondition(() => { + let items = [...chevronPopup.children]; + let lastElement = items.findLast( + c => c.nodeName == "menuitem" && BrowserTestUtils.isVisible(c) + ); + return lastElement.label == "404 Not Found"; + }); + Assert.ok(true, "The current page is bookmarked with correct position"); + + chevronPopup.hidePopup(); + BrowserTestUtils.removeTab(newTab); + await SpecialPowers.popPrefEnv(); +}); + +async function testForDndFromChevron(chevronMenu) { info("Open chevron menu"); let chevronPopup = document.getElementById("PlacesChevronPopup"); let onChevronPopupShown = BrowserTestUtils.waitForPopupEvent( @@ -125,3 +163,19 @@ async function dndTest(chevronMenu) { BrowserTestUtils.removeTab(dropTab); chevronPopup.hidePopup(); } + +async function openNewTabAndBookmarksToolbar({ url } = {}) { + let newTab = await BrowserTestUtils.openNewForegroundTab({ + gBrowser, + opening: url ?? "about:newtab", + waitForLoad: !!url, + }); + + let bookmarksToolbar = document.getElementById("PersonalToolbar"); + await TestUtils.waitForCondition( + () => !bookmarksToolbar.collapsed, + "Wait for toolbar to become visible" + ); + + return { newTab, bookmarksToolbar }; +}