Update On Wed Mar 5 19:56:10 CET 2025

This commit is contained in:
github-action[bot] 2025-03-05 19:56:11 +01:00
parent eaefe60938
commit 897718f7a3
4909 changed files with 515741 additions and 517059 deletions

1
Cargo.lock generated
View file

@ -2266,6 +2266,7 @@ dependencies = [
"mozbuild",
"profiler-macros",
"serde",
"smallvec",
]
[[package]]

View file

@ -134,7 +134,7 @@ ifeq ($(MOZ_BUILD_APP),mobile/android)
recurse_android-stage-package: stage-package
recurse_android-archive-geckoview:
GRADLE_INVOKED_WITHIN_MACH_BUILD=1 $(topsrcdir)/mach --log-no-times android archive-geckoview
GRADLE_INVOKED_WITHIN_MACH_BUILD=1 $(topsrcdir)/mach --log-no-times android archive-geckoview $(if $(MOZ_AUTOMATION),--no-configuration-cache)
endif
ifdef MOZ_WIDGET_TOOLKIT

View file

@ -1660,7 +1660,14 @@ addUiaTask(
* Test the TextRange pattern's GetEnclosingElement method.
*/
addUiaTask(
`<div id="editable" contenteditable role="textbox">ab <mark id="cdef"><span>cd</span> <a id="ef" href="/">ef</a></mark> <img id="g" src="https://example.com/a11y/accessible/tests/mochitest/moz.png" alt="g"></div>`,
`
<div id="editable" contenteditable role="textbox">
ab
<mark id="cdef"><span>cd</span> <a id="ef" href="/">ef</a></mark>
<a href="/"><img id="g" src="https://example.com/a11y/accessible/tests/mochitest/moz.png" alt="g"></a>
<p><button id="h">h</button></p>
</div>
`,
async function testTextRangeGetEnclosingElement() {
info("Getting editable DocumentRange");
await runPython(`
@ -1723,23 +1730,34 @@ addUiaTask(
await runPython(
`range.MoveEndpointByUnit(TextPatternRangeEndpoint_End, TextUnit_Character, -1)`
);
// Range is now "ef".
// Range is now "ef". The innermost element is the text leaf, but "ef" is a
// link and that's what Narrator wants.
is(
await runPython(`range.GetEnclosingElement().CurrentName`),
await runPython(`range.GetEnclosingElement().CurrentAutomationId`),
"ef",
"EnclosingElement is ef text leaf"
"EnclosingElement is ef"
);
// The IA2 -> UIA proxy gets the rest of this wrong.
if (!gIsUiaEnabled) {
return;
}
info("Moving 1 word");
await runPython(`range.Move(TextUnit_Word, 1)`);
// Range is now the embedded object character for the img (g).
// The IA2 -> UIA proxy gets this wrong.
if (gIsUiaEnabled) {
is(
await runPython(`range.GetEnclosingElement().CurrentAutomationId`),
"g",
"EnclosingElement is g"
);
}
is(
await runPython(`range.GetEnclosingElement().CurrentAutomationId`),
"g",
"EnclosingElement is g"
);
info("Moving 1 word");
await runPython(`range.Move(TextUnit_Word, 1)`);
// Range is now "h". "h" is a button and buttons prune their children, so
// UIA doesn't see the text leaf.
is(
await runPython(`range.GetEnclosingElement().CurrentAutomationId`),
"h",
"EnclosingElement is h"
);
}
);

View file

@ -746,12 +746,25 @@ UiaTextRange::GetEnclosingElement(
return CO_E_OBJNOTCONNECTED;
}
RemoveExcludedAccessiblesFromRange(range);
if (Accessible* enclosing =
range.Start().mAcc->GetClosestCommonInclusiveAncestor(
range.End().mAcc)) {
RefPtr<IRawElementProviderSimple> uia = MsaaAccessible::GetFrom(enclosing);
uia.forget(aRetVal);
Accessible* enclosing =
range.Start().mAcc->GetClosestCommonInclusiveAncestor(range.End().mAcc);
if (!enclosing) {
return S_OK;
}
for (Accessible* acc = enclosing; acc && !acc->IsDoc(); acc = acc->Parent()) {
if (nsAccUtils::MustPrune(acc) ||
// Bug 1950535: Narrator won't report a link correctly when navigating
// by character or word if we return a child text leaf. However, if
// there is more than a single text leaf, we need to return the child
// because it might have semantic significance; e.g. an embedded image.
(acc->Role() == roles::LINK && acc->ChildCount() == 1 &&
acc->FirstChild()->IsText())) {
enclosing = acc;
break;
}
}
RefPtr<IRawElementProviderSimple> uia = MsaaAccessible::GetFrom(enclosing);
uia.forget(aRetVal);
return S_OK;
}

View file

@ -6,8 +6,8 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
AboutReader: "resource://gre/modules/AboutReader.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
AboutReader: "moz-src:///toolkit/components/reader/AboutReader.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
Readerable: "resource://gre/modules/Readerable.sys.mjs",
});

View file

@ -8,7 +8,7 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PageActions: "resource:///modules/PageActions.sys.mjs",
PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
});
// A set of all of the AboutReaderParent actors that exist.

View file

@ -5,7 +5,8 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",

View file

@ -112,7 +112,7 @@ export class ContextMenuChild extends JSWindowActorChild {
media.requestFullscreen();
}
break;
case "pictureinpicture":
case "pictureinpicture": {
let event = new this.contentWindow.CustomEvent(
"MozTogglePictureInPicture",
{
@ -123,6 +123,7 @@ export class ContextMenuChild extends JSWindowActorChild {
);
media.dispatchEvent(event);
break;
}
}
}
);
@ -219,6 +220,37 @@ export class ContextMenuChild extends JSWindowActorChild {
return Promise.resolve({ spec, title, postData, charset });
}
case "ContextMenu:SearchFieldEngineData": {
let node = lazy.ContentDOMReference.resolve(
message.data.targetIdentifier
);
let charset = node.ownerDocument.characterSet;
let formBaseURI = Services.io.newURI(node.form.baseURI, charset);
let method = node.form.method.toUpperCase();
let formData = new FormData(node.form);
formData.set(node.name, "{searchTerms}");
let url = Services.io.newURI(
node.form.getAttribute("action"),
charset,
formBaseURI
).spec;
if (
!node.name ||
(method != "POST" && method != "GET") ||
node.form.enctype != "application/x-www-form-urlencoded" ||
formData.entries().some(([k, v]) => !k && typeof v != "string")
) {
// This should never happen since these conditions are checked in
// `isTargetASearchEngineField`.
return Promise.reject("Cannot create search engine from this form.");
}
return Promise.resolve({ url, formData, charset, method });
}
case "ContextMenu:SaveVideoFrameAsImage": {
let video = lazy.ContentDOMReference.resolve(
message.data.targetIdentifier
@ -1105,6 +1137,7 @@ export class ContextMenuChild extends JSWindowActorChild {
}
context.onKeywordField = editFlags & lazy.SpellCheckHelper.KEYWORD;
context.onSearchField = editFlags & lazy.SpellCheckHelper.SEARCHENGINE;
} else if (this.contentWindow.HTMLHtmlElement.isInstance(context.target)) {
const bodyElt = context.target.ownerDocument.body;

View file

@ -123,6 +123,12 @@ export class ContextMenuParent extends JSWindowActorParent {
});
}
getSearchFieldEngineData(targetIdentifier) {
return this.sendQuery("ContextMenu:SearchFieldEngineData", {
targetIdentifier,
});
}
getTextDirective() {
return this.sendQuery("ContextMenu:GetTextDirective");
}

View file

@ -6,7 +6,8 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
});
let gTestListeners = new Set();

View file

@ -5,7 +5,8 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
});
export class SearchSERPTelemetryParent extends JSWindowActorParent {

View file

@ -2362,7 +2362,7 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
// "btp": BTP enabled
// "-btp": BTP disabled
// One value from each section must be included in the browser.contentblocking.features.strict pref.
pref("browser.contentblocking.features.strict", "tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp");
pref("browser.contentblocking.features.strict", "tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,btp");
// Hide the "Change Block List" link for trackers/tracking content in the custom
// Content Blocking/ETP panel. By default, it will not be visible. There is also

View file

@ -353,6 +353,8 @@
<menuseparator id="context-sep-screenshots"/>
<menuitem id="context-keywordfield"
data-l10n-id="main-context-menu-keyword"/>
<menuitem id="context-add-engine"
data-l10n-id="main-context-menu-add-engine"/>
<menuitem id="context-searchselect"/>
<menuitem id="context-searchselect-private"/>
<menuitem id="context-translate-selection"

View file

@ -213,7 +213,16 @@ document.addEventListener(
gContextMenu.takeScreenshot();
break;
case "context-keywordfield":
AddKeywordForSearchField();
if (!gContextMenu) {
throw new Error("Context menu doesn't seem to be open.");
}
gContextMenu.addKeywordForSearchField();
break;
case "context-add-engine":
if (!gContextMenu) {
throw new Error("Context menu doesn't seem to be open.");
}
gContextMenu.addSearchFieldAsEngine();
break;
case "context-searchselect": {
let { searchTerms, usePrivate, principal, csp } = event.target;

View file

@ -53,7 +53,8 @@ ChromeUtils.defineESModuleGetters(this, {
nsContextMenu: "chrome://browser/content/nsContextMenu.sys.mjs",
OpenInTabsUtils:
"moz-src:///browser/components/tabbrowser/OpenInTabsUtils.sys.mjs",
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
PageActions: "resource:///modules/PageActions.sys.mjs",
PageThumbs: "resource://gre/modules/PageThumbs.sys.mjs",
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
@ -67,13 +68,13 @@ ChromeUtils.defineESModuleGetters(this, {
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
ProcessHangMonitor: "resource:///modules/ProcessHangMonitor.sys.mjs",
PromptUtils: "resource://gre/modules/PromptUtils.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
ResetPBMPanel: "resource:///modules/ResetPBMPanel.sys.mjs",
SafeBrowsing: "resource://gre/modules/SafeBrowsing.sys.mjs",
Sanitizer: "resource:///modules/Sanitizer.sys.mjs",
SaveToPocket: "chrome://pocket/content/SaveToPocket.sys.mjs",
ScreenshotsUtils: "resource:///modules/ScreenshotsUtils.sys.mjs",
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs",
SessionStore: "resource:///modules/sessionstore/SessionStore.sys.mjs",
ShoppingSidebarParent: "resource:///actors/ShoppingSidebarParent.sys.mjs",
@ -4821,14 +4822,6 @@ var MailIntegration = {
},
};
function AddKeywordForSearchField() {
if (!gContextMenu) {
throw new Error("Context menu doesn't seem to be open.");
}
gContextMenu.addKeywordForSearchField();
}
/**
* Applies only to the cmd|ctrl + shift + T keyboard shortcut
* Undo the last action that was taken - either closing the last tab or closing the last window;

View file

@ -82,7 +82,6 @@
"WindowIsClosing",
"warnAboutClosingWindow",
"MailIntegration",
"AddKeywordForSearchField",
"restoreLastClosedTabOrWindowOrSession",
"undoCloseTab",
"undoCloseWindow",

View file

@ -20,7 +20,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
NetUtil: "resource://gre/modules/NetUtil.sys.mjs",
PlacesUIUtils: "resource:///modules/PlacesUIUtils.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
ShortcutUtils: "resource://gre/modules/ShortcutUtils.sys.mjs",
TranslationsParent: "resource://gre/actors/TranslationsParent.sys.mjs",
WebsiteFilter: "resource:///modules/policies/WebsiteFilter.sys.mjs",
@ -218,6 +218,7 @@ export class nsContextMenu {
this.onEditable = context.onEditable;
this.onImage = context.onImage;
this.onKeywordField = context.onKeywordField;
this.onSearchField = context.onSearchField;
this.onLink = context.onLink;
this.onLoadedImage = context.onLoadedImage;
this.onMailtoLink = context.onMailtoLink;
@ -899,6 +900,7 @@ export class nsContextMenu {
!this.onMozExtLink) ||
this.onPlainTextLink
);
this.showItem("context-add-engine", this.shouldShowAddEngine());
this.showItem("context-keywordfield", this.shouldShowAddKeyword());
this.showItem("frame", this.inFrame);
@ -2344,6 +2346,20 @@ export class nsContextMenu {
});
}
addSearchFieldAsEngine() {
this.actor
.getSearchFieldEngineData(this.targetIdentifier)
.then(async ({ url, formData, charset, method }) => {
let icon = this.browser.mIconURL;
let uri = Services.io.newURI(url);
await this.window.gDialogBox.open(
"chrome://browser/content/search/addEngine.xhtml",
{ uri, formData, charset, method, icon }
);
})
.catch(console.error);
}
/**
* Utilities
*/
@ -2488,7 +2504,27 @@ export class nsContextMenu {
}
shouldShowAddKeyword() {
return this.onTextInput && this.onKeywordField && !this.isLoginForm();
return (
this.onTextInput &&
this.onKeywordField &&
!this.isLoginForm() &&
!Services.prefs.getBoolPref(
"browser.urlbar.update2.engineAliasRefresh",
false
)
);
}
shouldShowAddEngine() {
return (
this.onTextInput &&
this.onSearchField &&
!this.isLoginForm() &&
Services.prefs.getBoolPref(
"browser.urlbar.update2.engineAliasRefresh",
false
)
);
}
addDictionaries() {

View file

@ -73,6 +73,11 @@ support-files = [
"csp_iframe.sjs",
]
["browser_aboutNetError_invalid_header.js"]
support-files = [
"invalid_header.sjs",
]
["browser_aboutNetError_server_error.js"]
support-files = [
"server_error.sjs",

View file

@ -0,0 +1,56 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const INVALID_HEADER =
"https://example.com/browser/browser/base/content/test/about/invalid_header.sjs";
// From appstrings.properties
const EXPECTED_SHORT_DESC =
INVALID_HEADER +
" sent back a header with empty characters not allowed by web security standards.";
add_task(async function test_invalidHeaderValue() {
let browser;
let pageLoaded;
await BrowserTestUtils.openNewForegroundTab(
gBrowser,
() => {
gBrowser.selectedTab = BrowserTestUtils.addTab(gBrowser, INVALID_HEADER);
browser = gBrowser.selectedBrowser;
pageLoaded = BrowserTestUtils.waitForErrorPage(browser);
},
false
);
await pageLoaded;
await SpecialPowers.spawn(
browser,
[EXPECTED_SHORT_DESC],
function (expectedShortDesc) {
const doc = content.document;
ok(
doc.documentURI.startsWith("about:neterror"),
"Should be showing error page"
);
const titleEl = doc.querySelector(".title-text");
const actualDataL10nID = titleEl.getAttribute("data-l10n-id");
is(
actualDataL10nID,
"problem-with-this-site-title",
"Correct error link title is set"
);
const shortDesc = doc.getElementById("errorShortDesc");
ok(
shortDesc.textContent.startsWith(expectedShortDesc),
"Correct error page title is set"
);
}
);
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});

View file

@ -0,0 +1,11 @@
/* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200);
// x-invalid-header permits invalid chars in httpd.sys.mjs
response.setHeader("x-invalid-header-value", "Foo\x00Bar", false);
}

View file

@ -2,7 +2,8 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
ChromeUtils.defineESModuleGetters(this, {
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
});
function test() {

View file

@ -369,6 +369,10 @@ add_task(async function testCookiesSubViewAllowedHeuristic() {
TPC_PREF,
Ci.nsICookieService.BEHAVIOR_REJECT_TRACKER
);
Services.prefs.setBoolPref(
"privacy.restrict3rdpartystorage.heuristic.exclude_third_party_trackers",
false
);
let principal =
Services.scriptSecurityManager.createContentPrincipalFromOrigin(
// eslint-disable-next-line @microsoft/sdl/no-insecure-url
@ -474,6 +478,9 @@ add_task(async function testCookiesSubViewAllowedHeuristic() {
BrowserTestUtils.removeTab(tab);
Services.prefs.clearUserPref(TPC_PREF);
Services.prefs.clearUserPref(
"privacy.restrict3rdpartystorage.heuristic.exclude_third_party_trackers"
);
});
add_task(async function testCookiesSubViewBlockedDoublyNested() {

View file

@ -28,7 +28,7 @@ category browser-window-domcontentloaded resource:///modules/CustomizableUI.sys.
category browser-window-delayed-startup resource:///modules/ContentAnalysis.sys.mjs ContentAnalysis.initialize
category browser-window-delayed-startup resource:///modules/HomePage.sys.mjs HomePage.delayedStartup
category browser-window-delayed-startup resource:///modules/ReportBrokenSite.sys.mjs ReportBrokenSite.init
category browser-window-delayed-startup resource:///modules/SearchUIUtils.sys.mjs SearchUIUtils.init
category browser-window-delayed-startup moz-src:///browser/components/search/SearchUIUtils.sys.mjs SearchUIUtils.init
category browser-window-unload resource:///modules/BrowserDOMWindow.sys.mjs BrowserDOMWindow.teardownInWindow
category browser-window-unload moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs NewTabPagePreloading.removePreloadedBrowser
@ -43,7 +43,7 @@ category browser-idle-startup resource:///modules/GenAI.sys.mjs GenAI.init
category browser-idle-startup resource:///modules/QuickSuggest.sys.mjs QuickSuggest.init
category browser-idle-startup resource:///modules/UrlbarSearchTermsPersistence.sys.mjs UrlbarSearchTermsPersistence.init
category browser-idle-startup resource:///modules/ShoppingUtils.sys.mjs ShoppingUtils.init
category browser-idle-startup resource:///modules/SERPCategorization.sys.mjs SERPCategorization.init
category browser-idle-startup moz-src:///browser/components/search/SERPCategorization.sys.mjs SERPCategorization.init
category browser-idle-startup resource://gre/modules/ContentRelevancyManager.sys.mjs ContentRelevancyManager.init
#ifdef MOZ_UPDATER
category browser-idle-startup resource://gre/modules/UpdateListener.sys.mjs UpdateListener.maybeShowUnsupportedNotification
@ -62,11 +62,11 @@ category browser-quit-application-granted resource://normandy/Normandy.sys.mjs N
category browser-quit-application-granted resource://gre/modules/RFPHelper.sys.mjs RFPHelper.uninit
category browser-quit-application-granted resource:///modules/ShoppingUtils.sys.mjs ShoppingUtils.uninit
category browser-quit-application-granted resource:///modules/asrouter/ASRouterNewTabHook.sys.mjs ASRouterNewTabHook.destroy
category browser-quit-application-granted resource:///modules/SERPCategorization.sys.mjs SERPCategorization.uninit
category browser-quit-application-granted resource:///modules/SearchSERPTelemetry.sys.mjs SearchSERPTelemetry.uninit
category browser-quit-application-granted moz-src:///browser/components/search/SERPCategorization.sys.mjs SERPCategorization.uninit
category browser-quit-application-granted moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs SearchSERPTelemetry.uninit
#ifdef MOZ_UPDATER
category browser-quit-application-granted resource://gre/modules/UpdateListener.sys.mjs UpdateListener.reset
#endif
category browser-quit-application-granted resource:///modules/UrlbarSearchTermsPersistence.sys.mjs UrlbarSearchTermsPersistence.uninit
category search-service-notification resource:///modules/SearchUIUtils.sys.mjs SearchUIUtils.showSearchServiceNotification
category search-service-notification moz-src:///browser/components/search/SearchUIUtils.sys.mjs SearchUIUtils.showSearchServiceNotification

View file

@ -16,7 +16,7 @@ ChromeUtils.defineESModuleGetters(lazy, {
LaterRun: "resource:///modules/LaterRun.sys.mjs",
NimbusFeatures: "resource://nimbus/ExperimentAPI.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs",
ShellService: "resource:///modules/ShellService.sys.mjs",
SpecialMessageActions:

View file

@ -21,7 +21,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
BackupService: "resource:///modules/backup/BackupService.sys.mjs",
BookmarkHTMLUtils: "resource://gre/modules/BookmarkHTMLUtils.sys.mjs",
BookmarkJSONUtils: "resource://gre/modules/BookmarkJSONUtils.sys.mjs",
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
BrowserUsageTelemetry: "resource:///modules/BrowserUsageTelemetry.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
@ -74,7 +75,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
Sanitizer: "resource:///modules/Sanitizer.sys.mjs",
SandboxUtils: "resource://gre/modules/SandboxUtils.sys.mjs",
ScreenshotsUtils: "resource:///modules/ScreenshotsUtils.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SelectableProfileService:
"resource:///modules/profiles/SelectableProfileService.sys.mjs",
SessionStartup: "resource:///modules/sessionstore/SessionStartup.sys.mjs",
@ -2271,25 +2273,6 @@ BrowserGlue.prototype = {
});
},
async _setupSearchDetection() {
// There is no pref for this add-on because it shouldn't be disabled.
const ID = "addons-search-detection@mozilla.com";
let addon = await lazy.AddonManager.getAddonByID(ID);
// first time install of addon and install on firefox update
addon =
(await lazy.AddonManager.maybeInstallBuiltinAddon(
ID,
"2.0.0",
"resource://builtin-addons/search-detection/"
)) || addon;
if (!addon.isActive) {
addon.enable();
}
},
_monitorHTTPSOnlyPref() {
const PREF_ENABLED = "dom.security.https_only_mode";
const PREF_WAS_ENABLED = "dom.security.https_only_mode_ever_enabled";
@ -2434,7 +2417,6 @@ BrowserGlue.prototype = {
this._monitorWebcompatReporterPref();
this._monitorHTTPSOnlyPref();
this._setupSearchDetection();
this._monitorGPCPref();
@ -3802,11 +3784,7 @@ BrowserGlue.prototype = {
"resource://devtools/client/performance-new/popup/menu-button.sys.mjs"
);
if (!ProfilerMenuButton.isInNavbar()) {
// The profiler menu button is not enabled. Turn it on now.
const win = lazy.BrowserWindowTracker.getTopWindow();
if (win && win.document) {
ProfilerMenuButton.addToNavbar(win.document);
}
ProfilerMenuButton.addToNavbar();
}
}
}

View file

@ -9,3 +9,677 @@
$schema: moz://mozilla.org/schemas/glean/metrics/2-0-0
$tags:
- 'Firefox :: Messaging System'
messaging_system:
event_context_parse_error:
type: counter
lifetime: ping
description: |
How often we failed to parse event_context as JSON.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_reason:
type: string
lifetime: ping
description: |
The event_context's `reason`. Likely something like
"welcome-window-closed" or "app-shut-down",.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_page:
type: string
lifetime: ping
description: |
The event_context's `page`. Almost always "about:welcome".
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_source:
type: string
lifetime: ping
description: |
The event_context's `source`. Likely something like "primary_button".
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_context:
type: text
lifetime: ping
description: |
The stringified JSON of `event_context`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_family:
type: text
lifetime: ping
description: |
A string identifier of the message family derived from the message id
(e.g. MR_WELCOME_DEFAULT).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_id:
type: text
lifetime: ping
description: |
A string identifier of the message screen id
(e.g. AW_MOBILE_DOWNLOAD).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_initials:
type: text
lifetime: ping
description: |
A string identifier of the message screen initials
(e.g. 'EMAG' for EASY_SETUP, MOBILE_DOWNLOADS, AMO, GRATITUDE).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_index:
type: quantity
unit: integer
lifetime: ping
description: |
A number identifier of the screen index in a sequence of screens
(e.g. 0 for first message).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
message_id:
type: text
lifetime: ping
description: |
A string identifier of the message in Activity Stream Router.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
event:
type: string
description: >
The type of event. Any user defined string
(e.g. “IMPRESSION”, “CLICK_BUTTON”, "INDEXEDDB_OPEN_FAILED", “SESSION_END”)
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
ping_type:
type: string
description: >
Type of event the ping is capturing.
e.g. "cfr", "onboarding"
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
source:
type: string
description: >
The source of the interaction described by the other metrics.
e.g. "frecent_links", "newtab", "CFR"
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
client_id:
type: uuid
lifetime: ping
description: |
The client_id according to Telemetry.
Might not always have a value due to policy around specific types of
ping being sent. Value may be the canary client id
`c0ffeec0-ffee-c0ff-eec0-ffeec0ffeec0`
in pings near when the data upload pref is disabled (if Telemetry gets
to go first), or between when a client_id has been removed and when it
has been regenerated.
Present only in some circumstances (see
[bug 1484035]https://bugzilla.mozilla.org/show_bug.cgi?id=1484035)).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1755549
- https://bugzilla.mozilla.org/show_bug.cgi?id=1484035
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1755549
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
locale:
type: string
lifetime: ping
description: >
The locale as supplied to the messaging system by
`Services.locale.appLocaleAsBCP47`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
browser_session_id:
type: uuid
lifetime: ping
# Disable yamllint for long lines.
# yamllint disable
description: >
The Legacy Telemetry browser "session id".
Identifies a specific period from application start to shutdown.
See [the "main" ping docs](https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/data/main-ping.html)
for details.
# yamllint enable
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
impression_id:
type: uuid
lifetime: ping
description: >
The unique impression identifier for a specific client.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
bucket_id:
type: string
lifetime: ping
description: >
A name shared between multiple messages that may individually be too
targetted.
e.g. a message that gets shown on specific websites or a message asking
about personal information.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
addon_version:
type: string
lifetime: ping
description: >
Used to hold the system addon's version,
now is almost certainly an echo of the app's build id.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_key_count:
type: counter
description: |
The sum of all unknown keys counted.
Useful for testing.
Can be removed after bug 1600008 is resolved.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- chutten@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_keys:
type: labeled_counter
description: |
Ping keys supplied to the messaging system for which
we did not have a corresponding metric mapped to how often they attempted
to be recorded.
You may have forgotten to define an appropriate metric in
`browser/components/newtab/metrics.yaml`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
glean_ping_for_ping_failures:
type: counter
description: |
How often something went awry within
`AboutWelcome.submitGleanPingForPing`, preventing ping submission.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
- chutten@mozilla.com
expires: never
send_in_pings:
- metrics
invalid_nested_data:
type: labeled_counter
description: |
We received a ping with non-scalar data on a field of this name.
If this is existing pre-PingCentre-replacement data, you may need to
augment the logic in
`AboutWelcome.submitGleanPingForPing` like the other `handledKeys`.
If this is for new, post-PingCentre-replacement data, you should
probably prefer a flat structure.
If you're unsure, please ask in
[the #glean channel](https://chat.mozilla.org/#/room/#glean:mozilla.org).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
- chutten@mozilla.com
expires: never
send_in_pings:
- messaging-system
messaging_system.attribution:
source:
type: string
lifetime: ping
description: |
Attribution's source, possibly derived from the utm parameter of the same
name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
medium:
type: string
lifetime: ping
description: |
Attribution's medium, possibly derived from the utm parameter of the same
name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
campaign:
type: string
lifetime: ping
description: |
Attribution's campaign, possibly derived from the utm parameter of the
same name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
content:
type: string
lifetime: ping
description: |
Attribution's content, possibly derived from the utm parameter of the
same name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
experiment:
type: string
lifetime: ping
description: |
Attribution's experiment key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
variation:
type: string
lifetime: ping
description: |
Attribution's variation key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
ua:
type: string
lifetime: ping
description: |
Attribution's ua key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
dltoken:
type: string
lifetime: ping
description: |
String representation of the dltoken identifying the particular
installer used to install this Firefox.
Likely a UUID, if present.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
msstoresignedin:
type: string
lifetime: ping
description: |
Either the string "true" or the string "false" to indicate whether the
attributed install came from the Microsoft store and, if so, whether the
user was signed in at the time.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1756209
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1756209
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
dlsource:
type: string
lifetime: ping
description: |
Mozilla-specific download "source" name. Could be something like
"mozillaci" to identify that the installer came from
`{archive|ftp}.mozilla.org`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1819997
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1819997
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_keys:
type: labeled_counter
description: |
Attribution keys supplied to the messaging system for which
we did not have a corresponding metric, and the count of how
often that happened.
Either add this key to a list of known attribution keys in
`AboutWelcomeTelemetry` to suppress or define an appropriate metric in
`browser/components/newtab/metrics.yaml` to collect.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system

View file

@ -1365,6 +1365,45 @@ const BASE_MESSAGES = () => [
id: "defaultBrowserCheck",
},
},
{
id: "INFOBAR_DEFAULT_AND_PIN_87",
groups: ["cfr"],
content: {
text: {
string_id: "default-browser-notification-message",
},
type: "global",
buttons: [
{
label: {
string_id: "default-browser-notification-button",
},
action: {
type: "PIN_AND_DEFAULT",
},
primary: true,
accessKey: "P",
},
],
category: "cfrFeatures",
bucket_id: "INFOBAR_DEFAULT_AND_PIN_87",
},
trigger: {
id: "defaultBrowserCheck",
},
template: "infobar",
frequency: {
custom: [
{
cap: 1,
period: 3024000000,
},
],
lifetime: 2,
},
targeting:
"(firefoxVersion >= 138 && source == 'startup' && !isDefaultBrowser && !'browser.shell.checkDefaultBrowser'|preferenceValue && currentDate|date - 'browser.shell.userDisabledDefaultCheck'|preferenceValue * 1000 >= 604800000 && isMajorUpgrade != true && platformName != 'linux' && ((currentDate|date - profileAgeCreated) / 604800000) >= 5 && !activeNotifications && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features'|preferenceValue && ((currentDate|date - profileAgeCreated) / 604800000) < 15",
},
];
const PREONBOARDING_MESSAGES = () => [

View file

@ -4,3 +4,17 @@
---
$schema: moz://mozilla.org/schemas/glean/pings/2-0-0
messaging-system:
description: |
This is a ping representing single events triggered by the messaging system
and captures some pings from About:Welcome, ASRouter, and other corners.
include_client_id: false
send_if_empty: false
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com

View file

@ -8,7 +8,7 @@
"use strict";
ChromeUtils.defineESModuleGetters(this, {
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
});
var { ExtensionError } = ExtensionUtils;

View file

@ -58,13 +58,14 @@
"audio",
"launcher",
"bookmark",
"page_action",
"tab",
"tools_menu"
]
},
{
"type": "string",
"enum": ["browser_action", "page_action"],
"enum": ["browser_action"],
"max_manifest_version": 2
},
{

View file

@ -329,6 +329,35 @@ add_task(async function test_show_hide_pageAction() {
});
});
add_task(async function test_show_hide_pageAction_v3() {
await testShowHideEvent({
manifest_version: 3,
id: "page-action@mochitest",
menuCreateParams: {
id: "page_action_item",
title: "pageAction item",
contexts: ["page_action"],
},
expectedShownEvent: {
contexts: ["page_action", "all"],
viewType: undefined,
editable: false,
},
expectedShownEventWithPermissions: {
contexts: ["page_action", "all"],
viewType: undefined,
editable: false,
pageUrl: PAGE,
},
async doOpenMenu(extension) {
await openActionContextMenu(extension, "page");
},
async doCloseMenu() {
await closeActionContextMenu(null, "page");
},
});
});
add_task(async function test_show_hide_browserAction() {
await testShowHideEvent({
menuCreateParams: {

View file

@ -1732,680 +1732,6 @@ pocket:
send_in_pings:
- newtab
messaging_system:
event_context_parse_error:
type: counter
lifetime: ping
description: |
How often we failed to parse event_context as JSON.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_reason:
type: string
lifetime: ping
description: |
The event_context's `reason`. Likely something like
"welcome-window-closed" or "app-shut-down",.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_page:
type: string
lifetime: ping
description: |
The event_context's `page`. Almost always "about:welcome".
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_source:
type: string
lifetime: ping
description: |
The event_context's `source`. Likely something like "primary_button".
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_context:
type: text
lifetime: ping
description: |
The stringified JSON of `event_context`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_family:
type: text
lifetime: ping
description: |
A string identifier of the message family derived from the message id
(e.g. MR_WELCOME_DEFAULT).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_id:
type: text
lifetime: ping
description: |
A string identifier of the message screen id
(e.g. AW_MOBILE_DOWNLOAD).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_initials:
type: text
lifetime: ping
description: |
A string identifier of the message screen initials
(e.g. 'EMAG' for EASY_SETUP, MOBILE_DOWNLOADS, AMO, GRATITUDE).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1867627
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
event_screen_index:
type: quantity
unit: integer
lifetime: ping
description: |
A number identifier of the screen index in a sequence of screens
(e.g. 0 for first message).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
- nsauermann@mozilla.com
expires: never
send_in_pings:
- messaging-system
message_id:
type: text
lifetime: ping
description: |
A string identifier of the message in Activity Stream Router.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- web_activity
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
event:
type: string
description: >
The type of event. Any user defined string
(e.g. “IMPRESSION”, “CLICK_BUTTON”, "INDEXEDDB_OPEN_FAILED", “SESSION_END”)
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
ping_type:
type: string
description: >
Type of event the ping is capturing.
e.g. "cfr", "onboarding"
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
source:
type: string
description: >
The source of the interaction described by the other metrics.
e.g. "frecent_links", "newtab", "CFR"
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
client_id:
type: uuid
lifetime: ping
description: |
The client_id according to Telemetry.
Might not always have a value due to policy around specific types of
ping being sent. Value may be the canary client id
`c0ffeec0-ffee-c0ff-eec0-ffeec0ffeec0`
in pings near when the data upload pref is disabled (if Telemetry gets
to go first), or between when a client_id has been removed and when it
has been regenerated.
Present only in some circumstances (see
[bug 1484035]https://bugzilla.mozilla.org/show_bug.cgi?id=1484035)).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1755549
- https://bugzilla.mozilla.org/show_bug.cgi?id=1484035
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1755549
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
locale:
type: string
lifetime: ping
description: >
The locale as supplied to the messaging system by
`Services.locale.appLocaleAsBCP47`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
browser_session_id:
type: uuid
lifetime: ping
# Disable yamllint for long lines.
# yamllint disable
description: >
The Legacy Telemetry browser "session id".
Identifies a specific period from application start to shutdown.
See [the "main" ping docs](https://firefox-source-docs.mozilla.org/toolkit/components/telemetry/data/main-ping.html)
for details.
# yamllint enable
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
impression_id:
type: uuid
lifetime: ping
description: >
The unique impression identifier for a specific client.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
bucket_id:
type: string
lifetime: ping
description: >
A name shared between multiple messages that may individually be too
targetted.
e.g. a message that gets shown on specific websites or a message asking
about personal information.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
addon_version:
type: string
lifetime: ping
description: >
Used to hold the system addon's version,
now is almost certainly an echo of the app's build id.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_key_count:
type: counter
description: |
The sum of all unknown keys counted.
Useful for testing.
Can be removed after bug 1600008 is resolved.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- chutten@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_keys:
type: labeled_counter
description: |
Ping keys supplied to the messaging system for which
we did not have a corresponding metric mapped to how often they attempted
to be recorded.
You may have forgotten to define an appropriate metric in
`browser/components/newtab/metrics.yaml`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
glean_ping_for_ping_failures:
type: counter
description: |
How often something went awry within
`AboutWelcome.submitGleanPingForPing`, preventing ping submission.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
- chutten@mozilla.com
expires: never
send_in_pings:
- metrics
invalid_nested_data:
type: labeled_counter
description: |
We received a ping with non-scalar data on a field of this name.
If this is existing pre-PingCentre-replacement data, you may need to
augment the logic in
`AboutWelcome.submitGleanPingForPing` like the other `handledKeys`.
If this is for new, post-PingCentre-replacement data, you should
probably prefer a flat structure.
If you're unsure, please ask in
[the #glean channel](https://chat.mozilla.org/#/room/#glean:mozilla.org).
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
- chutten@mozilla.com
expires: never
send_in_pings:
- messaging-system
messaging_system.attribution:
source:
type: string
lifetime: ping
description: |
Attribution's source, possibly derived from the utm parameter of the same
name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
medium:
type: string
lifetime: ping
description: |
Attribution's medium, possibly derived from the utm parameter of the same
name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
campaign:
type: string
lifetime: ping
description: |
Attribution's campaign, possibly derived from the utm parameter of the
same name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
content:
type: string
lifetime: ping
description: |
Attribution's content, possibly derived from the utm parameter of the
same name.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
experiment:
type: string
lifetime: ping
description: |
Attribution's experiment key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
variation:
type: string
lifetime: ping
description: |
Attribution's variation key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
ua:
type: string
lifetime: ping
description: |
Attribution's ua key.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
dltoken:
type: string
lifetime: ping
description: |
String representation of the dltoken identifying the particular
installer used to install this Firefox.
Likely a UUID, if present.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
msstoresignedin:
type: string
lifetime: ping
description: |
Either the string "true" or the string "false" to indicate whether the
attributed install came from the Microsoft store and, if so, whether the
user was signed in at the time.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1756209
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1756209
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
dlsource:
type: string
lifetime: ping
description: |
Mozilla-specific download "source" name. Could be something like
"mozillaci" to identify that the installer came from
`{archive|ftp}.mozilla.org`.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1819997
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1819997
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- interaction
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
unknown_keys:
type: labeled_counter
description: |
Attribution keys supplied to the messaging system for which
we did not have a corresponding metric, and the count of how
often that happened.
Either add this key to a list of known attribution keys in
`AboutWelcomeTelemetry` to suppress or define an appropriate metric in
`browser/components/newtab/metrics.yaml` to collect.
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_sensitivity:
- technical
notification_emails:
- dmosedale@mozilla.com
- pmcmanis@mozilla.com
expires: never
send_in_pings:
- messaging-system
top_sites: # Replacement for PingCentre "topsites-impression|click" pings.
ping_type:
type: string

View file

@ -30,20 +30,6 @@ newtab:
- anicholson@mozilla.com
- najiang@mozilla.com
messaging-system:
description: |
This is a ping representing single events triggered by the messaging system
and captures some pings from About:Welcome, ASRouter, and other corners.
include_client_id: false
send_if_empty: false
bugs:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
data_reviews:
- https://bugzilla.mozilla.org/show_bug.cgi?id=1825863
notification_emails:
- pmcmanis@mozilla.com
- dmosedale@mozilla.com
top-sites:
description: |
A ping representing a single event happening with or to a TopSite.

View file

@ -21,7 +21,7 @@ add_task(async function add_keyword() {
await withBookmarksDialog(
false,
function () {
AddKeywordForSearchField();
gContextMenu.addKeywordForSearchField();
contentAreaContextMenu.hidePopup();
},
async function (dialogWin) {
@ -113,7 +113,7 @@ add_task(async function reopen_same_field() {
await withBookmarksDialog(
true,
function () {
AddKeywordForSearchField();
gContextMenu.addKeywordForSearchField();
contentAreaContextMenu.hidePopup();
},
async function (dialogWin) {
@ -159,7 +159,7 @@ add_task(async function open_other_field() {
await withBookmarksDialog(
true,
function () {
AddKeywordForSearchField();
gContextMenu.addKeywordForSearchField();
contentAreaContextMenu.hidePopup();
},
function (dialogWin) {

View file

@ -49,7 +49,7 @@ ChromeUtils.defineESModuleGetters(this, {
pktApi: "chrome://pocket/content/pktApi.sys.mjs",
pktTelemetry: "chrome://pocket/content/pktTelemetry.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
SaveToPocket: "chrome://pocket/content/SaveToPocket.sys.mjs",
});

View file

@ -3,9 +3,6 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
browser.jar:
content/browser/preferences/dialogs/addEngine.xhtml
content/browser/preferences/dialogs/addEngine.js
content/browser/preferences/dialogs/addEngine.css
content/browser/preferences/dialogs/applicationManager.xhtml
content/browser/preferences/dialogs/applicationManager.js
content/browser/preferences/dialogs/blocklists.xhtml

View file

@ -55,7 +55,7 @@
<!-- Links below are only used for search-l10n-ids into subdialogs -->
<link rel="localization" href="browser/aboutDialog.ftl"/>
<link rel="localization" href="browser/genai.ftl"/>
<link rel="localization" href="browser/preferences/addEngine.ftl"/>
<link rel="localization" href="browser/search.ftl"/>
<link rel="localization" href="browser/preferences/blocklists.ftl"/>
<link rel="localization" href="browser/preferences/clearSiteData.ftl"/>
<link rel="localization" href="browser/preferences/colors.ftl"/>

View file

@ -180,7 +180,7 @@
search-l10n-ids="
add-engine-button,
add-engine-name,
add-engine-alias,
add-engine-keyword,
add-engine-url,
add-engine-dialog.buttonlabelaccept,
"

View file

@ -8,7 +8,7 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
CustomizableUI: "resource:///modules/CustomizableUI.sys.mjs",
});
@ -1022,10 +1022,9 @@ class EngineView {
Services.search.removeEngine(this.selectedEngine.originalEngine);
break;
case "addEngineButton":
gSubDialog.open(
"chrome://browser/content/preferences/dialogs/addEngine.xhtml",
{ features: "resizable=no, modal=yes" }
);
gSubDialog.open("chrome://browser/content/search/addEngine.xhtml", {
features: "resizable=no, modal=yes",
});
break;
}
break;

View file

@ -200,11 +200,6 @@ export class ProfilesParent extends JSWindowActorParent {
} else if (source === "about:deleteprofile") {
Glean.profilesDelete.confirm.record();
}
let profiles = await SelectableProfileService.getAllProfiles();
if (profiles.length <= 1) {
return null;
}
// Notify windows that a quit has been requested.
let cancelQuit = Cc["@mozilla.org/supports-PRBool;1"].createInstance(

View file

@ -926,7 +926,7 @@ class SelectableProfileServiceClass extends EventEmitter {
*
* @param {boolean} shouldShow Whether or not we should show the profile selector
*/
async showProfileSelectorWindow(shouldShow) {
async setShowProfileSelectorWindow(shouldShow) {
this.groupToolkitProfile.showProfileSelector = shouldShow;
await this.#attemptFlushProfileService();
}
@ -1128,7 +1128,7 @@ class SelectableProfileServiceClass extends EventEmitter {
this.#currentProfile = await this.#createProfile(path);
// And also set the profile selector window to show at startup (bug 1933911).
this.showProfileSelectorWindow(true);
this.setShowProfileSelectorWindow(true);
}
}
@ -1217,20 +1217,17 @@ class SelectableProfileServiceClass extends EventEmitter {
this.#notifyTask.arm();
}
/**
* Close all active instances running the current profile
*/
closeActiveProfileInstances() {}
/**
* Schedule deletion of the current SelectableProfile as a background task.
*/
async deleteCurrentProfile() {
let profiles = await this.getAllProfiles();
// Refuse to delete the last profile.
if (profiles.length <= 1) {
return;
await this.createNewProfile();
await this.setShowProfileSelectorWindow(false);
profiles = await this.getAllProfiles();
}
// TODO: (Bug 1923980) How should we choose the new default profile?

View file

@ -95,7 +95,7 @@ export class ProfileSelector extends MozLitElement {
this.profiles = await this.selectableProfileService.getAllProfiles();
if (!this.profiles.length) {
this.selectableProfileService.showProfileSelectorWindow(false);
this.selectableProfileService.setShowProfileSelectorWindow(false);
}
this.initialized = true;
@ -112,7 +112,7 @@ export class ProfileSelector extends MozLitElement {
handleCheckboxToggle() {
let state = this.checkbox.checked ? "enabled" : "disabled";
Glean.profilesSelectorWindow.showAtStartup.record({ value: state });
this.selectableProfileService.showProfileSelectorWindow(
this.selectableProfileService.setShowProfileSelectorWindow(
this.checkbox.checked
);
}

View file

@ -0,0 +1,71 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
add_setup(initSelectableProfileService);
add_task(async function test_delete_last_profile() {
// mock() returns an object with a fake `runw` method that, when
// called, records its arguments.
let input = [];
let mock = () => {
return {
runw: (...args) => {
input = args;
},
};
};
const SelectableProfileService = getSelectableProfileService();
SelectableProfileService.getExecutableProcess = mock;
let profiles = await SelectableProfileService.getAllProfiles();
Assert.equal(profiles.length, 1, "Only 1 profile exists before deleting");
let profile = profiles[0];
Assert.equal(
SelectableProfileService.groupToolkitProfile.rootDir.path,
profile.path,
"The group toolkit profile path should be the path of the original profile"
);
await SelectableProfileService.setShowProfileSelectorWindow(true);
Assert.ok(
SelectableProfileService.groupToolkitProfile.showProfileSelector,
"Show profile selector is enabled"
);
await SelectableProfileService.deleteCurrentProfile();
await updateNotified();
profiles = await SelectableProfileService.getAllProfiles();
Assert.equal(profiles.length, 1, "Only 1 profile exists after deleting");
profile = profiles[0];
let expectedRunwArgs;
if (Services.appinfo.OS == "Darwin") {
expectedRunwArgs = [
"-foreground",
"--profile",
profile.path,
"-url",
"about:newprofile",
];
} else {
expectedRunwArgs = ["--profile", profile.path, "-url", "about:newprofile"];
}
Assert.deepEqual(expectedRunwArgs, input[1], "Expected runw arguments");
Assert.equal(
SelectableProfileService.groupToolkitProfile.rootDir.path,
profile.path,
"The group toolkit profile path should be the path of the newly created profile"
);
Assert.ok(
!SelectableProfileService.groupToolkitProfile.showProfileSelector,
"Show profile selector is disabled"
);
});

View file

@ -6,6 +6,8 @@ prefs = [
"browser.profiles.enabled=true",
]
["test_delete_last_profile.js"]
["test_fail_recover_storeID.js"]
["test_recover_storeID.js"]

View file

@ -6,7 +6,8 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
UrlbarSearchUtils: "resource:///modules/UrlbarSearchUtils.sys.mjs",
});

View file

@ -5,9 +5,10 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
});
/**

View file

@ -5,15 +5,18 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
Region: "resource://gre/modules/Region.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
SERPCategorization: "resource:///modules/SERPCategorization.sys.mjs",
SERPCategorizationRecorder: "resource:///modules/SERPCategorization.sys.mjs",
SERPCategorization:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPCategorizationRecorder:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPCategorizationEventScheduler:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
// Exported for tests.

View file

@ -15,7 +15,8 @@ ChromeUtils.defineLazyGetter(lazy, "SearchUIUtilsL10n", () => {
});
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
CustomizableUI: "resource:///modules/CustomizableUI.sys.mjs",

View file

@ -2,23 +2,45 @@
* 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/. */
/* import-globals-from ../main.js */
let gAddEngineDialog = {
_form: null,
_name: null,
_alias: null,
loadedResolvers: Promise.withResolvers(),
onLoad() {
document.mozSubdialogReady = this.init();
try {
this.init();
} finally {
this.loadedResolvers.resolve();
}
},
async init() {
init() {
this._dialog = document.querySelector("dialog");
this._form = document.getElementById("addEngineForm");
this._name = document.getElementById("engineName");
this._alias = document.getElementById("engineAlias");
// These arguments only exist if this dialog was opened via
// "Add Search Engine" in the context menu.
if (window.arguments?.[0]) {
let { uri, formData, charset, method, icon } = window.arguments[0];
this._formData = formData;
this._charset = charset;
this._method = method;
this._icon = icon;
this._uri = uri.spec;
this._name.value = uri.host;
this.onFormInput();
document.getElementById("engineUrlLabel").remove();
document.getElementById("engineUrl").remove();
document.getElementById("suggestUrlLabel").remove();
document.getElementById("suggestUrl").remove();
}
this._name.addEventListener("input", this.onNameInput.bind(this));
this._alias.addEventListener("input", this.onAliasInput.bind(this));
this._form.addEventListener("input", this.onFormInput.bind(this));
@ -26,22 +48,29 @@ let gAddEngineDialog = {
document.addEventListener("dialogaccept", this.onAddEngine.bind(this));
},
async onAddEngine() {
let url = document
.getElementById("engineUrl")
.value.replace(/%s/, "{searchTerms}");
onAddEngine() {
let url =
this._uri ||
document.getElementById("engineUrl").value.replace(/%s/, "{searchTerms}");
let suggestUrl = document
.getElementById("suggestUrl")
.value.replace(/%s/, "{searchTerms}");
await Services.search.addUserEngine({
name: this._name.value,
?.value.replace(/%s/, "{searchTerms}");
Services.search.addUserEngine({
url,
name: this._name.value,
alias: this._alias.value,
// The values below may be undefined.
formData: this._formData,
charset: this._charset,
method: this._method,
icon: this._icon,
suggestUrl,
});
},
async onNameInput() {
onNameInput() {
if (this._name.value) {
let engine = Services.search.getEngineByName(this._name.value);
let validity = engine
@ -56,13 +85,13 @@ let gAddEngineDialog = {
if (this._alias.value) {
let engine = await Services.search.getEngineByAlias(this._alias.value);
if (engine) {
engine = document.getElementById("engineAliasExists").textContent;
validity = document.getElementById("engineAliasExists").textContent;
}
}
this._alias.setCustomValidity(validity);
},
async onFormInput() {
onFormInput() {
this._dialog.setAttribute(
"buttondisabledaccept",
!this._form.checkValidity()
@ -70,4 +99,6 @@ let gAddEngineDialog = {
},
};
document.mozSubdialogReady = gAddEngineDialog.loadedResolvers.promise;
window.addEventListener("load", () => gAddEngineDialog.onLoad());

View file

@ -8,7 +8,7 @@
<window
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
xmlns:html="http://www.w3.org/1999/xhtml"
data-l10n-id="add-engine-window2"
data-l10n-id="add-engine-window"
data-l10n-attrs="title, style"
persist="width height"
>
@ -22,20 +22,14 @@
<html:link rel="stylesheet" href="chrome://global/skin/global.css" />
<html:link
rel="stylesheet"
href="chrome://browser/content/preferences/dialogs/addEngine.css"
/>
<html:link
rel="stylesheet"
href="chrome://browser/skin/preferences/preferences.css"
href="chrome://browser/content/search/addEngine.css"
/>
<html:link rel="localization" href="browser/preferences/addEngine.ftl" />
<html:link rel="localization" href="preview/enUS-searchFeatures.ftl" />
<html:link rel="localization" href="browser/search.ftl" />
</linkset>
<script src="chrome://browser/content/preferences/dialogs/addEngine.js" />
<script src="chrome://global/content/globalOverlay.js" />
<script src="chrome://browser/content/utilityOverlay.js" />
<script src="chrome://browser/content/search/addEngine.js" />
<separator class="thin" />
@ -64,7 +58,7 @@
id="engineUrl"
type="url"
required="required"
pattern=".*%s.*"
pattern="https?:.*%s.*"
/>
</hbox>
@ -74,18 +68,18 @@
data-l10n-id="add-engine-suggest-url"
/>
<hbox>
<html:input id="suggestUrl" type="url" pattern=".*%s.*" />
<html:input id="suggestUrl" type="url" pattern="https?:.*%s.*" />
</hbox>
<html:span
id="engineAliasExists"
hidden="hidden"
data-l10n-id="engine-alias-exists"
data-l10n-id="engine-keyword-exists"
/>
<html:label
id="engineAliasLabel"
for="engineAlias"
data-l10n-id="add-engine-alias"
data-l10n-id="add-engine-keyword"
/>
<hbox>
<html:input id="engineAlias" type="text" />

View file

@ -8,9 +8,9 @@
{
ChromeUtils.defineESModuleGetters(this, {
BrowserSearchTelemetry:
"resource:///modules/BrowserSearchTelemetry.sys.mjs",
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
SearchOneOffs: "resource:///modules/SearchOneOffs.sys.mjs",
SearchOneOffs: "moz-src:///browser/components/search/SearchOneOffs.sys.mjs",
});
/**

View file

@ -13,7 +13,7 @@
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry:
"resource:///modules/BrowserSearchTelemetry.sys.mjs",
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
FormHistory: "resource://gre/modules/FormHistory.sys.mjs",
SearchSuggestionController:

View file

@ -3,6 +3,9 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
browser.jar:
content/browser/search/addEngine.css (content/addEngine.css)
content/browser/search/addEngine.js (content/addEngine.js)
content/browser/search/addEngine.xhtml (content/addEngine.xhtml)
content/browser/search/autocomplete-popup.js (content/autocomplete-popup.js)
content/browser/search/searchbar.js (content/searchbar.js)
content/browser/contentSearchUI.js (content/contentSearchUI.js)

View file

@ -4,7 +4,7 @@
# 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/.
EXTRA_JS_MODULES += [
MOZ_SRC_FILES += [
"BrowserSearchTelemetry.sys.mjs",
"OpenSearchManager.sys.mjs",
"SearchOneOffs.sys.mjs",

View file

@ -6,6 +6,7 @@ support-files = [
"discovery.html",
"head.js",
"opensearch.html",
"test_windows1252.html",
"test.html",
"testEngine.xml",
"testEngine_diacritics.xml",
@ -20,6 +21,9 @@ support-files = ["test.html", "discovery.html", "426329.xml"]
["browser_addKeywordSearch.js"]
["browser_addSearchEngineFromForm.js"]
support-files = ["test.html", "test_windows1252.html"]
["browser_contentContextMenu.js"]
support-files = ["browser_contentContextMenu.xhtml"]

View file

@ -0,0 +1,202 @@
/* Any copyright is dedicated to the Public Domain.
https://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const TESTS = [
{
action: "/search",
method: "GET",
charset: "UTF-8",
fields: [
{ name: "q", value: "Some initial value", main: true },
{ name: "utf8✓", value: "✓", hidden: true },
],
submission: "kitten",
expected: "https://example.org/search?q=kitten&utf8%E2%9C%93=%E2%9C%93",
},
{
action: "/search",
method: "POST",
charset: "UTF-8",
fields: [
{ name: "q", value: "Some initial value", main: true },
{ name: "utf8✓", value: "✓", hidden: true },
],
submission: "kitten",
expected: "https://example.org/search",
expectedPost: "q=kitten&utf8%E2%9C%93=%E2%9C%93",
},
{
action: "/search",
method: "GET",
charset: "windows-1252",
fields: [
{ name: "q", main: true },
{ name: "cb", checked: true, value: "true", type: "checkbox" },
{ name: "cb2", checked: false, value: "true", type: "checkbox" },
],
submission: "caff\u00E8+",
expected: "https://example.org/search?q=caff%E8%2B&cb=true",
},
{
action: "/search",
method: "POST",
charset: "windows-1252",
fields: [
{ name: "q", main: true },
{ name: "foo", value: "bar" },
],
submission: "caff\u00E8+",
expected: "https://example.org/search",
expectedPost: "q=caff%E8%2B&foo=bar",
},
];
const URL_UTF_8 =
"https://example.org/browser/browser/components/search/test/browser/test.html";
const URL_WINDOWS1252 =
"https://example.org/browser/browser/components/search/test/browser/test_windows1252.html";
add_setup(async function () {
await SpecialPowers.pushPrefEnv({
set: [["browser.urlbar.update2.engineAliasRefresh", true]],
});
});
async function addEngine(browser, selector, name, alias) {
let contextMenu = document.getElementById("contentAreaContextMenu");
let addEngineItem = document.getElementById("context-add-engine");
let contextMenuPromise = BrowserTestUtils.waitForEvent(
contextMenu,
"popupshown"
);
info("Opening context menu.");
await BrowserTestUtils.synthesizeMouseAtCenter(
selector,
{ type: "contextmenu", button: 2 },
browser
);
await contextMenuPromise;
let dialogLoaded = TestUtils.topicObserved("subdialog-loaded");
info("Clicking add engine.");
contextMenu.activateItem(addEngineItem);
let [dialogWin] = await dialogLoaded;
await window.gDialogBox.dialog._dialogReady;
info("Dialog opened.");
fillTextField("engineName", name, dialogWin);
fillTextField("engineAlias", alias, dialogWin);
info("Saving engine.");
let promiseAdded = SearchTestUtils.promiseSearchNotification(
SearchUtils.MODIFIED_TYPE.ADDED,
SearchUtils.TOPIC_ENGINE_MODIFIED
);
EventUtils.synthesizeKey("VK_RETURN", {}, dialogWin);
await window.gDialogBox.dialog._closingPromise;
await promiseAdded;
return Services.search.getEngineByName(name);
}
async function createForm({ action, method, fields }) {
let doc = content.document;
doc.querySelector("form")?.remove();
let form = doc.createElement("form");
form.method = method;
form.action = action;
for (let fieldInfo of fields) {
let input = doc.createElement("input");
input.value = fieldInfo.value ?? "";
input.type = fieldInfo.type ?? "text";
if (fieldInfo.checked) {
input.checked = "true";
}
input.name = fieldInfo.name;
if (fieldInfo.main) {
input.id = "mainInput";
}
if (fieldInfo.hidden) {
input.hidden = true;
}
form.appendChild(input);
}
doc.body.appendChild(form);
}
async function navigateToCharset(charset) {
if (charset.toUpperCase() == "UTF-8") {
let browserLoadedPromise = BrowserTestUtils.browserLoaded(
gBrowser,
false,
URL_UTF_8
);
BrowserTestUtils.startLoadingURIString(gBrowser, URL_UTF_8);
await browserLoadedPromise;
} else if (charset.toLowerCase() == "windows-1252") {
let browserLoadedPromise = BrowserTestUtils.browserLoaded(
gBrowser,
false,
URL_WINDOWS1252
);
BrowserTestUtils.startLoadingURIString(gBrowser, URL_WINDOWS1252);
await browserLoadedPromise;
} else {
throw new Error();
}
}
add_task(async function () {
let tab = await BrowserTestUtils.openNewForegroundTab(gBrowser);
let browser = tab.linkedBrowser;
for (let args of TESTS) {
await navigateToCharset(args.charset);
await SpecialPowers.spawn(browser, [args], createForm);
let engine = await addEngine(browser, "#mainInput", "My Engine", "alias");
Assert.ok(!!engine, "Engine was installed.");
Assert.equal(
engine.id,
(await Services.search.getEngineByAlias("alias"))?.id,
"Engine has correct alias."
);
Assert.equal(engine.wrappedJSObject.queryCharset, args.charset);
let submission = engine.getSubmission(args.submission);
Assert.equal(
submission.uri.spec,
args.expected,
"Submission URI is correct"
);
Assert.equal(
decodePostData(submission.postData, args.charset),
args.expectedPost,
"Submission post data is correct."
);
await Services.search.removeEngine(engine);
}
// Let the dialog fully close.
await new Promise(r => setTimeout(r));
BrowserTestUtils.removeTab(gBrowser.selectedTab);
});
function decodePostData(postData, charset) {
if (!postData) {
return undefined;
}
const binaryStream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
Ci.nsIBinaryInputStream
);
binaryStream.setInputStream(postData);
const available = binaryStream.available();
const buffer = new ArrayBuffer(available);
binaryStream.readArrayBuffer(available, buffer);
return new TextDecoder(charset).decode(buffer);
}

View file

@ -4,7 +4,8 @@
/* eslint-disable mozilla/no-arbitrary-setTimeout */
ChromeUtils.defineESModuleGetters(this, {
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
});
// Bug 1588193 - BrowserTestUtils.waitForContentEvent now resolves slightly

View file

@ -4,7 +4,8 @@
// a limited number of add-engine items will be shown in the searchbar.
ChromeUtils.defineESModuleGetters(this, {
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
});
const searchPopup = document.getElementById("PopupSearchAutoComplete");

View file

@ -131,3 +131,25 @@ function clearSearchbarHistory() {
registerCleanupFunction(async () => {
await PlacesUtils.history.clear();
});
/**
* Fills a text field ensuring to cause expected edit events.
*
* @param {string} id
* id of the text field
* @param {string} text
* text to fill in
* @param {object} win
* dialog window
*/
function fillTextField(id, text, win) {
let elt = win.document.getElementById(id);
elt.focus();
elt.select();
EventUtils.synthesizeKey("a", { metaKey: true }, win);
EventUtils.synthesizeKey("KEY_Backspace", {}, win);
for (let c of text.split("")) {
EventUtils.synthesizeKey(c, {}, win);
}
}

View file

@ -9,7 +9,8 @@ const TELEMETRY_PREF =
"browser.search.serpEventTelemetryCategorization.enabled";
ChromeUtils.defineESModuleGetters(lazy, {
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
XPCOMUtils.defineLazyPreferenceGetter(

View file

@ -10,11 +10,14 @@
*/
ChromeUtils.defineESModuleGetters(this, {
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
ExperimentAPI: "resource://nimbus/ExperimentAPI.sys.mjs",
ExperimentFakes: "resource://testing-common/NimbusTestUtils.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SERPCategorizationRecorder: "resource:///modules/SERPCategorization.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SERPCategorizationRecorder:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -11,8 +11,9 @@
ChromeUtils.defineESModuleGetters(this, {
TELEMETRY_CATEGORIZATION_DOWNLOAD_SETTINGS:
"resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
});

View file

@ -13,13 +13,17 @@
requestLongerTimeout(2);
ChromeUtils.defineESModuleGetters(this, {
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
DomainToCategoriesStore: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
DomainToCategoriesStore:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SERPCategorizationRecorder: "resource:///modules/SERPCategorization.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SERPCategorizationRecorder:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
TELEMETRY_CATEGORIZATION_KEY:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -8,8 +8,10 @@
*/
ChromeUtils.defineESModuleGetters(this, {
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -12,7 +12,7 @@
ChromeUtils.defineESModuleGetters(this, {
SERPCategorizationEventScheduler:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -9,11 +9,12 @@
*/
ChromeUtils.defineESModuleGetters(this, {
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPCategorizationEventScheduler:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
TELEMETRY_CATEGORIZATION_KEY:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -12,15 +12,18 @@
requestLongerTimeout(5);
ChromeUtils.defineESModuleGetters(this, {
ADLINK_CHECK_TIMEOUT_MS: "resource:///modules/SearchSERPTelemetry.sys.mjs",
ADLINK_CHECK_TIMEOUT_MS:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
SEARCH_TELEMETRY_SHARED: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SEARCH_TELEMETRY_SHARED:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchSERPCategorization:
"resource:///modules/SearchSERPCategorization.sys.mjs",
SearchSERPDomainToCategoriesMap:
"resource:///modules/SearchSERPTelemetry.sys.mjs",
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
TELEMETRY_SETTINGS_KEY: "resource:///modules/SearchSERPTelemetry.sys.mjs",
TELEMETRY_SETTINGS_KEY:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -12,7 +12,7 @@
"use strict";
ChromeUtils.defineESModuleGetters(this, {
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
});
const TEST_PROVIDER_INFO = [

View file

@ -4,24 +4,31 @@
ChromeUtils.defineESModuleGetters(this, {
ADLINK_CHECK_TIMEOUT_MS:
"resource:///actors/SearchSERPTelemetryChild.sys.mjs",
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
CustomizableUITestUtils:
"resource://testing-common/CustomizableUITestUtils.sys.mjs",
Region: "resource://gre/modules/Region.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
SEARCH_TELEMETRY_SHARED: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetryUtils: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SEARCH_TELEMETRY_SHARED:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetryUtils:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchTestUtils: "resource://testing-common/SearchTestUtils.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
SERPCategorizationRecorder: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
SERPCategorizationRecorder:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
SPA_ADLINK_CHECK_TIMEOUT_MS:
"resource:///modules/SearchSERPTelemetry.sys.mjs",
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
TELEMETRY_CATEGORIZATION_KEY:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs",
VISIBILITY_THRESHOLD: "resource:///actors/SearchSERPTelemetryChild.sys.mjs",
});

View file

@ -0,0 +1,8 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="windows-1252" />
<title>An Interesting Website</title>
</head>
<body></body>
</html>

View file

@ -46,7 +46,7 @@ class TestPingSubmitted(MarionetteTestCase):
# Record an event for the ping to eventually submit.
self.marionette.execute_script(
"""
const { SERPCategorizationRecorder } = ChromeUtils.importESModule("resource:///modules/SERPCategorization.sys.mjs");
const { SERPCategorizationRecorder } = ChromeUtils.importESModule("moz-src:///browser/components/search/SERPCategorization.sys.mjs");
SERPCategorizationRecorder.recordCategorizationTelemetry({
organic_category: "3",
organic_num_domains: "1",

View file

@ -7,8 +7,10 @@
*/
ChromeUtils.defineESModuleGetters(this, {
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
DomainToCategoriesStore: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
DomainToCategoriesStore:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
Sqlite: "resource://gre/modules/Sqlite.sys.mjs",
});

View file

@ -9,9 +9,12 @@
"use strict";
ChromeUtils.defineESModuleGetters(this, {
SERPCategorization: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS: "resource:///modules/SERPCategorization.sys.mjs",
SERPCategorization:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
CATEGORIZATION_SETTINGS:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
ChromeUtils.defineLazyGetter(this, "gCryptoHash", () => {

View file

@ -8,7 +8,8 @@
"use strict";
ChromeUtils.defineESModuleGetters(this, {
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
add_task(async function record_matches_region() {

View file

@ -10,10 +10,12 @@
ChromeUtils.defineESModuleGetters(this, {
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
Region: "resource://gre/modules/Region.sys.mjs",
SERPCategorization: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
SERPCategorization:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
TELEMETRY_CATEGORIZATION_KEY:
"resource:///modules/SERPCategorization.sys.mjs",
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
TestUtils: "resource://testing-common/TestUtils.sys.mjs",
});

View file

@ -9,7 +9,8 @@
ChromeUtils.defineESModuleGetters(this, {
Region: "resource://gre/modules/Region.sys.mjs",
SERPDomainToCategoriesMap: "resource:///modules/SERPCategorization.sys.mjs",
SERPDomainToCategoriesMap:
"moz-src:///browser/components/search/SERPCategorization.sys.mjs",
});
// For the tests, domains aren't checked, but add at least one value so the

View file

@ -7,7 +7,8 @@
*/
ChromeUtils.defineESModuleGetters(this, {
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
});
const TESTS = [

View file

@ -6,7 +6,8 @@
ChromeUtils.defineESModuleGetters(this, {
AppConstants: "resource://gre/modules/AppConstants.sys.mjs",
RemoteSettings: "resource://services-settings/remote-settings.sys.mjs",
TELEMETRY_SETTINGS_KEY: "resource:///modules/SearchSERPTelemetry.sys.mjs",
TELEMETRY_SETTINGS_KEY:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
JsonSchema: "resource://gre/modules/JsonSchema.sys.mjs",
SearchEngineSelector: "resource://gre/modules/SearchEngineSelector.sys.mjs",
});

View file

@ -2,9 +2,11 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
ChromeUtils.defineESModuleGetters(this, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
NetUtil: "resource://gre/modules/NetUtil.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
});

View file

@ -2,10 +2,13 @@
http://creativecommons.org/publicdomain/zero/1.0/ */
ChromeUtils.defineESModuleGetters(this, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
NetUtil: "resource://gre/modules/NetUtil.sys.mjs",
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetryUtils: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetryUtils:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
TelemetryTestUtils: "resource://testing-common/TelemetryTestUtils.sys.mjs",
sinon: "resource://testing-common/Sinon.sys.mjs",
});

View file

@ -48,7 +48,7 @@ export const SUGGEST_OTHER_TABS_METHODS = {
export const DIM_REDUCTION_METHODS = {};
const MISSING_ANCHOR_IN_CLUSTER_PENALTY = 0.2;
const NEAREST_NEIGHBOR_DEFAULT_THRESHOLD = 0.225;
const NEAREST_NEIGHBOR_DEFAULT_THRESHOLD = 0.2;
const DISSIMILAR_TAB_LABEL = "None";
const MAX_NN_GROUPED_TABS = 4;

View file

@ -2919,8 +2919,14 @@
* An optional argument that accepts a single tab, which, if passed, will
* cause the group to be inserted just before this tab in the tab strip. By
* default, the group will be created at the end of the tab strip.
* @param {boolean} [options.showCreateUI]
* Set this to true to show the post-creation group edtior.
* @param {boolean} [options.isUserCreated]
* Should be true if this group is being created in response to an
* explicit request from the user (as opposed to a group being created
* for technical reasons, such as when an already existing group
* switches windows).
* Causes the group create UI to be displayed and telemetry events to be fired.
* @param {string} [options.telemetryUserCreateSource]
* The means by which the tab group was created. Defaults to "unknown".
*/
addTabGroup(
tabs,
@ -2929,7 +2935,8 @@
color = null,
label = "",
insertBefore = null,
showCreateUI = false,
isUserCreated = false,
telemetryUserCreateSource = "unknown",
} = {}
) {
if (!tabs?.length) {
@ -2975,10 +2982,19 @@
group.dispatchEvent(
new CustomEvent("TabGroupCreate", {
bubbles: true,
detail: { showCreateUI },
detail: { isUserCreated },
})
);
if (isUserCreated) {
Glean.browserEngagement.tabGroupCreate.record({
id,
layout: this.tabContainer.verticalMode ? "vertical" : "horizontal",
source: telemetryUserCreateSource,
tabs: group.tabs.length,
});
}
return group;
}
@ -6704,7 +6720,7 @@
break;
}
case "TabGroupCreate":
if (aEvent.detail.showCreateUI) {
if (aEvent.detail.isUserCreated) {
this.tabGroupMenu.openCreateModal(aEvent.target);
}
break;
@ -8449,7 +8465,7 @@ var TabContextMenu = {
if (gBrowser._tabGroupsEnabled) {
let groupableTabs = this.contextTabs.filter(t => !t.pinned);
let selectedGroupCount = new Set(
// the filter is necessary to remove the "null" group
// The filter removes the "null" group for ungrouped tabs.
groupableTabs.map(t => t.group).filter(g => g)
).size;
@ -8461,14 +8477,13 @@ var TabContextMenu = {
// Determine whether or not the "current" tab group should appear in the
// "move tab to group" context menu.
let groupToFilter;
if (selectedGroupCount == 1) {
groupToFilter = groupableTabs[0].group;
}
if (groupToFilter) {
availableGroupsToMoveTo = availableGroupsToMoveTo.filter(
group => group !== groupToFilter
);
let groupToFilter = groupableTabs[0].group;
if (groupToFilter && groupableTabs.every(t => t.group)) {
availableGroupsToMoveTo = availableGroupsToMoveTo.filter(
group => group !== groupToFilter
);
}
}
contextMoveTabToGroup.disabled = !groupableTabs.length;
@ -8845,7 +8860,8 @@ var TabContextMenu = {
moveTabsToNewGroup() {
gBrowser.addTabGroup(this.contextTabs, {
insertBefore: this.contextTab,
showCreateUI: true,
isUserCreated: true,
telemetryUserCreateSource: "tab_menu",
});
// When using the tab context menu to create a group from the all tabs

View file

@ -7,13 +7,6 @@
// This is loaded into chrome windows with the subscript loader. Wrap in
// a block to prevent accidentally leaking globals onto `window`.
{
const lazy = {};
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"smartTabGroupsEnabled",
"browser.tabs.groups.smart.enabled"
);
const { TabStateFlusher } = ChromeUtils.importESModule(
"resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
);
@ -31,6 +24,8 @@
"red",
];
static AI_ICON = "chrome://global/skin/icons/highlights.svg";
static headerSection = /*html*/ `
<html:div class="panel-header">
<html:h1
@ -304,6 +299,14 @@
constructor() {
super();
this.smartTabGroupsEnabled = false;
XPCOMUtils.defineLazyPreferenceGetter(
this,
"smartTabGroupsEnabled",
"browser.tabs.groups.smart.enabled",
false,
this.#onSmartTabGroupsPrefChange.bind(this)
);
}
connectedCallback() {
@ -403,10 +406,14 @@
this.#swatchesContainer.addEventListener("change", this);
}
#onSmartTabGroupsPrefChange(_preName, _prev, latest) {
const icon = latest ? MozTabbrowserTabGroupMenu.AI_ICON : "";
this.#suggestionButton.iconSrc = icon;
this.#suggestionsMessage.iconSrc = icon;
}
#initSuggestions() {
const AI_ICON = lazy.smartTabGroupsEnabled
? "chrome://global/skin/icons/highlights.svg"
: "";
const { SmartTabGroupingManager } = ChromeUtils.importESModule(
"moz-src:///browser/components/tabbrowser/SmartTabGrouping.sys.mjs"
);
@ -416,7 +423,9 @@
this.#suggestionButton = this.querySelector(
"#tab-group-suggestion-button"
);
this.#suggestionButton.iconSrc = AI_ICON;
this.#suggestionButton.iconSrc = this.smartTabGroupsEnabled
? MozTabbrowserTabGroupMenu.AI_ICON
: "";
this.#suggestionButton.addEventListener("click", () => {
this.#handleSmartSuggest();
});
@ -441,7 +450,9 @@
this.#suggestionsMessage = this.querySelector(
"#tab-group-suggestions-message"
);
this.#suggestionsMessage.iconSrc = AI_ICON;
this.#suggestionsMessage.iconSrc = this.smartTabGroupsEnabled
? MozTabbrowserTabGroupMenu.AI_ICON
: "";
this.#suggestionsDisclaimer = this.querySelector(
"#tab-group-suggestions-disclaimer"
);
@ -580,7 +591,7 @@
openCreateModal(group) {
this.activeGroup = group;
this.createMode = true;
this.suggestionState = lazy.smartTabGroupsEnabled
this.suggestionState = this.smartTabGroupsEnabled
? MozTabbrowserTabGroupMenu.State.CREATE_AI_INITIAL
: MozTabbrowserTabGroupMenu.State.CREATE_STANDARD_INITIAL;
@ -614,7 +625,7 @@
openEditModal(group) {
this.activeGroup = group;
this.createMode = false;
this.suggestionState = lazy.smartTabGroupsEnabled
this.suggestionState = this.smartTabGroupsEnabled
? MozTabbrowserTabGroupMenu.State.EDIT_AI_INITIAL
: MozTabbrowserTabGroupMenu.State.EDIT_STANDARD_INITIAL;
@ -810,7 +821,7 @@
* @param {string} action "save" or "cancel"
*/
#handleMlTelemetry(action) {
if (!lazy.smartTabGroupsEnabled) {
if (!this.smartTabGroupsEnabled) {
return;
}
if (this.#suggestedMlLabel) {

View file

@ -1154,8 +1154,9 @@
: [dropElement, ...movingTabs];
gBrowser.addTabGroup(tabsInGroup, {
insertBefore: dropElement,
showCreateUI: true,
isUserCreated: true,
color: draggedTab._dragData.tabGroupCreationColor,
telemetryUserCreateSource: "drag",
});
} else {
moveTabs();
@ -2241,7 +2242,11 @@
newIndex++;
}
if (newIndex < 0 || newIndex == oldIndex) {
if (newIndex < 0) {
newIndex = oldIndex;
}
if (newIndex == dragData.animDropIndex) {
return;
}
dragData.animDropIndex = newIndex;

View file

@ -79,6 +79,35 @@ browser.engagement:
type: quantity
expires: never
tab_group_create:
type: event
description: >
Recorded when the user creates a new tab group via
the tab context menu or through drag and drop.
notification_emails:
- dao@mozilla.com
- jswinarton@mozilla.com
bugs:
- https://bugzil.la/1938423
data_reviews:
- https://bugzil.la/1938423
data_sensitivity:
- interaction
extra_keys:
source:
description: The means by which the tab group was created
type: string
tabs:
description: The number of tabs in the group when it was created
type: quantity
layout:
description: The layout of the tab strip when the group was created (either "horizontal" or "vertical")
type: string
id:
description: The ID of the created tab group
type: string
expires: never
browser.ui.interaction:
all_tabs_panel_dragstart_tab_event_count:
type: counter

View file

@ -10,7 +10,7 @@ async function openCreatePanel(tabgroupPanel, tab) {
let panelShown = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "shown");
gBrowser.addTabGroup([tab], {
color: "cyan",
showCreateUI: true,
isUserCreated: true,
});
await panelShown;
}

View file

@ -1326,8 +1326,32 @@ add_task(
);
});
let ungroupedTab = BrowserTestUtils.addTab(gBrowser, "about:blank", {
skipAnimation: true,
});
EventUtils.synthesizeMouseAtCenter(
ungroupedTab,
{ ctrlKey: true, metaKey: true },
window
);
await withTabMenu(tabsToSelect[2], async (_, moveTabToGroupItem) => {
const submenu = moveTabToGroupItem.querySelector(
"#context_moveTabToGroupPopupMenu"
).children;
const tabGroupIds = Array.from(submenu).map(item =>
item.getAttribute("tab-group-id")
);
Assert.ok(
tabGroupIds.includes(selectedTabGroup.getAttribute("id")),
"group with selected tabs is in context menu list since one of the selected tabs is ungrouped"
);
});
await removeTabGroup(selectedTabGroup);
await removeTabGroup(otherGroup);
BrowserTestUtils.removeTab(ungroupedTab);
}
);
@ -1645,7 +1669,7 @@ add_task(async function test_tabGroupCreatePanel() {
group = gBrowser.addTabGroup([tab], {
color: "cyan",
label: "Food",
showCreateUI: true,
isUserCreated: true,
});
await panelShown;
};

View file

@ -222,16 +222,16 @@ add_task(async function promptStoresImpressionAndDisableTimestamps() {
);
const now = Math.floor(Date.now() / 1000);
const oneHourInMs = 60 * 60 * 1000;
const oneHourInS = 60 * 60;
Assert.ok(
impressionTimestamp &&
now - parseInt(impressionTimestamp, 10) <= oneHourInMs,
now - parseInt(impressionTimestamp, 10) <= oneHourInS,
"Prompt impression timestamp is stored"
);
Assert.ok(
disabledTimestamp && now - parseInt(disabledTimestamp, 10) <= oneHourInMs,
disabledTimestamp && now - parseInt(disabledTimestamp, 10) <= oneHourInS,
"Selecting checkbox stores timestamp of when user disabled the prompt"
);
});

View file

@ -14,7 +14,8 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
OpenSearchEngine: "resource://gre/modules/OpenSearchEngine.sys.mjs",
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
loadAndParseOpenSearchEngine:
"resource://gre/modules/OpenSearchLoader.sys.mjs",
PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs",

View file

@ -5,10 +5,11 @@
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
OpenSearchManager: "resource:///modules/OpenSearchManager.sys.mjs",
OpenSearchManager:
"moz-src:///browser/components/search/OpenSearchManager.sys.mjs",
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs",
UrlbarSearchUtils: "resource:///modules/UrlbarSearchUtils.sys.mjs",
UrlbarUtils: "resource:///modules/UrlbarUtils.sys.mjs",

View file

@ -7,7 +7,8 @@ import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs",
UrlbarProvidersManager: "resource:///modules/UrlbarProvidersManager.sys.mjs",
UrlbarTokenizer: "resource:///modules/UrlbarTokenizer.sys.mjs",

View file

@ -10,7 +10,8 @@ const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
ASRouter: "resource:///modules/asrouter/ASRouter.sys.mjs",
BrowserSearchTelemetry: "resource:///modules/BrowserSearchTelemetry.sys.mjs",
BrowserSearchTelemetry:
"moz-src:///browser/components/search/BrowserSearchTelemetry.sys.mjs",
BrowserUIUtils: "resource:///modules/BrowserUIUtils.sys.mjs",
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
CustomizableUI: "resource:///modules/CustomizableUI.sys.mjs",
@ -19,9 +20,9 @@ ChromeUtils.defineESModuleGetters(lazy, {
ObjectUtils: "resource://gre/modules/ObjectUtils.sys.mjs",
PartnerLinkAttribution: "resource:///modules/PartnerLinkAttribution.sys.mjs",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs",
ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs",
ReaderMode: "moz-src:///toolkit/components/reader/ReaderMode.sys.mjs",
SearchModeSwitcher: "resource:///modules/SearchModeSwitcher.sys.mjs",
SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs",
SearchUIUtils: "moz-src:///browser/components/search/SearchUIUtils.sys.mjs",
SearchUtils: "resource://gre/modules/SearchUtils.sys.mjs",
UrlbarController: "resource:///modules/UrlbarController.sys.mjs",
UrlbarEventBufferer: "resource:///modules/UrlbarEventBufferer.sys.mjs",
@ -2125,12 +2126,9 @@ export class UrlbarInput {
}
startLayoutExtend() {
// Do not expand if:
// The Urlbar does not support being expanded or it is already expanded
if (
!this.hasAttribute("breakout") ||
this.hasAttribute("breakout-extend")
) {
if (!this.#allowBreakout || this.hasAttribute("breakout-extend")) {
// Do not expand if the Urlbar does not support being expanded or it is
// already expanded.
return;
}
if (!this.view.isOpen) {

View file

@ -2,7 +2,7 @@
* 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/. */
import { SearchOneOffs } from "resource:///modules/SearchOneOffs.sys.mjs";
import { SearchOneOffs } from "moz-src:///browser/components/search/SearchOneOffs.sys.mjs";
const lazy = {};

View file

@ -15,7 +15,8 @@ const SCALAR_SEARCHMODE = "browser.engagement.navigation.urlbar_searchmode";
const SUGGEST_URLBAR_PREF = "browser.urlbar.suggest.searches";
ChromeUtils.defineESModuleGetters(this, {
SearchSERPTelemetry: "resource:///modules/SearchSERPTelemetry.sys.mjs",
SearchSERPTelemetry:
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs",
});
function searchInAwesomebar(value, win = window) {

View file

@ -4,7 +4,7 @@
"use strict";
const { SearchSERPTelemetry } = ChromeUtils.importESModule(
"resource:///modules/SearchSERPTelemetry.sys.mjs"
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs"
);
const TEST_PROVIDER_INFO = [

View file

@ -9,7 +9,7 @@
"use strict";
const { SearchSERPTelemetry } = ChromeUtils.importESModule(
"resource:///modules/SearchSERPTelemetry.sys.mjs"
"moz-src:///browser/components/search/SearchSERPTelemetry.sys.mjs"
);
const SCALAR_URLBAR_PERSISTED =

View file

@ -16,8 +16,6 @@ add_task(async function () {
variables: {
pagesNumSampledVisits:
"places.frecency.pages.alternative.numSampledVisits",
pagesNumInteractions:
"places.frecency.pages.alternative.interactions.numInteractions",
pagesMaxVisitGap:
"places.frecency.pages.alternative.interactions.maxVisitGapSeconds",
pagesViewTimeSeconds:

View file

@ -0,0 +1,25 @@
# 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/.
browser.jar:
% resource newtab %builtin-addons contentaccessible=yes
% content newtab %content/builtin-addons contentaccessible=yes
builtin-addons/newtab/manifest.json (./manifest.json)
builtin-addons/newtab/chrome.manifest (./chrome.manifest)
builtin-addons/newtab/webext-glue/background.js (./webext-glue/background.js)
builtin-addons/newtab/webext-glue/schema.json (./webext-glue/schema.json)
builtin-addons/newtab/webext-glue/resource-mapping.js (./webext-glue/resource-mapping.js)
builtin-addons/newtab/lib/ (./lib/*)
builtin-addons/newtab/common/ (./common/*)
* builtin-addons/newtab/data/content/abouthomecache/page.html.template (./data/content/abouthomecache/page.html.template)
* builtin-addons/newtab/data/content/abouthomecache/script.js.template (./data/content/abouthomecache/script.js.template)
builtin-addons/newtab/data/data/content/assets/ (./data/content/assets/*)
builtin-addons/newtab/data/content/activity-stream.bundle.js (./data/content/activity-stream.bundle.js)
builtin-addons/newtab/data/content/newtab-render.js (./data/content/newtab-render.js)
builtin-addons/newtab/data/css/activity-stream.css (./css/activity-stream.css)
builtin-addons/newtab/prerendered/activity-stream.html (./prerendered/activity-stream.html)
#ifndef RELEASE_OR_BETA
builtin-addons/newtab/prerendered/activity-stream-debug.html (./prerendered/activity-stream-debug.html)
#endif
builtin-addons/newtab/prerendered/activity-stream-noscripts.html (./prerendered/activity-stream-noscripts.html)

View file

@ -0,0 +1 @@
content newtab data/content contentaccessible=yes

Some files were not shown because too many files have changed in this diff Show more