browser/components/places/tests/unit/test_browserGlue_smartBookmarks.js

Wed, 31 Dec 2014 06:09:35 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Wed, 31 Dec 2014 06:09:35 +0100
changeset 0
6474c204b198
permissions
-rw-r--r--

Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.

     1 /* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
     2 /* vim:set ts=2 sw=2 sts=2 et: */
     3 /* This Source Code Form is subject to the terms of the Mozilla Public
     4  * License, v. 2.0. If a copy of the MPL was not distributed with this
     5  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
     7 /**
     8  * Tests that nsBrowserGlue is correctly interpreting the preferences settable
     9  * by the user or by other components.
    10  */
    12 const PREF_SMART_BOOKMARKS_VERSION = "browser.places.smartBookmarksVersion";
    13 const PREF_AUTO_EXPORT_HTML = "browser.bookmarks.autoExportHTML";
    14 const PREF_IMPORT_BOOKMARKS_HTML = "browser.places.importBookmarksHTML";
    15 const PREF_RESTORE_DEFAULT_BOOKMARKS = "browser.bookmarks.restore_default_bookmarks";
    17 const SMART_BOOKMARKS_ANNO = "Places/SmartBookmark";
    19 /**
    20  * Rebuilds smart bookmarks listening to console output to report any message or
    21  * exception generated when calling ensurePlacesDefaultQueriesInitialized().
    22  */
    23 function rebuildSmartBookmarks() {
    24   let consoleListener = {
    25     observe: function(aMsg) {
    26       print("Got console message: " + aMsg.message);
    27     },
    29     QueryInterface: XPCOMUtils.generateQI([
    30       Ci.nsIConsoleListener
    31     ]),
    32   };
    33   Services.console.reset();
    34   Services.console.registerListener(consoleListener);
    35   Cc["@mozilla.org/browser/browserglue;1"].getService(Ci.nsIBrowserGlue)
    36                                           .ensurePlacesDefaultQueriesInitialized();
    37   Services.console.unregisterListener(consoleListener);
    38 }
    41 let tests = [];
    42 //------------------------------------------------------------------------------
    44 tests.push({
    45   description: "All smart bookmarks are created if smart bookmarks version is 0.",
    46   exec: function() {
    47     // Sanity check: we should have default bookmark.
    48     do_check_neq(PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0), -1);
    49     do_check_neq(PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0), -1);
    51     // Set preferences.
    52     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 0);
    54     rebuildSmartBookmarks();
    56     // Count items.
    57     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
    58                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
    59     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
    60                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
    62     // Check version has been updated.
    63     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
    64                 SMART_BOOKMARKS_VERSION);
    66     next_test();
    67   }
    68 });
    70 //------------------------------------------------------------------------------
    72 tests.push({
    73   description: "An existing smart bookmark is replaced when version changes.",
    74   exec: function() {
    75     // Sanity check: we have a smart bookmark on the toolbar.
    76     let itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
    77     do_check_neq(itemId, -1);
    78     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
    79     // Change its title.
    80     PlacesUtils.bookmarks.setItemTitle(itemId, "new title");
    81     do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), "new title");
    83     // Sanity check items.
    84     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
    85                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
    86     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
    87                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
    89     // Set preferences.
    90     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 1);
    92     rebuildSmartBookmarks();
    94     // Count items.
    95     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
    96                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
    97     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
    98                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   100     // Check smart bookmark has been replaced, itemId has changed.
   101     itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0);
   102     do_check_neq(itemId, -1);
   103     do_check_neq(PlacesUtils.bookmarks.getItemTitle(itemId), "new title");
   104     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
   106     // Check version has been updated.
   107     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
   108                 SMART_BOOKMARKS_VERSION);
   110     next_test();
   111   }
   112 });
   114 //------------------------------------------------------------------------------
   116 tests.push({
   117   description: "bookmarks position is retained when version changes.",
   118   exec: function() {
   119     // Sanity check items.
   120     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   121                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
   122     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   123                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   125     let itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0);
   126     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
   127     let firstItemTitle = PlacesUtils.bookmarks.getItemTitle(itemId);
   129     itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 1);
   130     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
   131     let secondItemTitle = PlacesUtils.bookmarks.getItemTitle(itemId);
   133     // Set preferences.
   134     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 1);
   136     rebuildSmartBookmarks();
   138     // Count items.
   139     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   140                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
   141     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   142                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   144     // Check smart bookmarks are still in correct position.
   145     itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0);
   146     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
   147     do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), firstItemTitle);
   149     itemId = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 1);
   150     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId, SMART_BOOKMARKS_ANNO));
   151     do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId), secondItemTitle);
   153     // Check version has been updated.
   154     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
   155                 SMART_BOOKMARKS_VERSION);
   157     next_test();
   158   }
   159 });
   161 //------------------------------------------------------------------------------
   163 tests.push({
   164   description: "moved bookmarks position is retained when version changes.",
   165   exec: function() {
   166     // Sanity check items.
   167     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   168                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
   169     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   170                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   172     let itemId1 = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0);
   173     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId1, SMART_BOOKMARKS_ANNO));
   174     let firstItemTitle = PlacesUtils.bookmarks.getItemTitle(itemId1);
   176     let itemId2 = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 1);
   177     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId2, SMART_BOOKMARKS_ANNO));
   178     let secondItemTitle = PlacesUtils.bookmarks.getItemTitle(itemId2);
   180     // Move the first smart bookmark to the end of the menu.
   181     PlacesUtils.bookmarks.moveItem(itemId1, PlacesUtils.bookmarksMenuFolderId,
   182                                    PlacesUtils.bookmarks.DEFAULT_INDEX);
   184     do_check_eq(itemId1, PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId,
   185                                                    PlacesUtils.bookmarks.DEFAULT_INDEX));
   187     // Set preferences.
   188     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 1);
   190     rebuildSmartBookmarks();
   192     // Count items.
   193     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   194                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
   195     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   196                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   198     // Check smart bookmarks are still in correct position.
   199     itemId2 = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId, 0);
   200     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId2, SMART_BOOKMARKS_ANNO));
   201     do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId2), secondItemTitle);
   203     itemId1 = PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.bookmarksMenuFolderId,
   204                                                    PlacesUtils.bookmarks.DEFAULT_INDEX);
   205     do_check_true(PlacesUtils.annotations.itemHasAnnotation(itemId1, SMART_BOOKMARKS_ANNO));
   206     do_check_eq(PlacesUtils.bookmarks.getItemTitle(itemId1), firstItemTitle);
   208     // Move back the smart bookmark to the original position.
   209     PlacesUtils.bookmarks.moveItem(itemId1, PlacesUtils.bookmarksMenuFolderId, 1);
   211     // Check version has been updated.
   212     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
   213                 SMART_BOOKMARKS_VERSION);
   215     next_test();
   216   }
   217 });
   219 //------------------------------------------------------------------------------
   221 tests.push({
   222   description: "An explicitly removed smart bookmark should not be recreated.",
   223   exec: function() {   
   224     // Remove toolbar's smart bookmarks
   225     PlacesUtils.bookmarks.removeItem(PlacesUtils.bookmarks.getIdForItemAt(PlacesUtils.toolbarFolderId, 0));
   227     // Sanity check items.
   228     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   229                 DEFAULT_BOOKMARKS_ON_TOOLBAR);
   230     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   231                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   233     // Set preferences.
   234     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 1);
   236     rebuildSmartBookmarks();
   238     // Count items.
   239     // We should not have recreated the smart bookmark on toolbar.
   240     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   241                 DEFAULT_BOOKMARKS_ON_TOOLBAR);
   242     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   243                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   245     // Check version has been updated.
   246     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
   247                 SMART_BOOKMARKS_VERSION);
   249     next_test();
   250   }
   251 });
   253 //------------------------------------------------------------------------------
   255 tests.push({
   256   description: "Even if a smart bookmark has been removed recreate it if version is 0.",
   257   exec: function() {
   258     // Sanity check items.
   259     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   260                 DEFAULT_BOOKMARKS_ON_TOOLBAR);
   261     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   262                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   264     // Set preferences.
   265     Services.prefs.setIntPref(PREF_SMART_BOOKMARKS_VERSION, 0);
   267     rebuildSmartBookmarks();
   269     // Count items.
   270     // We should not have recreated the smart bookmark on toolbar.
   271     do_check_eq(countFolderChildren(PlacesUtils.toolbarFolderId),
   272                 SMART_BOOKMARKS_ON_TOOLBAR + DEFAULT_BOOKMARKS_ON_TOOLBAR);
   273     do_check_eq(countFolderChildren(PlacesUtils.bookmarksMenuFolderId),
   274                 SMART_BOOKMARKS_ON_MENU + DEFAULT_BOOKMARKS_ON_MENU);
   276     // Check version has been updated.
   277     do_check_eq(Services.prefs.getIntPref(PREF_SMART_BOOKMARKS_VERSION),
   278                 SMART_BOOKMARKS_VERSION);
   280     next_test();
   281   }
   282 });
   283 //------------------------------------------------------------------------------
   285 function countFolderChildren(aFolderItemId) {
   286   let rootNode = PlacesUtils.getFolderContents(aFolderItemId).root;
   287   let cc = rootNode.childCount;
   288   // Dump contents.
   289   for (let i = 0; i < cc ; i++) {
   290     let node = rootNode.getChild(i);
   291     let title = PlacesUtils.nodeIsSeparator(node) ? "---" : node.title;
   292     print("Found child(" + i + "): " + title);
   293   }
   294   rootNode.containerOpen = false;
   295   return cc;
   296 }
   298 function next_test() {
   299   if (tests.length) {
   300     // Execute next test.
   301     let test = tests.shift();
   302     print("\nTEST: " + test.description);
   303     test.exec();
   304   }
   305   else {
   306     // Clean up database from all bookmarks.
   307     remove_all_bookmarks();
   308     do_test_finished();
   309   }
   310 }
   312 function run_test() {
   313   do_test_pending();
   315   remove_bookmarks_html();
   316   remove_all_JSON_backups();
   318   // Initialize browserGlue, but remove it's listener to places-init-complete.
   319   let bg = Cc["@mozilla.org/browser/browserglue;1"].getService(Ci.nsIObserver);
   320   // Initialize Places.
   321   PlacesUtils.history;
   322   // Observes Places initialisation complete.
   323   Services.obs.addObserver(function waitPlaceInitComplete() {
   324     Services.obs.removeObserver(waitPlaceInitComplete, "places-browser-init-complete");
   326     // Ensure preferences status.
   327     do_check_false(Services.prefs.getBoolPref(PREF_AUTO_EXPORT_HTML));
   328     do_check_false(Services.prefs.getBoolPref(PREF_RESTORE_DEFAULT_BOOKMARKS));
   329     try {
   330       do_check_false(Services.prefs.getBoolPref(PREF_IMPORT_BOOKMARKS_HTML));
   331       do_throw("importBookmarksHTML pref should not exist");
   332     }
   333     catch(ex) {}
   335     waitForImportAndSmartBookmarks(next_test);
   336   }, "places-browser-init-complete", false);
   338   // Usually places init would async notify to glue, but we want to avoid
   339   // randomness here, thus we fire the notification synchronously.
   340   bg.observe(null, "places-init-complete", null);
   341 }
   343 function waitForImportAndSmartBookmarks(aCallback) {
   344   Services.obs.addObserver(function waitImport() {
   345     Services.obs.removeObserver(waitImport, "bookmarks-restore-success");
   346     // Delay to test eventual smart bookmarks creation.
   347     do_execute_soon(function () {
   348       promiseAsyncUpdates().then(aCallback);
   349     });
   350   }, "bookmarks-restore-success", false);
   351 }

mercurial