Bug 1467996 - Remove all the code adding a description annotation. r=mak,lina
authorMark Banner <standard8@mozilla.com>
Tue, 26 Jun 2018 12:33:45 +0000
changeset 423653 a4b5aaa1a6d8c58ffab76a871ad1c2e5dfdff741
parent 423652 ddc47948f3714ccae226d4079c859c7bce8daa22
child 423654 39d47ffbb58487188ffd6bf5bccc57df509f5cf5
push id65552
push usermbanner@mozilla.com
push dateTue, 26 Jun 2018 12:34:31 +0000
treeherderautoland@a4b5aaa1a6d8 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmak, lina
bugs1467996
milestone63.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 1467996 - Remove all the code adding a description annotation. r=mak,lina MozReview-Commit-ID: CRBSxJtJELp Differential Revision: https://phabricator.services.mozilla.com/D1748
browser/components/distribution.js
browser/components/places/PlacesUIUtils.jsm
services/sync/modules/engines/bookmarks.js
services/sync/tests/unit/test_bookmark_livemarks.js
services/sync/tests/unit/test_bookmark_store.js
services/sync/tests/unit/test_bookmark_tracker.js
services/sync/tps/extensions/tps/resource/modules/bookmarks.jsm
toolkit/components/places/BookmarkHTMLUtils.jsm
toolkit/components/places/Bookmarks.jsm
toolkit/components/places/PlacesSyncUtils.jsm
toolkit/components/places/PlacesUtils.jsm
toolkit/components/places/SyncedBookmarksMirror.jsm
toolkit/components/places/tests/sync/head_sync.js
toolkit/components/places/tests/sync/test_sync_utils.js
toolkit/components/places/tests/unit/test_384370.js
toolkit/components/places/tests/unit/test_PlacesUtils_annotations.js
toolkit/components/places/tests/unit/test_bookmarks_html.js
toolkit/components/places/tests/unit/test_bookmarks_html_corrupt.js
toolkit/components/places/tests/unit/test_bookmarks_json.js
--- a/browser/components/distribution.js
+++ b/browser/components/distribution.js
@@ -147,25 +147,16 @@ DistributionCustomizer.prototype = {
 
         let folder = await PlacesUtils.bookmarks.insert({
           type: PlacesUtils.bookmarks.TYPE_FOLDER,
           parentGuid, index, title: item.title
         });
 
         await this._parseBookmarksSection(folder.guid,
                                           "BookmarksFolder-" + item.folderId);
-
-        if (item.description) {
-          let folderId = await PlacesUtils.promiseItemId(folder.guid);
-          PlacesUtils.annotations.setItemAnnotation(folderId,
-                                                    "bookmarkProperties/description",
-                                                    item.description, 0,
-                                                    PlacesUtils.annotations.EXPIRE_NEVER);
-        }
-
         break;
 
       case "separator":
         if (itemIndex < defaultIndex)
           index = prependIndex++;
 
         await PlacesUtils.bookmarks.insert({
           type: PlacesUtils.bookmarks.TYPE_SEPARATOR,
@@ -186,28 +177,20 @@ DistributionCustomizer.prototype = {
         });
         break;
 
       case "bookmark":
       default:
         if (itemIndex < defaultIndex)
           index = prependIndex++;
 
-        let bm = await PlacesUtils.bookmarks.insert({
+        await PlacesUtils.bookmarks.insert({
           parentGuid, index, title: item.title, url: item.link
         });
 
-        if (item.description) {
-          let bmId = await PlacesUtils.promiseItemId(bm.guid);
-          PlacesUtils.annotations.setItemAnnotation(bmId,
-                                                    "bookmarkProperties/description",
-                                                    item.description, 0,
-                                                    PlacesUtils.annotations.EXPIRE_NEVER);
-        }
-
         if (item.icon && item.iconData) {
           try {
             let faviconURI = Services.io.newURI(item.icon);
             PlacesUtils.favicons.replaceFaviconDataFromDataURL(
               faviconURI, item.iconData, 0,
               Services.scriptSecurityManager.getSystemPrincipal());
 
             PlacesUtils.favicons.setAndFetchFaviconForPage(
--- a/browser/components/places/PlacesUIUtils.jsm
+++ b/browser/components/places/PlacesUIUtils.jsm
@@ -204,17 +204,16 @@ let InternalFaviconLoader = {
       this._removeLoadDataFromWindowMap(win, loadData);
     }, FAVICON_REQUEST_TIMEOUT);
     let loadDataForWindow = gFaviconLoadDataMap.get(win);
     loadDataForWindow.push(loadData);
   },
 };
 
 var PlacesUIUtils = {
-  DESCRIPTION_ANNO: "bookmarkProperties/description",
   LAST_USED_FOLDERS_META_KEY: "bookmarks/lastusedfolders",
 
   /**
    * Makes a URI from a spec, and do fixup
    * @param   aSpec
    *          The string spec of the URI
    * @return A URI object for the spec.
    */
--- a/services/sync/modules/engines/bookmarks.js
+++ b/services/sync/modules/engines/bookmarks.js
@@ -26,17 +26,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   Resource: "resource://services-sync/resource.js",
 });
 
 XPCOMUtils.defineLazyGetter(this, "PlacesBundle", () => {
   return Services.strings.createBundle("chrome://places/locale/places.properties");
 });
 
 XPCOMUtils.defineLazyGetter(this, "ANNOS_TO_TRACK", () => [
-  PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO,
   PlacesUtils.LMANNO_FEEDURI,
   PlacesUtils.LMANNO_SITEURI,
 ]);
 
 const PLACES_MAINTENANCE_INTERVAL_SECONDS = 4 * 60 * 60; // 4 hours.
 
 const FOLDER_SORTINDEX = 1000000;
 
--- a/services/sync/tests/unit/test_bookmark_livemarks.js
+++ b/services/sync/tests/unit/test_bookmark_livemarks.js
@@ -3,18 +3,16 @@
 
 ChromeUtils.import("resource://gre/modules/Log.jsm");
 ChromeUtils.import("resource://services-sync/record.js");
 ChromeUtils.import("resource://services-sync/engines.js");
 ChromeUtils.import("resource://services-sync/engines/bookmarks.js");
 ChromeUtils.import("resource://services-sync/util.js");
 ChromeUtils.import("resource://services-sync/service.js");
 
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
-
 // Record borrowed from Bug 631361.
 const record631361 = {
   id: "M5bwUKK8hPyF",
   index: 150,
   modified: 1296768176.49,
   payload:
   {"id": "M5bwUKK8hPyF",
    "type": "livemark",
@@ -54,44 +52,16 @@ function makeLivemark(p, mintGUID) {
   b.cleartext = Cu.cloneInto(p, {});
 
   if (mintGUID)
     b.id = Utils.makeGUID();
 
   return b;
 }
 
-add_task(async function test_livemark_descriptions() {
-  let engine = new BookmarksEngine(Service);
-  await engine.initialize();
-  let store = engine._store;
-
-  let record = record631361.payload;
-
-  async function doRecord(r) {
-    store._childrenToOrder = {};
-    await store.applyIncoming(r);
-    await store._orderChildren();
-    delete store._childrenToOrder;
-  }
-
-  // Attempt to provoke an error by messing around with the description.
-  record.description = null;
-  await doRecord(makeLivemark(record));
-  record.description = "";
-  await doRecord(makeLivemark(record));
-
-  // Attempt to provoke an error by adding a bad description anno.
-  let id = await PlacesUtils.promiseItemId(record.id);
-  PlacesUtils.annotations.setItemAnnotation(id, DESCRIPTION_ANNO, "", 0,
-                                            PlacesUtils.annotations.EXPIRE_NEVER);
-
-  await engine.finalize();
-});
-
 add_task(async function test_livemark_invalid() {
   let engine = new BookmarksEngine(Service);
   await engine.initialize();
   let store = engine._store;
 
   _("Livemarks considered invalid by nsLivemarkService are skipped.");
 
   _("Parent is unknown. Will be set to unfiled.");
--- a/services/sync/tests/unit/test_bookmark_store.js
+++ b/services/sync/tests/unit/test_bookmark_store.js
@@ -52,41 +52,36 @@ add_task(async function test_bookmark_cr
     let item = await PlacesUtils.bookmarks.fetch({
       url: "http://getfirefox.com/",
     });
     Assert.equal(null, item);
 
     _("Let's create a new record.");
     let fxrecord = new Bookmark("bookmarks", "get-firefox1");
     fxrecord.bmkUri        = "http://getfirefox.com/";
-    fxrecord.description   = "Firefox is awesome.";
     fxrecord.title         = "Get Firefox!";
     fxrecord.tags          = ["firefox", "awesome", "browser"];
     fxrecord.keyword       = "awesome";
     fxrecord.parentName    = BookmarksToolbarTitle;
     fxrecord.parentid      = "toolbar";
     await store.applyIncoming(fxrecord);
 
     _("Verify it has been created correctly.");
     item = await PlacesUtils.bookmarks.fetch(fxrecord.id);
     Assert.equal(item.type, PlacesUtils.bookmarks.TYPE_BOOKMARK);
     Assert.equal(item.url.href, "http://getfirefox.com/");
     Assert.equal(item.title, fxrecord.title);
-    let id = await PlacesUtils.promiseItemId(item.guid);
-    let description = PlacesUtils.annotations.getItemAnnotation(id,
-      PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO);
-    Assert.equal(description, fxrecord.description);
     Assert.equal(item.parentGuid, PlacesUtils.bookmarks.toolbarGuid);
     let keyword = await PlacesUtils.keywords.fetch(fxrecord.keyword);
     Assert.equal(keyword.url.href, "http://getfirefox.com/");
 
     _("Have the store create a new record object. Verify that it has the same data.");
     let newrecord = await store.createRecord(fxrecord.id);
     Assert.ok(newrecord instanceof Bookmark);
-    for (let property of ["type", "bmkUri", "description", "title",
+    for (let property of ["type", "bmkUri", "title",
                           "keyword", "parentName", "parentid"]) {
       Assert.equal(newrecord[property], fxrecord[property]);
     }
     Assert.ok(Utils.deepEquals(newrecord.tags.sort(),
                                fxrecord.tags.sort()));
 
     _("The calculated sort index is based on frecency data.");
     Assert.ok(newrecord.sortindex >= 150);
@@ -95,24 +90,19 @@ add_task(async function test_bookmark_cr
     let tbrecord = new Bookmark("bookmarks", "thunderbird1");
     tbrecord.bmkUri        = "http://getthunderbird.com/";
     tbrecord.parentName    = BookmarksToolbarTitle;
     tbrecord.parentid      = "toolbar";
     await store.applyIncoming(tbrecord);
 
     _("Verify it has been created correctly.");
     item = await PlacesUtils.bookmarks.fetch(tbrecord.id);
-    id = await PlacesUtils.promiseItemId(item.guid);
     Assert.equal(item.type, PlacesUtils.bookmarks.TYPE_BOOKMARK);
     Assert.equal(item.url.href, "http://getthunderbird.com/");
     Assert.equal(item.title, "");
-    do_check_throws(function() {
-      PlacesUtils.annotations.getItemAnnotation(id,
-        PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO);
-    }, Cr.NS_ERROR_NOT_AVAILABLE);
     Assert.equal(item.parentGuid, PlacesUtils.bookmarks.toolbarGuid);
     keyword = await PlacesUtils.keywords.fetch({
       url: "http://getthunderbird.com/",
     });
     Assert.equal(null, keyword);
   } finally {
     _("Clean up.");
     await store.wipe();
@@ -126,38 +116,29 @@ add_task(async function test_bookmark_up
 
   try {
     _("Create a bookmark whose values we'll change.");
     let bmk1 = await PlacesUtils.bookmarks.insert({
       parentGuid: PlacesUtils.bookmarks.toolbarGuid,
       url: "http://getfirefox.com/",
       title: "Get Firefox!",
     });
-    let bmk1_id = await PlacesUtils.promiseItemId(bmk1.guid);
-    PlacesUtils.annotations.setItemAnnotation(
-      bmk1_id, PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO,
-      "Firefox is awesome.", 0, PlacesUtils.annotations.EXPIRE_NEVER);
     await PlacesUtils.keywords.insert({
       url: "http://getfirefox.com/",
       keyword: "firefox",
     });
 
     _("Update the record with some null values.");
     let record = await store.createRecord(bmk1.guid);
     record.title = null;
-    record.description = null;
     record.keyword = null;
     record.tags = null;
     await store.applyIncoming(record);
 
     _("Verify that the values have been cleared.");
-    do_check_throws(function() {
-      PlacesUtils.annotations.getItemAnnotation(
-        bmk1_id, PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO);
-    }, Cr.NS_ERROR_NOT_AVAILABLE);
     let item = await PlacesUtils.bookmarks.fetch(bmk1.guid);
     Assert.equal(item.title, "");
     let keyword = await PlacesUtils.keywords.fetch({
       url: "http://getfirefox.com/",
     });
     Assert.equal(null, keyword);
   } finally {
     _("Clean up.");
@@ -166,26 +147,25 @@ add_task(async function test_bookmark_up
   }
 });
 
 add_task(async function test_bookmark_createRecord() {
   let engine = Service.engineManager.get("bookmarks");
   let store = engine._store;
 
   try {
-    _("Create a bookmark without a description or title.");
+    _("Create a bookmark without a title.");
     let bmk1 = await PlacesUtils.bookmarks.insert({
       parentGuid: PlacesUtils.bookmarks.toolbarGuid,
       url: "http://getfirefox.com/",
     });
 
     _("Verify that the record is created accordingly.");
     let record = await store.createRecord(bmk1.guid);
     Assert.equal(record.title, "");
-    Assert.equal(record.description, null);
     Assert.equal(record.keyword, null);
 
   } finally {
     _("Clean up.");
     await store.wipe();
   }
 });
 
--- a/services/sync/tests/unit/test_bookmark_tracker.js
+++ b/services/sync/tests/unit/test_bookmark_tracker.js
@@ -678,51 +678,16 @@ add_task(async function test_async_onIte
     await verifyTrackedItems([fxBmk1.guid, fxBmk2.guid]);
     Assert.equal(tracker.score, SCORE_INCREMENT_XLARGE * 2);
   } finally {
     _("Clean up.");
     await cleanup();
   }
 });
 
-add_task(async function test_onItemAnnoChanged() {
-  _("Item annotations should be tracked");
-
-  try {
-    await tracker.stop();
-    let folder = PlacesUtils.bookmarks.createFolder(
-      PlacesUtils.bookmarks.bookmarksMenuFolder, "Parent",
-      PlacesUtils.bookmarks.DEFAULT_INDEX);
-    _("Track changes to annos.");
-    let b = PlacesUtils.bookmarks.insertBookmark(
-      folder, CommonUtils.makeURI("http://getfirefox.com"),
-      PlacesUtils.bookmarks.DEFAULT_INDEX, "Get Firefox!");
-    let bGUID = await PlacesUtils.promiseItemGuid(b);
-    _("New item is " + b);
-    _("GUID: " + bGUID);
-
-    await startTracking();
-    PlacesUtils.annotations.setItemAnnotation(
-      b, PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO, "A test description", 0,
-      PlacesUtils.annotations.EXPIRE_NEVER);
-    // bookmark should be tracked, folder should not.
-    await verifyTrackedItems([bGUID]);
-    Assert.equal(tracker.score, SCORE_INCREMENT_XLARGE);
-    await resetTracker();
-
-    PlacesUtils.annotations.removeItemAnnotation(b,
-      PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO);
-    await verifyTrackedItems([bGUID]);
-    Assert.equal(tracker.score, SCORE_INCREMENT_XLARGE);
-  } finally {
-    _("Clean up.");
-    await cleanup();
-  }
-});
-
 add_task(async function test_onItemAdded_filtered_root() {
   _("Items outside the change roots should not be tracked");
 
   try {
     await startTracking();
 
     _("Create a new root");
     let rootID = PlacesUtils.bookmarks.createFolder(
--- a/services/sync/tps/extensions/tps/resource/modules/bookmarks.jsm
+++ b/services/sync/tps/extensions/tps/resource/modules/bookmarks.jsm
@@ -31,17 +31,16 @@ function extend(child, supertype) {
 /**
  * PlacesItemProps object, holds properties for places items
  */
 function PlacesItemProps(props) {
   this.location = null;
   this.uri = null;
   this.keyword = null;
   this.title = null;
-  this.description = null;
   this.after = null;
   this.before = null;
   this.folder = null;
   this.position = null;
   this.delete = false;
   this.siteUri = null;
   this.feedUri = null;
   this.livemark = null;
@@ -256,41 +255,16 @@ PlacesItem.prototype = {
   async GetOrCreateFolder(location) {
     let parentGuid = await this.GetFolder(location);
     if (parentGuid == null)
       parentGuid = await this.CreateFolder(location);
     return parentGuid;
   },
 
   /**
-   * CheckDescription
-   *
-   * Compares the description of this places item with an expected
-   * description.
-   *
-   * @param expectedDescription The description this places item is
-   *        expected to have
-   * @return true if the actual and expected descriptions match, or if
-   *         there is no expected description; otherwise false
-   */
-  async CheckDescription(expectedDescription) {
-    if (expectedDescription != null) {
-      // Use PlacesSyncUtils as it gives us the description.
-      let info = await PlacesSyncUtils.bookmarks.fetch(this.props.guid);
-      if (info.description != expectedDescription) {
-        Logger.logPotentialError("Invalid description, expected: " +
-          expectedDescription + ", actual: " + info.description + " for " +
-          this.toString());
-        return false;
-      }
-    }
-    return true;
-  },
-
-  /**
    * CheckPosition
    *
    * Verifies the position of this places item.
    *
    * @param before The name of the places item that this item should be
             before, or null if this check should be skipped
    * @param after The name of the places item that this item should be
             after, or null if this check should be skipped
@@ -335,41 +309,16 @@ PlacesItem.prototype = {
         parentGuid: newfolderGuid,
         index: PlacesUtils.bookmarks.DEFAULT_INDEX,
       });
       this.props.parentGuid = newfolderGuid;
     }
   },
 
   /**
-   * SetDescription
-   *
-   * Updates the description for this places item.
-   *
-   * @param description The new description to set; if null, no changes are
-   *        made
-   * @return nothing
-   */
-  async SetDescription(description) {
-    let itemId = await PlacesUtils.promiseItemId(this.props.guid);
-
-    if (description != null) {
-      if (description != "")
-        PlacesUtils.annotations.setItemAnnotation(itemId,
-                                      "bookmarkProperties/description",
-                                      description,
-                                      0,
-                                      PlacesUtils.annotations.EXPIRE_NEVER);
-      else
-        PlacesUtils.annotations.removeItemAnnotation(itemId,
-                                         "bookmarkProperties/description");
-    }
-  },
-
-  /**
    * SetPosition
    *
    * Updates the position of this places item within this item's current
    * folder.  Use SetLocation to change folders.
    *
    * @param position The new index this item should be moved to; if null,
    *        no changes are made; if -1, this item is moved to the bottom of
    *        the current folder. Otherwise, must be a string which is the
@@ -490,32 +439,30 @@ Bookmark.prototype = {
     Logger.AssertTrue(this.props.parentGuid, "Unable to create " +
       "bookmark, error creating folder " + this.props.location);
     let bookmarkURI = Services.io.newURI(this.props.uri);
     let {guid} = await PlacesUtils.bookmarks.insert({parentGuid: this.props.parentGuid,
                                                      url: bookmarkURI,
                                                      title: this.props.title});
     this.props.guid = guid;
     await this.SetKeyword(this.props.keyword);
-    await this.SetDescription(this.props.description);
     await this.SetTags(this.props.tags);
     return this.props.guid;
   },
 
   /**
    * Update
    *
    * Updates this bookmark's properties according the properties on this
    * object's 'updateProps' property.
    *
    * @return nothing
    */
   async Update() {
     Logger.AssertTrue(this.props.guid, "Invalid guid during Update");
-    await this.SetDescription(this.updateProps.description);
     await this.SetTitle(this.updateProps.title);
     await this.SetUri(this.updateProps.uri);
     await this.SetKeyword(this.updateProps.keyword);
     await this.SetTags(this.updateProps.tags);
     await this.SetLocation(this.updateProps.location);
     await this.SetPosition(this.updateProps.position);
   },
 
@@ -538,19 +485,16 @@ Bookmark.prototype = {
                                                     null,
                                                     bookmarkTitle,
                                                     this.props.uri);
 
     if (!this.props.guid) {
       Logger.logPotentialError(this.toString() + " not found");
       return null;
     }
-    if (!(await this.CheckDescription(this.props.description))) {
-      return null;
-    }
     if (this.props.keyword != null) {
       let {keyword} = await PlacesSyncUtils.bookmarks.fetch(this.props.guid);
       if (keyword != this.props.keyword) {
         Logger.logPotentialError("Incorrect keyword - expected: " +
           this.props.keyword + ", actual: " + keyword +
           " for " + this.toString());
         return null;
       }
@@ -619,17 +563,16 @@ BookmarkFolder.prototype = {
     Logger.AssertTrue(this.props.parentGuid, "Unable to create " +
       "folder, error creating parent folder " + this.props.location);
     let {guid} = await PlacesUtils.bookmarks.insert({parentGuid: this.props.parentGuid,
                                                      title: this.props.folder,
                                                      index: PlacesUtils.bookmarks.DEFAULT_INDEX,
                                                      type: PlacesUtils.bookmarks.TYPE_FOLDER,
                                                      });
     this.props.guid = guid;
-    await this.SetDescription(this.props.description);
     return this.props.parentGuid;
   },
 
   /**
    * Find
    *
    * Locates the bookmark folder which corresponds to this object's
    * properties.
@@ -644,19 +587,16 @@ BookmarkFolder.prototype = {
     }
     this.props.guid = await this.GetPlacesChildGuid(
                               this.props.parentGuid,
                               PlacesUtils.bookmarks.TYPE_FOLDER,
                               this.props.folder);
     if (this.props.guid == null) {
       return null;
     }
-    if (!(await this.CheckDescription(this.props.description))) {
-      return null;
-    }
     if (!(await this.CheckPosition(this.props.before,
                                    this.props.after,
                                    this.props.last_item_pos))) {
       return null;
     }
     return this.props.guid;
   },
 
@@ -681,17 +621,16 @@ BookmarkFolder.prototype = {
    *
    * @return nothing
    */
   async Update() {
     Logger.AssertTrue(this.props.guid, "Invalid guid during Update");
     await this.SetLocation(this.updateProps.location);
     await this.SetPosition(this.updateProps.position);
     await this.SetTitle(this.updateProps.folder);
-    await this.SetDescription(this.updateProps.description);
   },
 };
 
 extend(BookmarkFolder, PlacesItem);
 
 /**
  * Livemark class constructor. Initialzes instance properties.
  */
--- a/toolkit/components/places/BookmarkHTMLUtils.jsm
+++ b/toolkit/components/places/BookmarkHTMLUtils.jsm
@@ -680,35 +680,20 @@ BookmarkImporter.prototype = {
         this._handleSeparator(aElt);
         break;
     }
   },
 
   _closeContainer: function closeContainer(aElt) {
     let frame = this._curFrame;
 
-    // see the comment for the definition of inDescription. Basically, we commit
-    // any text in previousText to the description of the node/folder if there
-    // is any.
+    // Although we no longer support importing descriptions, we still need to
+    // clear any previous text, so that it doesn't get swallowed into other elements.
     if (frame.inDescription) {
-      // NOTE ES5 trim trims more than the previous C++ trim.
-      frame.previousText = frame.previousText.trim(); // important
-      if (frame.previousText) {
-        let item = frame.previousLink ? frame.previousItem : frame.folder;
-        if (!item.hasOwnProperty("annos")) {
-          item.annos = [];
-        }
-        item.annos.push({
-          "name": DESCRIPTION_ANNO,
-          "flags": 0,
-          "expires": 4,
-          "value": frame.previousText
-        });
-        frame.previousText = "";
-      }
+      frame.previousText = "";
       frame.inDescription = false;
     }
 
     if (aElt.namespaceURI != "http://www.w3.org/1999/xhtml") {
       return;
     }
     switch (aElt.localName) {
       case "dl":
--- a/toolkit/components/places/Bookmarks.jsm
+++ b/toolkit/components/places/Bookmarks.jsm
@@ -87,16 +87,24 @@ async function promiseTagsFolderId() {
   );
   return gTagsFolderId = rows[0].getResultByName("id");
 }
 
 const MATCH_ANYWHERE_UNMODIFIED = Ci.mozIPlacesAutoComplete.MATCH_ANYWHERE_UNMODIFIED;
 const BEHAVIOR_BOOKMARK = Ci.mozIPlacesAutoComplete.BEHAVIOR_BOOKMARK;
 const SQLITE_MAX_VARIABLE_NUMBER = 999;
 
+// Annotations which insertTree currently accepts. These should be going away
+// soon, see bug 1460577.
+const ACCEPTED_ANNOTATIONS = [
+  PlacesUtils.LMANNO_FEEDURI,
+  PlacesUtils.LMANNO_SITEURI,
+  "Places/SmartBookmark",
+];
+
 var Bookmarks = Object.freeze({
   /**
    * Item's type constants.
    * These should stay consistent with nsINavBookmarksService.idl
    */
   TYPE_BOOKMARK: 1,
   TYPE_FOLDER: 2,
   TYPE_SEPARATOR: 3,
@@ -414,17 +422,18 @@ var Bookmarks = Object.freeze({
           dateAdded: { defaultValue: time,
                        validIf: b => !b.lastModified ||
                                      b.dateAdded <= b.lastModified },
           lastModified: { defaultValue: time,
                           validIf: b => (!b.dateAdded && b.lastModified >= time) ||
                                         (b.dateAdded && b.lastModified >= b.dateAdded) },
           index: { replaceWith: indexToUse++ },
           source: { replaceWith: source },
-          annos: {},
+          annos: { validIf: b => false,
+                   fixup: b => b.annos = b.annos.filter(anno => ACCEPTED_ANNOTATIONS.includes(anno.name))},
           keyword: { validIf: b => b.type == TYPE_BOOKMARK },
           charset: { validIf: b => b.type == TYPE_BOOKMARK },
           postData: { validIf: b => b.type == TYPE_BOOKMARK },
           tags: { validIf: b => b.type == TYPE_BOOKMARK },
           children: { validIf: b => b.type == TYPE_FOLDER && Array.isArray(b.children) }
         };
         if (fixupOrSkipInvalidEntries) {
           insertInfo.guid.fixup = b => b.guid = PlacesUtils.history.makeGuid();
--- a/toolkit/components/places/PlacesSyncUtils.jsm
+++ b/toolkit/components/places/PlacesSyncUtils.jsm
@@ -373,17 +373,16 @@ const HistorySyncUtils = PlacesSyncUtils
       { cutoff_date: sinceInMicroseconds, max_results: options.limit }
     );
     return rows.map(row => row.getResultByName("url"));
   },
 });
 
 const BookmarkSyncUtils = PlacesSyncUtils.bookmarks = Object.freeze({
   SMART_BOOKMARKS_ANNO: "Places/SmartBookmark",
-  DESCRIPTION_ANNO: "bookmarkProperties/description",
   SYNC_PARENT_ANNO: "sync/parent",
 
   SYNC_ID_META_KEY: "sync/bookmarks/syncId",
   LAST_SYNC_META_KEY: "sync/bookmarks/lastSync",
   WIPE_REMOTE_META_KEY: "sync/bookmarks/wipeRemote",
 
   // Jan 23, 1993 in milliseconds since 1970. Corresponds roughly to the release
   // of the original NCSA Mosiac. We can safely assume that any dates before
@@ -1109,17 +1108,16 @@ const BookmarkSyncUtils = PlacesSyncUtil
    * The following properties are supported:
    *  - kind: Optional.
    *  - guid: Required.
    *  - parentGuid: Optional; reparents the bookmark if specified.
    *  - title: Optional.
    *  - url: Optional.
    *  - tags: Optional; replaces all existing tags.
    *  - keyword: Optional.
-   *  - description: Optional.
    *  - query: Optional.
    *
    * @param info
    *        object representing a bookmark-item, as defined above.
    *
    * @return {Promise} resolved when the update is complete.
    * @resolves to an object representing the updated bookmark.
    * @rejects if it's not possible to update the given bookmark.
@@ -1140,17 +1138,16 @@ const BookmarkSyncUtils = PlacesSyncUtil
    * The following properties are supported:
    *  - kind: Required.
    *  - guid: Required.
    *  - parentGuid: Required.
    *  - url: Required for bookmarks.
    *  - query: A smart bookmark query string, optional.
    *  - tags: An optional array of tag strings.
    *  - keyword: An optional keyword string.
-   *  - description: An optional description string.
    *
    * Sync doesn't set the index, since it appends and reorders children
    * after applying all incoming items.
    *
    * @param info
    *        object representing a synced bookmark.
    *
    * @return {Promise} resolved when the creation is complete.
@@ -1176,18 +1173,16 @@ const BookmarkSyncUtils = PlacesSyncUtil
    *    Omitted for the Places root and parents with empty titles.
    *  - dateAdded (all): Timestamp in milliseconds, when the bookmark was added
    *    or created on a remote device if known.
    *  - title ("bookmark", "folder", "livemark", "query"): The item's title.
    *    Omitted if empty.
    *  - url ("bookmark", "query"): The item's URL.
    *  - tags ("bookmark", "query"): An array containing the item's tags.
    *  - keyword ("bookmark"): The bookmark's keyword, if one exists.
-   *  - description ("bookmark", "folder", "livemark"): The item's description.
-   *    Omitted if one isn't set.
    *  - feed ("livemark"): A `URL` object pointing to the livemark's feed URL.
    *  - site ("livemark"): A `URL` object pointing to the livemark's site URL,
    *    or `null` if one isn't set.
    *  - childRecordIds ("folder"): An array containing the record IDs of the item's
    *    children, used to determine child order.
    *  - folder ("query"): The tag folder name, if this is a tag query.
    *  - query ("query"): The smart bookmark query name, if this is a smart
    *    bookmark.
@@ -1597,24 +1592,16 @@ async function insertBookmarkMetadata(db
     await PlacesUtils.keywords.insert({
       keyword: insertInfo.keyword,
       url: bookmarkItem.url.href,
       source: SOURCE_SYNC,
     });
     newItem.keyword = insertInfo.keyword;
   }
 
-  if (insertInfo.description) {
-    PlacesUtils.annotations.setItemAnnotation(itemId,
-      BookmarkSyncUtils.DESCRIPTION_ANNO, insertInfo.description, 0,
-      PlacesUtils.annotations.EXPIRE_NEVER,
-      SOURCE_SYNC);
-    newItem.description = insertInfo.description;
-  }
-
   return newItem;
 }
 
 // Determines the Sync record kind for an existing bookmark.
 async function getKindForItem(db, item) {
   switch (item.type) {
     case PlacesUtils.bookmarks.TYPE_FOLDER: {
       let isLivemark = await getAnno(db, item.guid,
@@ -1818,29 +1805,16 @@ async function updateBookmarkMetadata(db
         keyword: updateInfo.keyword,
         url: newItem.url.href,
         source: SOURCE_SYNC,
       });
     }
     newItem.keyword = updateInfo.keyword;
   }
 
-  if (updateInfo.hasOwnProperty("description")) {
-    if (updateInfo.description) {
-      PlacesUtils.annotations.setItemAnnotation(itemId,
-        BookmarkSyncUtils.DESCRIPTION_ANNO, updateInfo.description, 0,
-        PlacesUtils.annotations.EXPIRE_NEVER,
-        SOURCE_SYNC);
-    } else {
-      PlacesUtils.annotations.removeItemAnnotation(itemId,
-        BookmarkSyncUtils.DESCRIPTION_ANNO, SOURCE_SYNC);
-    }
-    newItem.description = updateInfo.description;
-  }
-
   if (updateInfo.hasOwnProperty("query")) {
     PlacesUtils.annotations.setItemAnnotation(itemId,
       BookmarkSyncUtils.SMART_BOOKMARKS_ANNO, updateInfo.query, 0,
       PlacesUtils.annotations.EXPIRE_NEVER,
       SOURCE_SYNC);
     newItem.query = updateInfo.query;
   }
 
@@ -1862,20 +1836,16 @@ function validateNewBookmark(name, info)
                                BookmarkSyncUtils.KINDS.LIVEMARK ].includes(b.kind) ||
                              b.title === "" },
       query: { validIf: b => b.kind == BookmarkSyncUtils.KINDS.QUERY },
       folder: { validIf: b => b.kind == BookmarkSyncUtils.KINDS.QUERY },
       tags: { validIf: b => [ BookmarkSyncUtils.KINDS.BOOKMARK,
                               BookmarkSyncUtils.KINDS.QUERY ].includes(b.kind) },
       keyword: { validIf: b => [ BookmarkSyncUtils.KINDS.BOOKMARK,
                                  BookmarkSyncUtils.KINDS.QUERY ].includes(b.kind) },
-      description: { validIf: b => [ BookmarkSyncUtils.KINDS.BOOKMARK,
-                                     BookmarkSyncUtils.KINDS.QUERY,
-                                     BookmarkSyncUtils.KINDS.FOLDER,
-                                     BookmarkSyncUtils.KINDS.LIVEMARK ].includes(b.kind) },
       feed: { validIf: b => b.kind == BookmarkSyncUtils.KINDS.LIVEMARK },
       site: { validIf: b => b.kind == BookmarkSyncUtils.KINDS.LIVEMARK },
       dateAdded: { required: false }
     });
 
   return insertInfo;
 }
 
@@ -1980,19 +1950,18 @@ async function placesBookmarkToSyncBookm
     }
   }
 
   return item;
 }
 
 // Converts a Sync bookmark object to a Places bookmark or livemark object.
 // This function maps record IDs to Places GUIDs, and filters out extra Sync
-// properties like keywords, tags, and descriptions. Returns an object that can
-// be passed to `PlacesUtils.livemarks.addLivemark` or
-// `PlacesUtils.bookmarks.{insert, update}`.
+// properties like keywords, tags. Returns an object that can be passed to
+// `PlacesUtils.livemarks.addLivemark` or `PlacesUtils.bookmarks.{insert, update}`.
 function syncBookmarkToPlacesBookmark(info) {
   let bookmarkInfo = {
     source: SOURCE_SYNC,
   };
 
   for (let prop in info) {
     switch (prop) {
       case "kind":
@@ -2035,17 +2004,17 @@ function syncBookmarkToPlacesBookmark(in
         break;
     }
   }
 
   return bookmarkInfo;
 }
 
 // Creates and returns a Sync bookmark object containing the bookmark's
-// tags, keyword, description.
+// tags, keyword.
 var fetchBookmarkItem = async function(db, bookmarkItem) {
   let item = await placesBookmarkToSyncBookmark(db, bookmarkItem);
 
   if (!item.title) {
     item.title = "";
   }
 
   item.tags = PlacesUtils.tagging.getTagsForURI(
@@ -2053,63 +2022,44 @@ var fetchBookmarkItem = async function(d
 
   let keywordEntry = await PlacesUtils.keywords.fetch({
     url: bookmarkItem.url,
   });
   if (keywordEntry) {
     item.keyword = keywordEntry.keyword;
   }
 
-  let description = await getAnno(db, bookmarkItem.guid,
-                                  BookmarkSyncUtils.DESCRIPTION_ANNO);
-  if (description) {
-    item.description = description;
-  }
-
   return item;
 };
 
-// Creates and returns a Sync bookmark object containing the folder's
-// description and children.
+// Creates and returns a Sync bookmark object containing the folder's children.
 async function fetchFolderItem(db, bookmarkItem) {
   let item = await placesBookmarkToSyncBookmark(db, bookmarkItem);
 
   if (!item.title) {
     item.title = "";
   }
 
-  let description = await getAnno(db, bookmarkItem.guid,
-                                  BookmarkSyncUtils.DESCRIPTION_ANNO);
-  if (description) {
-    item.description = description;
-  }
-
   let childGuids = await fetchChildGuids(db, bookmarkItem.guid);
   item.childRecordIds = childGuids.map(guid =>
     BookmarkSyncUtils.guidToRecordId(guid)
   );
 
   return item;
 }
 
 // Creates and returns a Sync bookmark object containing the livemark's
-// description, children (none), feed URI, and site URI.
+// children (none), feed URI, and site URI.
 async function fetchLivemarkItem(db, bookmarkItem) {
   let item = await placesBookmarkToSyncBookmark(db, bookmarkItem);
 
   if (!item.title) {
     item.title = "";
   }
 
-  let description = await getAnno(db, bookmarkItem.guid,
-                                  BookmarkSyncUtils.DESCRIPTION_ANNO);
-  if (description) {
-    item.description = description;
-  }
-
   let feedAnno = await getAnno(db, bookmarkItem.guid,
                                PlacesUtils.LMANNO_FEEDURI);
   item.feed = new URL(feedAnno);
 
   let siteAnno = await getAnno(db, bookmarkItem.guid,
                                PlacesUtils.LMANNO_SITEURI);
   if (siteAnno) {
     item.site = new URL(siteAnno);
@@ -2118,22 +2068,16 @@ async function fetchLivemarkItem(db, boo
   return item;
 }
 
 // Creates and returns a Sync bookmark object containing the query's tag
 // folder name and smart bookmark query ID.
 async function fetchQueryItem(db, bookmarkItem) {
   let item = await placesBookmarkToSyncBookmark(db, bookmarkItem);
 
-  let description = await getAnno(db, bookmarkItem.guid,
-                                  BookmarkSyncUtils.DESCRIPTION_ANNO);
-  if (description) {
-    item.description = description;
-  }
-
   let params = new URLSearchParams(bookmarkItem.url.pathname);
   let tags = params.getAll("tag");
   if (tags.length == 1) {
     item.folder = tags[0];
   }
 
   let query = await getAnno(db, bookmarkItem.guid,
                             BookmarkSyncUtils.SMART_BOOKMARKS_ANNO);
--- a/toolkit/components/places/PlacesUtils.jsm
+++ b/toolkit/components/places/PlacesUtils.jsm
@@ -279,17 +279,16 @@ const SYNC_BOOKMARK_VALIDATORS = Object.
       if (typeof tag != "string" || !tag ||
           tag.length > Ci.nsITaggingService.MAX_TAG_LENGTH) {
         throw new Error(`Invalid tag: ${tag}`);
       }
     }
     return v;
   },
   keyword: simpleValidateFunc(v => v === null || typeof v == "string"),
-  description: simpleValidateFunc(v => v === null || typeof v == "string"),
   dateAdded: simpleValidateFunc(v => typeof v === "number"
     && v > PlacesSyncUtils.bookmarks.EARLIEST_BOOKMARK_TIMESTAMP),
   feed: v => v === null ? v : BOOKMARK_VALIDATORS.url(v),
   site: v => v === null ? v : BOOKMARK_VALIDATORS.url(v),
   title: BOOKMARK_VALIDATORS.title,
   url: BOOKMARK_VALIDATORS.url,
 });
 
--- a/toolkit/components/places/SyncedBookmarksMirror.jsm
+++ b/toolkit/components/places/SyncedBookmarksMirror.jsm
@@ -107,17 +107,16 @@ XPCOMUtils.defineLazyGetter(this, "Local
     JOIN localItems s ON s.id = b.parent
   )
 `);
 
 // These can be removed once they're exposed in a central location (bug
 // 1375896).
 const DB_URL_LENGTH_MAX = 65536;
 const DB_TITLE_LENGTH_MAX = 4096;
-const DB_DESCRIPTION_LENGTH_MAX = 256;
 
 const SQLITE_MAX_VARIABLE_NUMBER = 999;
 
 // The current mirror database schema version. Bump for migrations, then add
 // migration code to `migrateMirrorSchema`.
 const MIRROR_SCHEMA_VERSION = 2;
 
 // Use a shared jankYielder in these functions
@@ -126,19 +125,19 @@ function yieldingIterator(collection) {
   return Async.yieldingIterator(collection, maybeYield);
 }
 
 /**
  * A mirror maintains a copy of the complete tree as stored on the Sync server.
  * It is persistent.
  *
  * The mirror schema is a hybrid of how Sync and Places represent bookmarks.
- * The `items` table contains item attributes (title, kind, description,
- * URL, etc.), while the `structure` table stores parent-child relationships and
- * position. This is similar to how iOS encodes "value" and "structure" state,
+ * The `items` table contains item attributes (title, kind, URL, etc.), while
+ * the `structure` table stores parent-child relationships and position.
+ * This is similar to how iOS encodes "value" and "structure" state,
  * though we handle these differently when merging. See `BookmarkMerger` for
  * details.
  *
  * There's no guarantee that the remote state is consistent. We might be missing
  * parents or children, or a bookmark and its parent might disagree about where
  * it belongs. This means we need a strategy to handle missing parents and
  * children.
  *
@@ -666,31 +665,29 @@ class SyncedBookmarksMirror {
     }
 
     await this.maybeStoreRemoteURL(url);
 
     let serverModified = determineServerModified(record);
     let dateAdded = determineDateAdded(record);
     let title = validateTitle(record.title);
     let keyword = validateKeyword(record.keyword);
-    let description = validateDescription(record.description);
 
     await this.db.executeCached(`
       REPLACE INTO items(guid, serverModified, needsMerge, kind,
                          dateAdded, title, keyword,
-                         urlId, description)
+                         urlId)
       VALUES(:guid, :serverModified, :needsMerge, :kind,
              :dateAdded, NULLIF(:title, ""), :keyword,
              (SELECT id FROM urls
               WHERE hash = hash(:url) AND
-                    url = :url),
-             :description)`,
+                    url = :url))`,
       { guid, serverModified, needsMerge,
         kind: SyncedBookmarksMirror.KIND.BOOKMARK, dateAdded, title, keyword,
-        url: url.href, description });
+        url: url.href });
 
     let tags = record.tags;
     if (tags && Array.isArray(tags)) {
       for (let rawTag of tags) {
         let tag = validateTag(rawTag);
         if (!tag) {
           continue;
         }
@@ -740,59 +737,55 @@ class SyncedBookmarksMirror {
       }
     }
 
     await this.maybeStoreRemoteURL(url);
 
     let serverModified = determineServerModified(record);
     let dateAdded = determineDateAdded(record);
     let title = validateTitle(record.title);
-    let description = validateDescription(record.description);
     let smartBookmarkName = typeof record.queryId == "string" ?
                             record.queryId : null;
 
     await this.db.executeCached(`
       REPLACE INTO items(guid, serverModified, needsMerge, kind,
-                         dateAdded, title, urlId, description,
-                         smartBookmarkName)
+                         dateAdded, title, urlId, smartBookmarkName)
       VALUES(:guid, :serverModified, :needsMerge, :kind,
              :dateAdded, NULLIF(:title, ""),
              (SELECT id FROM urls
               WHERE hash = hash(:url) AND
                     url = :url),
-             :description, :smartBookmarkName)`,
+             :smartBookmarkName)`,
       { guid, serverModified, needsMerge,
         kind: SyncedBookmarksMirror.KIND.QUERY, dateAdded, title,
-        url: url.href, description, smartBookmarkName });
+        url: url.href, smartBookmarkName });
   }
 
   async storeRemoteFolder(record, { needsMerge }) {
     let guid = validateGuid(record.id);
     if (!guid) {
       MirrorLog.warn("Ignoring folder with invalid ID", record.id);
       return;
     }
     if (guid == PlacesUtils.bookmarks.rootGuid) {
       // The Places root shouldn't be synced at all.
       MirrorLog.warn("Ignoring Places root record", record);
     }
 
     let serverModified = determineServerModified(record);
     let dateAdded = determineDateAdded(record);
     let title = validateTitle(record.title);
-    let description = validateDescription(record.description);
 
     await this.db.executeCached(`
       REPLACE INTO items(guid, serverModified, needsMerge, kind,
-                         dateAdded, title, description)
+                         dateAdded, title)
       VALUES(:guid, :serverModified, :needsMerge, :kind,
-             :dateAdded, NULLIF(:title, ""),
-             :description)`,
+             :dateAdded, NULLIF(:title, ""))`,
       { guid, serverModified, needsMerge, kind: SyncedBookmarksMirror.KIND.FOLDER,
-        dateAdded, title, description });
+        dateAdded, title });
 
     let children = record.children;
     if (children && Array.isArray(children)) {
       for (let position = 0; position < children.length; ++position) {
         await maybeYield();
         let childRecordId = children[position];
         let childGuid = validateGuid(childRecordId);
         if (!childGuid) {
@@ -840,27 +833,26 @@ class SyncedBookmarksMirror {
       MirrorLog.warn("Ignoring livemark ${guid} with invalid feed URL ${url}",
                      { guid, url: record.feedUri });
       return;
     }
 
     let serverModified = determineServerModified(record);
     let dateAdded = determineDateAdded(record);
     let title = validateTitle(record.title);
-    let description = validateDescription(record.description);
     let siteURL = validateURL(record.siteUri);
 
     await this.db.executeCached(`
       REPLACE INTO items(guid, serverModified, needsMerge, kind, dateAdded,
-                         title, description, feedURL, siteURL)
+                         title, feedURL, siteURL)
       VALUES(:guid, :serverModified, :needsMerge, :kind, :dateAdded,
-             NULLIF(:title, ""), :description, :feedURL, :siteURL)`,
+             NULLIF(:title, ""), :feedURL, :siteURL)`,
       { guid, serverModified, needsMerge,
         kind: SyncedBookmarksMirror.KIND.LIVEMARK,
-        dateAdded, title, description, feedURL: feedURL.href,
+        dateAdded, title, feedURL: feedURL.href,
         siteURL: siteURL ? siteURL.href : null });
   }
 
   async storeRemoteSeparator(record, { needsMerge }) {
     let guid = validateGuid(record.id);
     if (!guid) {
       MirrorLog.warn("Ignoring separator with invalid ID", record.id);
       return;
@@ -1567,36 +1559,31 @@ class SyncedBookmarksMirror {
       { valueState: BookmarkMergeState.TYPE.REMOTE });
 
     // Stage remaining locally changed items for upload.
     await this.db.execute(`
       WITH RECURSIVE
       ${LocalItemsSQLFragment}
       INSERT INTO itemsToUpload(id, guid, syncChangeCounter, parentGuid,
                                 parentTitle, dateAdded, type, title, isQuery,
-                                url, tags, description,
+                                url, tags,
                                 smartBookmarkName, keyword, feedURL, siteURL,
                                 position, tagFolderName)
       SELECT s.id, s.guid, s.syncChangeCounter, s.parentGuid, s.parentTitle,
              s.dateAdded / 1000, s.type, s.title,
              IFNULL(SUBSTR(h.url, 1, 6) = 'place:', 0) AS isQuery,
              h.url,
              (SELECT GROUP_CONCAT(t.title, ',') FROM moz_bookmarks e
               JOIN moz_bookmarks t ON t.id = e.parent
               JOIN moz_bookmarks r ON r.id = t.parent
               WHERE s.type = :bookmarkType AND
                     r.guid = :tagsGuid AND
                     e.fk = h.id),
              (SELECT a.content FROM moz_items_annos a
               JOIN moz_anno_attributes n ON n.id = a.anno_attribute_id
-              WHERE s.type IN (:bookmarkType, :folderType) AND
-                    a.item_id = s.id AND
-                    n.name = :descriptionAnno),
-             (SELECT a.content FROM moz_items_annos a
-              JOIN moz_anno_attributes n ON n.id = a.anno_attribute_id
               WHERE a.item_id = s.id AND
                     n.name = :smartBookmarkAnno),
              (SELECT keyword FROM moz_keywords WHERE place_id = h.id),
              (SELECT a.content FROM moz_items_annos a
               JOIN moz_anno_attributes n ON n.id = a.anno_attribute_id
               WHERE s.type = :folderType AND
                     a.item_id = s.id AND
                     n.name = :feedURLAnno),
@@ -1610,17 +1597,16 @@ class SyncedBookmarksMirror {
               WHERE substr(h.url, 1, 6) = 'place:')
       FROM localItems s
       LEFT JOIN moz_places h ON h.id = s.placeId
       LEFT JOIN idsToWeaklyUpload w ON w.id = s.id
       WHERE s.syncChangeCounter >= 1 OR
             w.id NOT NULL`,
       { bookmarkType: PlacesUtils.bookmarks.TYPE_BOOKMARK,
         tagsGuid: PlacesUtils.bookmarks.tagsGuid,
-        descriptionAnno: PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO,
         smartBookmarkAnno: PlacesSyncUtils.bookmarks.SMART_BOOKMARKS_ANNO,
         folderType: PlacesUtils.bookmarks.TYPE_FOLDER,
         feedURLAnno: PlacesUtils.LMANNO_FEEDURI,
         siteURLAnno: PlacesUtils.LMANNO_SITEURI });
 
     // Record the child GUIDs of locally changed folders, which we use to
     // populate the `children` array in the record.
     await this.db.execute(`
@@ -1661,17 +1647,17 @@ class SyncedBookmarksMirror {
         childRecordIdsByLocalParentId.set(localParentId, [childRecordId]);
       }
     }
 
     let itemRows = await this.db.execute(`
       SELECT id, syncChangeCounter, guid, isDeleted, type, isQuery,
              smartBookmarkName, tagFolderName,
              keyword, tags, url, IFNULL(title, "") AS title,
-             description, feedURL, siteURL, position, parentGuid,
+             feedURL, siteURL, position, parentGuid,
              IFNULL(parentTitle, "") AS parentTitle, dateAdded
       FROM itemsToUpload`);
 
     for await (let row of yieldingIterator(itemRows)) {
       let syncChangeCounter = row.getResultByName("syncChangeCounter");
 
       let guid = row.getResultByName("guid");
       let recordId = PlacesSyncUtils.bookmarks.guidToRecordId(guid);
@@ -1712,39 +1698,31 @@ class SyncedBookmarksMirror {
               // Omit `dateAdded` from the record if it's not set locally.
               dateAdded: row.getResultByName("dateAdded") || undefined,
               bmkUri: row.getResultByName("url"),
               title: row.getResultByName("title"),
               queryId: row.getResultByName("smartBookmarkName"),
               // folderName should never be an empty string or null
               folderName: row.getResultByName("tagFolderName") || undefined,
             };
-            let description = row.getResultByName("description");
-            if (description) {
-              queryCleartext.description = description;
-            }
             changeRecords[recordId] = new BookmarkChangeRecord(
               syncChangeCounter, queryCleartext);
             continue;
           }
 
           let bookmarkCleartext = {
             id: recordId,
             type: "bookmark",
             parentid: parentRecordId,
             hasDupe: true,
             parentName: row.getResultByName("parentTitle"),
             dateAdded: row.getResultByName("dateAdded") || undefined,
             bmkUri: row.getResultByName("url"),
             title: row.getResultByName("title"),
           };
-          let description = row.getResultByName("description");
-          if (description) {
-            bookmarkCleartext.description = description;
-          }
           let keyword = row.getResultByName("keyword");
           if (keyword) {
             bookmarkCleartext.keyword = keyword;
           }
           let tags = row.getResultByName("tags");
           if (tags) {
             bookmarkCleartext.tags = tags.split(",");
           }
@@ -1763,20 +1741,16 @@ class SyncedBookmarksMirror {
               type: "livemark",
               parentid: parentRecordId,
               hasDupe: true,
               parentName: row.getResultByName("parentTitle"),
               dateAdded: row.getResultByName("dateAdded") || undefined,
               title: row.getResultByName("title"),
               feedUri: feedURLHref,
             };
-            let description = row.getResultByName("description");
-            if (description) {
-              livemarkCleartext.description = description;
-            }
             let siteURLHref = row.getResultByName("siteURL");
             if (siteURLHref) {
               livemarkCleartext.siteUri = siteURLHref;
             }
             changeRecords[recordId] = new BookmarkChangeRecord(
               syncChangeCounter, livemarkCleartext);
             continue;
           }
@@ -1785,20 +1759,16 @@ class SyncedBookmarksMirror {
             id: recordId,
             type: "folder",
             parentid: parentRecordId,
             hasDupe: true,
             parentName: row.getResultByName("parentTitle"),
             dateAdded: row.getResultByName("dateAdded") || undefined,
             title: row.getResultByName("title"),
           };
-          let description = row.getResultByName("description");
-          if (description) {
-            folderCleartext.description = description;
-          }
           let localId = row.getResultByName("id");
           let childRecordIds = childRecordIdsByLocalParentId.get(localId);
           folderCleartext.children = childRecordIds || [];
           changeRecords[recordId] = new BookmarkChangeRecord(
             syncChangeCounter, folderCleartext);
           continue;
         }
 
@@ -1956,18 +1926,18 @@ async function migrateMirrorSchema(db, c
 async function initializeMirrorDatabase(db) {
   // Key-value metadata table. Stores the server collection last modified time
   // and sync ID.
   await db.execute(`CREATE TABLE mirror.meta(
     key TEXT PRIMARY KEY,
     value NOT NULL
   )`);
 
-  // Note: loadInSidebar is not used as of Firefox 63, but remains to avoid
-  // rebuilding the database if the user happens to downgrade.
+  // Note: description and loadInSidebar are not used as of Firefox 63, but
+  // remain to avoid rebuilding the database if the user happens to downgrade.
   await db.execute(`CREATE TABLE mirror.items(
     id INTEGER PRIMARY KEY,
     guid TEXT UNIQUE NOT NULL,
     /* The server modified time, in milliseconds. */
     serverModified INTEGER NOT NULL DEFAULT 0,
     needsMerge BOOLEAN NOT NULL DEFAULT 0,
     isDeleted BOOLEAN NOT NULL DEFAULT 0,
     kind INTEGER NOT NULL DEFAULT -1,
@@ -2072,20 +2042,16 @@ async function createMirrorRoots(db) {
  * @param {Sqlite.OpenedConnection} db
  *        The mirror database connection.
  */
 async function initializeTempMirrorEntities(db) {
   // Columns in `items` that correspond to annos stored in `moz_items_annos`.
   // We use this table to build SQL fragments for the `insertNewLocalItems` and
   // `updateExistingLocalItems` triggers below.
   const syncedAnnoTriggers = [{
-    annoName: PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO,
-    columnName: "newDescription",
-    type: PlacesUtils.annotations.TYPE_STRING,
-  }, {
     annoName: PlacesSyncUtils.bookmarks.SMART_BOOKMARKS_ANNO,
     columnName: "newSmartBookmarkName",
     type: PlacesUtils.annotations.TYPE_STRING,
   }, {
     annoName: PlacesUtils.LMANNO_FEEDURI,
     columnName: "newFeedURL",
     type: PlacesUtils.annotations.TYPE_STRING,
   }, {
@@ -2182,17 +2148,16 @@ async function initializeTempMirrorEntit
   // on this view to update Places. Note that we can't just `REPLACE INTO
   // moz_bookmarks`, because `REPLACE` doesn't fire the `AFTER DELETE` triggers
   // that Places uses to maintain schema coherency.
   await db.execute(`
     CREATE TEMP VIEW itemsToMerge(localId, remoteId, hasRemoteValue, newLevel,
                                   oldGuid, newGuid, newType,
                                   newDateAddedMicroseconds, newTitle,
                                   oldPlaceId, newPlaceId, newKeyword,
-                                  newDescription,
                                   newSmartBookmarkName, newFeedURL,
                                   newSiteURL) AS
     SELECT b.id, v.id, r.valueState = ${BookmarkMergeState.TYPE.REMOTE},
            r.level, r.localGuid, r.mergedGuid,
            (CASE WHEN v.kind IN (${[
                         SyncedBookmarksMirror.KIND.BOOKMARK,
                         SyncedBookmarksMirror.KIND.QUERY,
                       ].join(",")}) THEN ${PlacesUtils.bookmarks.TYPE_BOOKMARK}
@@ -2200,17 +2165,17 @@ async function initializeTempMirrorEntit
                         SyncedBookmarksMirror.KIND.FOLDER,
                         SyncedBookmarksMirror.KIND.LIVEMARK,
                       ].join(",")}) THEN ${PlacesUtils.bookmarks.TYPE_FOLDER}
                  ELSE ${PlacesUtils.bookmarks.TYPE_SEPARATOR} END),
            /* Take the older creation date. "b.dateAdded" is in microseconds;
               "v.dateAdded" is in milliseconds. */
            (CASE WHEN b.dateAdded / 1000 < v.dateAdded THEN b.dateAdded
                  ELSE v.dateAdded * 1000 END),
-           v.title, h.id, u.newPlaceId, v.keyword, v.description,
+           v.title, h.id, u.newPlaceId, v.keyword,
            v.smartBookmarkName, v.feedURL, v.siteURL
     FROM items v
     JOIN mergeStates r ON r.mergedGuid = v.guid
     LEFT JOIN moz_bookmarks b ON b.guid = r.localGuid
     LEFT JOIN moz_places h ON h.id = b.fk
     LEFT JOIN (
       SELECT h.id AS newPlaceId, u.id AS urlId
       FROM urls u
@@ -2678,17 +2643,16 @@ async function initializeTempMirrorEntit
     parentGuid TEXT,
     parentTitle TEXT,
     dateAdded INTEGER, /* In milliseconds. */
     type INTEGER,
     title TEXT,
     isQuery BOOLEAN NOT NULL DEFAULT 0,
     url TEXT,
     tags TEXT,
-    description TEXT,
     smartBookmarkName TEXT,
     tagFolderName TEXT,
     keyword TEXT,
     feedURL TEXT,
     siteURL TEXT,
     position INTEGER
   )`);
 
@@ -2743,23 +2707,16 @@ function validateURL(rawURL) {
   }
   let url = null;
   try {
     url = new URL(rawURL);
   } catch (ex) {}
   return url;
 }
 
-function validateDescription(rawDescription) {
-  if (typeof rawDescription != "string" || !rawDescription) {
-    return null;
-  }
-  return rawDescription.slice(0, DB_DESCRIPTION_LENGTH_MAX);
-}
-
 function validateKeyword(rawKeyword) {
   if (typeof rawKeyword != "string") {
     return null;
   }
   let keyword = rawKeyword.trim();
   // Drop empty keywords.
   return keyword ? keyword.toLowerCase() : null;
 }
--- a/toolkit/components/places/tests/sync/head_sync.js
+++ b/toolkit/components/places/tests/sync/head_sync.js
@@ -130,17 +130,16 @@ async function promiseManyDatesAdded(gui
 }
 
 async function fetchLocalTree(rootGuid) {
   function bookmarkNodeToInfo(node) {
     let { guid, index, title, typeCode: type } = node;
     let itemInfo = { guid, index, title, type };
     if (node.annos) {
       let syncableAnnos = node.annos.filter(anno => [
-        PlacesSyncUtils.bookmarks.DESCRIPTION_ANNO,
         PlacesSyncUtils.bookmarks.SMART_BOOKMARKS_ANNO,
         PlacesUtils.LMANNO_FEEDURI,
         PlacesUtils.LMANNO_SITEURI,
       ].includes(anno.name));
       if (syncableAnnos.length) {
         itemInfo.annos = syncableAnnos;
       }
     }
--- a/toolkit/components/places/tests/sync/test_sync_utils.js
+++ b/toolkit/components/places/tests/sync/test_sync_utils.js
@@ -1,16 +1,15 @@
 ChromeUtils.import("resource://gre/modules/ObjectUtils.jsm");
 ChromeUtils.import("resource://gre/modules/PlacesSyncUtils.jsm");
 ChromeUtils.import("resource://testing-common/httpd.js");
 ChromeUtils.defineModuleGetter(this, "Preferences",
                                "resource://gre/modules/Preferences.jsm");
 Cu.importGlobalProperties(["URLSearchParams"]);
 
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
 const SYNC_PARENT_ANNO = "sync/parent";
 
 var makeGuid = PlacesUtils.history.makeGuid;
 
 function makeLivemarkServer() {
   let server = new HttpServer();
   server.registerPrefixHandler("/feed/", do_get_file("./livemark.xml"));
   server.start(-1);
@@ -965,55 +964,16 @@ add_task(async function test_conflicting
     ].sort(), "Should bump change counter for bookmarks with updated keyword");
     await setChangesSynced(changes);
   }
 
   await PlacesUtils.bookmarks.eraseEverything();
   await PlacesSyncUtils.bookmarks.reset();
 });
 
-add_task(async function test_update_annos() {
-  let guids = await populateTree(PlacesUtils.bookmarks.menuGuid, {
-    kind: "folder",
-    title: "folder",
-  }, {
-    kind: "bookmark",
-    title: "bmk",
-    url: "https://example.com",
-  });
-
-  info("Add folder description");
-  {
-    let updatedItem = await PlacesSyncUtils.bookmarks.update({
-      recordId: guids.folder,
-      description: "Folder description",
-    });
-    equal(updatedItem.description, "Folder description",
-      "Should return new description");
-    let id = await recordIdToId(updatedItem.recordId);
-    equal(PlacesUtils.annotations.getItemAnnotation(id, DESCRIPTION_ANNO),
-      "Folder description", "Should set description anno");
-  }
-
-  info("Clear folder description");
-  {
-    let updatedItem = await PlacesSyncUtils.bookmarks.update({
-      recordId: guids.folder,
-      description: null,
-    });
-    ok(!updatedItem.description, "Should not return cleared description");
-    let id = await recordIdToId(updatedItem.recordId);
-    ok(!PlacesUtils.annotations.itemHasAnnotation(id, DESCRIPTION_ANNO),
-      "Should remove description anno");
-  }
-
-  await PlacesUtils.bookmarks.eraseEverything();
-  await PlacesSyncUtils.bookmarks.reset();
-});
-
 add_task(async function test_update_move_root() {
   info("Move root to same parent");
   {
     // This should be a no-op.
     let sameRoot = await PlacesSyncUtils.bookmarks.update({
       recordId: "menu",
       parentRecordId: "places",
     });
@@ -1432,52 +1392,16 @@ add_task(async function test_insert_keyw
     equal(entry.url.href, "https://mozilla.org/",
       "Should reassign keyword to new item");
   }
 
   await PlacesUtils.bookmarks.eraseEverything();
   await PlacesSyncUtils.bookmarks.reset();
 });
 
-add_task(async function test_insert_annos() {
-  info("Bookmark with description");
-  let descBmk = await PlacesSyncUtils.bookmarks.insert({
-    kind: "bookmark",
-    url: "https://example.com",
-    recordId: makeGuid(),
-    parentRecordId: "menu",
-    description: "Bookmark description",
-  });
-  {
-    equal(descBmk.description, "Bookmark description",
-      "Should return new bookmark description");
-    let id = await recordIdToId(descBmk.recordId);
-    equal(PlacesUtils.annotations.getItemAnnotation(id, DESCRIPTION_ANNO),
-      "Bookmark description", "Should set new bookmark description");
-  }
-
-  info("Folder with description");
-  let descFolder = await PlacesSyncUtils.bookmarks.insert({
-    kind: "folder",
-    recordId: makeGuid(),
-    parentRecordId: "menu",
-    description: "Folder description",
-  });
-  {
-    equal(descFolder.description, "Folder description",
-      "Should return new folder description");
-    let id = await recordIdToId(descFolder.recordId);
-    equal(PlacesUtils.annotations.getItemAnnotation(id, DESCRIPTION_ANNO),
-      "Folder description", "Should set new folder description");
-  }
-
-  await PlacesUtils.bookmarks.eraseEverything();
-  await PlacesSyncUtils.bookmarks.reset();
-});
-
 add_task(async function test_insert_tag_query() {
   info("Use the public tagging API to ensure we added the tag correctly");
   await PlacesUtils.bookmarks.insert({
     parentGuid: PlacesUtils.bookmarks.menuGuid,
     type: PlacesUtils.bookmarks.TYPE_BOOKMARK,
     url: "https://mozilla.org",
     title: "Mozilla",
   });
@@ -1754,24 +1678,22 @@ add_task(async function test_unsynced_or
   await PlacesSyncUtils.bookmarks.reset();
 });
 
 add_task(async function test_fetch() {
   let folder = await PlacesSyncUtils.bookmarks.insert({
     recordId: makeGuid(),
     parentRecordId: "menu",
     kind: "folder",
-    description: "Folder description",
   });
   let bmk = await PlacesSyncUtils.bookmarks.insert({
     recordId: makeGuid(),
     parentRecordId: "menu",
     kind: "bookmark",
     url: "https://example.com",
-    description: "Bookmark description",
     tags: ["taggy"],
   });
   let folderBmk = await PlacesSyncUtils.bookmarks.insert({
     recordId: makeGuid(),
     parentRecordId: folder.recordId,
     kind: "bookmark",
     url: "https://example.org",
     keyword: "kw",
@@ -1793,42 +1715,40 @@ add_task(async function test_fetch() {
     kind: "query",
     recordId: makeGuid(),
     parentRecordId: "toolbar",
     url: "place:folder=TOOLBAR",
     query: "BookmarksToolbar",
     title: "Bookmarks toolbar query",
   });
 
-  info("Fetch empty folder with description");
+  info("Fetch empty folder");
   {
     let item = await PlacesSyncUtils.bookmarks.fetch(folder.recordId);
     deepEqual(item, {
       recordId: folder.recordId,
       kind: "folder",
       parentRecordId: "menu",
-      description: "Folder description",
       childRecordIds: [folderBmk.recordId, folderSep.recordId],
       parentTitle: "menu",
       dateAdded: item.dateAdded,
       title: "",
-    }, "Should include description, children, title, and parent title in folder");
+    }, "Should include children, title, and parent title in folder");
   }
 
-  info("Fetch bookmark with description and tags");
+  info("Fetch bookmark with tags");
   {
     let item = await PlacesSyncUtils.bookmarks.fetch(bmk.recordId);
     deepEqual(Object.keys(item).sort(), ["recordId", "kind", "parentRecordId",
-      "url", "tags", "description", "parentTitle", "title", "dateAdded"].sort(),
+      "url", "tags", "parentTitle", "title", "dateAdded"].sort(),
       "Should include bookmark-specific properties");
     equal(item.recordId, bmk.recordId, "Sync ID should match");
     equal(item.url.href, "https://example.com/", "Should return URL");
     equal(item.parentRecordId, "menu", "Should return parent sync ID");
     deepEqual(item.tags, ["taggy"], "Should return tags");
-    equal(item.description, "Bookmark description", "Should return bookmark description");
     equal(item.parentTitle, "menu", "Should return parent title");
     strictEqual(item.title, "", "Should return empty title");
   }
 
   info("Fetch bookmark with keyword; without parent title");
   {
     let item = await PlacesSyncUtils.bookmarks.fetch(folderBmk.recordId);
     deepEqual(Object.keys(item).sort(), ["recordId", "kind", "parentRecordId",
@@ -1875,25 +1795,22 @@ add_task(async function test_fetch_livem
   try {
     info("Create livemark");
     let livemark = await PlacesUtils.livemarks.addLivemark({
       parentGuid: PlacesUtils.bookmarks.menuGuid,
       feedURI: uri(site + "/feed/1"),
       siteURI: uri(site),
       index: PlacesUtils.bookmarks.DEFAULT_INDEX,
     });
-    PlacesUtils.annotations.setItemAnnotation(livemark.id, DESCRIPTION_ANNO,
-      "Livemark description", 0, PlacesUtils.annotations.EXPIRE_NEVER);
 
     info("Fetch livemark");
     let item = await PlacesSyncUtils.bookmarks.fetch(livemark.guid);
     deepEqual(Object.keys(item).sort(), ["recordId", "kind", "parentRecordId",
-      "description", "feed", "site", "parentTitle", "title", "dateAdded"].sort(),
+      "feed", "site", "parentTitle", "title", "dateAdded"].sort(),
       "Should include livemark-specific properties");
-    equal(item.description, "Livemark description", "Should return description");
     equal(item.feed.href, site + "/feed/1", "Should return feed URL");
     equal(item.site.href, site + "/", "Should return site URL");
     strictEqual(item.title, "", "Should include livemark title even if empty");
   } finally {
     await stopServer();
   }
 
   await PlacesUtils.bookmarks.eraseEverything();
--- a/toolkit/components/places/tests/unit/test_384370.js
+++ b/toolkit/components/places/tests/unit/test_384370.js
@@ -1,10 +1,8 @@
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
-
 var tagData = [
   { uri: uri("http://slint.us"), tags: ["indie", "kentucky", "music"] },
   { uri: uri("http://en.wikipedia.org/wiki/Diplodocus"), tags: ["dinosaur", "dj", "rad word"] }
 ];
 
 var bookmarkData = [
   { uri: uri("http://slint.us"), title: "indie, kentucky, music" },
   { uri: uri("http://en.wikipedia.org/wiki/Diplodocus"), title: "dinosaur, dj, rad word" }
@@ -88,38 +86,31 @@ async function testMenuBookmarks() {
   let folderNode = root.getChild(2);
   Assert.equal(folderNode.type, folderNode.RESULT_TYPE_FOLDER);
   Assert.equal(folderNode.title, "test");
   let folder = await PlacesUtils.bookmarks.fetch(folderNode.bookmarkGuid);
   Assert.equal(folder.dateAdded.getTime(), 1177541020000);
 
   Assert.equal(PlacesUtils.asQuery(folderNode).hasChildren, true);
 
-  Assert.equal("folder test comment",
-              PlacesUtils.annotations.getItemAnnotation(folderNode.itemId,
-                                                        DESCRIPTION_ANNO));
-
   // open test folder, and test the children
   folderNode.containerOpen = true;
   Assert.equal(folderNode.childCount, 1);
 
   let bookmarkNode = folderNode.getChild(0);
   Assert.equal("http://test/post", bookmarkNode.uri);
   Assert.equal("test post keyword", bookmarkNode.title);
   Assert.equal(bookmarkNode.dateAdded, 1177375336000000);
 
   let entry = await PlacesUtils.keywords.fetch({ url: bookmarkNode.uri });
   Assert.equal("test", entry.keyword);
   Assert.equal("hidden1%3Dbar&text1%3D%25s", entry.postData);
 
   Assert.equal("ISO-8859-1",
                (await PlacesUtils.getCharsetForURI(NetUtil.newURI(bookmarkNode.uri))));
-  Assert.equal("item description",
-              PlacesUtils.annotations.getItemAnnotation(bookmarkNode.itemId,
-                                                        DESCRIPTION_ANNO));
 
   folderNode.containerOpen = false;
   root.containerOpen = false;
 }
 
 async function testToolbarBookmarks() {
   let root = PlacesUtils.getFolderContents(PlacesUtils.bookmarks.toolbarGuid).root;
 
--- a/toolkit/components/places/tests/unit/test_PlacesUtils_annotations.js
+++ b/toolkit/components/places/tests/unit/test_PlacesUtils_annotations.js
@@ -1,20 +1,20 @@
 /* Any copyright is dedicated to the Public Domain.
    http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
 const TEST_ANNOTATIONS = [{
-  name: "fake/annotation1",
+  name: PlacesUtils.LMANNO_FEEDURI,
   value: "test",
   flags: 0,
   expires: Ci.nsIAnnotationService.EXPIRE_MONTHS,
 }, {
-  name: "fake/annotation2",
+  name: PlacesUtils.LMANNO_SITEURI,
   value: "test2",
   flags: 0,
   expires: Ci.nsIAnnotationService.EXPIRE_DAYS,
 }];
 
 function checkAnnotations(annotations, expectedAnnotations) {
   Assert.equal(annotations.length, expectedAnnotations.length,
     "Should have the expected number of annotations");
--- a/toolkit/components/places/tests/unit/test_bookmarks_html.js
+++ b/toolkit/components/places/tests/unit/test_bookmarks_html.js
@@ -1,16 +1,14 @@
 /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
 /* vim:set ts=2 sw=2 sts=2 et: */
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
-
 // An object representing the contents of bookmarks.preplaces.html.
 var test_bookmarks = {
   menu: [
     { title: "Mozilla Firefox",
       children: [
         { title: "Help and Tutorials",
           url: "http://en-us.www.mozilla.com/en-US/firefox/help/",
           icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
@@ -28,22 +26,20 @@ var test_bookmarks = {
           icon: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAHWSURBVHjaYvz//z8DJQAggJiQOe/fv2fv7Oz8rays/N+VkfG/iYnJfyD/1+rVq7ffu3dPFpsBAAHEAHIBCJ85c8bN2Nj4vwsDw/8zQLwKiO8CcRoQu0DxqlWrdsHUwzBAAIGJmTNnPgYa9j8UqhFElwPxf2MIDeIrKSn9FwSJoRkAEEAM0DD4DzMAyPi/G+QKY4hh5WAXGf8PDQ0FGwJ22d27CjADAAIIrLmjo+MXA9R2kAHvGBA2wwx6B8W7od6CeQcggKCmCEL8bgwxYCbUIGTDVkHDBia+CuotgACCueD3TDQN75D4xmAvCoK9ARMHBzAw0AECiBHkAlC0Mdy7x9ABNA3obAZXIAa6iKEcGlMVQHwWyjYuL2d4v2cPg8vZswx7gHyAAAK7AOif7SAbOqCmn4Ha3AHFsIDtgPq/vLz8P4MSkJ2W9h8ggBjevXvHDo4FQUQg/kdypqCg4H8lUIACnQ/SOBMYI8bAsAJFPcj1AAEEjwVQqLpAbXmH5BJjqI0gi9DTAAgDBBCcAVLkgmQ7yKCZxpCQxqUZhAECCJ4XgMl493ug21ZD+aDAXH0WLM4A9MZPXJkJIIAwTAR5pQMalaCABQUULttBGCCAGCnNzgABBgAMJ5THwGvJLAAAAABJRU5ErkJggg=="
         }
       ]
     },
     {
       type: Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR
     },
     { title: "test",
-      description: "folder test comment",
       dateAdded: 1177541020000000,
       lastModified: 1177541050000000,
       children: [
         { title: "test post keyword",
-          description: "item description",
           dateAdded: 1177375336000000,
           lastModified: 1177375423000000,
           keyword: "test",
           postData: "hidden1%3Dbar&text1%3D%25s",
           charset: "ISO-8859-1",
           url: "http://test/post"
         }
       ]
@@ -287,21 +283,16 @@ function checkItem(aExpected, aNode) {
     for (let prop in aExpected) {
       switch (prop) {
         case "type":
           Assert.equal(aNode.type, aExpected.type);
           break;
         case "title":
           Assert.equal(aNode.title, aExpected.title);
           break;
-        case "description":
-          Assert.equal(PlacesUtils.annotations
-                                  .getItemAnnotation(id, DESCRIPTION_ANNO),
-                       aExpected.description);
-          break;
         case "dateAdded":
           Assert.equal(PlacesUtils.toPRTime(bookmark.dateAdded),
                        aExpected.dateAdded);
           break;
         case "lastModified":
           Assert.equal(PlacesUtils.toPRTime(bookmark.lastModified),
                        aExpected.lastModified);
           break;
--- a/toolkit/components/places/tests/unit/test_bookmarks_html_corrupt.js
+++ b/toolkit/components/places/tests/unit/test_bookmarks_html_corrupt.js
@@ -1,15 +1,13 @@
 /*
  * This test ensures that importing/exporting to HTML does not stop
  * if a malformed uri is found.
  */
 
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
-
 const TEST_FAVICON_PAGE_URL = "http://en-US.www.mozilla.com/en-US/firefox/central/";
 const TEST_FAVICON_DATA_SIZE = 580;
 
 add_task(async function test_corrupt_file() {
   // avoid creating the places smart folder during tests
   Services.prefs.setIntPref("browser.places.smartBookmarksVersion", -1);
 
   // Import bookmarks from the corrupt file.
@@ -59,19 +57,17 @@ var database_check = async function() {
   Assert.equal(folderNode.type, folderNode.RESULT_TYPE_FOLDER);
   Assert.equal(folderNode.title, "test");
 
   let bookmark = await PlacesUtils.bookmarks.fetch({
     guid: folderNode.bookmarkGuid
   });
   Assert.equal(PlacesUtils.toPRTime(bookmark.dateAdded), 1177541020000000);
   Assert.equal(PlacesUtils.toPRTime(bookmark.lastModified), 1177541050000000);
-  Assert.equal("folder test comment",
-               PlacesUtils.annotations.getItemAnnotation(folderNode.itemId,
-                                                         DESCRIPTION_ANNO));
+
   // open test folder, and test the children
   PlacesUtils.asQuery(folderNode);
   Assert.equal(folderNode.hasChildren, true);
   folderNode.containerOpen = true;
   Assert.equal(folderNode.childCount, 1);
 
   let bookmarkNode = folderNode.getChild(0);
   Assert.equal("http://test/post", bookmarkNode.uri);
@@ -82,20 +78,16 @@ var database_check = async function() {
   Assert.equal("hidden1%3Dbar&text1%3D%25s", entry.postData);
 
   Assert.equal(bookmarkNode.dateAdded, 1177375336000000);
   Assert.equal(bookmarkNode.lastModified, 1177375423000000);
 
   Assert.equal((await PlacesUtils.getCharsetForURI(NetUtil.newURI(bookmarkNode.uri))),
                "ISO-8859-1");
 
-  Assert.equal("item description",
-               PlacesUtils.annotations.getItemAnnotation(bookmarkNode.itemId,
-                                                         DESCRIPTION_ANNO));
-
   // clean up
   folderNode.containerOpen = false;
   root.containerOpen = false;
 
   // BOOKMARKS TOOLBAR
   root = PlacesUtils.getFolderContents(PlacesUtils.bookmarks.toolbarGuid).root;
   Assert.equal(root.childCount, 3);
 
--- a/toolkit/components/places/tests/unit/test_bookmarks_json.js
+++ b/toolkit/components/places/tests/unit/test_bookmarks_json.js
@@ -1,16 +1,14 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 ChromeUtils.import("resource://gre/modules/BookmarkJSONUtils.jsm");
 
-const DESCRIPTION_ANNO = "bookmarkProperties/description";
-
 // An object representing the contents of bookmarks.json.
 var test_bookmarks = {
   menu: [
     { guid: "OCyeUO5uu9FF",
       title: "Mozilla Firefox",
       children: [
         { guid: "OCyeUO5uu9FG",
           title: "Help and Tutorials",
@@ -40,23 +38,21 @@ var test_bookmarks = {
     },
     {
       guid: "OCyeUO5uu9FK",
       type: Ci.nsINavHistoryResultNode.RESULT_TYPE_SEPARATOR
     },
     {
       guid: "OCyeUO5uu9FL",
       title: "test",
-      description: "folder test comment",
       dateAdded: 1177541020000000,
       lastModified: 1177541050000000,
       children: [
         { guid: "OCyeUO5uu9GX",
           title: "test post keyword",
-          description: "item description",
           dateAdded: 1177375336000000,
           lastModified: 1177375423000000,
           keyword: "test",
           postData: "hidden1%3Dbar&text1%3D%25s",
           charset: "ISO-8859-1"
         }
       ]
     }
@@ -180,20 +176,16 @@ async function checkItem(aExpected, aNod
   for (let prop in aExpected) {
     switch (prop) {
       case "type":
         Assert.equal(aNode.type, aExpected.type);
         break;
       case "title":
         Assert.equal(aNode.title, aExpected.title);
         break;
-      case "description":
-        Assert.equal(PlacesUtils.annotations.getItemAnnotation(
-                     id, DESCRIPTION_ANNO), aExpected.description);
-        break;
       case "dateAdded":
         Assert.equal(PlacesUtils.toPRTime(bookmark.dateAdded),
                      aExpected.dateAdded);
         break;
       case "lastModified":
         Assert.equal(PlacesUtils.toPRTime(bookmark.lastModified),
                      aExpected.lastModified);
         break;