From 1f572a8a6baebd069dec6859b4884dff9c95f2a6 Mon Sep 17 00:00:00 2001 From: Blair McBride Date: Mon, 7 Feb 2011 16:53:53 +1300 Subject: [PATCH] Bug 625465 - Items in list view should launch description view with a single click on an add-on entry. r=dtownsend, a=beltzner --- .../mozapps/extensions/content/extensions.css | 4 + .../mozapps/extensions/content/extensions.xml | 95 +++++++++++++--- .../extensions/test/browser/Makefile.in | 1 + .../test/browser/browser_bug562854.js | 9 +- .../test/browser/browser_bug591465.js | 26 ++--- .../test/browser/browser_bug625465.js | 101 ++++++++++++++++++ .../extensions/test/browser/browser_list.js | 3 +- .../mozapps/extensions/extensions.css | 8 +- .../mozapps/extensions/detail-btn.png | Bin 0 -> 1152 bytes .../mozapps/extensions/extensions.css | 24 ++++- toolkit/themes/pinstripe/mozapps/jar.mn | 1 + .../mozapps/extensions/detail-btn.png | Bin 0 -> 1152 bytes .../mozapps/extensions/extensions.css | 42 +++++++- toolkit/themes/winstripe/mozapps/jar.mn | 2 + 14 files changed, 278 insertions(+), 38 deletions(-) create mode 100644 toolkit/mozapps/extensions/test/browser/browser_bug625465.js create mode 100644 toolkit/themes/pinstripe/mozapps/extensions/detail-btn.png create mode 100644 toolkit/themes/winstripe/mozapps/extensions/detail-btn.png diff --git a/toolkit/mozapps/extensions/content/extensions.css b/toolkit/mozapps/extensions/content/extensions.css index 6a1468241128..ba11ac52d8d5 100644 --- a/toolkit/mozapps/extensions/content/extensions.css +++ b/toolkit/mozapps/extensions/content/extensions.css @@ -54,6 +54,10 @@ xhtml|link { -moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#sorters"); } +.list { + -moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#addons-richlistbox"); +} + .addon[status="installed"] { -moz-box-orient: vertical; -moz-binding: url("chrome://mozapps/content/extensions/extensions.xml#addon-generic"); diff --git a/toolkit/mozapps/extensions/content/extensions.xml b/toolkit/mozapps/extensions/content/extensions.xml index 6fa86f300e39..2851e848204d 100644 --- a/toolkit/mozapps/extensions/content/extensions.xml +++ b/toolkit/mozapps/extensions/content/extensions.xml @@ -521,6 +521,61 @@ + + + null + null + + + + 30)) { + var item = event.target; + + while (item && item.localName != "richlistitem") + item = item == this ? null : item.parentNode; + + if (!item) + return; + + var index = this.getIndexOfItem(item); + if (index != this.selectedIndex) + this.selectedIndex = index; + + this.mLastMoveTime = now; + } + ]]> + + + + + + @@ -845,8 +900,7 @@ - @@ -1627,20 +1681,33 @@ + + + + diff --git a/toolkit/mozapps/extensions/test/browser/Makefile.in b/toolkit/mozapps/extensions/test/browser/Makefile.in index ef2c5c389ddb..583c40a9b3ac 100644 --- a/toolkit/mozapps/extensions/test/browser/Makefile.in +++ b/toolkit/mozapps/extensions/test/browser/Makefile.in @@ -70,6 +70,7 @@ _MAIN_TEST_FILES = \ browser_bug608316.js \ browser_bug610764.js \ browser_bug618502.js \ + browser_bug625465.js \ browser_details.js \ browser_discovery.js \ browser_dragdrop.js \ diff --git a/toolkit/mozapps/extensions/test/browser/browser_bug562854.js b/toolkit/mozapps/extensions/test/browser/browser_bug562854.js index 4c06cebb784e..f243b4c66a04 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_bug562854.js +++ b/toolkit/mozapps/extensions/test/browser/browser_bug562854.js @@ -3,7 +3,8 @@ */ /** - * Tests that double-click does not go to detail view if the target is a link or button. + * Tests that clicking does not go to detail view if the target is a link or button, + * but clicking anywhere else does. */ function test() { @@ -40,7 +41,7 @@ function is_in_detail(aManager, view) { is(doc.getElementById("view-port").selectedPanel.id, "detail-view", "Should be on the right view"); } -// Check that double-click does something. +// Check that clicking on the addon item does something. add_test(function() { open_manager("addons://list/extension", function(aManager) { info("Part 1"); @@ -48,8 +49,7 @@ add_test(function() { var addon = get_addon_element(aManager, "test1@tests.mozilla.org"); addon.parentNode.ensureElementIsVisible(addon); - EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 1 }, aManager); - EventUtils.synthesizeMouseAtCenter(addon, { clickCount: 2 }, aManager); + EventUtils.synthesizeMouseAtCenter(addon, { }, aManager); wait_for_view_load(aManager, function(aManager) { info("Part 2"); @@ -110,7 +110,6 @@ add_test(function() { var rect = target.getBoundingClientRect(); var addonRect = addon.getBoundingClientRect(); - EventUtils.synthesizeMouse(target, rect.width / 2, rect.height / 2, { clickCount: 1 }, aManager); EventUtils.synthesizeMouse(addon, rect.left - addonRect.left + rect.width / 2, rect.top - addonRect.top + rect.height / 2, diff --git a/toolkit/mozapps/extensions/test/browser/browser_bug591465.js b/toolkit/mozapps/extensions/test/browser/browser_bug591465.js index 973a8d6b6d81..fad275681c00 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_bug591465.js +++ b/toolkit/mozapps/extensions/test/browser/browser_bug591465.js @@ -128,7 +128,7 @@ add_test(function() { }, false); info("Opening context menu on enabled extension item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -147,7 +147,7 @@ add_test(function() { }, false); info("Opening context menu on newly disabled extension item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -166,7 +166,7 @@ add_test(function() { }, false); info("Opening context menu on newly enabled extension item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -183,7 +183,7 @@ add_test(function() { }, false); info("Opening context menu on disabled extension item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -203,7 +203,7 @@ add_test(function() { }, false); info("Opening context menu on enabled theme item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -222,7 +222,7 @@ add_test(function() { }, false); info("Opening context menu on disabled theme item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -242,7 +242,7 @@ add_test(function() { info("Opening context menu on enabled extension, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -263,7 +263,7 @@ add_test(function() { info("Opening context menu on disabled extension, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -284,7 +284,7 @@ add_test(function() { info("Opening context menu on enabled theme, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -305,7 +305,7 @@ add_test(function() { info("Opening context menu on disabled theme, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -325,7 +325,7 @@ add_test(function() { info("Opening context menu with single menu item on enabled theme, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); @@ -359,7 +359,7 @@ add_test(function() { }, false); info("Opening context menu on remote extension item"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); @@ -389,7 +389,7 @@ add_test(function() { info("Opening context menu on remote extension, in detail view"); var el = gManagerWindow.document.querySelector("#detail-view .detail-view-container"); - EventUtils.synthesizeMouse(el, 4, 4, { }, gManagerWindow); + el.parentNode.selectedItem = el; EventUtils.synthesizeMouse(el, 4, 4, { type: "contextmenu", button: 2 }, gManagerWindow); }); }); diff --git a/toolkit/mozapps/extensions/test/browser/browser_bug625465.js b/toolkit/mozapps/extensions/test/browser/browser_bug625465.js new file mode 100644 index 000000000000..732b0d247ea7 --- /dev/null +++ b/toolkit/mozapps/extensions/test/browser/browser_bug625465.js @@ -0,0 +1,101 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + +// Bug 625465 - Items in list view should launch description view with a single click on an add-on entry + +var gManagerWindow; +var gList; + +function test() { + waitForExplicitFinish(); + + var gProvider = new MockProvider(); + for (let i = 1; i <= 30; i++) { + gProvider.createAddons([{ + id: "test" + i + "@tests.mozilla.org", + name: "Test add-on " + i, + description: "foo" + }]); + } + + open_manager("addons://list/extension", function(aManager) { + gManagerWindow = aManager; + gList = gManagerWindow.document.getElementById("addon-list"); + + run_next_test(); + }); +} + +function end_test() { + close_manager(gManagerWindow, finish); +} + + +function get_item_content_pos(aItem) { + return { + x: (aItem.boxObject.x - gList.boxObject.x) + 10, + y: (aItem.boxObject.y - gList.boxObject.y - gList._scrollbox.scrollTop) + 10 + }; +} + +function get_item_index(aItem) { + for (let i = 0; i < gList.childElementCount; i++) { + if (gList.childNodes[i] == aItem) + return i; + } + return -1; +} + +function mouseover_item(aItemNum, aCallback) { + var item = get_addon_element(gManagerWindow, "test" + aItemNum + "@tests.mozilla.org"); + var itemIndex = get_item_index(item); + gList.ensureElementIsVisible(item); + if (aItemNum == 1) + is(gList.selectedIndex, -1, "Should not initially have an item selected"); + + info("Moving mouse over item: " + item.value); + var pos = get_item_content_pos(item); + EventUtils.synthesizeMouse(gList, pos.x, pos.y, {type: "mousemove"}, gManagerWindow); + executeSoon(function() { + is(gManagerWindow.gViewController.currentViewId, "addons://list/extension", "Should still be in list view"); + is(gList.selectedIndex, itemIndex, "Correct item should be selected"); + + aCallback(); + }); +} + +add_test(function() { + var i = 1; + function test_next_item() { + if (i < 10) { + mouseover_item(i, function() { + i++ + test_next_item(); + }); + } else { + run_next_test(); + } + } + test_next_item(); +}); + + +add_test(function() { + gList.selectedIndex = 1; + var item = gList.selectedItem; + gList.ensureElementIsVisible(item); + var pos = get_item_content_pos(item); + EventUtils.synthesizeMouse(gList, pos.x, pos.y, {type: "mousemove"}, gManagerWindow); + executeSoon(function() { + var scrollDelta = item.boxObject.height * 2; + info("Scrolling by " + scrollDelta + "px (2 items)"); + EventUtils.synthesizeMouseScroll(gList, pos.x, pos.y, {type: "MozMousePixelScroll", delta: scrollDelta}, gManagerWindow); + setTimeout(function() { + var item = gList.selectedItem; + var itemIndex = get_item_index(item); + is(itemIndex, 3, "Correct item should be selected"); + run_next_test(); + }, 100); + }); +}); diff --git a/toolkit/mozapps/extensions/test/browser/browser_list.js b/toolkit/mozapps/extensions/test/browser/browser_list.js index b5f19162e158..e412ff392a7c 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_list.js +++ b/toolkit/mozapps/extensions/test/browser/browser_list.js @@ -594,7 +594,8 @@ add_test(function() { getService(Ci.nsIFocusManager); let addon = items["Test add-on 6"]; - EventUtils.synthesizeMouseAtCenter(addon, { }, gManagerWindow); + addon.parentNode.selectedItem = addon; + addon.focus(); is(fm.focusedElement, addon.parentNode, "Focus should have moved to the list"); EventUtils.synthesizeKey("VK_TAB", { }, gManagerWindow); diff --git a/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css b/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css index ebfdd179585e..3bd5f985565f 100644 --- a/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css +++ b/toolkit/themes/gnomestripe/mozapps/extensions/extensions.css @@ -414,9 +414,15 @@ } .details { + -moz-appearance: none; + border: none; cursor: pointer; + padding: 0; margin: 0; - -moz-margin-start: 10px; + background: transparent; + min-width: 13px; + -moz-margin-start: 6px; + list-style-image: url("moz-icon://stock/gtk-go-forward?size=16"); } .icon-container { diff --git a/toolkit/themes/pinstripe/mozapps/extensions/detail-btn.png b/toolkit/themes/pinstripe/mozapps/extensions/detail-btn.png new file mode 100644 index 0000000000000000000000000000000000000000..2a422483b10835cad161e5cde4a6f081b85bf380 GIT binary patch literal 1152 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 S@a5|O0000 .button-box { + border-color: transparent; } .icon-container { @@ -679,7 +698,7 @@ } .addon[selected] { - background-color: rgba(148, 172, 204, 0.39); + background-color: rgba(255, 255, 255, 0.65); color: black; } @@ -691,6 +710,25 @@ color: #3F3F3F; } +.addon[mousedown] { + background-color: rgba(255, 255, 255, 0.5); + box-shadow: inset 1px 1px 4px rgba(0, 0, 0, 0.20); + border-top-width: 1px; + border-bottom-width: 0px; + padding-top: 6px; + padding-bottom: 6px; +} + +.view-pane:not(#search-view) .addon[mousedown]:first-of-type, +#search-view .addon[first][mousedown] { + border-top-width: 0px; +} + +.view-pane:not(#search-view) .addon[mousedown]:last-of-type, +#search-view .addon[last][mousedown] { + border-bottom-width: 1px; +} + /*** item - uninstalled ***/ diff --git a/toolkit/themes/winstripe/mozapps/jar.mn b/toolkit/themes/winstripe/mozapps/jar.mn index 7f35927835e8..bf0765abe936 100644 --- a/toolkit/themes/winstripe/mozapps/jar.mn +++ b/toolkit/themes/winstripe/mozapps/jar.mn @@ -42,6 +42,7 @@ toolkit.jar: skin/classic/mozapps/extensions/alerticon-info-positive.png (extensions/alerticon-info-positive.png) skin/classic/mozapps/extensions/alerticon-info-negative.png (extensions/alerticon-info-negative.png) skin/classic/mozapps/extensions/background-texture.png (extensions/background-texture.png) + skin/classic/mozapps/extensions/detail-btn.png (extensions/detail-btn.png) skin/classic/mozapps/extensions/eula.css (extensions/eula.css) skin/classic/mozapps/handling/handling.css (handling/handling.css) skin/classic/mozapps/passwordmgr/key.png (passwordmgr/key.png) @@ -117,6 +118,7 @@ toolkit.jar: skin/classic/aero/mozapps/extensions/alerticon-info-positive.png (extensions/alerticon-info-positive.png) skin/classic/aero/mozapps/extensions/alerticon-info-negative.png (extensions/alerticon-info-negative.png) skin/classic/aero/mozapps/extensions/background-texture.png (extensions/background-texture.png) + skin/classic/aero/mozapps/extensions/detail-btn.png (extensions/detail-btn.png) skin/classic/aero/mozapps/extensions/eula.css (extensions/eula.css) skin/classic/aero/mozapps/handling/handling.css (handling/handling.css) skin/classic/aero/mozapps/passwordmgr/key.png (passwordmgr/key-aero.png)