diff options
Diffstat (limited to 'browser/components/places/tests/unit/head_bookmarks.js')
-rw-r--r-- | browser/components/places/tests/unit/head_bookmarks.js | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/browser/components/places/tests/unit/head_bookmarks.js b/browser/components/places/tests/unit/head_bookmarks.js new file mode 100644 index 000000000..460295f96 --- /dev/null +++ b/browser/components/places/tests/unit/head_bookmarks.js @@ -0,0 +1,133 @@ +/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */ +/* 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/. */ + +var Ci = Components.interfaces; +var Cc = Components.classes; +var Cr = Components.results; +var Cu = Components.utils; + +Cu.import("resource://gre/modules/Services.jsm"); +Cu.import("resource://gre/modules/LoadContextInfo.jsm"); + +// Import common head. +var commonFile = do_get_file("../../../../../toolkit/components/places/tests/head_common.js", false); +if (commonFile) { + let uri = Services.io.newFileURI(commonFile); + Services.scriptloader.loadSubScript(uri.spec, this); +} + +// Put any other stuff relative to this test folder below. + +XPCOMUtils.defineLazyGetter(this, "PlacesUIUtils", function() { + Cu.import("resource:///modules/PlacesUIUtils.jsm"); + return PlacesUIUtils; +}); + +const ORGANIZER_FOLDER_ANNO = "PlacesOrganizer/OrganizerFolder"; +const ORGANIZER_QUERY_ANNO = "PlacesOrganizer/OrganizerQuery"; + +// Needed by some test that relies on having an app registered. +Cu.import("resource://testing-common/AppInfo.jsm", this); +updateAppInfo({ + name: "PlacesTest", + ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}", + version: "1", + platformVersion: "", +}); + +// Smart bookmarks constants. +const SMART_BOOKMARKS_VERSION = 8; +const SMART_BOOKMARKS_ON_TOOLBAR = 1; +const SMART_BOOKMARKS_ON_MENU = 2; // Takes into account the additional separator. + +// Default bookmarks constants. +const DEFAULT_BOOKMARKS_ON_TOOLBAR = 1; +const DEFAULT_BOOKMARKS_ON_MENU = 1; + +const SMART_BOOKMARKS_ANNO = "Places/SmartBookmark"; + +function checkItemHasAnnotation(guid, name) { + return PlacesUtils.promiseItemId(guid).then(id => { + let hasAnnotation = PlacesUtils.annotations.itemHasAnnotation(id, name); + Assert.ok(hasAnnotation, `Expected annotation ${name}`); + }); +} + +var createCorruptDB = Task.async(function* () { + let dbPath = OS.Path.join(OS.Constants.Path.profileDir, "places.sqlite"); + yield OS.File.remove(dbPath); + + // Create a corrupt database. + let dir = yield OS.File.getCurrentDirectory(); + let src = OS.Path.join(dir, "corruptDB.sqlite"); + yield OS.File.copy(src, dbPath); + + // Check there's a DB now. + Assert.ok((yield OS.File.exists(dbPath)), "should have a DB now"); +}); + +/** + * Rebuilds smart bookmarks listening to console output to report any message or + * exception generated. + * + * @return {Promise} + * Resolved when done. + */ +function rebuildSmartBookmarks() { + let consoleListener = { + observe(aMsg) { + if (aMsg.message.startsWith("[JavaScript Warning:")) { + // TODO (Bug 1300416): Ignore spurious strict warnings. + return; + } + do_throw("Got console message: " + aMsg.message); + }, + QueryInterface: XPCOMUtils.generateQI([ Ci.nsIConsoleListener ]), + }; + Services.console.reset(); + Services.console.registerListener(consoleListener); + do_register_cleanup(() => { + try { + Services.console.unregisterListener(consoleListener); + } catch (ex) { /* will likely fail */ } + }); + Cc["@mozilla.org/browser/browserglue;1"] + .getService(Ci.nsIObserver) + .observe(null, "browser-glue-test", "smart-bookmarks-init"); + return promiseTopicObserved("test-smart-bookmarks-done").then(() => { + Services.console.unregisterListener(consoleListener); + }); +} + +const SINGLE_TRY_TIMEOUT = 100; +const NUMBER_OF_TRIES = 30; + +/** + * Similar to waitForConditionPromise, but poll for an asynchronous value + * every SINGLE_TRY_TIMEOUT ms, for no more than tryCount times. + * + * @param promiseFn + * A function to generate a promise, which resolves to the expected + * asynchronous value. + * @param timeoutMsg + * The reason to reject the returned promise with. + * @param [optional] tryCount + * Maximum times to try before rejecting the returned promise with + * timeoutMsg, defaults to NUMBER_OF_TRIES. + * @return {Promise} + * @resolves to the asynchronous value being polled. + * @rejects if the asynchronous value is not available after tryCount attempts. + */ +var waitForResolvedPromise = Task.async(function* (promiseFn, timeoutMsg, tryCount=NUMBER_OF_TRIES) { + let tries = 0; + do { + try { + let value = yield promiseFn(); + return value; + } catch (ex) {} + yield new Promise(resolve => do_timeout(SINGLE_TRY_TIMEOUT, resolve)); + } while (++tries <= tryCount); + throw new Error(timeoutMsg); +}); |