diff --git a/browser/components/sessionstore/SessionStore.sys.mjs b/browser/components/sessionstore/SessionStore.sys.mjs index 8e2de0ba06c6..5f05ae404a95 100644 --- a/browser/components/sessionstore/SessionStore.sys.mjs +++ b/browser/components/sessionstore/SessionStore.sys.mjs @@ -2360,7 +2360,7 @@ var SessionStoreInternal = { // It's possible that a tab switched its privacy state at some point // before our flush, so we need to filter again. lazy.PrivacyFilter.filterPrivateTabs(winData); - this.maybeSaveClosedWindow(winData, isLastWindow); + this.maybeSaveClosedWindow(winData, isLastWindow, true); if (!isLastWindow && winData.closedId > -1) { this._addClosedAction( @@ -2439,7 +2439,7 @@ var SessionStoreInternal = { * to call this method again asynchronously (for example, after * a window flush). */ - maybeSaveClosedWindow(winData, isLastWindow) { + maybeSaveClosedWindow(winData, isLastWindow, recordTelemetry = false) { // Make sure SessionStore is still running, and make sure that we // haven't chosen to forget this window. if ( @@ -2498,6 +2498,14 @@ var SessionStoreInternal = { } if (alreadyStored) { this._removeClosedWindow(winIndex); + return; + } + // we only do this after the TabStateFlusher promise resolves in ssi_onClose + if (recordTelemetry) { + let closedTabsHistogram = Services.telemetry.getHistogramById( + "FX_SESSION_RESTORE_CLOSED_TABS_NOT_SAVED" + ); + closedTabsHistogram.add(winData._closedTabs.length); } } } diff --git a/browser/components/sessionstore/test/browser_closed_tabs_closed_windows.js b/browser/components/sessionstore/test/browser_closed_tabs_closed_windows.js index ad8c6667d20e..b19799fef2a7 100644 --- a/browser/components/sessionstore/test/browser_closed_tabs_closed_windows.js +++ b/browser/components/sessionstore/test/browser_closed_tabs_closed_windows.js @@ -1,7 +1,9 @@ /* 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/. */ - +const { TelemetryTestUtils } = ChromeUtils.import( + "resource://testing-common/TelemetryTestUtils.jsm" +); const TEST_URLS = [ "http://mochi.test:8888/browser/", "https://www.example.com/", @@ -74,17 +76,37 @@ async function prepareClosedData() { closedIds.tab5 = SessionStore.getClosedTabDataForWindow(privateWin)[0].closedId; + const testWindow6 = await BrowserTestUtils.openNewBrowserWindow(); + + const testWindow7 = await BrowserTestUtils.openNewBrowserWindow(); + await openAndCloseTab(testWindow7, TEST_URLS[4]); + + let closedTabsHistogram = TelemetryTestUtils.getAndClearHistogram( + "FX_SESSION_RESTORE_CLOSED_TABS_NOT_SAVED" + ); + await BrowserTestUtils.closeWindow(testWindow1); closedIds.testWindow1 = SessionStore.getClosedWindowData()[0].closedId; await BrowserTestUtils.closeWindow(testWindow2); + closedIds.testWindow2 = SessionStore.getClosedWindowData()[0].closedId; await BrowserTestUtils.closeWindow(testWindow3); + closedIds.testWindow3 = SessionStore.getClosedWindowData()[0].closedId; await BrowserTestUtils.closeWindow(privateWin); Assert.ok( closedIds.testWindow2 > closedIds.testWindow1, "We got the closedIds in the expected order" ); + + await BrowserTestUtils.closeWindow(testWindow6); + TelemetryTestUtils.assertHistogram(closedTabsHistogram, 0, 1); + closedTabsHistogram.clear(); + + await BrowserTestUtils.closeWindow(testWindow7); + TelemetryTestUtils.assertHistogram(closedTabsHistogram, 1, 1); + closedTabsHistogram.clear(); + return closedIds; } diff --git a/toolkit/components/telemetry/Histograms.json b/toolkit/components/telemetry/Histograms.json index 4369c664a388..ce1a44539c37 100644 --- a/toolkit/components/telemetry/Histograms.json +++ b/toolkit/components/telemetry/Histograms.json @@ -9307,6 +9307,17 @@ "n_values": 50, "description": "Session restore: Number of tabs restored eagerly in the session that has just been restored." }, + "FX_SESSION_RESTORE_CLOSED_TABS_NOT_SAVED": { + "record_in_processes": ["main", "content"], + "products": ["firefox"], + "expires_in_version": "127", + "alert_emails": ["firefox-view-engineers@mozilla.com"], + "releaseChannelCollection": "opt-out", + "bug_numbers": [1848459], + "kind": "enumerated", + "n_values": 25, + "description": "Session restore: Number of closed tabs that are NOT saved due to lack of open tabs worth saving on window close." + }, "FX_TABLETMODE_PAGE_LOAD": { "record_in_processes": ["main", "content"], "products": ["firefox", "fennec"],