summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js')
-rw-r--r--browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js162
1 files changed, 162 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js b/browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js
new file mode 100644
index 0000000000..5d35356a69
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_bug631374_tags_selector_scroll.js
@@ -0,0 +1,162 @@
+/**
+ * This test checks that editing tags doesn't scroll the tags selector
+ * listbox to wrong positions.
+ */
+
+const TEST_URL = "about:buildconfig";
+
+function scrolledIntoView(item, parentItem) {
+ let itemRect = item.getBoundingClientRect();
+ let parentItemRect = parentItem.getBoundingClientRect();
+ let pointInView = y => parentItemRect.top < y && y < parentItemRect.bottom;
+
+ // Partially visible items are also considered visible.
+ return pointInView(itemRect.top) || pointInView(itemRect.bottom);
+}
+
+add_task(async function runTest() {
+ await PlacesUtils.bookmarks.eraseEverything();
+ let tags = [
+ "a",
+ "b",
+ "c",
+ "d",
+ "e",
+ "f",
+ "g",
+ "h",
+ "i",
+ "l",
+ "m",
+ "n",
+ "o",
+ "p",
+ ];
+
+ // Add a bookmark and tag it.
+ let uri1 = Services.io.newURI(TEST_URL);
+ let bm1 = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.toolbarGuid,
+ title: "mozilla",
+ url: uri1.spec,
+ });
+ PlacesUtils.tagging.tagURI(uri1, tags);
+
+ // Add a second bookmark so that tags won't disappear when unchecked.
+ let uri2 = Services.io.newURI("http://www2.mozilla.org/");
+ let bm2 = await PlacesUtils.bookmarks.insert({
+ parentGuid: PlacesUtils.bookmarks.toolbarGuid,
+ title: "mozilla",
+ url: uri2.spec,
+ });
+ PlacesUtils.tagging.tagURI(uri2, tags);
+
+ let win = await BrowserTestUtils.openNewBrowserWindow();
+ await BrowserTestUtils.openNewForegroundTab({
+ gBrowser: win.gBrowser,
+ opening: TEST_URL,
+ waitForStateStop: true,
+ });
+
+ registerCleanupFunction(async () => {
+ bookmarkPanel.removeAttribute("animate");
+ await BrowserTestUtils.closeWindow(win);
+ await PlacesUtils.bookmarks.eraseEverything();
+ });
+
+ win.StarUI._createPanelIfNeeded();
+ let bookmarkPanel = win.document.getElementById("editBookmarkPanel");
+ bookmarkPanel.setAttribute("animate", false);
+ let shownPromise = promisePopupShown(bookmarkPanel);
+
+ let bookmarkStar = win.BookmarkingUI.star;
+ bookmarkStar.click();
+
+ await shownPromise;
+
+ // Init panel.
+ ok(win.gEditItemOverlay, "gEditItemOverlay is in context");
+ ok(win.gEditItemOverlay.initialized, "gEditItemOverlay is initialized");
+
+ await openTagSelector(win);
+ let tagsSelector = win.document.getElementById("editBMPanel_tagsSelector");
+
+ // Go by two so there is some untouched tag in the middle.
+ for (let i = 8; i < tags.length; i += 2) {
+ tagsSelector.selectedIndex = i;
+ let listItem = tagsSelector.selectedItem;
+ isnot(listItem, null, "Valid listItem found");
+
+ tagsSelector.ensureElementIsVisible(listItem);
+ let scrollTop = tagsSelector.scrollTop;
+
+ ok(listItem.hasAttribute("checked"), "Item is checked " + i);
+ let selectedTag = listItem.label;
+
+ // Uncheck the tag.
+ let promise = BrowserTestUtils.waitForEvent(
+ tagsSelector,
+ "BookmarkTagsSelectorUpdated"
+ );
+ EventUtils.synthesizeMouseAtCenter(listItem.firstElementChild, {}, win);
+ await promise;
+ is(scrollTop, tagsSelector.scrollTop, "Scroll position did not change");
+
+ // The listbox is rebuilt, so we have to get the new element.
+ let newItem = tagsSelector.selectedItem;
+ isnot(newItem, null, "Valid new listItem found");
+ ok(!newItem.hasAttribute("checked"), "New listItem is unchecked " + i);
+ is(newItem.label, selectedTag, "Correct tag is still selected");
+
+ // Check the tag.
+ promise = BrowserTestUtils.waitForEvent(
+ tagsSelector,
+ "BookmarkTagsSelectorUpdated"
+ );
+ EventUtils.synthesizeMouseAtCenter(newItem.firstElementChild, {}, win);
+ await promise;
+ is(scrollTop, tagsSelector.scrollTop, "Scroll position did not change");
+ }
+
+ // Remove the second bookmark, then nuke some of the tags.
+ await PlacesUtils.bookmarks.remove(bm2);
+
+ // Allow the tag updates to complete
+ await PlacesTestUtils.promiseAsyncUpdates();
+
+ // Doing this backwords tests more interesting paths.
+ for (let i = tags.length - 1; i >= 0; i -= 2) {
+ tagsSelector.selectedIndex = i;
+ let listItem = tagsSelector.selectedItem;
+ isnot(listItem, null, "Valid listItem found");
+
+ tagsSelector.ensureElementIsVisible(listItem);
+
+ ok(listItem.hasAttribute("checked"), "Item is checked " + i);
+
+ // Uncheck the tag.
+ let promise = BrowserTestUtils.waitForEvent(
+ tagsSelector,
+ "BookmarkTagsSelectorUpdated"
+ );
+ EventUtils.synthesizeMouseAtCenter(listItem.firstElementChild, {}, win);
+ await promise;
+ }
+
+ let hiddenPromise = promisePopupHidden(bookmarkPanel);
+ let doneButton = win.document.getElementById("editBookmarkPanelDoneButton");
+ doneButton.click();
+ await hiddenPromise;
+ // Cleanup.
+ await PlacesUtils.bookmarks.remove(bm1);
+});
+
+function openTagSelector(win) {
+ let promise = BrowserTestUtils.waitForEvent(
+ win.document.getElementById("editBMPanel_tagsSelector"),
+ "BookmarkTagsSelectorUpdated"
+ );
+ // Open the tags selector.
+ win.document.getElementById("editBMPanel_tagsSelectorExpander").doCommand();
+ return promise;
+}