summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/browser_markPageAsFollowedLink.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/browser_markPageAsFollowedLink.js')
-rw-r--r--browser/components/places/tests/browser/browser_markPageAsFollowedLink.js75
1 files changed, 75 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/browser_markPageAsFollowedLink.js b/browser/components/places/tests/browser/browser_markPageAsFollowedLink.js
new file mode 100644
index 0000000000..75ed89ddea
--- /dev/null
+++ b/browser/components/places/tests/browser/browser_markPageAsFollowedLink.js
@@ -0,0 +1,75 @@
+/**
+ * Tests that visits across frames are correctly represented in the database.
+ */
+
+const BASE_URL =
+ "http://mochi.test:8888/browser/browser/components/places/tests/browser";
+const PAGE_URL = BASE_URL + "/framedPage.html";
+const LEFT_URL = BASE_URL + "/frameLeft.html";
+const RIGHT_URL = BASE_URL + "/frameRight.html";
+
+add_task(async function test() {
+ // We must wait for both frames to be loaded and the visits to be registered.
+ let deferredLeftFrameVisit = PromiseUtils.defer();
+ let deferredRightFrameVisit = PromiseUtils.defer();
+
+ Services.obs.addObserver(function observe(subject) {
+ (async function () {
+ let url = subject.QueryInterface(Ci.nsIURI).spec;
+ if (url == LEFT_URL) {
+ is(
+ await getTransitionForUrl(url),
+ null,
+ "Embed visits should not get a database entry."
+ );
+ deferredLeftFrameVisit.resolve();
+ } else if (url == RIGHT_URL) {
+ is(
+ await getTransitionForUrl(url),
+ PlacesUtils.history.TRANSITION_FRAMED_LINK,
+ "User activated visits should get a FRAMED_LINK transition."
+ );
+ Services.obs.removeObserver(observe, "uri-visit-saved");
+ deferredRightFrameVisit.resolve();
+ }
+ })();
+ }, "uri-visit-saved");
+
+ // Open a tab and wait for all the subframes to load.
+ let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser, PAGE_URL);
+
+ // Wait for the left frame visit to be registered.
+ info("Waiting left frame visit");
+ await deferredLeftFrameVisit.promise;
+
+ // Click on the link in the left frame to cause a page load in the
+ // right frame.
+ info("Clicking link");
+ await SpecialPowers.spawn(tab.linkedBrowser, [], async function () {
+ content.frames[0].document.getElementById("clickme").click();
+ });
+
+ // Wait for the right frame visit to be registered.
+ info("Waiting right frame visit");
+ await deferredRightFrameVisit.promise;
+
+ BrowserTestUtils.removeTab(tab);
+});
+
+function getTransitionForUrl(url) {
+ return PlacesUtils.withConnectionWrapper(
+ "browser_markPageAsFollowedLink",
+ async db => {
+ let rows = await db.execute(
+ `
+ SELECT visit_type
+ FROM moz_historyvisits
+ JOIN moz_places h ON place_id = h.id
+ WHERE url_hash = hash(:url) AND url = :url
+ `,
+ { url }
+ );
+ return rows.length ? rows[0].getResultByName("visit_type") : null;
+ }
+ );
+}