зеркало из https://github.com/mozilla/gecko-dev.git
Bug 1713325 - Exclude time when the user is idle from the page view time for history metadata. r=mak
Differential Revision: https://phabricator.services.mozilla.com/D116275
This commit is contained in:
Родитель
b30e42f4ec
Коммит
0948a5fbc8
|
@ -1937,6 +1937,7 @@ BrowserGlue.prototype = {
|
||||||
|
|
||||||
BrowserUsageTelemetry.uninit();
|
BrowserUsageTelemetry.uninit();
|
||||||
SearchSERPTelemetry.uninit();
|
SearchSERPTelemetry.uninit();
|
||||||
|
Interactions.uninit();
|
||||||
PageThumbs.uninit();
|
PageThumbs.uninit();
|
||||||
NewTabUtils.uninit();
|
NewTabUtils.uninit();
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,17 @@ XPCOMUtils.defineLazyModuleGetters(this, {
|
||||||
Services: "resource://gre/modules/Services.jsm",
|
Services: "resource://gre/modules/Services.jsm",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyServiceGetters(this, {
|
||||||
|
idleService: ["@mozilla.org/widget/useridleservice;1", "nsIUserIdleService"],
|
||||||
|
});
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
this,
|
||||||
|
"pageViewIdleTime",
|
||||||
|
"browser.places.interactions.pageViewIdleTime",
|
||||||
|
60
|
||||||
|
);
|
||||||
|
|
||||||
const DOMWINDOW_OPENED_TOPIC = "domwindowopened";
|
const DOMWINDOW_OPENED_TOPIC = "domwindowopened";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,6 +72,13 @@ class _Interactions {
|
||||||
*/
|
*/
|
||||||
#activeWindow = undefined;
|
#activeWindow = undefined;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tracks if the user is idle.
|
||||||
|
*
|
||||||
|
* @type {boolean}
|
||||||
|
*/
|
||||||
|
#userIsIdle = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This stores the page view start time of the current page view.
|
* This stores the page view start time of the current page view.
|
||||||
* For any single page view, this may be moved multiple times as the
|
* For any single page view, this may be moved multiple times as the
|
||||||
|
@ -113,6 +131,14 @@ class _Interactions {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Services.obs.addObserver(this, DOMWINDOW_OPENED_TOPIC, true);
|
Services.obs.addObserver(this, DOMWINDOW_OPENED_TOPIC, true);
|
||||||
|
idleService.addIdleObserver(this, pageViewIdleTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Uninitializes, removes any observers that need cleaning up manually.
|
||||||
|
*/
|
||||||
|
uninit() {
|
||||||
|
idleService.removeIdleObserver(this, pageViewIdleTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -179,7 +205,16 @@ class _Interactions {
|
||||||
!this.#activeWindow ||
|
!this.#activeWindow ||
|
||||||
(browser && browser.ownerGlobal != this.#activeWindow)
|
(browser && browser.ownerGlobal != this.#activeWindow)
|
||||||
) {
|
) {
|
||||||
this.logConsole.debug("No active window");
|
this.logConsole.debug("No update due to no active window");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We do not update the interaction when the user is idle, since we will
|
||||||
|
// have already updated it when idle was signalled.
|
||||||
|
// Sometimes an interaction may be signalled before idle is cleared, however
|
||||||
|
// worst case we'd only loose approx 2 seconds of interaction detail.
|
||||||
|
if (this.#userIsIdle) {
|
||||||
|
this.logConsole.debug("No update due to user is idle");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -275,6 +310,18 @@ class _Interactions {
|
||||||
case DOMWINDOW_OPENED_TOPIC:
|
case DOMWINDOW_OPENED_TOPIC:
|
||||||
this.#onWindowOpen(subject);
|
this.#onWindowOpen(subject);
|
||||||
break;
|
break;
|
||||||
|
case "idle":
|
||||||
|
this.logConsole.debug("idle");
|
||||||
|
// We save the state of the current interaction when we are notified
|
||||||
|
// that the user is idle.
|
||||||
|
this.#updateInteraction();
|
||||||
|
this.#userIsIdle = true;
|
||||||
|
break;
|
||||||
|
case "active":
|
||||||
|
this.logConsole.debug("active");
|
||||||
|
this.#userIsIdle = false;
|
||||||
|
this._pageViewStartTime = Cu.now();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -341,7 +388,9 @@ class _Interactions {
|
||||||
* @param {InteractionInfo} interactionInfo
|
* @param {InteractionInfo} interactionInfo
|
||||||
* The document information to write.
|
* The document information to write.
|
||||||
*/
|
*/
|
||||||
async _updateDatabase({ url, totalViewTime }) {}
|
async _updateDatabase(interactionInfo) {
|
||||||
|
this.logConsole.debug("Would update database: ", interactionInfo);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const Interactions = new _Interactions();
|
const Interactions = new _Interactions();
|
||||||
|
|
|
@ -13,6 +13,7 @@ const TEST_URL4 = "https://example.com/browser/browser/components";
|
||||||
|
|
||||||
add_task(async function setup() {
|
add_task(async function setup() {
|
||||||
sinon.spy(Interactions, "_updateDatabase");
|
sinon.spy(Interactions, "_updateDatabase");
|
||||||
|
disableIdleService();
|
||||||
|
|
||||||
registerCleanupFunction(() => {
|
registerCleanupFunction(() => {
|
||||||
sinon.restore();
|
sinon.restore();
|
||||||
|
@ -37,13 +38,20 @@ async function assertDatabaseValues(expected) {
|
||||||
Assert.equal(
|
Assert.equal(
|
||||||
actual.totalViewTime,
|
actual.totalViewTime,
|
||||||
expected[i].exactTotalViewTime,
|
expected[i].exactTotalViewTime,
|
||||||
"Should have kept the exact time."
|
"Should have kept the exact time"
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
Assert.greater(
|
Assert.greater(
|
||||||
actual.totalViewTime,
|
actual.totalViewTime,
|
||||||
expected[i].totalViewTime,
|
expected[i].totalViewTime,
|
||||||
"Should have stored the interaction time."
|
"Should have stored the interaction time"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
if (expected[i].maxViewTime) {
|
||||||
|
Assert.less(
|
||||||
|
actual.totalViewTime,
|
||||||
|
expected[i].maxViewTime,
|
||||||
|
"Should have recorded an interaction below the maximum expected"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -388,3 +396,50 @@ add_task(async function test_interactions_private_browsing() {
|
||||||
BrowserTestUtils.removeTab(tabInOriginalWindow);
|
BrowserTestUtils.removeTab(tabInOriginalWindow);
|
||||||
await BrowserTestUtils.closeWindow(privateWin);
|
await BrowserTestUtils.closeWindow(privateWin);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
add_task(async function test_interactions_idle() {
|
||||||
|
sinon.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 = Interactions._updateDatabase.args[0][0].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,
|
||||||
|
// Note: this should be `exactTotalViewTime: lastViewTime`, but
|
||||||
|
// apply updates to the same object.
|
||||||
|
totalViewTime: lastViewTime + 30000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
url: TEST_URL,
|
||||||
|
totalViewTime: lastViewTime + 30000,
|
||||||
|
maxViewTime: lastViewTime + 30000 + 10000,
|
||||||
|
},
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
|
|
@ -7,3 +7,26 @@ const { Interactions } = ChromeUtils.import(
|
||||||
);
|
);
|
||||||
|
|
||||||
const { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm");
|
const { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm");
|
||||||
|
|
||||||
|
XPCOMUtils.defineLazyPreferenceGetter(
|
||||||
|
this,
|
||||||
|
"pageViewIdleTime",
|
||||||
|
"browser.places.interactions.pageViewIdleTime",
|
||||||
|
60
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register the mock idleSerice.
|
||||||
|
*
|
||||||
|
* @param {Fun} registerCleanupFunction
|
||||||
|
*/
|
||||||
|
function disableIdleService() {
|
||||||
|
let idleService = Cc["@mozilla.org/widget/useridleservice;1"].getService(
|
||||||
|
Ci.nsIUserIdleService
|
||||||
|
);
|
||||||
|
idleService.removeIdleObserver(Interactions, pageViewIdleTime);
|
||||||
|
|
||||||
|
registerCleanupFunction(() => {
|
||||||
|
idleService.addIdleObserver(Interactions, pageViewIdleTime);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче