summaryrefslogtreecommitdiffstats
path: root/toolkit/components/places/tests/browser/browser_upgrade.js
diff options
context:
space:
mode:
Diffstat (limited to 'toolkit/components/places/tests/browser/browser_upgrade.js')
-rw-r--r--toolkit/components/places/tests/browser/browser_upgrade.js106
1 files changed, 106 insertions, 0 deletions
diff --git a/toolkit/components/places/tests/browser/browser_upgrade.js b/toolkit/components/places/tests/browser/browser_upgrade.js
new file mode 100644
index 0000000000..a5077a345b
--- /dev/null
+++ b/toolkit/components/places/tests/browser/browser_upgrade.js
@@ -0,0 +1,106 @@
+/* Any copyright is dedicated to the Public Domain.
+ http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/* eslint-disable @microsoft/sdl/no-insecure-url */
+
+"use strict";
+
+// This test checks that when a upgrade is happening through HTTPS-Only,
+// only a history entry for the https url of the site is added visibly for
+// the user, while the http version gets added as a hidden entry.
+
+async function assertIsPlaceHidden(url, expectHidden) {
+ const hidden = await PlacesTestUtils.getDatabaseValue(
+ "moz_places",
+ "hidden",
+ { url }
+ );
+ Assert.ok(hidden !== undefined, `We should have saved a visit to ${url}`);
+ Assert.equal(
+ hidden,
+ expectHidden ? 1 : 0,
+ `Check if the visit to ${url} is hidden`
+ );
+}
+
+async function assertVisitFromAndType(
+ url,
+ expectedFromVisitURL,
+ expectedVisitType
+) {
+ const db = await PlacesUtils.promiseDBConnection();
+ const rows = await db.execute(
+ `SELECT v1.visit_type FROM moz_historyvisits v1
+ JOIN moz_places p1 ON p1.id = v1.place_id
+ WHERE p1.url = :url
+ AND from_visit IN
+ (SELECT v2.id FROM moz_historyvisits v2
+ JOIN moz_places p2 ON p2.id = v2.place_id
+ WHERE p2.url = :expectedFromVisitURL)
+ `,
+ { url, expectedFromVisitURL }
+ );
+ Assert.equal(
+ rows.length,
+ 1,
+ `There should be a single visit to ${url} with "from_visit" set to the visit id of ${expectedFromVisitURL}`
+ );
+ Assert.equal(
+ rows[0].getResultByName("visit_type"),
+ expectedVisitType,
+ `The visit to ${url} should have a visit type of ${expectedVisitType}`
+ );
+}
+
+function waitForVisitNotifications(urls) {
+ return Promise.all(
+ urls.map(url =>
+ PlacesTestUtils.waitForNotification("page-visited", events =>
+ events.some(e => e.url === url)
+ )
+ )
+ );
+}
+
+add_task(async function test_upgrade() {
+ await SpecialPowers.pushPrefEnv({
+ set: [["dom.security.https_only_mode", true]],
+ });
+
+ await PlacesUtils.history.clear();
+
+ registerCleanupFunction(async function () {
+ await PlacesUtils.history.clear();
+ });
+
+ const visitPromise = waitForVisitNotifications([
+ "http://example.com/",
+ "https://example.com/",
+ ]);
+
+ info("Opening http://example.com/");
+ await BrowserTestUtils.withNewTab(
+ {
+ gBrowser,
+ url: "http://example.com/",
+ waitForLoad: true,
+ },
+ async browser => {
+ Assert.equal(
+ browser.currentURI.scheme,
+ "https",
+ "We should have been upgraded"
+ );
+ info("Waiting for page visits to reach places database");
+ await visitPromise;
+ info("Checking places database");
+ await assertIsPlaceHidden("http://example.com/", true);
+ await assertIsPlaceHidden("https://example.com/", false);
+ await assertVisitFromAndType(
+ "https://example.com/",
+ "http://example.com/",
+ Ci.nsINavHistoryService.TRANSITION_REDIRECT_PERMANENT
+ );
+ }
+ );
+});