summaryrefslogtreecommitdiffstats
path: root/browser/components/places/tests/browser/interactions/browser_interactions_view_time.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/places/tests/browser/interactions/browser_interactions_view_time.js')
-rw-r--r--browser/components/places/tests/browser/interactions/browser_interactions_view_time.js398
1 files changed, 398 insertions, 0 deletions
diff --git a/browser/components/places/tests/browser/interactions/browser_interactions_view_time.js b/browser/components/places/tests/browser/interactions/browser_interactions_view_time.js
new file mode 100644
index 0000000000..3bb76288eb
--- /dev/null
+++ b/browser/components/places/tests/browser/interactions/browser_interactions_view_time.js
@@ -0,0 +1,398 @@
+/* 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/. */
+
+/**
+ * Tests page view time recording for interactions.
+ */
+
+const TEST_URL = "https://example.com/";
+const TEST_URL2 = "https://example.com/browser";
+const TEST_URL3 = "https://example.com/browser/browser";
+const TEST_URL4 = "https://example.com/browser/browser/components";
+
+add_task(async function test_interactions_simple_load_and_navigate_away() {
+ await BrowserTestUtils.withNewTab(TEST_URL, async browser => {
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ BrowserTestUtils.loadURIString(browser, TEST_URL2);
+ await BrowserTestUtils.browserLoaded(browser, false, TEST_URL2);
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+
+ BrowserTestUtils.loadURIString(browser, "about:blank");
+ await BrowserTestUtils.browserLoaded(browser, false, "about:blank");
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ {
+ url: TEST_URL2,
+ totalViewTime: 20000,
+ },
+ ]);
+ });
+});
+
+add_task(async function test_interactions_simple_load_and_change_to_non_http() {
+ await Interactions.reset();
+ await BrowserTestUtils.withNewTab(TEST_URL, async browser => {
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ BrowserTestUtils.loadURIString(browser, "about:support");
+ await BrowserTestUtils.browserLoaded(browser, false, "about:support");
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ });
+});
+
+add_task(async function test_interactions_close_tab() {
+ await Interactions.reset();
+ await BrowserTestUtils.withNewTab(TEST_URL, async browser => {
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+ });
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 20000,
+ },
+ ]);
+});
+
+add_task(async function test_interactions_background_tab() {
+ await Interactions.reset();
+ let tab1 = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ url: TEST_URL,
+ });
+
+ let tab2 = BrowserTestUtils.addTab(gBrowser, TEST_URL2);
+ await BrowserTestUtils.browserLoaded(tab2.linkedBrowser, false, TEST_URL2);
+
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ BrowserTestUtils.removeTab(tab2);
+
+ // This is checking a non-action, so let the event queue clear to try and
+ // detect any unexpected database writes. We wait for a few ticks to
+ // make it more likely. however if this fails it may show up as an
+ // intermittent.
+ await TestUtils.waitForTick();
+ await TestUtils.waitForTick();
+ await TestUtils.waitForTick();
+
+ await assertDatabaseValues([]);
+
+ BrowserTestUtils.removeTab(tab1);
+
+ // Only the interaction in the visible tab should have been recorded.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+});
+
+add_task(async function test_interactions_switch_tabs() {
+ await Interactions.reset();
+ let tab1 = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ url: TEST_URL,
+ });
+
+ let tab2 = BrowserTestUtils.addTab(gBrowser, TEST_URL2);
+ await BrowserTestUtils.browserLoaded(tab2.linkedBrowser, false, TEST_URL2);
+
+ info("Switch to second tab");
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+ gBrowser.selectedTab = tab2;
+
+ // Only the interaction of the first tab should be recorded so far.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ let tab1ViewTime = await getDatabaseValue(TEST_URL, "totalViewTime");
+
+ info("Switch back to first tab");
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+ gBrowser.selectedTab = tab1;
+
+ // The interaction of the second tab should now be recorded.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ exactTotalViewTime: tab1ViewTime,
+ },
+ {
+ url: TEST_URL2,
+ totalViewTime: 20000,
+ },
+ ]);
+
+ info("Switch to second tab again");
+ Interactions._pageViewStartTime = Cu.now() - 30000;
+ gBrowser.selectedTab = tab2;
+
+ // The interaction of the second tab should now be recorded.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: tab1ViewTime + 30000,
+ },
+ {
+ url: TEST_URL2,
+ totalViewTime: 20000,
+ },
+ ]);
+
+ BrowserTestUtils.removeTab(tab1);
+ BrowserTestUtils.removeTab(tab2);
+});
+
+add_task(async function test_interactions_switch_windows() {
+ await Interactions.reset();
+
+ // Open a tab in the first window.
+ let tabInOriginalWindow = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ url: TEST_URL,
+ });
+
+ // and then load the second window.
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ let otherWin = await BrowserTestUtils.openNewBrowserWindow();
+
+ BrowserTestUtils.loadURIString(otherWin.gBrowser.selectedBrowser, TEST_URL2);
+ await BrowserTestUtils.browserLoaded(
+ otherWin.gBrowser.selectedBrowser,
+ false,
+ TEST_URL2
+ );
+ await SimpleTest.promiseFocus(otherWin);
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ let originalWindowViewTime = await getDatabaseValue(
+ TEST_URL,
+ "totalViewTime"
+ );
+
+ info("Switch back to original window");
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+ await SimpleTest.promiseFocus(window);
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ exactTotalViewTime: originalWindowViewTime,
+ },
+ {
+ url: TEST_URL2,
+ totalViewTime: 20000,
+ },
+ ]);
+ let newWindowViewTime = await getDatabaseValue(TEST_URL2, "totalViewTime");
+
+ info("Switch back to new window");
+ Interactions._pageViewStartTime = Cu.now() - 30000;
+ await SimpleTest.promiseFocus(otherWin);
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: originalWindowViewTime + 30000,
+ },
+ {
+ url: TEST_URL2,
+ exactTotalViewTime: newWindowViewTime,
+ },
+ ]);
+
+ BrowserTestUtils.removeTab(tabInOriginalWindow);
+ await BrowserTestUtils.closeWindow(otherWin);
+});
+
+add_task(async function test_interactions_loading_in_unfocused_windows() {
+ await Interactions.reset();
+
+ let otherWin = await BrowserTestUtils.openNewBrowserWindow();
+
+ BrowserTestUtils.loadURIString(otherWin.gBrowser.selectedBrowser, TEST_URL);
+ await BrowserTestUtils.browserLoaded(
+ otherWin.gBrowser.selectedBrowser,
+ false,
+ TEST_URL
+ );
+
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ BrowserTestUtils.loadURIString(otherWin.gBrowser.selectedBrowser, TEST_URL2);
+ await BrowserTestUtils.browserLoaded(
+ otherWin.gBrowser.selectedBrowser,
+ false,
+ TEST_URL2
+ );
+
+ // Only the interaction of the first tab should be recorded so far.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ let newWindowViewTime = await getDatabaseValue(TEST_URL, "totalViewTime");
+
+ // Open a tab in the background window, and then navigate somewhere else,
+ // this should not record an intereaction.
+ let tabInOriginalWindow = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ url: TEST_URL3,
+ });
+
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+
+ BrowserTestUtils.loadURIString(tabInOriginalWindow.linkedBrowser, TEST_URL4);
+ await BrowserTestUtils.browserLoaded(
+ tabInOriginalWindow.linkedBrowser,
+ false,
+ TEST_URL4
+ );
+
+ // Only the interaction of the first tab should be recorded so far.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ exactTotalViewTime: newWindowViewTime,
+ },
+ ]);
+
+ BrowserTestUtils.removeTab(tabInOriginalWindow);
+ await BrowserTestUtils.closeWindow(otherWin);
+});
+
+add_task(async function test_interactions_private_browsing() {
+ await Interactions.reset();
+
+ // Open a tab in the first window.
+ let tabInOriginalWindow = await BrowserTestUtils.openNewForegroundTab({
+ gBrowser,
+ url: TEST_URL,
+ });
+
+ // and then load the second window.
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ let privateWin = await BrowserTestUtils.openNewBrowserWindow({
+ private: true,
+ });
+
+ BrowserTestUtils.loadURIString(
+ privateWin.gBrowser.selectedBrowser,
+ TEST_URL2
+ );
+ await BrowserTestUtils.browserLoaded(
+ privateWin.gBrowser.selectedBrowser,
+ false,
+ TEST_URL2
+ );
+ await SimpleTest.promiseFocus(privateWin);
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ let originalWindowViewTime = await getDatabaseValue(
+ TEST_URL,
+ "totalViewTime"
+ );
+
+ info("Switch back to original window");
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+ // As we're checking for a non-action, wait for the focus to have definitely
+ // completed, and then let the event queues clear.
+ await SimpleTest.promiseFocus(window);
+ await TestUtils.waitForTick();
+
+ // The private window site should not be recorded.
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ exactTotalViewTime: originalWindowViewTime,
+ },
+ ]);
+
+ info("Switch back to new window");
+ Interactions._pageViewStartTime = Cu.now() - 30000;
+ await SimpleTest.promiseFocus(privateWin);
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: originalWindowViewTime + 30000,
+ },
+ ]);
+
+ BrowserTestUtils.removeTab(tabInOriginalWindow);
+ await BrowserTestUtils.closeWindow(privateWin);
+});
+
+add_task(async function test_interactions_idle() {
+ await Interactions.reset();
+ let lastViewTime;
+
+ await BrowserTestUtils.withNewTab(TEST_URL, async browser => {
+ Interactions._pageViewStartTime = Cu.now() - 10000;
+
+ Interactions.observe(null, "idle", "");
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: 10000,
+ },
+ ]);
+ lastViewTime = await getDatabaseValue(TEST_URL, "totalViewTime");
+
+ Interactions._pageViewStartTime = Cu.now() - 20000;
+
+ Interactions.observe(null, "active", "");
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ exactTotalViewTime: lastViewTime,
+ },
+ ]);
+
+ Interactions._pageViewStartTime = Cu.now() - 30000;
+ });
+
+ await assertDatabaseValues([
+ {
+ url: TEST_URL,
+ totalViewTime: lastViewTime + 30000,
+ maxViewTime: lastViewTime + 30000 + 10000,
+ },
+ ]);
+});