Bug 1354159 - Part 3 - Add a Bookmarks button to the Library panel that shows a subview with a list of most recent bookmarks. r?mak,Gijs
This patch changes the Recent Bookmarks flow in browser-places.js to use the new
PlacesPanelview to provide a rich view that support drag and drop and context
actions.
A new button 'Search Bookmarks' was added, which prefills the urlbar with '* ',
which is a shortcut for searching bookmarks using the Awesomebar.
MozReview-Commit-ID: 1XlO8HMKEJs
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -693,16 +693,30 @@ var PlacesCommandHook = {
if (!organizer || organizer.closed) {
// No currently open places window, so open one with the specified mode.
openDialog("chrome://browser/content/places/places.xul",
"", "chrome,toolbar=yes,dialog=no,resizable", aLeftPaneRoot);
} else {
organizer.PlacesOrganizer.selectLeftPaneContainerByHierarchy(aLeftPaneRoot);
organizer.focus();
}
+ },
+
+ searchBookmarks() {
+ if (!focusAndSelectUrlBar()) {
+ return;
+ }
+ for (let char of ["*", " "]) {
+ let code = char.charCodeAt(0);
+ gURLBar.inputField.dispatchEvent(new KeyboardEvent("keypress", {
+ keyCode: code,
+ charCode: code,
+ bubbles: true
+ }));
+ }
}
};
XPCOMUtils.defineLazyModuleGetter(this, "RecentlyClosedTabsAndWindowsMenuUtils",
"resource:///modules/sessionstore/RecentlyClosedTabsAndWindowsMenuUtils.jsm");
// View for the history menu.
function HistoryMenu(aPopupShowingEvent) {
@@ -1349,17 +1363,17 @@ var BookmarkingUI = {
// On non-photon, this code should never be reached. However, if you click
// the outer button's border, some cpp code for the menu button's XBL
// binding decides to open the popup even though the dropmarker is invisible.
//
// Separately, in Photon, if the button is in the dynamic portion of the
// overflow panel, we want to show a subview instead.
if (this.button.getAttribute("cui-areatype") == CustomizableUI.TYPE_MENU_PANEL ||
(AppConstants.MOZ_PHOTON_THEME && this.button.hasAttribute("overflowedItem"))) {
- this._showSubview();
+ this._showSubView();
event.preventDefault();
event.stopPropagation();
return;
}
let widget = CustomizableUI.getWidget(this.BOOKMARK_BUTTON_ID)
.forWindow(window);
if (widget.overflowed) {
@@ -1833,34 +1847,37 @@ var BookmarkingUI = {
this.dropmarkerNotifier.removeAttribute("notification");
this.button.removeAttribute("notification");
this.dropmarkerNotifier.style.transform = "";
this.notifier.style.transform = "";
}, 1000);
},
- _showSubview() {
+ showSubView(anchor) {
+ this._showSubView(anchor);
+ },
+
+ _showSubView(anchor = document.getElementById(this.BOOKMARK_BUTTON_ID)) {
let view = document.getElementById("PanelUI-bookmarks");
view.addEventListener("ViewShowing", this);
view.addEventListener("ViewHiding", this);
- let anchor = document.getElementById(this.BOOKMARK_BUTTON_ID);
anchor.setAttribute("closemenu", "none");
PanelUI.showSubView("PanelUI-bookmarks", anchor,
CustomizableUI.AREA_PANEL);
},
onCommand: function BUI_onCommand(aEvent) {
if (aEvent.target != aEvent.currentTarget) {
return;
}
// Handle special case when the button is in the panel.
if (this.button.getAttribute("cui-areatype") == CustomizableUI.TYPE_MENU_PANEL) {
- this._showSubview();
+ this._showSubView();
return;
}
let widget = CustomizableUI.getWidget(this.BOOKMARK_BUTTON_ID)
.forWindow(window);
if (widget.overflowed) {
// Close the overflow panel because the Edit Bookmark panel will appear.
widget.node.removeAttribute("closemenu");
}
@@ -1889,38 +1906,49 @@ var BookmarkingUI = {
break;
case "ViewHiding":
this.onPanelMenuViewHiding(aEvent);
break;
}
},
onPanelMenuViewShowing: function BUI_onViewShowing(aEvent) {
+ let panelview = aEvent.target;
this.updateBookmarkPageMenuItem();
// Update checked status of the toolbar toggle.
let viewToolbar = document.getElementById("panelMenu_viewBookmarksToolbar");
- let personalToolbar = document.getElementById("PersonalToolbar");
- if (personalToolbar.collapsed)
- viewToolbar.removeAttribute("checked");
- else
- viewToolbar.setAttribute("checked", "true");
+ if (viewToolbar) {
+ let personalToolbar = document.getElementById("PersonalToolbar");
+ if (personalToolbar.collapsed)
+ viewToolbar.removeAttribute("checked");
+ else
+ viewToolbar.setAttribute("checked", "true");
+ }
// Get all statically placed buttons to supply them with keyboard shortcuts.
- let staticButtons = viewToolbar.parentNode.getElementsByTagName("toolbarbutton");
+ let staticButtons = panelview.getElementsByTagName("toolbarbutton");
for (let i = 0, l = staticButtons.length; i < l; ++i)
CustomizableUI.addShortcut(staticButtons[i]);
// Setup the Places view.
- this._panelMenuView = new PlacesPanelMenuView("place:folder=BOOKMARKS_MENU",
- "panelMenu_bookmarksMenu",
- "panelMenu_bookmarksMenu", {
- extraClasses: {
- entry: "subviewbutton",
- footer: "panel-subview-footer"
- }
- });
- aEvent.target.removeEventListener("ViewShowing", this);
+ if (gPhotonStructure) {
+ // We restrict the amount of results to 42. Not 50, but 42. Why? Because 42.
+ let query = "place:queryType=" + Ci.nsINavHistoryQueryOptions.QUERY_TYPE_BOOKMARKS +
+ "&sort=" + Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_DESCENDING +
+ "&maxResults=42&excludeQueries=1";
+ this._panelMenuView = new PlacesPanelview(document.getElementById("panelMenu_bookmarksMenu"),
+ panelview, query);
+ } else {
+ this._panelMenuView = new PlacesPanelMenuView("place:folder=BOOKMARKS_MENU",
+ "panelMenu_bookmarksMenu", "panelMenu_bookmarksMenu", {
+ extraClasses: {
+ entry: "subviewbutton",
+ footer: "panel-subview-footer"
+ }
+ });
+ }
+ panelview.removeEventListener("ViewShowing", this);
},
onPanelMenuViewHiding: function BUI_onViewHiding(aEvent) {
this._panelMenuView.uninit();
delete this._panelMenuView;
aEvent.target.removeEventListener("ViewHiding", this);
},
--- a/browser/components/customizableui/content/panelUI.inc.xul
+++ b/browser/components/customizableui/content/panelUI.inc.xul
@@ -205,49 +205,72 @@
</hbox>
</vbox>
</panelview>
<panelview id="PanelUI-bookmarks" flex="1" class="PanelUI-subView">
<label value="&bookmarksMenu.label;" class="panel-subview-header"/>
<vbox class="panel-subview-body">
<toolbarbutton id="panelMenuBookmarkThisPage"
+#ifndef MOZ_PHOTON_THEME
class="subviewbutton"
+#else
+ class="subviewbutton subviewbutton-iconic"
+#endif
observes="bookmarkThisPageBroadcaster"
command="Browser:AddBookmarkAs"
onclick="PanelUI.hide();"/>
+#ifndef MOZ_PHOTON_THEME
<toolbarseparator/>
+#endif
<toolbarbutton id="panelMenu_viewBookmarksSidebar"
label="&viewBookmarksSidebar2.label;"
+#ifndef MOZ_PHOTON_THEME
class="subviewbutton"
+#else
+ class="subviewbutton subviewbutton-iconic"
+#endif
key="viewBookmarksSidebarKb"
oncommand="SidebarUI.toggle('viewBookmarksSidebar'); PanelUI.hide();">
<observes element="viewBookmarksSidebar" attribute="checked"/>
</toolbarbutton>
+#ifndef MOZ_PHOTON_THEME
<toolbarbutton id="panelMenu_viewBookmarksToolbar"
label="&viewBookmarksToolbar.label;"
type="checkbox"
toolbarId="PersonalToolbar"
class="subviewbutton"
oncommand="onViewToolbarCommand(event); PanelUI.hide();"/>
<toolbarseparator/>
<toolbarbutton id="panelMenu_bookmarksToolbar"
label="&personalbarCmd.label;"
class="subviewbutton cui-withicon"
oncommand="PlacesCommandHook.showPlacesOrganizer('BookmarksToolbar'); PanelUI.hide();"/>
<toolbarbutton id="panelMenu_unsortedBookmarks"
label="&otherBookmarksCmd.label;"
class="subviewbutton cui-withicon"
oncommand="PlacesCommandHook.showPlacesOrganizer('UnfiledBookmarks'); PanelUI.hide();"/>
<toolbarseparator class="small-separator"/>
+#else
+ <toolbarbutton id="panelMenu_searchBookmarks"
+ label="&searchBookmarks.label;"
+ class="subviewbutton subviewbutton-iconic"
+ oncommand="PlacesCommandHook.searchBookmarks(); PanelUI.hide();"/>
+ <toolbarseparator/>
+ <label id="panelMenu_recentBookmarks"
+ value="&recentBookmarks.label;"
+ class="subview-subheader"/>
+#endif
<toolbaritem id="panelMenu_bookmarksMenu"
orient="vertical"
smoothscroll="false"
+#ifndef MOZ_PHOTON_THEME
onclick="if (event.button == 1) BookmarkingUI.onPanelMenuViewCommand(event, this._placesView);"
oncommand="BookmarkingUI.onPanelMenuViewCommand(event, this._placesView);"
+#endif
flatList="true"
tooltip="bhTooltip">
<!-- bookmarks menu items will go here -->
</toolbaritem>
</vbox>
<toolbarbutton id="panelMenu_showAllBookmarks"
label="&showAllBookmarks2.label;"
class="subviewbutton panel-subview-footer"
@@ -705,16 +728,21 @@
label="&goOfflineCmd.label;"
type="checkbox"
observes="workOfflineMenuitemState"
oncommand="BrowserOffline.toggleOfflineStatus();"/>
</vbox>
</panelview>
<panelview id="appMenu-libraryView" class="PanelUI-subView">
<vbox class="panel-subview-body">
+ <toolbarbutton id="appMenu-library-bookmarks-button"
+ class="subviewbutton subviewbutton-iconic subviewbutton-nav"
+ label="&bookmarksMenuButton.label;"
+ closemenu="none"
+ oncommand="BookmarkingUI.showSubView(this);"/>
<toolbarbutton id="appMenu-library-history-button"
class="subviewbutton subviewbutton-iconic subviewbutton-nav"
label="&historyMenu.label;"
closemenu="none"
oncommand="PanelUI.showSubView('PanelUI-history', this)"/>
<toolbarbutton id="appMenu-library-remotetabs-button"
class="subviewbutton subviewbutton-iconic subviewbutton-nav"
label="&appMenuRemoteTabs.label;"
--- a/browser/components/places/content/browserPlacesViews.js
+++ b/browser/components/places/content/browserPlacesViews.js
@@ -2080,17 +2080,17 @@ class PlacesPanelview extends PlacesView
let type = placesNode.type;
if (type == Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR) {
element = document.createElement("toolbarseparator");
} else {
if (type != Ci.nsINavHistoryResultNode.RESULT_TYPE_URI)
throw "Unexpected node";
element = document.createElement("toolbarbutton");
- element.classList.add("subviewbutton", "subviewbutton-iconic", "subview-bookmark-item");
+ element.classList.add("subviewbutton", "subviewbutton-iconic", "bookmark-item");
element.setAttribute("scheme", PlacesUIUtils.guessUrlSchemeForUI(placesNode.uri));
element.setAttribute("label", PlacesUIUtils.getBestTitle(placesNode));
let icon = placesNode.icon;
if (icon)
element.setAttribute("image", icon);
}
--- a/browser/locales/en-US/chrome/browser/browser.dtd
+++ b/browser/locales/en-US/chrome/browser/browser.dtd
@@ -243,16 +243,17 @@ These should match what Safari and other
<!ENTITY bookmarksButton.label "Bookmarks">
<!ENTITY bookmarksCmd.commandkey "b">
<!ENTITY bookmarksMenuButton.label "Bookmarks">
<!ENTITY bookmarksMenuButton.other.label "Other Bookmarks">
<!ENTITY bookmarksMenuButton.mobile.label "Mobile Bookmarks">
<!ENTITY viewBookmarksSidebar2.label "View Bookmarks Sidebar">
<!ENTITY viewBookmarksToolbar.label "View Bookmarks Toolbar">
+<!ENTITY searchBookmarks.label "Search Bookmarks">
<!ENTITY containersMenu.label "Containers">
<!-- LOCALIZATION NOTE (bookmarksSidebarGtkCmd.commandkey): This command
- key should not contain the letters A-F, since these are reserved
- shortcut keys on Linux. -->
<!ENTITY bookmarksGtkCmd.commandkey "o">
<!ENTITY bookmarksWinCmd.commandkey "i">