summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/unit/head_bookmarks.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/unit/head_bookmarks.js')
-rw-r--r--browser/components/places/tests/unit/head_bookmarks.js89
1 files changed, 89 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 0000000000..8aabfb3832
--- /dev/null
+++ b/browser/components/places/tests/unit/head_bookmarks.js
@@ -0,0 +1,89 @@
+/* -*- 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/. */
+
+// Import common head.
+/* import-globals-from ../../../../../toolkit/components/places/tests/head_common.js */
+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.
+
+ChromeUtils.defineESModuleGetters(this, {
+ PlacesUIUtils: "resource:///modules/PlacesUIUtils.sys.mjs",
+});
+
+// Needed by some test that relies on having an app registered.
+const { updateAppInfo } = ChromeUtils.importESModule(
+ "resource://testing-common/AppInfo.sys.mjs"
+);
+updateAppInfo({
+ name: "PlacesTest",
+ ID: "{230de50e-4cd1-11dc-8314-0800200c9a66}",
+ version: "1",
+ platformVersion: "",
+});
+
+// Default bookmarks constants.
+const DEFAULT_BOOKMARKS_ON_TOOLBAR = 1;
+const DEFAULT_BOOKMARKS_ON_MENU = 1;
+
+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 = async function () {
+ let dbPath = PathUtils.join(PathUtils.profileDir, "places.sqlite");
+ await IOUtils.remove(dbPath);
+
+ // Create a corrupt database.
+ let src = PathUtils.join(do_get_cwd().path, "corruptDB.sqlite");
+ await IOUtils.copy(src, dbPath);
+
+ // Check there's a DB now.
+ Assert.ok(await IOUtils.exists(dbPath), "should have a DB now");
+};
+
+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 {Function} promiseFn
+ * A function to generate a promise, which resolves to the expected
+ * asynchronous value.
+ * @param {msg} timeoutMsg
+ * The reason to reject the returned promise with.
+ * @param {number} [tryCount]
+ * Maximum times to try before rejecting the returned promise with
+ * timeoutMsg, defaults to NUMBER_OF_TRIES.
+ * @returns {Promise} to the asynchronous value being polled.
+ * @throws if the asynchronous value is not available after tryCount attempts.
+ */
+var waitForResolvedPromise = async function (
+ promiseFn,
+ timeoutMsg,
+ tryCount = NUMBER_OF_TRIES
+) {
+ let tries = 0;
+ do {
+ try {
+ let value = await promiseFn();
+ return value;
+ } catch (ex) {}
+ await new Promise(resolve => do_timeout(SINGLE_TRY_TIMEOUT, resolve));
+ } while (++tries <= tryCount);
+ throw new Error(timeoutMsg);
+};