2015-06-15 22:36:43 +03:00
|
|
|
/* 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/. */
|
|
|
|
|
|
|
|
"use strict";
|
|
|
|
|
Bug 1792341 - Migrate more toolkit/modules consumers to use direct ES module import. r=Gijs,webdriver-reviewers,perftest-reviewers,necko-reviewers,geckoview-reviewers,preferences-reviewers,application-update-reviewers,pip-reviewers,credential-management-reviewers,sgalich,owlish,bytesized,AlexandruIonescu,whimboo,mconley,mixedpuppy
Mainly automated changes. Some manual ESLint fixes and whitespace cleanup.
Differential Revision: https://phabricator.services.mozilla.com/D158452
2022-10-18 14:21:26 +03:00
|
|
|
const { AppConstants } = ChromeUtils.importESModule(
|
|
|
|
"resource://gre/modules/AppConstants.sys.mjs"
|
2020-03-11 06:10:29 +03:00
|
|
|
);
|
2015-06-15 22:36:43 +03:00
|
|
|
|
2022-07-12 07:21:34 +03:00
|
|
|
const { XPCOMUtils } = ChromeUtils.importESModule(
|
|
|
|
"resource://gre/modules/XPCOMUtils.sys.mjs"
|
2019-01-17 21:18:31 +03:00
|
|
|
);
|
2015-06-15 22:36:43 +03:00
|
|
|
|
2022-06-06 21:59:45 +03:00
|
|
|
const lazy = {};
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyModuleGetters(lazy, {
|
2022-07-20 14:57:48 +03:00
|
|
|
ActivityStream: "resource://activity-stream/lib/ActivityStream.jsm",
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
ObjectUtils: "resource://gre/modules/ObjectUtils.jsm",
|
2018-07-27 04:09:12 +03:00
|
|
|
RemotePages:
|
|
|
|
"resource://gre/modules/remotepagemanager/RemotePageManagerParent.jsm",
|
2018-07-16 18:58:35 +03:00
|
|
|
});
|
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
const ABOUT_URL = "about:newtab";
|
|
|
|
const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
|
|
|
|
const TOPIC_APP_QUIT = "quit-application-granted";
|
2018-07-16 18:58:35 +03:00
|
|
|
const BROWSER_READY_NOTIFICATION = "sessionstore-windows-restored";
|
2015-06-15 22:36:43 +03:00
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
const AboutNewTab = {
|
2018-07-16 18:58:35 +03:00
|
|
|
QueryInterface: ChromeUtils.generateQI([
|
Bug 1649221: Update ChromeUtils.generateQI callers to pass strings. r=mccr8,remote-protocol-reviewers,marionette-reviewers,perftest-reviewers,webcompat-reviewers,geckoview-reviewers,preferences-reviewers,agi,whimboo,Bebe,twisniewski
Differential Revision: https://phabricator.services.mozilla.com/D81594
2020-07-11 02:58:28 +03:00
|
|
|
"nsIObserver",
|
|
|
|
"nsISupportsWeakReference",
|
2018-07-16 18:58:35 +03:00
|
|
|
]),
|
|
|
|
|
|
|
|
// AboutNewTab
|
2020-03-11 06:10:29 +03:00
|
|
|
initialized: false,
|
2015-06-15 22:36:43 +03:00
|
|
|
|
|
|
|
pageListener: null,
|
2020-03-11 06:10:29 +03:00
|
|
|
isPageListenerOverridden: false,
|
|
|
|
willNotifyUser: false,
|
2015-06-15 22:36:43 +03:00
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
_activityStreamEnabled: false,
|
2020-03-11 05:20:31 +03:00
|
|
|
activityStream: null,
|
2020-03-11 06:10:29 +03:00
|
|
|
activityStreamDebug: false,
|
|
|
|
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
_cachedTopSites: null,
|
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
_newTabURL: ABOUT_URL,
|
|
|
|
_newTabURLOverridden: false,
|
2018-07-16 18:58:35 +03:00
|
|
|
|
|
|
|
/**
|
|
|
|
* init - Initializes an instance of Activity Stream if one doesn't exist already
|
|
|
|
* and creates the instance of Remote Page Manager which Activity Stream
|
|
|
|
* uses for message passing.
|
|
|
|
*
|
|
|
|
* @param {obj} pageListener - Optional argument. An existing instance of RemotePages
|
|
|
|
* which Activity Stream has previously made, and we
|
|
|
|
* would like to re-use.
|
|
|
|
*/
|
2017-08-01 22:08:16 +03:00
|
|
|
init(pageListener) {
|
2020-03-11 06:10:29 +03:00
|
|
|
Services.obs.addObserver(this, TOPIC_APP_QUIT);
|
|
|
|
if (!AppConstants.RELEASE_OR_BETA) {
|
|
|
|
XPCOMUtils.defineLazyPreferenceGetter(
|
|
|
|
this,
|
|
|
|
"activityStreamDebug",
|
|
|
|
PREF_ACTIVITY_STREAM_DEBUG,
|
|
|
|
false,
|
|
|
|
() => {
|
|
|
|
this.notifyChange();
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
XPCOMUtils.defineLazyPreferenceGetter(
|
|
|
|
this,
|
|
|
|
"privilegedAboutProcessEnabled",
|
|
|
|
"browser.tabs.remote.separatePrivilegedContentProcess",
|
|
|
|
false,
|
|
|
|
() => {
|
|
|
|
this.notifyChange();
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
// More initialization happens here
|
2021-12-22 16:00:31 +03:00
|
|
|
this.toggleActivityStream(true);
|
2020-03-11 06:10:29 +03:00
|
|
|
this.initialized = true;
|
|
|
|
|
|
|
|
if (this.isPageListenerOverridden) {
|
2017-03-07 22:22:33 +03:00
|
|
|
return;
|
|
|
|
}
|
2018-07-16 18:58:35 +03:00
|
|
|
|
|
|
|
// Since `init` can be called via `reset` at a later time with an existing
|
|
|
|
// pageListener, we want to only add the observer if we are initializing
|
|
|
|
// without this pageListener argument. This means it was the first call to `init`
|
|
|
|
if (!pageListener) {
|
|
|
|
Services.obs.addObserver(this, BROWSER_READY_NOTIFICATION);
|
|
|
|
}
|
|
|
|
|
2018-04-23 22:47:57 +03:00
|
|
|
this.pageListener =
|
|
|
|
pageListener ||
|
2022-06-06 21:59:45 +03:00
|
|
|
new lazy.RemotePages(["about:home", "about:newtab", "about:welcome"]);
|
2017-05-24 11:56:00 +03:00
|
|
|
},
|
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
/**
|
|
|
|
* React to changes to the activity stream being enabled or not.
|
|
|
|
*
|
|
|
|
* This will only act if there is a change of state and if not overridden.
|
|
|
|
*
|
|
|
|
* @returns {Boolean} Returns if there has been a state change
|
|
|
|
*
|
|
|
|
* @param {Boolean} stateEnabled activity stream enabled state to set to
|
|
|
|
* @param {Boolean} forceState force state change
|
|
|
|
*/
|
|
|
|
toggleActivityStream(stateEnabled, forceState = false) {
|
|
|
|
if (
|
|
|
|
!forceState &&
|
|
|
|
(this._newTabURLOverridden ||
|
|
|
|
stateEnabled === this._activityStreamEnabled)
|
|
|
|
) {
|
|
|
|
// exit there is no change of state
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (stateEnabled) {
|
|
|
|
this._activityStreamEnabled = true;
|
|
|
|
} else {
|
|
|
|
this._activityStreamEnabled = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
this._newTabURL = ABOUT_URL;
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
|
|
|
get newTabURL() {
|
|
|
|
return this._newTabURL;
|
|
|
|
},
|
|
|
|
|
|
|
|
set newTabURL(aNewTabURL) {
|
|
|
|
let newTabURL = aNewTabURL.trim();
|
|
|
|
if (newTabURL === ABOUT_URL) {
|
|
|
|
// avoid infinite redirects in case one sets the URL to about:newtab
|
|
|
|
this.resetNewTabURL();
|
|
|
|
return;
|
|
|
|
} else if (newTabURL === "") {
|
|
|
|
newTabURL = "about:blank";
|
|
|
|
}
|
|
|
|
|
|
|
|
this.toggleActivityStream(false);
|
|
|
|
this._newTabURL = newTabURL;
|
|
|
|
this._newTabURLOverridden = true;
|
|
|
|
this.notifyChange();
|
|
|
|
},
|
|
|
|
|
|
|
|
get newTabURLOverridden() {
|
|
|
|
return this._newTabURLOverridden;
|
|
|
|
},
|
|
|
|
|
|
|
|
get activityStreamEnabled() {
|
|
|
|
return this._activityStreamEnabled;
|
|
|
|
},
|
|
|
|
|
|
|
|
resetNewTabURL() {
|
|
|
|
this._newTabURLOverridden = false;
|
|
|
|
this._newTabURL = ABOUT_URL;
|
|
|
|
this.toggleActivityStream(true, true);
|
|
|
|
this.notifyChange();
|
|
|
|
},
|
|
|
|
|
|
|
|
notifyChange() {
|
|
|
|
Services.obs.notifyObservers(null, "newtab-url-changed", this._newTabURL);
|
|
|
|
},
|
|
|
|
|
2018-07-16 18:58:35 +03:00
|
|
|
/**
|
|
|
|
* onBrowserReady - Continues the initialization of Activity Stream after browser is ready.
|
|
|
|
*/
|
|
|
|
onBrowserReady() {
|
|
|
|
if (this.activityStream && this.activityStream.initialized) {
|
|
|
|
return;
|
|
|
|
}
|
2015-06-15 22:36:43 +03:00
|
|
|
|
2022-06-06 21:59:45 +03:00
|
|
|
this.activityStream = new lazy.ActivityStream();
|
2018-07-16 18:58:35 +03:00
|
|
|
try {
|
|
|
|
this.activityStream.init();
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
this._subscribeToActivityStream();
|
2018-07-16 18:58:35 +03:00
|
|
|
} catch (e) {
|
|
|
|
Cu.reportError(e);
|
|
|
|
}
|
2015-06-15 22:36:43 +03:00
|
|
|
},
|
|
|
|
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
_subscribeToActivityStream() {
|
|
|
|
let unsubscribe = this.activityStream.store.subscribe(() => {
|
|
|
|
// If the top sites changed, broadcast "newtab-top-sites-changed". We
|
|
|
|
// ignore changes to the `screenshot` property in each site because
|
|
|
|
// screenshots are generated at times that are hard to predict and it ends
|
|
|
|
// up interfering with tests that rely on "newtab-top-sites-changed".
|
|
|
|
// Observers likely don't care about screenshots anyway.
|
|
|
|
let topSites = this.activityStream.store
|
|
|
|
.getState()
|
|
|
|
.TopSites.rows.map(site => {
|
|
|
|
site = { ...site };
|
|
|
|
delete site.screenshot;
|
|
|
|
return site;
|
|
|
|
});
|
2022-06-06 21:59:45 +03:00
|
|
|
if (!lazy.ObjectUtils.deepEqual(topSites, this._cachedTopSites)) {
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
this._cachedTopSites = topSites;
|
|
|
|
Services.obs.notifyObservers(null, "newtab-top-sites-changed");
|
|
|
|
}
|
|
|
|
});
|
|
|
|
this._unsubscribeFromActivityStream = () => {
|
|
|
|
try {
|
|
|
|
unsubscribe();
|
|
|
|
} catch (e) {
|
|
|
|
Cu.reportError(e);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
},
|
|
|
|
|
2018-07-16 18:58:35 +03:00
|
|
|
/**
|
|
|
|
* uninit - Uninitializes Activity Stream if it exists, and destroys the pageListener
|
|
|
|
* if it exists.
|
|
|
|
*/
|
2016-12-30 02:34:54 +03:00
|
|
|
uninit() {
|
2018-07-16 18:58:35 +03:00
|
|
|
if (this.activityStream) {
|
Bug 1747973 - Cache the top-sites query context like we cache other contexts. r=harry
This caches the top-sites context like we cache other contexts. The cache is
cleared when the top sites change or are enabled/disabled.
Unlike other contexts, which are evicted from the cache once too many newer
contexts are cached, the top-sites context is never evicted due to space reasons
because showing the top sites is a frequent action.
I wanted to keep the logic around when/whether the top sites have changed or
been enabled/disabled isolated to the top-sites provider, since it's the class
concerned with top sites in the first place, instead of spreading it out to
`QueryContextCache`. However, by the same token I didn't want to cache contexts
directly in the provider in order to keep all context caching in
`QueryContextCache`. (Contexts are also per window/urlbar, not global, so if we
were to cache contexts in the provider, we'd need to store them in map from
windows to contexts or something similar.)
So I added a more general listener system to the provider. Listeners are called
when the top sites change or they are enabled/disabled. `QueryContextCache` adds
a listener function so it can evict its cached top-sites context. The provider
keeps weak references to the listener functions because currently `UrlbarView`
doesn't have a way to tell when it's destroyed, so it doesn't know when it
should remove listeners.
Finally, there doesn't seem to be a way to observe the `TopSitesFeed` from the
outside, and I don't think it's the role of `TopSitesFeed` to broadcast an
observer message to the entire browser or something like that, so I modified
`AboutNewTab` to subscribe to changes in its activity stream object and then
compare the new top sites to the last seen top sites, and if they're different,
then broadcast a new "newtab-top-sites-changed" notification.
Differential Revision: https://phabricator.services.mozilla.com/D134863
2022-01-03 22:18:54 +03:00
|
|
|
this._unsubscribeFromActivityStream?.();
|
2018-07-16 18:58:35 +03:00
|
|
|
this.activityStream.uninit();
|
|
|
|
this.activityStream = null;
|
|
|
|
}
|
|
|
|
|
2017-03-07 22:22:33 +03:00
|
|
|
if (this.pageListener) {
|
|
|
|
this.pageListener.destroy();
|
|
|
|
this.pageListener = null;
|
|
|
|
}
|
2020-03-11 06:10:29 +03:00
|
|
|
this.initialized = false;
|
2017-03-07 22:22:33 +03:00
|
|
|
},
|
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
overridePageListener(shouldPassPageListener) {
|
|
|
|
this.isPageListenerOverridden = true;
|
|
|
|
|
2017-08-01 22:08:16 +03:00
|
|
|
const pageListener = this.pageListener;
|
|
|
|
if (!pageListener) {
|
|
|
|
return null;
|
2019-07-05 10:55:19 +03:00
|
|
|
}
|
2017-08-01 22:08:16 +03:00
|
|
|
if (shouldPassPageListener) {
|
|
|
|
this.pageListener = null;
|
|
|
|
return pageListener;
|
|
|
|
}
|
|
|
|
this.uninit();
|
|
|
|
return null;
|
2015-06-15 22:36:43 +03:00
|
|
|
},
|
2017-03-07 22:22:33 +03:00
|
|
|
|
2017-08-01 22:08:16 +03:00
|
|
|
reset(pageListener) {
|
2020-03-11 06:10:29 +03:00
|
|
|
this.isPageListenerOverridden = false;
|
2017-08-01 22:08:16 +03:00
|
|
|
this.init(pageListener);
|
2018-07-16 18:58:35 +03:00
|
|
|
},
|
|
|
|
|
2019-07-29 21:30:59 +03:00
|
|
|
getTopSites() {
|
|
|
|
return this.activityStream
|
|
|
|
? this.activityStream.store.getState().TopSites.rows
|
|
|
|
: [];
|
|
|
|
},
|
|
|
|
|
2020-03-11 06:10:29 +03:00
|
|
|
_alreadyRecordedTopsitesPainted: false,
|
|
|
|
_nonDefaultStartup: false,
|
|
|
|
|
|
|
|
noteNonDefaultStartup() {
|
|
|
|
this._nonDefaultStartup = true;
|
|
|
|
},
|
|
|
|
|
|
|
|
maybeRecordTopsitesPainted(timestamp) {
|
|
|
|
if (this._alreadyRecordedTopsitesPainted || this._nonDefaultStartup) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
const SCALAR_KEY = "timestamps.about_home_topsites_first_paint";
|
|
|
|
|
|
|
|
let startupInfo = Services.startup.getStartupInfo();
|
|
|
|
let processStartTs = startupInfo.process.getTime();
|
|
|
|
let delta = Math.round(timestamp - processStartTs);
|
|
|
|
Services.telemetry.scalarSet(SCALAR_KEY, delta);
|
2020-07-09 17:30:40 +03:00
|
|
|
ChromeUtils.addProfilerMarker("aboutHomeTopsitesFirstPaint");
|
2020-03-11 06:10:29 +03:00
|
|
|
this._alreadyRecordedTopsitesPainted = true;
|
|
|
|
},
|
|
|
|
|
2018-07-16 18:58:35 +03:00
|
|
|
// nsIObserver implementation
|
|
|
|
|
|
|
|
observe(subject, topic, data) {
|
|
|
|
switch (topic) {
|
2020-03-11 06:10:29 +03:00
|
|
|
case TOPIC_APP_QUIT: {
|
2020-04-29 19:25:17 +03:00
|
|
|
// We defer to this to the next tick of the event loop since the
|
|
|
|
// AboutHomeStartupCache might want to read from the ActivityStream
|
|
|
|
// store during TOPIC_APP_QUIT.
|
|
|
|
Services.tm.dispatchToMainThread(() => this.uninit());
|
2020-03-11 06:10:29 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case BROWSER_READY_NOTIFICATION: {
|
2018-07-16 18:58:35 +03:00
|
|
|
Services.obs.removeObserver(this, BROWSER_READY_NOTIFICATION);
|
|
|
|
// Avoid running synchronously during this event that's used for timing
|
|
|
|
Services.tm.dispatchToMainThread(() => this.onBrowserReady());
|
|
|
|
break;
|
2020-03-11 06:10:29 +03:00
|
|
|
}
|
2018-07-16 18:58:35 +03:00
|
|
|
}
|
2017-03-07 22:22:33 +03:00
|
|
|
},
|
2015-06-15 22:36:43 +03:00
|
|
|
};
|
2020-03-11 06:10:29 +03:00
|
|
|
|
|
|
|
var EXPORTED_SYMBOLS = ["AboutNewTab"];
|