Bug 1363183 - Add a "bookmark" item to the page action menu. r?mikedeboer
MozReview-Commit-ID: 9RR4U3X3gIT
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -1639,17 +1639,17 @@ var BookmarkingUI = {
init() {
CustomizableUI.addListener(this);
this._updateCustomizationState();
},
_hasBookmarksObserver: false,
_itemGuids: new Set(),
uninit: function BUI_uninit() {
- this._updateBookmarkPageMenuItem(true);
+ this.updateBookmarkPageMenuItem(true);
CustomizableUI.removeListener(this);
this._uninitView();
if (this._hasBookmarksObserver) {
PlacesUtils.removeLazyBookmarkObserver(this);
}
@@ -1729,30 +1729,30 @@ var BookmarkingUI = {
}
}
},
/**
* forceReset is passed when we're destroyed and the label should go back
* to the default (Bookmark This Page) for OS X.
*/
- _updateBookmarkPageMenuItem: function BUI__updateBookmarkPageMenuItem(forceReset) {
+ updateBookmarkPageMenuItem: function BUI_updateBookmarkPageMenuItem(forceReset) {
let isStarred = !forceReset && this._itemGuids.size > 0;
let label = isStarred ? "editlabel" : "bookmarklabel";
if (this.broadcaster) {
this.broadcaster.setAttribute("label", this.broadcaster.getAttribute(label));
}
},
onMainMenuPopupShowing: function BUI_onMainMenuPopupShowing(event) {
// Don't handle events for submenus.
if (event.target != event.currentTarget)
return;
- this._updateBookmarkPageMenuItem();
+ this.updateBookmarkPageMenuItem();
PlacesCommandHook.updateBookmarkAllTabsCommand();
this._initMobileBookmarks(document.getElementById("menu_mobileBookmarks"));
this._initRecentBookmarks(document.getElementById("menu_recentBookmarks"));
},
_showBookmarkedNotification: function BUI_showBookmarkedNotification() {
function getCenteringTransformForRects(rectToPosition, referenceRect) {
let topDiff = referenceRect.top - rectToPosition.top;
@@ -1849,32 +1849,32 @@ var BookmarkingUI = {
if (!this._pendingUpdate) {
if (!isBookmarked)
this._showBookmarkedNotification();
PlacesCommandHook.bookmarkCurrentPage(true);
}
},
onCurrentPageContextPopupShowing() {
- this._updateBookmarkPageMenuItem();
+ this.updateBookmarkPageMenuItem();
},
handleEvent: function BUI_handleEvent(aEvent) {
switch (aEvent.type) {
case "ViewShowing":
this.onPanelMenuViewShowing(aEvent);
break;
case "ViewHiding":
this.onPanelMenuViewHiding(aEvent);
break;
}
},
onPanelMenuViewShowing: function BUI_onViewShowing(aEvent) {
- this._updateBookmarkPageMenuItem();
+ 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");
// Get all statically placed buttons to supply them with keyboard shortcuts.
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -7758,19 +7758,22 @@ var gPageActionButton = {
}
this._preparePanelToBeShown();
this.panel.hidden = false;
this.panel.openPopup(this.button, "bottomcenter topright");
},
_preparePanelToBeShown() {
+ // Update the bookmark item's label.
+ BookmarkingUI.updateBookmarkPageMenuItem();
+
+ // Update the send-to-device item's disabled state.
let browser = gBrowser.selectedBrowser;
let url = browser.currentURI.spec;
-
let sendToDeviceItem =
document.getElementById("page-action-send-to-device-button");
sendToDeviceItem.disabled = !gSync.isSendableURI(url);
},
copyURL() {
this.panel.hidePopup();
Cc["@mozilla.org/widget/clipboardhelper;1"]
--- a/browser/base/content/browser.xul
+++ b/browser/base/content/browser.xul
@@ -452,16 +452,22 @@
flip="slide"
position="bottomcenter topright"
noautofocus="true">
<photonpanelmultiview id="page-action-multiView"
mainViewId="page-action-mainView">
<panelview id="page-action-mainView"
class="PanelUI-subView">
<vbox class="panel-subview-body">
+ <toolbarbutton id="page-action-bookmark-button"
+ class="subviewbutton subviewbutton-iconic"
+ observes="bookmarkThisPageBroadcaster"
+ command="Browser:AddBookmarkAs"
+ onclick="gPageActionButton.panel.hidePopup();"/>
+ <toolbarseparator/>
<toolbarbutton id="page-action-copy-url-button"
class="subviewbutton subviewbutton-iconic"
label="©URLCmd.label;"
command="PageAction:copyURL"/>
<toolbarbutton id="page-action-email-link-button"
class="subviewbutton subviewbutton-iconic"
label="&emailPageCmd.label;"
command="PageAction:emailLink"/>
--- a/browser/base/content/test/urlbar/browser_page_action_menu.js
+++ b/browser/base/content/test/urlbar/browser_page_action_menu.js
@@ -1,12 +1,78 @@
"use strict";
let gPanel = document.getElementById("page-action-panel");
+add_task(async function bookmark() {
+ // Open a unique page.
+ let url = "http://example.com/browser_page_action_menu";
+ await BrowserTestUtils.withNewTab(url, async () => {
+ // Open the panel.
+ await promisePanelOpen();
+
+ // The bookmark button should read "Bookmark This Page" and not be starred.
+ let bookmarkButton = document.getElementById("page-action-bookmark-button");
+ Assert.equal(bookmarkButton.label, "Bookmark This Page");
+ Assert.ok(!bookmarkButton.hasAttribute("starred"));
+
+ // Click the button.
+ let hiddenPromise = promisePanelHidden();
+ EventUtils.synthesizeMouseAtCenter(bookmarkButton, {});
+ await hiddenPromise;
+
+ // Make sure the edit-bookmark panel opens, then hide it.
+ await new Promise(resolve => {
+ if (StarUI.panel.state == "open") {
+ resolve();
+ return;
+ }
+ StarUI.panel.addEventListener("popupshown", resolve, { once: true });
+ });
+ StarUI.panel.hidePopup();
+
+ // Open the panel again.
+ await promisePanelOpen();
+
+ // The bookmark button should now read "Edit This Bookmark" and be starred.
+ Assert.equal(bookmarkButton.label, "Edit This Bookmark");
+ Assert.ok(bookmarkButton.hasAttribute("starred"));
+ Assert.equal(bookmarkButton.getAttribute("starred"), "true");
+
+ // Click it again.
+ hiddenPromise = promisePanelHidden();
+ EventUtils.synthesizeMouseAtCenter(bookmarkButton, {});
+ await hiddenPromise;
+
+ // The edit-bookmark panel should open again.
+ await new Promise(resolve => {
+ if (StarUI.panel.state == "open") {
+ resolve();
+ return;
+ }
+ StarUI.panel.addEventListener("popupshown", resolve, { once: true });
+ });
+
+ // Click the remove-bookmark button in the panel.
+ StarUI._element("editBookmarkPanelRemoveButton").click();
+
+ // Open the panel again.
+ await promisePanelOpen();
+
+ // The bookmark button should read "Bookmark This Page" and not be starred.
+ Assert.equal(bookmarkButton.label, "Bookmark This Page");
+ Assert.ok(!bookmarkButton.hasAttribute("starred"));
+
+ // Done.
+ hiddenPromise = promisePanelHidden();
+ gPanel.hidePopup();
+ await hiddenPromise;
+ });
+});
+
add_task(async function copyURL() {
// Open the panel.
await promisePanelOpen();
// Click Copy URL.
let copyURLButton = document.getElementById("page-action-copy-url-button");
let hiddenPromise = promisePanelHidden();
EventUtils.synthesizeMouseAtCenter(copyURLButton, {});
--- a/browser/themes/shared/browser.inc.css
+++ b/browser/themes/shared/browser.inc.css
@@ -83,16 +83,24 @@
-moz-context-properties: fill;
fill: currentColor;
}
#urlbar-page-action-button > .toolbarbutton-icon {
width: 16px;
}
+#page-action-bookmark-button {
+ list-style-image: url("chrome://browser/skin/bookmark-hollow.svg");
+}
+
+#page-action-bookmark-button[starred] {
+ list-style-image: url("chrome://browser/skin/bookmark.svg");
+}
+
#page-action-copy-url-button {
list-style-image: url("chrome://browser/skin/link.svg");
}
#page-action-email-link-button {
list-style-image: url("chrome://browser/skin/email-link.svg");
}