Bug 1463738 - Remove the Bookmark description UI. r=dao
authorMark Banner <standard8@mozilla.com>
Wed, 23 May 2018 17:15:09 +0100
changeset 420498 e9a9f3abd88935b5d4106a53d15d956ab2870ac4
parent 420497 347ccb93cb083df26161a66336fcbb96d7294ae3
child 420499 5391b20d3f00d0c121e3d07bfcfdf4b595a844e5
push id103828
push useraiakab@mozilla.com
push dateWed, 30 May 2018 22:08:58 +0000
treeherdermozilla-inbound@8d0ee6e73fb3 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersdao
bugs1463738, 1402890
milestone62.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 1463738 - Remove the Bookmark description UI. r=dao This removes the bookmark description UI, but leaves the backend in-place for a release or two, so that users have time to save anything they want (e.g. via backup). The backend will be removed in bug 1402890. MozReview-Commit-ID: La4AYFar7eK
browser/base/content/browser-places.js
browser/base/content/browser.js
browser/base/content/content.js
browser/base/content/nsContextMenu.js
browser/components/feeds/FeedConverter.js
browser/components/feeds/test/browser/browser_telemetry_checks.js
browser/components/places/PlacesUIUtils.jsm
browser/components/places/content/bookmarkProperties.js
browser/components/places/content/controller.js
browser/components/places/content/editBookmark.js
browser/components/places/content/editBookmarkPanel.inc.xul
browser/components/places/content/places.js
browser/components/places/content/places.xul
browser/components/places/content/treeView.js
browser/components/places/tests/browser/browser_library_infoBox.js
browser/locales/en-US/chrome/browser/places/editBookmarkOverlay.dtd
browser/locales/en-US/chrome/browser/places/places.dtd
browser/locales/en-US/chrome/browser/places/places.properties
browser/modules/ContentClick.jsm
browser/modules/ContextMenu.jsm
browser/modules/Feeds.jsm
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -279,17 +279,17 @@ var StarUI = {
         target = target.parentNode;
       }
       target.addEventListener("popupshown", function(event) {
         fn();
       }, {"capture": true, "once": true});
     };
     gEditItemOverlay.initPanel({ node: aNode,
                                  onPanelReady,
-                                 hiddenRows: ["description", "location",
+                                 hiddenRows: ["location",
                                               "loadInSidebar", "keyword"],
                                  focusedElement: "preferred"});
     this.panel.openPopup(aAnchorElement, aPosition);
   },
 
   panelShown:
   function SU_panelShown(aEvent) {
     if (aEvent.target == this.panel) {
@@ -362,49 +362,45 @@ var PlacesCommandHook = {
     // the current page
     let url = aUrl ? new URL(aUrl) : new URL(aBrowser.currentURI.spec);
     let info = await PlacesUtils.bookmarks.fetch({ url });
     let isNewBookmark = !info;
     if (!info) {
       let parentGuid = PlacesUtils.bookmarks.unfiledGuid;
       info = { url, parentGuid };
       // Bug 1148838 - Make this code work for full page plugins.
-      let description = null;
       let charset = null;
 
-      let docInfo = aUrl ? {} : await this._getPageDetails(aBrowser);
+      let isErrorPage = false;
+      if (!aUrl && aBrowser.documentURI) {
+        isErrorPage = /^about:(neterror|certerror|blocked)/.test(aBrowser.documentURI.spec);
+      }
 
       try {
-        if (docInfo.isErrorPage) {
+        if (isErrorPage) {
           let entry = await PlacesUtils.history.fetch(aBrowser.currentURI);
           if (entry) {
             info.title = entry.title;
           }
         } else {
           info.title = aTitle || aBrowser.contentTitle;
         }
         info.title = info.title || url.href;
-        description = docInfo.description;
         charset = aUrl ? null : aBrowser.characterSet;
       } catch (e) {
         Cu.reportError(e);
       }
 
       if (aShowEditUI && isNewBookmark) {
         // If we bookmark the page here but open right into a cancelable
         // state (i.e. new bookmark in Library), start batching here so
         // all of the actions can be undone in a single undo step.
         StarUI.beginBatch();
       }
 
-      if (description) {
-        info.annotations = [{ name: PlacesUIUtils.DESCRIPTION_ANNO,
-                              value: description }];
-      }
-
       info.guid = await PlacesTransactions.NewBookmark(info).transact();
 
       // Set the character-set
       if (charset && !PrivateBrowsingUtils.isBrowserPrivate(aBrowser))
          PlacesUtils.setCharsetForURI(makeURI(url.href), charset);
     }
 
     // Revert the contents of the location bar
@@ -423,60 +419,44 @@ var PlacesCommandHook = {
       return;
     }
 
     // Fall back to showing the panel over the content area.
     await StarUI.showEditBookmarkPopup(node, aBrowser, "overlap", isNewBookmark,
                                        url);
   },
 
-  _getPageDetails(browser) {
-    return new Promise(resolve => {
-      let mm = browser.messageManager;
-      mm.addMessageListener("Bookmarks:GetPageDetails:Result", function listener(msg) {
-        mm.removeMessageListener("Bookmarks:GetPageDetails:Result", listener);
-        resolve(msg.data);
-      });
-
-      mm.sendAsyncMessage("Bookmarks:GetPageDetails", { });
-    });
-  },
-
   /**
    * Adds a bookmark to the page targeted by a link.
    * @param parentId
    *        The folder in which to create a new bookmark if aURL isn't
    *        bookmarked.
    * @param url (string)
    *        the address of the link target
    * @param title
    *        The link text
-   * @param [optional] description
-   *        The linked page description, if available
    */
-  async bookmarkLink(parentId, url, title, description = "") {
+  async bookmarkLink(parentId, url, title) {
     let bm = await PlacesUtils.bookmarks.fetch({url});
     if (bm) {
       let node = await PlacesUIUtils.promiseNodeLikeFromFetchInfo(bm);
       PlacesUIUtils.showBookmarkDialog({ action: "edit", node }, window.top);
       return;
     }
 
     let parentGuid = parentId == PlacesUtils.bookmarksMenuFolderId ?
                        PlacesUtils.bookmarks.menuGuid :
                        await PlacesUtils.promiseItemGuid(parentId);
     let defaultInsertionPoint = new PlacesInsertionPoint({ parentId, parentGuid });
     PlacesUIUtils.showBookmarkDialog({ action: "add",
                                        type: "bookmark",
                                        uri: makeURI(url),
                                        title,
-                                       description,
                                        defaultInsertionPoint,
-                                       hiddenRows: [ "description",
-                                                     "location",
+                                       hiddenRows: [ "location",
                                                      "loadInSidebar",
                                                      "keyword" ]
                                      }, window.top);
   },
 
   /**
    * List of nsIURI objects characterizing the tabs currently open in the
    * browser, modulo pinned tabs.  The URIs will be in the order in which their
@@ -503,18 +483,17 @@ var PlacesCommandHook = {
    * Adds a folder with bookmarks to all of the currently open tabs in this
    * window.
    */
   bookmarkCurrentPages: function PCH_bookmarkCurrentPages() {
     let pages = this.uniqueCurrentPages;
     if (pages.length > 1) {
     PlacesUIUtils.showBookmarkDialog({ action: "add",
                                        type: "folder",
-                                       URIList: pages,
-                                       hiddenRows: [ "description" ]
+                                       URIList: pages
                                      }, window);
     }
   },
 
   /**
    * Updates disabled state for the "Bookmark All Tabs" command.
    */
   updateBookmarkAllTabsCommand:
@@ -530,42 +509,34 @@ var PlacesCommandHook = {
   },
 
   /**
    * Adds a Live Bookmark to a feed associated with the current page.
    * @param     url
    *            The nsIURI of the page the feed was attached to
    * @title     title
    *            The title of the feed. Optional.
-   * @subtitle  subtitle
-   *            A short description of the feed. Optional.
    */
-  async addLiveBookmark(url, feedTitle, feedSubtitle) {
+  async addLiveBookmark(url, feedTitle) {
     let toolbarIP = new PlacesInsertionPoint({
       parentId: PlacesUtils.toolbarFolderId,
       parentGuid: PlacesUtils.bookmarks.toolbarGuid
     });
 
     let feedURI = makeURI(url);
     let title = feedTitle || gBrowser.contentTitle;
-    let description = feedSubtitle;
-    if (!description) {
-      description = (await this._getPageDetails(gBrowser.selectedBrowser)).description;
-    }
 
     PlacesUIUtils.showBookmarkDialog({ action: "add",
                                        type: "livemark",
                                        feedURI,
                                        siteURI: gBrowser.currentURI,
                                        title,
-                                       description,
                                        defaultInsertionPoint: toolbarIP,
                                        hiddenRows: [ "feedLocation",
-                                                     "siteLocation",
-                                                     "description" ]
+                                                     "siteLocation" ]
                                      }, window);
   },
 
   /**
    * Opens the Places Organizer.
    * @param {String} item The item to select in the organizer window,
    *                      options are (case sensitive):
    *                      BookmarksMenu, BookmarksToolbar, UnfiledBookmarks,
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -6191,18 +6191,17 @@ function contentAreaClick(event, isPanel
       // This is the Opera convention for a special link that, when clicked,
       // allows to add a sidebar panel.  The link's title attribute contains
       // the title that should be used for the sidebar panel.
       PlacesUIUtils.showBookmarkDialog({ action: "add",
                                          type: "bookmark",
                                          uri: makeURI(href),
                                          title: linkNode.getAttribute("title"),
                                          loadBookmarkInSidebar: true,
-                                         hiddenRows: [ "description",
-                                                       "location",
+                                         hiddenRows: [ "location",
                                                        "keyword" ]
                                        }, window);
       event.preventDefault();
       return;
     }
   }
 
   handleLinkClick(event, href, linkNode);
@@ -7333,22 +7332,20 @@ function AddKeywordForSearchField() {
 
     let bookmarkData = message.data;
     let title = gNavigatorBundle.getFormattedString("addKeywordTitleAutoFill",
                                                     [bookmarkData.title]);
     PlacesUIUtils.showBookmarkDialog({ action: "add",
                                        type: "bookmark",
                                        uri: makeURI(bookmarkData.spec),
                                        title,
-                                       description: bookmarkData.description,
                                        keyword: "",
                                        postData: bookmarkData.postData,
                                        charSet: bookmarkData.charset,
                                        hiddenRows: [ "location",
-                                                     "description",
                                                      "tags",
                                                      "loadInSidebar" ]
                                      }, window);
   };
   mm.addMessageListener("ContextMenu:SearchFieldBookmarkData:Result", onMessage);
 
   mm.sendAsyncMessage("ContextMenu:SearchFieldBookmarkData", {}, { target: gContextMenu.target });
 }
--- a/browser/base/content/content.js
+++ b/browser/base/content/content.js
@@ -22,17 +22,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   InlineSpellCheckerContent: "resource://gre/modules/InlineSpellCheckerContent.jsm",
   LoginManagerContent: "resource://gre/modules/LoginManagerContent.jsm",
   LoginFormFactory: "resource://gre/modules/LoginManagerContent.jsm",
   InsecurePasswordUtils: "resource://gre/modules/InsecurePasswordUtils.jsm",
   PluginContent: "resource:///modules/PluginContent.jsm",
   PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
   FormSubmitObserver: "resource:///modules/FormSubmitObserver.jsm",
   PageMetadata: "resource://gre/modules/PageMetadata.jsm",
-  PlacesUIUtils: "resource:///modules/PlacesUIUtils.jsm",
   SafeBrowsing: "resource://gre/modules/SafeBrowsing.jsm",
   Utils: "resource://gre/modules/sessionstore/Utils.jsm",
   WebNavigationFrames: "resource://gre/modules/WebNavigationFrames.jsm",
   ContextMenu: "resource:///modules/ContextMenu.jsm",
 });
 
 XPCOMUtils.defineLazyGetter(this, "gPipNSSBundle", function() {
   return Services.strings.createBundle("chrome://pipnss/locale/pipnss.properties");
@@ -998,24 +997,16 @@ var PageMetadataMessenger = {
         sendAsyncMessage("PageMetadata:MicroformatsResult", result);
         break;
       }
     }
   }
 };
 PageMetadataMessenger.init();
 
-addMessageListener("Bookmarks:GetPageDetails", (message) => {
-  let doc = content.document;
-  let isErrorPage = /^about:(neterror|certerror|blocked)/.test(doc.documentURI);
-  sendAsyncMessage("Bookmarks:GetPageDetails:Result",
-                   { isErrorPage,
-                     description: PlacesUIUtils.getDescriptionFromDocument(doc) });
-});
-
 addEventListener("InstallBrowserTheme", LightWeightThemeWebInstallListener, false, true);
 addEventListener("PreviewBrowserTheme", LightWeightThemeWebInstallListener, false, true);
 addEventListener("ResetBrowserThemePreview", LightWeightThemeWebInstallListener, false, true);
 
 let OfflineApps = {
   _docId: 0,
   _docIdMap: new Map(),
 
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -1423,18 +1423,17 @@ nsContextMenu.prototype = {
     let uri = gContextMenuContentData.documentURIObject;
     let mm = this.browser.messageManager;
 
     let onMessage = (message) => {
       mm.removeMessageListener("ContextMenu:BookmarkFrame:Result", onMessage);
 
       window.top.PlacesCommandHook.bookmarkLink(PlacesUtils.bookmarksMenuFolderId,
                                                 uri.spec,
-                                                message.data.title,
-                                                message.data.description)
+                                                message.data.title)
                                   .catch(Cu.reportError);
     };
     mm.addMessageListener("ContextMenu:BookmarkFrame:Result", onMessage);
 
     mm.sendAsyncMessage("ContextMenu:BookmarkFrame", null, { target: this.target });
   },
 
   savePageAs: function CM_savePageAs() {
--- a/browser/components/feeds/FeedConverter.js
+++ b/browser/components/feeds/FeedConverter.js
@@ -382,17 +382,17 @@ FeedResultService.prototype = {
                                        feedHandler: "default" });
       break;
     default:
       // "web" should have been handled elsewhere
       LOG("unexpected handler: " + handler);
       // fall through
     case "bookmarks":
       Services.cpmm.sendAsyncMessage("FeedConverter:addLiveBookmark",
-                                     { spec, title, subtitle });
+                                     { spec, title });
       break;
     }
   },
 
   /**
    * See nsIFeedResultService.idl
    */
   addFeedResult(feedResult) {
--- a/browser/components/feeds/test/browser/browser_telemetry_checks.js
+++ b/browser/components/feeds/test/browser/browser_telemetry_checks.js
@@ -37,17 +37,17 @@ add_task(async function() {
       resolve(args);
       // Return the promise because Feeds.jsm expects a promise:
       return createBMPromise;
     };
   });
   registerCleanupFunction(() => PlacesCommandHook.addLiveBookmark = old);
   await BrowserTestUtils.synthesizeMouseAtCenter("#subscribeButton", {}, tab.linkedBrowser);
   let bmArgs = await createBMPromise;
-  Assert.deepEqual(bmArgs, [FEED_URI, "Example Feed", ""], "Should have been trying to subscribe");
+  Assert.deepEqual(bmArgs, [FEED_URI, "Example Feed"], "Should have been trying to subscribe");
   let snapshot = getSnapShot();
   Assert.equal(snapshot.parent[kSubscribed], 1, "Should have subscribed once.");
 
   // Now manually add a livemark in the menu and one in the bookmarks toolbar:
   let livemarks = await Promise.all([
     PlacesUtils.livemarks.addLivemark({
       parentGuid: PlacesUtils.bookmarks.menuGuid,
       feedURI: Services.io.newURI(FEED_URI),
@@ -89,9 +89,8 @@ add_task(async function() {
   // And opening an item in the popup:
   let item = await TestUtils.waitForCondition(
     () => popup.querySelector("menuitem.bookmark-item"));
   item.doCommand();
   Assert.equal(getSnapShot().parent[kLivemarkItemOpened], 1, "Should count livemark item opening");
   popup.hidePopup();
   BrowserTestUtils.removeTab(tab);
 });
-
--- a/browser/components/places/PlacesUIUtils.jsm
+++ b/browser/components/places/PlacesUIUtils.jsm
@@ -476,48 +476,16 @@ var PlacesUIUtils = {
       var errorStr = this.getString("load-js-data-url-error");
       Services.prompt.alert(aWindow, brandShortName, errorStr);
       return false;
     }
     return true;
   },
 
   /**
-   * Get the description associated with a document, as specified in a <META>
-   * element.
-   * @param   doc
-   *          A DOM Document to get a description for
-   * @return A description string if a META element was discovered with a
-   *         "description" or "httpequiv" attribute, empty string otherwise.
-   */
-  getDescriptionFromDocument: function PUIU_getDescriptionFromDocument(doc) {
-    var metaElements = doc.getElementsByTagName("META");
-    for (var i = 0; i < metaElements.length; ++i) {
-      if (metaElements[i].name.toLowerCase() == "description" ||
-          metaElements[i].httpEquiv.toLowerCase() == "description") {
-        return metaElements[i].content;
-      }
-    }
-    return "";
-  },
-
-  /**
-   * Retrieve the description of an item
-   * @param aItemId
-   *        item identifier
-   * @return the description of the given item, or an empty string if it is
-   * not set.
-   */
-  getItemDescription: function PUIU_getItemDescription(aItemId) {
-    if (PlacesUtils.annotations.itemHasAnnotation(aItemId, this.DESCRIPTION_ANNO))
-      return PlacesUtils.annotations.getItemAnnotation(aItemId, this.DESCRIPTION_ANNO);
-    return "";
-  },
-
-  /**
    * Check whether or not the given node represents a removable entry (either in
    * history or in bookmarks).
    *
    * @param aNode
    *        a node, except the root node of a query.
    * @param aView
    *        The view originating the request.
    * @return true if the aNode represents a removable entry, false otherwise.
--- a/browser/components/places/content/bookmarkProperties.js
+++ b/browser/components/places/content/bookmarkProperties.js
@@ -14,18 +14,16 @@
  *             "Load this bookmark in the sidebar" field.
  *         - "folder"
  *           @ URIList (Array of nsIURI objects) - optional, list of uris to
  *             be bookmarked under the new folder.
  *         - "livemark"
  *       @ uri (nsIURI object) - optional, the default uri for the new item.
  *         The property is not used for the "folder with items" type.
  *       @ title (String) - optional, the default title for the new item.
- *       @ description (String) - optional, the default description for the new
- *         item.
  *       @ defaultInsertionPoint (InsertionPoint JS object) - optional, the
  *         default insertion point for the new item.
  *       @ keyword (String) - optional, the default keyword for the new item.
  *       @ postData (String) - optional, POST data to accompany the keyword.
  *       @ charSet (String) - optional, character-set to accompany the keyword.
  *      Notes:
  *        1) If |uri| is set for a bookmark/livemark item and |title| isn't,
  *           the dialog will query the history tables for the title associated
@@ -42,17 +40,16 @@
  *         - "folder" (also applies to livemarks)
  *           @ node (an nsINavHistoryResultNode object) - a node representing
  *             the folder.
  *   @ hiddenRows (Strings array) - optional, list of rows to be hidden
  *     regardless of the item edited or added by the dialog.
  *     Possible values:
  *     - "title"
  *     - "location"
- *     - "description"
  *     - "keyword"
  *     - "tags"
  *     - "loadInSidebar"
  *     - "folderPicker" - hides both the tree and the menu.
  *
  * window.arguments[0].bookmarkGuid is set to the guid of the item, if the
  * dialog is accepted.
  */
@@ -84,17 +81,16 @@ var BookmarkPropertiesPanel = {
     return this.__strings;
   },
 
   _action: null,
   _itemType: null,
   _uri: null,
   _loadInSidebar: false,
   _title: "",
-  _description: "",
   _URIs: [],
   _keyword: "",
   _postData: null,
   _charSet: "",
   _feedURI: null,
   _siteURI: null,
 
   _defaultInsertionPoint: null,
@@ -221,19 +217,16 @@ var BookmarkPropertiesPanel = {
           if (!this._title) {
             if (this._feedURI) {
               this._title = await PlacesUtils.history.fetch(this._feedURI) ||
                             this._feedURI.spec;
             } else
               this._title = this._strings.getString("newLivemarkDefault");
           }
       }
-
-      if ("description" in dialogInfo)
-        this._description = dialogInfo.description;
     } else { // edit
       this._node = dialogInfo.node;
       this._title = this._node.title;
       if (PlacesUtils.nodeIsFolder(this._node))
         this._itemType = BOOKMARK_FOLDER;
       else if (PlacesUtils.nodeIsURI(this._node))
         this._itemType = BOOKMARK_ITEM;
     }
@@ -456,20 +449,16 @@ var BookmarkPropertiesPanel = {
       await this._defaultInsertionPoint.getIndex(),
       this._defaultInsertionPoint.guid,
     ];
   },
 
   async _promiseNewItem() {
     let [containerId, index, parentGuid] = await this._getInsertionPointDetails();
     let annotations = [];
-    if (this._description) {
-      annotations.push({ name: PlacesUIUtils.DESCRIPTION_ANNO,
-                         value: this._description });
-    }
     if (this._loadInSidebar) {
       annotations.push({ name: PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO,
                          value: true });
     }
 
     let itemGuid;
     let info = { parentGuid, index, title: this._title, annotations };
     if (this._itemType == BOOKMARK_ITEM) {
--- a/browser/components/places/content/controller.js
+++ b/browser/components/places/content/controller.js
@@ -268,20 +268,19 @@ PlacesController.prototype = {
       break;
     case "placesCmd_sortBy:name":
       this.sortFolderByName().catch(Cu.reportError);
       break;
     case "placesCmd_createBookmark":
       let node = this._view.selectedNode;
       PlacesUIUtils.showBookmarkDialog({ action: "add",
                                          type: "bookmark",
-                                         hiddenRows: [ "description",
-                                                        "keyword",
-                                                        "location",
-                                                        "loadInSidebar" ],
+                                         hiddenRows: [ "keyword",
+                                                       "location",
+                                                       "loadInSidebar" ],
                                          uri: Services.io.newURI(node.uri),
                                          title: node.title
                                        }, window.top);
       break;
     }
   },
 
   onEvent: function PC_onEvent(eventName) { },
--- a/browser/components/places/content/editBookmark.js
+++ b/browser/components/places/content/editBookmark.js
@@ -123,24 +123,16 @@ var gEditItemOverlay = {
   },
 
   _initLocationField() {
     if (!this._paneInfo.isURI)
       throw new Error("_initLocationField called unexpectedly");
     this._initTextField(this._locationField, this._paneInfo.uri.spec);
   },
 
-  _initDescriptionField() {
-    if (!this._paneInfo.isItem)
-      throw new Error("_initDescriptionField called unexpectedly");
-
-    this._initTextField(this._descriptionField,
-                        PlacesUIUtils.getItemDescription(this._paneInfo.itemId));
-  },
-
   async _initKeywordField(newKeyword = "") {
     if (!this._paneInfo.isBookmark) {
       throw new Error("_initKeywordField called unexpectedly");
     }
 
     // Reset the field status synchronously now, eventually we'll reinit it
     // later if we find an existing keyword. This way we can ensure to be in a
     // consistent status when reusing the panel across different bookmarks.
@@ -188,17 +180,17 @@ var gEditItemOverlay = {
    *          item to be edited. A node-like object must have the following
    *          properties (with values that match exactly those a result node
    *          would have): itemId, bookmarkGuid, uri, title, type.
    *        - uris: an array of uris for bulk tagging.
    *
    *        2. any of the following optional properties:
    *          - hiddenRows (Strings array): list of rows to be hidden regardless
    *            of the item edited. Possible values: "title", "location",
-   *            "description", "keyword", "loadInSidebar", "feedLocation",
+   *            "keyword", "loadInSidebar", "feedLocation",
    *            "siteLocation", folderPicker"
    */
   initPanel(aInfo) {
     if (typeof(aInfo) != "object" || aInfo === null)
       throw new Error("aInfo must be an object.");
     if ("node" in aInfo) {
       try {
         aInfo.node.type;
@@ -240,23 +232,16 @@ var gEditItemOverlay = {
     // In some cases we want to hide the location field, since it's not
     // human-readable, but we still want to initialize it.
     showOrCollapse("locationRow", isURI, "location");
     if (isURI) {
       this._initLocationField();
       this._locationField.readOnly = this.readOnly;
     }
 
-    // hide the description field for
-    if (showOrCollapse("descriptionRow", isItem && !this.readOnly,
-                       "description")) {
-      this._initDescriptionField();
-      this._descriptionField.readOnly = this.readOnly;
-    }
-
     if (showOrCollapse("keywordRow", isBookmark, "keyword")) {
       this._initKeywordField().catch(Cu.reportError);
       this._keywordField.readOnly = this.readOnly;
     }
 
     // Collapse the tag selector if the item does not accept tags.
     if (showOrCollapse("tagsRow", isURI || bulkTagging, "tags"))
       this._initTagsField();
@@ -624,30 +609,16 @@ var gEditItemOverlay = {
       return;
     }
 
     this._mayUpdateFirstEditField("namePicker");
     await PlacesTransactions.EditTitle({ guid: this._paneInfo.itemGuid,
                                          title: this._namePicker.value }).transact();
   },
 
-  onDescriptionFieldChange() {
-    if (this.readOnly || !this._paneInfo.isItem)
-      return;
-
-    let description = this._element("descriptionField").value;
-    if (description != PlacesUIUtils.getItemDescription(this._paneInfo.itemId)) {
-      let annotation =
-        { name: PlacesUIUtils.DESCRIPTION_ANNO, value: description };
-      let guid = this._paneInfo.itemGuid;
-      PlacesTransactions.Annotate({ guid, annotation })
-                        .transact().catch(Cu.reportError);
-    }
-  },
-
   onLocationFieldChange() {
     if (this.readOnly || !this._paneInfo.isBookmark)
       return;
 
     let newURI;
     try {
       newURI = PlacesUIUtils.createFixedURI(this._locationField.value);
     } catch (ex) {
@@ -1085,20 +1056,16 @@ var gEditItemOverlay = {
           this._onTagsChange(aGuid, newURI).catch(Cu.reportError);
         }
       }
       break;
     case "keyword":
       if (this._paneInfo.visibleRows.has("keywordRow"))
         this._initKeywordField(aValue).catch(Cu.reportError);
       break;
-    case PlacesUIUtils.DESCRIPTION_ANNO:
-      if (this._paneInfo.visibleRows.has("descriptionRow"))
-        this._initDescriptionField();
-      break;
     case PlacesUIUtils.LOAD_IN_SIDEBAR_ANNO:
       if (this._paneInfo.visibleRows.has("loadInSidebarCheckbox"))
         this._initLoadInSidebar();
       break;
     }
   },
 
   onItemMoved(id, oldParentId, oldIndex, newParentId, newIndex, type, guid,
@@ -1129,14 +1096,14 @@ var gEditItemOverlay = {
 
   onItemRemoved() { },
   onBeginUpdateBatch() { },
   onEndUpdateBatch() { },
   onItemVisited() { },
 };
 
 for (let elt of ["folderMenuList", "folderTree", "namePicker",
-                 "locationField", "descriptionField", "keywordField",
+                 "locationField", "keywordField",
                  "tagsField", "loadInSidebarCheckbox"]) {
   let eltScoped = elt;
   XPCOMUtils.defineLazyGetter(gEditItemOverlay, `_${eltScoped}`,
                               () => gEditItemOverlay._element(eltScoped));
 }
--- a/browser/components/places/content/editBookmarkPanel.inc.xul
+++ b/browser/components/places/content/editBookmarkPanel.inc.xul
@@ -116,28 +116,16 @@
           collapsed="true">
       <observes element="additionalInfoBroadcaster" attribute="hidden"/>
       <label value="&editBookmarkOverlay.keyword.label;"
              accesskey="&editBookmarkOverlay.keyword.accesskey;"
              control="editBMPanel_keywordField"/>
       <textbox id="editBMPanel_keywordField"
                onchange="gEditItemOverlay.onKeywordFieldChange();"/>
     </vbox>
-
-    <vbox id="editBMPanel_descriptionRow"
-          collapsed="true">
-      <observes element="additionalInfoBroadcaster" attribute="hidden"/>
-      <label value="&editBookmarkOverlay.description.label;"
-             accesskey="&editBookmarkOverlay.description.accesskey;"
-             control="editBMPanel_descriptionField"/>
-      <textbox id="editBMPanel_descriptionField"
-               multiline="true"
-               rows="4"
-               onchange="gEditItemOverlay.onDescriptionFieldChange();"/>
-    </vbox>
   </vbox>
 
   <checkbox id="editBMPanel_loadInSidebarCheckbox"
             collapsed="true"
             label="&editBookmarkOverlay.loadInSidebar.label;"
             accesskey="&editBookmarkOverlay.loadInSidebar.accesskey;"
             oncommand="gEditItemOverlay.onLoadInSidebarCheckboxCommand();">
     <observes element="additionalInfoBroadcaster" attribute="hidden"/>
--- a/browser/components/places/content/places.js
+++ b/browser/components/places/content/places.js
@@ -27,17 +27,16 @@ const HISTORY_LIBRARY_SEARCH_TELEMETRY =
 
 var PlacesOrganizer = {
   _places: null,
 
   // IDs of fields from editBookmark that should be hidden when infoBox
   // is minimal. IDs should be kept in sync with the IDs of the elements
   // observing additionalInfoBroadcaster.
   _additionalInfoFields: [
-    "editBMPanel_descriptionRow",
     "editBMPanel_loadInSidebarCheckbox",
     "editBMPanel_keywordRow",
   ],
 
   _initFolderTree() {
     this._places.place = `place:type=${Ci.nsINavHistoryQueryOptions.RESULTS_AS_LEFT_PANE_QUERY}&excludeItems=1&expandQueries=0`;
   },
 
@@ -672,17 +671,16 @@ var PlacesOrganizer = {
       if (aNodeList.every(PlacesUtils.nodeIsURI)) {
         let uris = aNodeList.map(node => Services.io.newURI(node.uri));
         detailsDeck.selectedIndex = 1;
         gEditItemOverlay.initPanel({ uris,
                                      hiddenRows: ["folderPicker",
                                                   "loadInSidebar",
                                                   "location",
                                                   "keyword",
-                                                  "description",
                                                   "name"]});
         this._detectAndSetDetailsPaneMinimalState(selectedNode);
       } else {
         detailsDeck.selectedIndex = 0;
         let selectItemDesc = document.getElementById("selectItemDescription");
         let itemsCountLabel = document.getElementById("itemsCountText");
         selectItemDesc.hidden = false;
         itemsCountLabel.value =
@@ -1172,19 +1170,16 @@ var ViewMenu = {
     var colLookupTable = {
       title:        { key: "TITLE",        dir: "ascending"  },
       tags:         { key: "TAGS",         dir: "ascending"  },
       url:          { key: "URI",          dir: "ascending"  },
       date:         { key: "DATE",         dir: "descending" },
       visitCount:   { key: "VISITCOUNT",   dir: "descending" },
       dateAdded:    { key: "DATEADDED",    dir: "descending" },
       lastModified: { key: "LASTMODIFIED", dir: "descending" },
-      description:  { key: "ANNOTATION",
-                      dir: "ascending",
-                      anno: PlacesUIUtils.DESCRIPTION_ANNO }
     };
 
     // Make sure we have a valid column.
     if (!colLookupTable.hasOwnProperty(columnId))
       throw new Error("Invalid column");
 
     // Use a default sort direction if none has been specified.  If aDirection
     // is invalid, result.sortingMode will be undefined, which has the effect
--- a/browser/components/places/content/places.xul
+++ b/browser/components/places/content/places.xul
@@ -416,19 +416,16 @@
                       persist="width hidden ordinal sortActive sortDirection"/>
             <splitter class="tree-splitter"/>
             <treecol label="&col.mostrecentvisit.label;" id="placesContentDate" anonid="date" flex="1" hidden="true"
                       persist="width hidden ordinal sortActive sortDirection"/>
             <splitter class="tree-splitter"/>
             <treecol label="&col.visitcount.label;" id="placesContentVisitCount" anonid="visitCount" flex="1" hidden="true"
                       persist="width hidden ordinal sortActive sortDirection"/>
             <splitter class="tree-splitter"/>
-            <treecol label="&col.description.label;" id="placesContentDescription" anonid="description" flex="1" hidden="true"
-                      persist="width hidden ordinal sortActive sortDirection"/>
-            <splitter class="tree-splitter"/>
             <treecol label="&col.dateadded.label;" id="placesContentDateAdded" anonid="dateAdded" flex="1" hidden="true"
                       persist="width hidden ordinal sortActive sortDirection"/>
             <splitter class="tree-splitter"/>
             <treecol label="&col.lastmodified.label;" id="placesContentLastModified" anonid="lastModified" flex="1" hidden="true"
                       persist="width hidden ordinal sortActive sortDirection"/>
           </treecols>
           <treechildren flex="1" onclick="ContentTree.onClick(event);"/>
         </tree>
--- a/browser/components/places/content/treeView.js
+++ b/browser/components/places/content/treeView.js
@@ -577,35 +577,32 @@ PlacesTreeView.prototype = {
     return this.__dateFormatter;
   },
 
   COLUMN_TYPE_UNKNOWN: 0,
   COLUMN_TYPE_TITLE: 1,
   COLUMN_TYPE_URI: 2,
   COLUMN_TYPE_DATE: 3,
   COLUMN_TYPE_VISITCOUNT: 4,
-  COLUMN_TYPE_DESCRIPTION: 5,
-  COLUMN_TYPE_DATEADDED: 6,
-  COLUMN_TYPE_LASTMODIFIED: 7,
-  COLUMN_TYPE_TAGS: 8,
+  COLUMN_TYPE_DATEADDED: 5,
+  COLUMN_TYPE_LASTMODIFIED: 6,
+  COLUMN_TYPE_TAGS: 7,
 
   _getColumnType: function PTV__getColumnType(aColumn) {
     let columnType = aColumn.element.getAttribute("anonid") || aColumn.id;
 
     switch (columnType) {
       case "title":
         return this.COLUMN_TYPE_TITLE;
       case "url":
         return this.COLUMN_TYPE_URI;
       case "date":
         return this.COLUMN_TYPE_DATE;
       case "visitCount":
         return this.COLUMN_TYPE_VISITCOUNT;
-      case "description":
-        return this.COLUMN_TYPE_DESCRIPTION;
       case "dateAdded":
         return this.COLUMN_TYPE_DATEADDED;
       case "lastModified":
         return this.COLUMN_TYPE_LASTMODIFIED;
       case "tags":
         return this.COLUMN_TYPE_TAGS;
     }
     return this.COLUMN_TYPE_UNKNOWN;
@@ -624,23 +621,16 @@ PlacesTreeView.prototype = {
       case Ci.nsINavHistoryQueryOptions.SORT_BY_URI_ASCENDING:
         return [this.COLUMN_TYPE_URI, false];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_URI_DESCENDING:
         return [this.COLUMN_TYPE_URI, true];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_ASCENDING:
         return [this.COLUMN_TYPE_VISITCOUNT, false];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_VISITCOUNT_DESCENDING:
         return [this.COLUMN_TYPE_VISITCOUNT, true];
-      case Ci.nsINavHistoryQueryOptions.SORT_BY_ANNOTATION_ASCENDING:
-        if (this._result.sortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
-          return [this.COLUMN_TYPE_DESCRIPTION, false];
-        break;
-      case Ci.nsINavHistoryQueryOptions.SORT_BY_ANNOTATION_DESCENDING:
-        if (this._result.sortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
-          return [this.COLUMN_TYPE_DESCRIPTION, true];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_ASCENDING:
         return [this.COLUMN_TYPE_DATEADDED, false];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_DATEADDED_DESCENDING:
         return [this.COLUMN_TYPE_DATEADDED, true];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_LASTMODIFIED_ASCENDING:
         return [this.COLUMN_TYPE_LASTMODIFIED, false];
       case Ci.nsINavHistoryQueryOptions.SORT_BY_LASTMODIFIED_DESCENDING:
         return [this.COLUMN_TYPE_LASTMODIFIED, true];
@@ -919,19 +909,17 @@ PlacesTreeView.prototype = {
 
   nodeTagsChanged: function PTV_nodeTagsChanged(aNode) {
     this._invalidateCellValue(aNode, this.COLUMN_TYPE_TAGS);
   },
 
   nodeKeywordChanged(aNode, aNewKeyword) {},
 
   nodeAnnotationChanged: function PTV_nodeAnnotationChanged(aNode, aAnno) {
-    if (aAnno == PlacesUIUtils.DESCRIPTION_ANNO) {
-      this._invalidateCellValue(aNode, this.COLUMN_TYPE_DESCRIPTION);
-    } else if (aAnno == PlacesUtils.LMANNO_FEEDURI) {
+    if (aAnno == PlacesUtils.LMANNO_FEEDURI) {
       PlacesUtils.livemarks.getLivemark({ id: aNode.itemId })
         .then(aLivemark => {
           this._controller.cacheLivemarkInfo(aNode, aLivemark);
           let properties = this._cellProperties.get(aNode);
           this._cellProperties.set(aNode, properties += " livemark");
           // The livemark attribute is set as a cell property on the title cell.
           this._invalidateCellValue(aNode, this.COLUMN_TYPE_TITLE);
         }, Cu.reportError);
@@ -1571,24 +1559,16 @@ PlacesTreeView.prototype = {
           // I expect, and gives me no information I know how to use.
           // Only show this for URI-based items.
           return "";
         }
 
         return this._convertPRTimeToString(nodeTime);
       case this.COLUMN_TYPE_VISITCOUNT:
         return node.accessCount;
-      case this.COLUMN_TYPE_DESCRIPTION:
-        if (node.itemId != -1) {
-          try {
-            return PlacesUtils.annotations.
-                               getItemAnnotation(node.itemId, PlacesUIUtils.DESCRIPTION_ANNO);
-          } catch (ex) { /* has no description */ }
-        }
-        return "";
       case this.COLUMN_TYPE_DATEADDED:
         if (node.dateAdded)
           return this._convertPRTimeToString(node.dateAdded);
         return "";
       case this.COLUMN_TYPE_LASTMODIFIED:
         if (node.lastModified)
           return this._convertPRTimeToString(node.lastModified);
         return "";
@@ -1660,17 +1640,16 @@ PlacesTreeView.prototype = {
     //
     // The problem occurs when you have a query that results in bookmark
     // folders. One example of this is the subscriptions view. In these cases,
     // this rule doesn't allow you to sort those sub-folders by their natural
     // order.
     let allowTriState = PlacesUtils.nodeIsFolder(this._result.root);
 
     let oldSort = this._result.sortingMode;
-    let oldSortingAnnotation = this._result.sortingAnnotation;
     let newSort;
     let newSortingAnnotation = "";
     const NHQO = Ci.nsINavHistoryQueryOptions;
     switch (this._getColumnType(aColumn)) {
       case this.COLUMN_TYPE_TITLE:
         if (oldSort == NHQO.SORT_BY_TITLE_ASCENDING)
           newSort = NHQO.SORT_BY_TITLE_DESCENDING;
         else if (allowTriState && oldSort == NHQO.SORT_BY_TITLE_DESCENDING)
@@ -1705,31 +1684,16 @@ PlacesTreeView.prototype = {
         if (oldSort == NHQO.SORT_BY_VISITCOUNT_DESCENDING)
           newSort = NHQO.SORT_BY_VISITCOUNT_ASCENDING;
         else if (allowTriState && oldSort == NHQO.SORT_BY_VISITCOUNT_ASCENDING)
           newSort = NHQO.SORT_BY_NONE;
         else
           newSort = NHQO.SORT_BY_VISITCOUNT_DESCENDING;
 
         break;
-      case this.COLUMN_TYPE_DESCRIPTION:
-        if (oldSort == NHQO.SORT_BY_ANNOTATION_ASCENDING &&
-            oldSortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO) {
-          newSort = NHQO.SORT_BY_ANNOTATION_DESCENDING;
-          newSortingAnnotation = PlacesUIUtils.DESCRIPTION_ANNO;
-        } else if (allowTriState &&
-                 oldSort == NHQO.SORT_BY_ANNOTATION_DESCENDING &&
-                 oldSortingAnnotation == PlacesUIUtils.DESCRIPTION_ANNO)
-          newSort = NHQO.SORT_BY_NONE;
-        else {
-          newSort = NHQO.SORT_BY_ANNOTATION_ASCENDING;
-          newSortingAnnotation = PlacesUIUtils.DESCRIPTION_ANNO;
-        }
-
-        break;
       case this.COLUMN_TYPE_DATEADDED:
         if (oldSort == NHQO.SORT_BY_DATEADDED_ASCENDING)
           newSort = NHQO.SORT_BY_DATEADDED_DESCENDING;
         else if (allowTriState &&
                  oldSort == NHQO.SORT_BY_DATEADDED_DESCENDING)
           newSort = NHQO.SORT_BY_NONE;
         else
           newSort = NHQO.SORT_BY_DATEADDED_ASCENDING;
--- a/browser/components/places/tests/browser/browser_library_infoBox.js
+++ b/browser/components/places/tests/browser/browser_library_infoBox.js
@@ -93,22 +93,23 @@ add_task(async function() {
                   QueryInterface(Ci.nsINavHistoryContainerResultNode);
   menuNode.containerOpen = true;
   childNode = menuNode.getChild(0);
   isnot(childNode, null, "Bookmarks menu child node exists.");
   is(childNode.title, "Recent Bookmarks",
       "Correctly selected recently bookmarked node.");
   PO._places.selectNode(childNode);
   checkInfoBoxSelected();
-  ok(!infoBoxExpanderWrapper.hidden,
-      "Expander button is not hidden for recently bookmarked node.");
-  checkAddInfoFieldsNotCollapsed(PO);
+  ok(infoBoxExpanderWrapper.hidden,
+     "Expander button is hidden for recently bookmarked node.");
+  checkAddInfoFieldsCollapsed(PO);
 
   // open first bookmark
   view = ContentTree.view.view;
+  ContentTree.view.focus();
   ok(view.rowCount > 0, "Bookmark item exists.");
   view.selection.select(0);
   checkInfoBoxSelected();
   ok(!infoBoxExpanderWrapper.hidden,
       "Expander button is not hidden for bookmark item.");
   checkAddInfoFieldsNotCollapsed(PO);
 
   ok(true, "Checking additional info fields visibiity for bookmark item");
--- a/browser/locales/en-US/chrome/browser/places/editBookmarkOverlay.dtd
+++ b/browser/locales/en-US/chrome/browser/places/editBookmarkOverlay.dtd
@@ -11,18 +11,16 @@
 <!ENTITY editBookmarkOverlay.siteLocation.label              "Site Location:">
 <!ENTITY editBookmarkOverlay.siteLocation.accesskey          "S">
 <!ENTITY editBookmarkOverlay.folder.label                    "Folder:">
 <!ENTITY editBookmarkOverlay.foldersExpanderDown.tooltip     "Show all the bookmarks folders">
 <!ENTITY editBookmarkOverlay.expanderUp.tooltip              "Hide">
 <!ENTITY editBookmarkOverlay.tags.label                      "Tags:">
 <!ENTITY editBookmarkOverlay.tags.accesskey                  "T">
 <!ENTITY editBookmarkOverlay.tagsEmptyDesc.label             "Separate tags with commas">
-<!ENTITY editBookmarkOverlay.description.label               "Description:">
-<!ENTITY editBookmarkOverlay.description.accesskey           "D">
 <!ENTITY editBookmarkOverlay.keyword.label                   "Keyword:">
 <!ENTITY editBookmarkOverlay.keyword.accesskey               "K">
 <!ENTITY editBookmarkOverlay.tagsExpanderDown.tooltip        "Show all tags">
 <!ENTITY editBookmarkOverlay.loadInSidebar.label             "Load this bookmark in the sidebar">
 <!ENTITY editBookmarkOverlay.loadInSidebar.accesskey         "h">
 <!ENTITY editBookmarkOverlay.choose.label                    "Choose…">
 <!ENTITY editBookmarkOverlay.newFolderButton.label           "New Folder">
 <!ENTITY editBookmarkOverlay.newFolderButton.accesskey       "o">
--- a/browser/locales/en-US/chrome/browser/places/places.dtd
+++ b/browser/locales/en-US/chrome/browser/places/places.dtd
@@ -73,17 +73,16 @@
 <!ENTITY cmd.reloadLivebookmark.label      "Reload Live Bookmark">
 <!ENTITY cmd.reloadLivebookmark.accesskey  "R">
 
 <!ENTITY col.name.label          "Name">
 <!ENTITY col.tags.label          "Tags">
 <!ENTITY col.url.label           "Location">
 <!ENTITY col.mostrecentvisit.label "Most Recent Visit">
 <!ENTITY col.visitcount.label    "Visit Count">
-<!ENTITY col.description.label   "Description">
 <!ENTITY col.dateadded.label     "Added">
 <!ENTITY col.lastmodified.label  "Last Modified">
 
 <!ENTITY historySearch.placeholder  "Search history">
 <!ENTITY bookmarksSearch.placeholder  "Search bookmarks">
 
 <!ENTITY cmd.find.key  "f">
 
--- a/browser/locales/en-US/chrome/browser/places/places.properties
+++ b/browser/locales/en-US/chrome/browser/places/places.properties
@@ -31,18 +31,16 @@ sortByNameGeneric=Sort by Name
 view.sortBy.1.name.label=Sort by Name
 view.sortBy.1.name.accesskey=N
 view.sortBy.1.url.label=Sort by Location
 view.sortBy.1.url.accesskey=L
 view.sortBy.1.date.label=Sort by Most Recent Visit
 view.sortBy.1.date.accesskey=V
 view.sortBy.1.visitCount.label=Sort by Visit Count
 view.sortBy.1.visitCount.accesskey=C
-view.sortBy.1.description.label=Sort by Description
-view.sortBy.1.description.accesskey=D
 view.sortBy.1.dateAdded.label=Sort by Added
 view.sortBy.1.dateAdded.accesskey=e
 view.sortBy.1.lastModified.label=Sort by Last Modified
 view.sortBy.1.lastModified.accesskey=M
 view.sortBy.1.tags.label=Sort by Tags
 view.sortBy.1.tags.accesskey=T
 
 searchBookmarks=Search Bookmarks
--- a/browser/modules/ContentClick.jsm
+++ b/browser/modules/ContentClick.jsm
@@ -49,19 +49,18 @@ var ContentClick = {
       // This is the Opera convention for a special link that, when clicked,
       // allows to add a sidebar panel.  The link's title attribute contains
       // the title that should be used for the sidebar panel.
       PlacesUIUtils.showBookmarkDialog({ action: "add",
                                          type: "bookmark",
                                          uri: Services.io.newURI(json.href),
                                          title: json.title,
                                          loadBookmarkInSidebar: true,
-                                         hiddenRows: [ "description",
-                                                        "location",
-                                                        "keyword" ]
+                                         hiddenRows: [ "location",
+                                                       "keyword" ]
                                        }, window);
       return;
     }
 
     // Note: We don't need the sidebar code here.
 
     // Mark the page as a user followed link.  This is done so that history can
     // distinguish automatic embed visits from user activated ones.  For example
--- a/browser/modules/ContextMenu.jsm
+++ b/browser/modules/ContextMenu.jsm
@@ -11,17 +11,16 @@ var EXPORTED_SYMBOLS = ["ContextMenu"];
 Cu.importGlobalProperties(["URL"]);
 
 ChromeUtils.import("resource://gre/modules/Services.jsm");
 ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyModuleGetters(this, {
   E10SUtils: "resource://gre/modules/E10SUtils.jsm",
   BrowserUtils: "resource://gre/modules/BrowserUtils.jsm",
-  PlacesUIUtils: "resource:///modules/PlacesUIUtils.jsm",
   findCssSelector: "resource://gre/modules/css-selector.js",
   SpellCheckHelper: "resource://gre/modules/InlineSpellChecker.jsm",
   LoginManagerContent: "resource://gre/modules/LoginManagerContent.jsm",
   WebNavigationFrames: "resource://gre/modules/WebNavigationFrames.jsm",
   PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
   InlineSpellCheckerContent: "resource://gre/modules/InlineSpellCheckerContent.jsm",
 });
 
@@ -31,18 +30,17 @@ XPCOMUtils.defineLazyGetter(this, "PageM
   return new tmp.PageMenuChild();
 });
 
 const messageListeners = {
   "ContextMenu:BookmarkFrame": function(aMessage) {
     let frame = this.getTarget(aMessage).ownerDocument;
 
     this.global.sendAsyncMessage("ContextMenu:BookmarkFrame:Result",
-                                 { title: frame.title,
-                                 description: PlacesUIUtils.getDescriptionFromDocument(frame) });
+                                 { title: frame.title });
   },
 
   "ContextMenu:Canvas:ToBlobURL": function(aMessage) {
     this.getTarget(aMessage).toBlob((blob) => {
       let blobURL = URL.createObjectURL(blob);
       this.global.sendAsyncMessage("ContextMenu:Canvas:ToBlobURL:Result", { blobURL });
     });
   },
@@ -120,17 +118,16 @@ const messageListeners = {
     let formBaseURI = Services.io.newURI(node.form.baseURI, charset);
     let formURI = Services.io.newURI(node.form.getAttribute("action"),
                                      charset, formBaseURI);
     let spec = formURI.spec;
     let isURLEncoded =  (node.form.method.toUpperCase() == "POST" &&
                          (node.form.enctype == "application/x-www-form-urlencoded" ||
                           node.form.enctype == ""));
     let title = node.ownerDocument.title;
-    let description = PlacesUIUtils.getDescriptionFromDocument(node.ownerDocument);
     let formData = [];
 
     function escapeNameValuePair(aName, aValue, aIsFormUrlEncoded) {
       if (aIsFormUrlEncoded) {
         return escape(aName + "=" + aValue);
       }
 
       return escape(aName) + "=" + escape(aValue);
@@ -167,17 +164,17 @@ const messageListeners = {
     if (isURLEncoded) {
       postData = formData.join("&");
     } else {
       let separator = spec.includes("?") ? "&" : "?";
       spec += separator + formData.join("&");
     }
 
     this.global.sendAsyncMessage("ContextMenu:SearchFieldBookmarkData:Result",
-                                 { spec, title, description, postData, charset });
+                                 { spec, title, postData, charset });
   },
 
   "ContextMenu:SaveVideoFrameAsImage": function(aMessage) {
     let video = this.getTarget(aMessage);
     let canvas = this.content.document.createElementNS("http://www.w3.org/1999/xhtml",
                                                        "canvas");
     canvas.width = video.videoWidth;
     canvas.height = video.videoHeight;
--- a/browser/modules/Feeds.jsm
+++ b/browser/modules/Feeds.jsm
@@ -39,17 +39,17 @@ var Feeds = {
         let registrar = Cc["@mozilla.org/embeddor.implemented/web-content-handler-registrar;1"].
                           getService(Ci.nsIWebContentConverterService);
         registrar.setAutoHandler(data.contentType, data.handler);
         break;
       }
 
       case "FeedConverter:addLiveBookmark": {
         let topWindow = BrowserWindowTracker.getTopWindow();
-        topWindow.PlacesCommandHook.addLiveBookmark(data.spec, data.title, data.subtitle)
+        topWindow.PlacesCommandHook.addLiveBookmark(data.spec, data.title)
                                    .catch(Cu.reportError);
         break;
       }
     }
   },
 
   /**
    * isValidFeed: checks whether the given data represents a valid feed.