Update On Wed Apr 2 20:54:28 CEST 2025

This commit is contained in:
github-action[bot] 2025-04-02 20:54:29 +02:00
parent c2daad41dd
commit b8ea620731
2825 changed files with 58980 additions and 36938 deletions

View file

@ -22,4 +22,4 @@
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
# don't change CLOBBER for WebIDL changes any more.
Merge day clobber 2025-03-31
Modified build files in third_party/libwebrtc - Bug 1952339 - Vendor libwebrtc from a416f1c7a9

52
Cargo.lock generated
View file

@ -642,6 +642,26 @@ version = "3.15.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa"
[[package]]
name = "bytemuck"
version = "1.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
dependencies = [
"bytemuck_derive",
]
[[package]]
name = "bytemuck_derive"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "byteorder"
version = "1.5.0"
@ -929,12 +949,13 @@ dependencies = [
[[package]]
name = "codespan-reporting"
version = "0.11.1"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
dependencies = [
"serde",
"termcolor",
"unicode-width 0.1.999",
"unicode-width 0.2.0",
]
[[package]]
@ -4507,7 +4528,7 @@ checksum = "a2983372caf4480544083767bf2d27defafe32af49ab4df3a0b7fc90793a3664"
[[package]]
name = "naga"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"arrayvec",
"bit-set",
@ -4524,7 +4545,6 @@ dependencies = [
"serde",
"spirv",
"strum",
"termcolor",
"thiserror 2.0.9",
"unicode-ident",
]
@ -4649,6 +4669,7 @@ dependencies = [
"nserror",
"nsstring",
"qlog",
"static_assertions",
"static_prefs",
"thin-vec",
"uuid",
@ -5562,14 +5583,15 @@ dependencies = [
[[package]]
name = "ron"
version = "0.8.1"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
checksum = "63f3aa105dea217ef30d89581b65a4d527a19afc95ef5750be3890e8d3c5b837"
dependencies = [
"base64 0.21.999",
"base64 0.22.1",
"bitflags 2.9.0",
"serde",
"serde_derive",
"unicode-ident",
]
[[package]]
@ -7386,11 +7408,13 @@ dependencies = [
[[package]]
name = "wgpu-core"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"arrayvec",
"bit-set",
"bit-vec",
"bitflags 2.9.0",
"bytemuck",
"cfg_aliases",
"document-features",
"hashbrown 0.14.5",
@ -7414,7 +7438,7 @@ dependencies = [
[[package]]
name = "wgpu-core-deps-apple"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"wgpu-hal",
]
@ -7422,7 +7446,7 @@ dependencies = [
[[package]]
name = "wgpu-core-deps-windows-linux-android"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"wgpu-hal",
]
@ -7430,7 +7454,7 @@ dependencies = [
[[package]]
name = "wgpu-hal"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"android_system_properties",
"arrayvec",
@ -7438,6 +7462,7 @@ dependencies = [
"bit-set",
"bitflags 2.9.0",
"block",
"bytemuck",
"cfg_aliases",
"core-graphics-types 0.1.999",
"gpu-alloc",
@ -7465,9 +7490,10 @@ dependencies = [
[[package]]
name = "wgpu-types"
version = "24.0.0"
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
dependencies = [
"bitflags 2.9.0",
"bytemuck",
"js-sys",
"log",
"serde",

View file

@ -182,6 +182,17 @@ class AccAttributes {
return nullptr;
}
template <typename T>
const T* GetAttributeWeakPtr(nsAtom* aAttrName) const {
if (auto value = mData.Lookup(aAttrName)) {
if (value->is<RefPtr<T>>()) {
const T* ref = value->as<RefPtr<T>>();
return ref;
}
}
return nullptr;
}
template <typename T>
Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const {
static_assert(std::is_same_v<nsTArray<int32_t>, T> ||

View file

@ -1544,10 +1544,10 @@ already_AddRefed<AccAttributes> RemoteAccessible::DefaultTextAttributes() {
return result.forget();
}
RefPtr<const AccAttributes> RemoteAccessible::GetCachedARIAAttributes() const {
const AccAttributes* RemoteAccessible::GetCachedARIAAttributes() const {
ASSERT_DOMAINS_ACTIVE(CacheDomain::ARIA);
if (mCachedFields) {
auto attrs = mCachedFields->GetAttributeRefPtr<AccAttributes>(
auto attrs = mCachedFields->GetAttributeWeakPtr<AccAttributes>(
CacheKey::ARIAAttributes);
VERIFY_CACHE(CacheDomain::ARIA);
return attrs;
@ -1845,7 +1845,7 @@ void RemoteAccessible::LiveRegionAttributes(nsAString* aLive,
if (!mCachedFields) {
return;
}
RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes();
auto attrs = GetCachedARIAAttributes();
if (!attrs) {
return;
}
@ -2329,7 +2329,7 @@ Maybe<int32_t> RemoteAccessible::GetIntARIAAttr(nsAtom* aAttrName) const {
if (RequestDomainsIfInactive(CacheDomain::ARIA)) {
return Nothing();
}
if (RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes()) {
if (auto attrs = GetCachedARIAAttributes()) {
if (auto val = attrs->GetAttribute<int32_t>(aAttrName)) {
return val;
}

View file

@ -354,7 +354,7 @@ class RemoteAccessible : public Accessible, public HyperTextAccessibleBase {
Maybe<const nsTArray<int32_t>&> GetCachedTextLines();
nsRect GetCachedCharRect(int32_t aOffset);
RefPtr<const AccAttributes> GetCachedTextAttributes();
RefPtr<const AccAttributes> GetCachedARIAAttributes() const;
const AccAttributes* GetCachedARIAAttributes() const;
nsString GetCachedHTMLNameAttribute() const;

View file

@ -565,16 +565,18 @@ function prompt(aActor, aBrowser, aRequest) {
}
const reqAudioOutput = !!audioOutputDevices.length;
const isFile = principal.schemeIs("file");
const stringId = getPromptMessageId(
reqVideoInput,
reqAudioInput,
reqAudioOutput,
!!aRequest.secondOrigin
!!aRequest.secondOrigin,
isFile
);
let message;
let originToShow;
if (principal.schemeIs("file")) {
message = localization.formatValueSync(stringId + "-with-file");
if (isFile) {
message = localization.formatValueSync(stringId);
originToShow = null;
} else {
message = localization.formatValueSync(stringId, {
@ -1333,63 +1335,101 @@ function prompt(aActor, aBrowser, aRequest) {
* @param {"AudioCapture" | "Microphone" | null} reqAudioInput
* @param {boolean} reqAudioOutput
* @param {boolean} delegation - Is the access delegated to a third party?
* @param {boolean} isFile - Is the request coming from a file?
* @returns {string} Localization message identifier
*/
function getPromptMessageId(
reqVideoInput,
reqAudioInput,
reqAudioOutput,
delegation
delegation,
isFile
) {
switch (reqVideoInput) {
case "Camera":
switch (reqAudioInput) {
case "Microphone":
return delegation
? "webrtc-allow-share-camera-and-microphone-unsafe-delegation"
: "webrtc-allow-share-camera-and-microphone";
if (isFile) {
return "webrtc-allow-share-camera-and-microphone-with-file";
}
if (delegation) {
return "webrtc-allow-share-camera-and-microphone-unsafe-delegation";
}
return "webrtc-allow-share-camera-and-microphone";
case "AudioCapture":
return delegation
? "webrtc-allow-share-camera-and-audio-capture-unsafe-delegation"
: "webrtc-allow-share-camera-and-audio-capture";
if (isFile) {
return "webrtc-allow-share-camera-and-audio-capture-with-file";
}
if (delegation) {
return "webrtc-allow-share-camera-and-audio-capture-unsafe-delegation";
}
return "webrtc-allow-share-camera-and-audio-capture";
default:
return delegation
? "webrtc-allow-share-camera-unsafe-delegation"
: "webrtc-allow-share-camera";
if (isFile) {
return "webrtc-allow-share-camera-with-file";
}
if (delegation) {
return "webrtc-allow-share-camera-unsafe-delegation";
}
return "webrtc-allow-share-camera";
}
case "Screen":
switch (reqAudioInput) {
case "Microphone":
return delegation
? "webrtc-allow-share-screen-and-microphone-unsafe-delegation"
: "webrtc-allow-share-screen-and-microphone";
if (isFile) {
return "webrtc-allow-share-screen-and-microphone-with-file";
}
if (delegation) {
return "webrtc-allow-share-screen-and-microphone-unsafe-delegation";
}
return "webrtc-allow-share-screen-and-microphone";
case "AudioCapture":
return delegation
? "webrtc-allow-share-screen-and-audio-capture-unsafe-delegation"
: "webrtc-allow-share-screen-and-audio-capture";
if (isFile) {
return "webrtc-allow-share-screen-and-audio-capture-with-file";
}
if (delegation) {
return "webrtc-allow-share-screen-and-audio-capture-unsafe-delegation";
}
return "webrtc-allow-share-screen-and-audio-capture";
default:
return delegation
? "webrtc-allow-share-screen-unsafe-delegation"
: "webrtc-allow-share-screen";
if (isFile) {
return "webrtc-allow-share-screen-with-file";
}
if (delegation) {
return "webrtc-allow-share-screen-unsafe-delegation";
}
return "webrtc-allow-share-screen";
}
default:
switch (reqAudioInput) {
case "Microphone":
return delegation
? "webrtc-allow-share-microphone-unsafe-delegation"
: "webrtc-allow-share-microphone";
if (isFile) {
return "webrtc-allow-share-microphone-with-file";
}
if (delegation) {
return "webrtc-allow-share-microphone-unsafe-delegation";
}
return "webrtc-allow-share-microphone";
case "AudioCapture":
return delegation
? "webrtc-allow-share-audio-capture-unsafe-delegation"
: "webrtc-allow-share-audio-capture";
if (isFile) {
return "webrtc-allow-share-audio-capture-with-file";
}
if (delegation) {
return "webrtc-allow-share-audio-capture-unsafe-delegation";
}
return "webrtc-allow-share-audio-capture";
default:
// This should be always true, if we've reached this far.
if (reqAudioOutput) {
return delegation
? "webrtc-allow-share-speaker-unsafe-delegation"
: "webrtc-allow-share-speaker";
if (isFile) {
return "webrtc-allow-share-speaker-with-file";
}
if (delegation) {
return "webrtc-allow-share-speaker-unsafe-delegation";
}
return "webrtc-allow-share-speaker";
}
return undefined;
}

View file

@ -377,6 +377,8 @@ pref("browser.warnOnQuit", true);
pref("browser.overlink-delay", 80);
pref("browser.taskbarTabs.enabled", false);
pref("browser.theme.colorway-closet", true);
#if defined(MOZ_WIDGET_GTK)
@ -2325,9 +2327,9 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
// Fingerprinting:
// "fp": fingerprinting blocking enabled
// "-fp": fingerprinting blocking disabled
// Cryptomining:
// "cm": cryptomining blocking enabled
// "-cm": cryptomining blocking disabled
// Cryptomining Tracking Protection:
// "cryptoTP": cryptomining blocking enabled
// "-cryptoTP": cryptomining blocking disabled
// Social Tracking Protection:
// "stp": social tracking protection enabled
// "-stp": social tracking protection disabled
@ -2337,6 +2339,12 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
// Email Tracking Protection in private windows:
// "emailTPPrivate": email tracking protection in private windows enabled
// "-emailTPPrivate": email tracking protection in private windows disabled
// Consent Manager Skipping:
// "consentmanagerSkip": consent manager skipping enabled
// "-consentmanagerSkip": consent manager skipping disabled
// Consent Manager Skipping in private windows:
// "consentmanagerSkipPrivate": consent manager skipping in private windows enabled
// "-consentmanagerSkipPrivate": consent manager skipping in private windows disabled
// Level 2 Tracking list in normal windows:
// "lvl2": Level 2 tracking list enabled
// "-lvl2": Level 2 tracking list disabled
@ -2382,7 +2390,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,btp");
pref("browser.contentblocking.features.strict", "tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,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

@ -140,9 +140,6 @@ customElements.define(
this.textEl = this.querySelector("#addon-webext-perm-text");
this.introEl = this.querySelector("#addon-webext-perm-intro");
this.permsSingleEl = this.querySelector(
"#addon-webext-perm-single-entry"
);
this.permsListEl = this.querySelector("#addon-webext-perm-list");
this.render();
@ -154,15 +151,6 @@ customElements.define(
return !(showIncognitoCheckbox || strings.msgs.length);
}
get hasMultiplePermissionsEntries() {
const { strings, showIncognitoCheckbox } =
this.notification.options.customElementOptions;
return (
strings.msgs.length > 1 ||
(strings.msgs.length === 1 && showIncognitoCheckbox)
);
}
get domainsSet() {
if (!this.notification?.options?.customElementOptions) {
return undefined;
@ -187,7 +175,7 @@ customElements.define(
const { strings, showIncognitoCheckbox, isUserScriptsRequest } =
this.notification.options.customElementOptions;
const { textEl, introEl, permsSingleEl, permsListEl } = this;
const { textEl, introEl, permsListEl } = this;
const HTML_NS = "http://www.w3.org/1999/xhtml";
const doc = this.ownerDocument;
@ -218,37 +206,8 @@ customElements.define(
return;
}
// If there are multiple permissions entries to be shown,
// add to the list element one entry for each granted permission
// (and one for the private browsing checkbox, if it should
// be shown) and return earlier.
if (this.hasMultiplePermissionsEntries) {
for (let [idx, msg] of strings.msgs.entries()) {
let item = doc.createElementNS(HTML_NS, "li");
item.classList.add("webext-perm-granted");
if (
this.hasFullDomainsList &&
this.#isFullDomainsListEntryIndex(idx)
) {
item.append(this.#createFullDomainsListFragment(msg));
} else {
item.textContent = msg;
}
permsListEl.appendChild(item);
}
if (showIncognitoCheckbox) {
let item = doc.createElementNS(HTML_NS, "li");
item.classList.add(
"webext-perm-optional",
"webext-perm-privatebrowsing"
);
item.appendChild(this.#createPrivateBrowsingCheckbox());
permsListEl.appendChild(item);
}
permsListEl.hidden = false;
return;
}
// We only expect a single permission for a userScripts request per
// https://searchfox.org/mozilla-central/rev/5fb48bf50516ed2529d533e5dfe49b4752efb8b8/browser/modules/ExtensionsUI.sys.mjs#308-313.
if (isUserScriptsRequest) {
// The "userScripts" permission cannot be granted until the user has
// confirmed again in the notification's content, as described at
@ -262,32 +221,37 @@ customElements.define(
this.#setAllowButtonEnabled(false);
permsSingleEl.append(checkboxEl, warningEl);
permsSingleEl.classList.add("webext-perm-optional");
permsSingleEl.hidden = false;
return;
}
// Render a single permission entry, which will be either:
// - an entry for the private browsing checkbox
// - or single granted permission entry.
if (showIncognitoCheckbox) {
permsSingleEl.appendChild(this.#createPrivateBrowsingCheckbox());
permsSingleEl.hidden = false;
permsSingleEl.classList.add(
"webext-perm-optional",
"webext-perm-privatebrowsing"
);
return;
}
const msg = strings.msgs[0];
if (this.hasFullDomainsList && this.#isFullDomainsListEntryIndex(0)) {
permsSingleEl.append(this.#createFullDomainsListFragment(msg));
let item = doc.createElementNS(HTML_NS, "li");
item.append(checkboxEl, warningEl);
item.classList.add("webext-perm-optional");
permsListEl.append(item);
} else {
permsSingleEl.textContent = msg;
for (let [idx, msg] of strings.msgs.entries()) {
let item = doc.createElementNS(HTML_NS, "li");
item.classList.add("webext-perm-granted");
if (
this.hasFullDomainsList &&
this.#isFullDomainsListEntryIndex(idx)
) {
item.append(this.#createFullDomainsListFragment(msg));
} else {
item.textContent = msg;
}
permsListEl.appendChild(item);
}
if (showIncognitoCheckbox) {
let item = doc.createElementNS(HTML_NS, "li");
item.classList.add(
"webext-perm-optional",
"webext-perm-privatebrowsing"
);
item.appendChild(this.#createPrivateBrowsingCheckbox());
permsListEl.appendChild(item);
}
}
permsSingleEl.hidden = false;
permsListEl.hidden = false;
}
#createFullDomainsListFragment(msg) {
@ -317,7 +281,7 @@ customElements.define(
}
#clearChildElements() {
const { textEl, introEl, permsSingleEl, permsListEl } = this;
const { textEl, introEl, permsListEl } = this;
// Clear all changes to the child elements that may have been changed
// by a previous call of the render method.
@ -328,13 +292,6 @@ customElements.define(
introEl.textContent = "";
introEl.hidden = true;
permsSingleEl.textContent = "";
permsSingleEl.hidden = true;
permsSingleEl.classList.remove(
"webext-perm-optional",
"webext-perm-privatebrowsing"
);
permsListEl.textContent = "";
permsListEl.hidden = true;
}

View file

@ -11,7 +11,6 @@
<stringbundleset id="stringbundleset">
<stringbundle id="bundle_brand" src="chrome://branding/locale/brand.properties"/>
<stringbundle id="bundle_shell" src="chrome://browser/locale/shellservice.properties"/>
</stringbundleset>
<!-- The event listeners are defined by _initCommandSet in browser-init.js -->

View file

@ -88,7 +88,7 @@ ChromeUtils.defineESModuleGetters(this, {
TabCrashHandler: "resource:///modules/ContentCrashHandlers.sys.mjs",
TabsSetupFlowManager:
"resource:///modules/firefox-view-tabs-setup-manager.sys.mjs",
TaskbarTabUI: "resource:///modules/TaskbarTabUI.sys.mjs",
TaskbarTabUI: "resource:///modules/taskbartabs/TaskbarTabUI.sys.mjs",
TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs",
ToolbarContextMenu: "resource:///modules/ToolbarContextMenu.sys.mjs",
ToolbarDropHandler: "resource:///modules/ToolbarDropHandler.sys.mjs",

View file

@ -30,7 +30,11 @@
data-l10n-sync="true">
<head>
<!-- CSP might be disabled by C++ code. -->
#if defined(EARLY_BETA_OR_EARLIER)
<meta http-equiv="Content-Security-Policy" content="script-src chrome: moz-src: resource: 'report-sample'" />
#else
<meta http-equiv="Content-Security-Policy" content="script-src-attr 'none' 'report-sample'" />
#endif
<!-- The "global.css" stylesheet is imported first to allow other stylesheets to
override rules using selectors with the same specificity. This applies to
@ -101,6 +105,7 @@
<link rel="localization" href="preview/onboarding.ftl"/>
<link rel="localization" href="preview/smartTabGroups.ftl"/>
<link rel="localization" href="preview/tabUnload.ftl"/>
<link rel="localization" href="preview/taskbartabs.ftl"/>
<title data-l10n-id="browser-main-window-default-title"></title>

View file

@ -382,6 +382,13 @@
<image id="picture-in-picture-button-icon"
class="urlbar-icon"/>
</hbox>
<hbox id="taskbar-tabs-button"
class="urlbar-page-action"
role="button"
data-l10n-id="taskbar-tab-urlbar-button-open"
hidden="true">
<image class="urlbar-icon"/>
</hbox>
<hbox id="translations-button"
class="urlbar-page-action"
role="button"

View file

@ -198,7 +198,8 @@ document.addEventListener(
#tracking-protection-icon-container,
#identity-icon-box,
#identity-permission-box,
#translations-button
#translations-button,
#taskbar-tabs-button
`);
if (!element) {
return;

View file

@ -119,7 +119,6 @@
<popupnotificationcontent class="addon-webext-perm-notification-content" orient="vertical">
<description id="addon-webext-perm-text" class="addon-webext-perm-text"/>
<label id="addon-webext-perm-intro" class="addon-webext-perm-text"/>
<label id="addon-webext-perm-single-entry" class="addon-webext-perm-single-entry"/>
<html:ul id="addon-webext-perm-list" class="addon-webext-perm-list"/>
</popupnotificationcontent>
</popupnotification>

View file

@ -53,7 +53,7 @@ function onExtra1() {
showResetDialog();
}
function onLoad() {
window.addEventListener("load", () => {
const dialog = document.getElementById("safeModeDialog");
if (appStartup.automaticSafeModeNecessary) {
document.getElementById("autoSafeMode").hidden = false;
@ -72,4 +72,4 @@ function onLoad() {
document.addEventListener("dialogaccept", onDefaultButton);
document.addEventListener("dialogcancel", onCancel);
document.addEventListener("dialogextra1", onExtra1);
}
});

View file

@ -4,12 +4,13 @@
- 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/. -->
<?csp default-src chrome: resource:; style-src chrome: 'unsafe-inline'; ?>
<window
xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
data-l10n-id="troubleshoot-mode-window"
data-l10n-attrs="title,style"
onload="onLoad()"
>
<dialog
id="safeModeDialog"

View file

@ -23,8 +23,8 @@ add_setup(async function () {
"social-tracking.example.org",
],
// Whitelist trackertest.org loaded by default in trackingPage.html
["urlclassifier.trackingSkipURLs", "trackertest.org"],
["urlclassifier.trackingAnnotationSkipURLs", "trackertest.org"],
["urlclassifier.trackingSkipURLs", "*://trackertest.org/*"],
["urlclassifier.trackingAnnotationSkipURLs", "*://trackertest.org/*"],
["privacy.trackingprotection.enabled", false],
["privacy.trackingprotection.annotate_channels", true],
],

View file

@ -25,8 +25,8 @@ add_setup(async function () {
["privacy.trackingprotection.fingerprinting.enabled", true],
["privacy.socialtracking.block_cookies.enabled", true],
// Allowlist trackertest.org loaded by default in trackingPage.html
["urlclassifier.trackingSkipURLs", "trackertest.org"],
["urlclassifier.trackingAnnotationSkipURLs", "trackertest.org"],
["urlclassifier.trackingSkipURLs", "*://trackertest.org/*"],
["urlclassifier.trackingAnnotationSkipURLs", "*://trackertest.org/*"],
// Additional denylisted hosts.
[
"urlclassifier.trackingAnnotationTable.testEntries",

View file

@ -273,6 +273,10 @@ add_task(async function test_sideloading() {
[["webext-perms-host-description-all-urls"]],
kSideloaded
);
ok(
panel.querySelector(".webext-perm-privatebrowsing checkbox"),
"Expect incognito checkbox in sideload prompt"
);
// Accept the permissions
panel.button.click();

View file

@ -141,11 +141,14 @@ async function backgroundUpdateTest(url, id, checkIconFn) {
// The original extension has 1 promptable permission and the new one
// has 2 (history and <all_urls>) plus 1 non-promptable permission (cookies).
// So we should only see the 1 new promptable permission in the notification.
let singlePermissionEl = document.getElementById(
"addon-webext-perm-single-entry"
let permissionsListEl = document.getElementById("addon-webext-perm-list");
ok(!permissionsListEl.hidden, "Permissions list is visible");
ok(permissionsListEl.textContent, "Permissions list contains text");
is(
permissionsListEl.childElementCount,
1,
"Expect only 1 permission entry in the Permissions list"
);
ok(!singlePermissionEl.hidden, "Single permission entry is not hidden");
ok(singlePermissionEl.textContent, "Single permission entry text is set");
// Cancel the update.
panel.secondaryButton.click();

View file

@ -227,7 +227,6 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
let icon = panel.getAttribute("icon");
let learnMoreLink = panel.querySelector(".popup-notification-learnmore-link");
let ul = document.getElementById("addon-webext-perm-list");
let singleDataEl = document.getElementById("addon-webext-perm-single-entry");
if (checkIcon instanceof RegExp) {
ok(
@ -254,8 +253,8 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
ok(description.startsWith(exp.at(0)), "Description is the expected one");
ok(description.endsWith(exp.at(-1)), "Description is the expected one");
const hasPBCheckbox = !!(
singleDataEl.querySelector("checkbox") || ul.querySelector("checkbox")
const hasPBCheckbox = !!ul.querySelector(
"li.webext-perm-privatebrowsing > checkbox"
);
is(
@ -266,21 +265,12 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
if (!permissions.length && !hasPBCheckbox) {
ok(ul.hidden, "Permissions list is hidden");
ok(singleDataEl.hidden, "Expect a single permission entry to be hidden");
} else if (!permissions.length) {
ok(ul.hidden, "Permissions list is hidden");
ok(
!singleDataEl.hidden,
"Expect a single permission entry for the private browsing checkbox to not be hidden"
);
ok(
singleDataEl.querySelector("checkbox"),
"Expect a checkbox inside the single permission entry"
);
ok(singleDataEl.textContent, "Single entry text content should not empty");
is(ul.childElementCount, 0, "Permission list should have no entries");
ok(!ul.hidden, "Permissions list is visible");
ok(hasPBCheckbox, "Expect a checkbox inside the list of permissions");
is(ul.childElementCount, 1, "Permission list should have an entry");
} else if (permissions.length === 1 && hasPBCheckbox) {
ok(!ul.hidden, "Permissions list to not be hidden");
ok(!ul.hidden, "Permissions list is visible");
is(ul.childElementCount, 2, "Expect 2 entries in the permissions list");
is(
ul.children[0].textContent,
@ -296,16 +286,8 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
lastEntry.querySelector("checkbox"),
"Expect a checkbox inside the last permissions list entry"
);
} else if (permissions.length === 1 && !hasPBCheckbox) {
ok(ul.hidden, "Permissions list to be hidden");
ok(!ul.childElementCount, "Permission list has no entries");
} else {
ok(singleDataEl.hidden, "Single permission data entry is hidden");
ok(
!singleDataEl.textContent,
"Single permission data label has not been set"
);
ok(!ul.hidden, "Permissions list to not be hidden");
ok(!ul.hidden, "Permissions list is visible");
for (let i in permissions) {
let [key, param] = permissions[i];
const expected = formatExtValue(key, param);

View file

@ -540,8 +540,9 @@ const WebRTCIndicator = {
toggleEl.checked
);
Services.ppmm.sharedData.flush();
let l10nId =
"webrtc-microphone-" + (toggleEl.checked ? "muted" : "unmuted");
let l10nId = toggleEl.checked
? "webrtc-microphone-muted"
: "webrtc-microphone-unmuted";
document.l10n.setAttributes(toggleEl, l10nId);
},
@ -557,7 +558,9 @@ const WebRTCIndicator = {
toggleCameraMute(toggleEl) {
Services.ppmm.sharedData.set("WebRTC:GlobalCameraMute", toggleEl.checked);
Services.ppmm.sharedData.flush();
let l10nId = "webrtc-camera-" + (toggleEl.checked ? "muted" : "unmuted");
let l10nId = toggleEl.checked
? "webrtc-camera-muted"
: "webrtc-camera-unmuted";
document.l10n.setAttributes(toggleEl, l10nId);
},

View file

@ -33,6 +33,7 @@ category browser-window-delayed-startup moz-src:///browser/components/search/Sea
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
category browser-window-delayed-startup resource:///modules/taskbartabs/TaskbarTabs.sys.mjs TaskbarTabs.init
# App startup consumers
category browser-idle-startup resource:///modules/PlacesUIUtils.sys.mjs PlacesUIUtils.unblockToolbars

View file

@ -324,43 +324,8 @@ function openBrowserWindow(
}
if (isStartup) {
let win = Services.wm.getMostRecentWindow("navigator:blank");
let win = gBrowserContentHandler.replaceStartupWindow(args, forcePrivate);
if (win) {
// Remove the windowtype of our blank window so that we don't close it
// later on when seeing cmdLine.preventDefault is true.
win.document.documentElement.removeAttribute("windowtype");
if (forcePrivate) {
win.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing =
true;
if (
AppConstants.platform == "win" &&
Services.prefs.getBoolPref(
"browser.privateWindowSeparation.enabled",
true
)
) {
lazy.WinTaskbar.setGroupIdForWindow(
win,
lazy.WinTaskbar.defaultPrivateGroupId
);
lazy.WindowsUIUtils.setWindowIconFromExe(
win,
Services.dirsvc.get("XREExeF", Ci.nsIFile).path,
// This corresponds to the definitions in
// nsNativeAppSupportWin.h
PRIVATE_BROWSING_ICON_INDEX
);
}
}
let openTime = win.openTime;
win.location = AppConstants.BROWSER_CHROME_URL;
win.arguments = args; // <-- needs to be a plain JS array here.
ChromeUtils.addProfilerMarker("earlyBlankWindowVisible", openTime);
lazy.BrowserWindowTracker.registerOpeningWindow(win, forcePrivate);
return win;
}
}
@ -1178,6 +1143,52 @@ nsBrowserContentHandler.prototype = {
request.cancel(Cr.NS_BINDING_ABORTED);
},
/**
* Replace the startup UI window created in BrowserGlue with an actual window
*/
replaceStartupWindow(args, forcePrivate) {
let win = Services.wm.getMostRecentWindow("navigator:blank");
if (win) {
// Remove the windowtype of our blank window so that we don't close it
// later on when seeing cmdLine.preventDefault is true.
win.document.documentElement.removeAttribute("windowtype");
if (forcePrivate) {
win.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing =
true;
if (
AppConstants.platform == "win" &&
Services.prefs.getBoolPref(
"browser.privateWindowSeparation.enabled",
true
)
) {
lazy.WinTaskbar.setGroupIdForWindow(
win,
lazy.WinTaskbar.defaultPrivateGroupId
);
lazy.WindowsUIUtils.setWindowIconFromExe(
win,
Services.dirsvc.get("XREExeF", Ci.nsIFile).path,
// This corresponds to the definitions in
// nsNativeAppSupportWin.h
PRIVATE_BROWSING_ICON_INDEX
);
}
}
let openTime = win.openTime;
win.location = AppConstants.BROWSER_CHROME_URL;
win.arguments = args; // <-- needs to be a plain JS array here.
ChromeUtils.addProfilerMarker("earlyBlankWindowVisible", openTime);
lazy.BrowserWindowTracker.registerOpeningWindow(win, forcePrivate);
return win;
}
return null;
},
/* nsICommandLineValidator */
validate: function bch_validate(cmdLine) {
var urlFlagIdx = cmdLine.findFlag("url", false);

View file

@ -4808,6 +4808,8 @@ var ContentBlockingCategoriesPrefs = {
"privacy.trackingprotection.cryptomining.enabled": null,
"privacy.trackingprotection.emailtracking.enabled": null,
"privacy.trackingprotection.emailtracking.pbmode.enabled": null,
"privacy.trackingprotection.consentmanager.skip.enabled": null,
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled": null,
"privacy.annotate_channels.strict_list.enabled": null,
"network.http.referer.disallowCrossSiteRelaxingDefault": null,
"network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation":
@ -4830,6 +4832,8 @@ var ContentBlockingCategoriesPrefs = {
"privacy.trackingprotection.cryptomining.enabled": null,
"privacy.trackingprotection.emailtracking.enabled": null,
"privacy.trackingprotection.emailtracking.pbmode.enabled": null,
"privacy.trackingprotection.consentmanager.skip.enabled": null,
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled": null,
"privacy.annotate_channels.strict_list.enabled": null,
"network.http.referer.disallowCrossSiteRelaxingDefault": null,
"network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation":
@ -4877,12 +4881,12 @@ var ContentBlockingCategoriesPrefs = {
"privacy.trackingprotection.fingerprinting.enabled"
] = false;
break;
case "cm":
case "cryptoTP":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.cryptomining.enabled"
] = true;
break;
case "-cm":
case "-cryptoTP":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.cryptomining.enabled"
] = false;
@ -4917,6 +4921,26 @@ var ContentBlockingCategoriesPrefs = {
"privacy.trackingprotection.emailtracking.pbmode.enabled"
] = false;
break;
case "consentmanagerSkip":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.consentmanager.skip.enabled"
] = true;
break;
case "-consentmanagerSkip":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.consentmanager.skip.enabled"
] = false;
break;
case "consentmanagerSkipPrivate":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled"
] = true;
break;
case "-consentmanagerSkipPrivate":
this.CATEGORY_PREFS[type][
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled"
] = false;
break;
case "lvl2":
this.CATEGORY_PREFS[type][
"privacy.annotate_channels.strict_list.enabled"

View file

@ -963,6 +963,55 @@ export const ASRouterTriggerListeners = new Map([
},
},
],
[
"tabGroupCollapsed",
{
id: "tabGroupCollapsed",
_initialized: false,
_triggerHandler: null,
// Number of times the user collapsed a tab group this session
_tabGroupsCollapsed: 0,
init(triggerHandler) {
this._triggerHandler = triggerHandler;
if (!this._initialized) {
lazy.EveryWindow.registerCallback(
this.id,
win => {
win.addEventListener("TabGroupCollapse", this);
},
win => {
win.removeEventListener("TabGroupCollapse", this);
}
);
this._initialized = true;
}
},
handleEvent(event) {
if (this._initialized) {
if (!event.target.ownerGlobal.gBrowser) {
return;
}
const { gBrowser } = event.target.ownerGlobal;
this._tabGroupsCollapsed++;
this._triggerHandler(gBrowser.selectedBrowser, {
id: this.id,
context: {
tabGroupsCollapsedCount: this._tabGroupsCollapsed,
},
});
}
},
uninit() {
if (this._initialized) {
lazy.EveryWindow.unregisterCallback(this.id);
this._initialized = false;
this._triggerHandler = null;
this._tabGroupsCollapsed = 0;
}
},
},
],
[
"activityAfterIdle",
{

View file

@ -656,282 +656,6 @@ const MESSAGES = () => {
},
skip_in_tests: "not tested in automation",
},
{
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
template: "feature_callout",
content: {
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
template: "multistage",
backdrop: "transparent",
transitions: false,
disableHistoryUpdates: true,
tour_pref_name:
"messaging-system-action.fakespot-opted-out-survey.progress",
tour_pref_default_value:
'{"screen":"FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_1","complete":false}',
screens: [
{
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_1",
force_hide_steps_indicator: true,
anchors: [
{
selector: "#shopping-sidebar-button",
panel_position: {
anchor_attachment: "bottomcenter",
callout_attachment: "topright",
},
no_open_on_anchor: true,
arrow_width: "22.62742",
},
],
content: {
position: "callout",
layout: "survey",
width: "332px",
padding: "20",
title: {
string_id: "shopping-survey-headline",
},
title_logo: {
imageURL: "chrome://branding/content/about-logo.png",
},
secondary_button: {
label: {
string_id: "shopping-survey-submit-button-label",
},
style: "primary",
action: {
type: "MULTI_ACTION",
collectSelect: true,
data: {
actions: [
{
type: "SET_PREF",
data: {
pref: {
name: "messaging-system-action.fakespot-opted-out-survey.progress",
value:
'{"screen":"FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_2","complete":false}',
},
},
},
],
},
},
disabled: "hasActiveMultiSelect",
},
dismiss_button: {
action: {
type: "MULTI_ACTION",
collectSelect: true,
data: {
actions: [
{
type: "BLOCK_MESSAGE",
data: {
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
},
},
{
type: "SET_PREF",
data: {
pref: {
name: "messaging-system-action.fakespot-opted-out-survey.progress",
},
},
},
],
},
dismiss: true,
},
label: {
string_id: "shopping-onboarding-dialog-close-button",
},
size: "small",
},
tiles: {
type: "multiselect",
style: {
flexDirection: "column",
alignItems: "flex-start",
},
label: {
string_id: "shopping-survey-opted-out-multiselect-label",
},
data: [
{
id: "fakespot-opted-out-survey-hard-to-understand",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-hard-to-understand",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
randomize: true,
},
{
id: "fakespot-opted-out-survey-too-slow",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-too-slow",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
randomize: true,
},
{
id: "fakespot-opted-out-survey-not-accurate",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-not-accurate",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
randomize: true,
},
{
id: "fakespot-opted-out-survey-not-helpful",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-not-helpful",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
randomize: true,
},
{
id: "fakespot-opted-out-survey-check-reviews-myself",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-check-myself",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
randomize: true,
},
{
id: "fakespot-opted-out-survey-other",
type: "checkbox",
defaultValue: false,
label: {
string_id: "shopping-survey-opted-out-other",
},
icon: {
style: {
marginInline: "2px 8px",
},
},
group: "checkboxes",
},
],
},
},
},
{
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_2",
force_hide_steps_indicator: true,
anchors: [
{
selector: "#shopping-sidebar-button",
panel_position: {
anchor_attachment: "bottomcenter",
callout_attachment: "topright",
},
no_open_on_anchor: true,
arrow_width: "22.62742",
},
],
content: {
layout: "inline",
position: "callout",
title: {
string_id: "shopping-survey-thanks-title",
},
title_logo: {
imageURL:
"https://firefox-settings-attachments.cdn.mozilla.net/main-workspace/ms-images/706c7a85-cf23-442e-8a92-7ebc7f537375.svg",
},
dismiss_button: {
action: {
type: "SET_PREF",
data: {
pref: {
name: "messaging-system-action.fakespot-opted-out-survey.progress",
},
},
dismiss: true,
},
label: {
string_id: "shopping-onboarding-dialog-close-button",
},
size: "small",
},
page_event_listeners: [
{
params: {
type: "timeout",
options: {
once: true,
interval: 20000,
},
},
action: {
dismiss: true,
},
},
{
params: {
type: "tourend",
options: {
once: true,
},
},
action: {
type: "BLOCK_MESSAGE",
data: {
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
},
},
},
],
},
},
],
},
priority: 2,
targeting:
"'browser.shopping.experience2023.optedIn' | preferenceValue == 2 && !'browser.shopping.experience2023.active' | preferenceValue && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && !'browser.shopping.experience2023.integratedSidebar' | preferenceValue",
trigger: {
id: "preferenceObserver",
params: ["browser.shopping.experience2023.optedIn"],
},
skip_in_tests: "it's not tested in automation",
},
{
id: "ADDONS_STAFF_PICK_PT_2",
template: "feature_callout",

View file

@ -1,4 +1,3 @@
[DEFAULT]
skip-if = ["os == 'android'"]
["test_fxa_menu_message.html"]

View file

@ -3,7 +3,6 @@ prefs = [
"browser.backup.scheduled.enabled=false",
]
support-files = ["head.js"]
skip-if = ["os == 'android'"]
["test_backup_settings.html"]

View file

@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(this, {
MenuMessage: "resource:///modules/asrouter/MenuMessage.sys.mjs",
NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs",
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
updateZoomUI: "resource:///modules/ZoomUI.sys.mjs",
});
/**
@ -661,6 +662,7 @@ const PanelUI = {
let message = ASRouter.getMessageById(messageId);
ASRouter.addImpression(message);
}
updateZoomUI(gBrowser.selectedBrowser);
},
_onHelpViewShow() {

View file

@ -2,6 +2,11 @@
/* vim: set sts=2 sw=2 et tw=80: */
"use strict";
// Prevent intermittent TV job failure hit due to the entire test file
// taking longer than the default per-testfile timeout on macOS builds
// while running in chaos mode.
requestLongerTimeout(2);
async function runTests(options) {
async function background(getTests) {
let manifest = browser.runtime.getManifest();

View file

@ -242,7 +242,9 @@ add_task(async function testOptionalPermissionsDialogShowsFullDomainsList() {
domainsListLength: 1,
verifyDialog(popupContentEl) {
assertNoDomainsList(popupContentEl);
assertOneDomainPermission(popupContentEl.permsSingleEl);
// This will fail if there are other unexpected permission strings
// listed in the permissions list.
assertOneDomainPermission(popupContentEl.permsListEl);
},
},
{
@ -263,7 +265,7 @@ add_task(async function testOptionalPermissionsDialogShowsFullDomainsList() {
optional_permissions: [],
domainsListLength: 10,
verifyDialog(popupContentEl) {
const domainsListEl = popupContentEl.permsSingleEl.querySelector(
const domainsListEl = popupContentEl.permsListEl.querySelector(
".webext-perm-domains-list"
);
Assert.ok(domainsListEl, "Expect domains list element to be found");

View file

@ -3,6 +3,5 @@
["test_card_container.html"]
["test_fxview_search_textbox.html"]
skip-if = ["debug"]
["test_fxview_tab_list.html"]

View file

@ -12,8 +12,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
});
// TODO put in actual link probably same as labs bug 1951144
const FEEDBACK_LINK = "https://connect.mozilla.org/";
const FEEDBACK_LINK =
"https://connect.mozilla.org/t5/discussions/try-out-link-previews-on-firefox-labs/td-p/92012";
/**
* Class representing a link preview element.
@ -227,7 +227,7 @@ class LinkPreviewCard extends MozLitElement {
<p>
Key points are AI-generated and may have mistakes.
<a @click=${this.handleLink} href=${FEEDBACK_LINK}>
Foxfooding feedback
Share feedback
</a>
</p>
<p>

View file

@ -1,5 +1,4 @@
[DEFAULT]
skip-if = ["os == 'android'"]
support-files = ["../head-common.js"]
["test_migration_wizard.html"]

View file

@ -110,6 +110,15 @@ export var AboutHomeStartupCache = {
throw new Error("AboutHomeStartupCache already initted.");
}
if (
Services.startup.isInOrBeyondShutdownPhase(
Ci.nsIAppStartup.SHUTDOWN_PHASE_APPSHUTDOWNCONFIRMED
)
) {
// Stay not initted, such that using us will reject or be a no-op.
return;
}
this.setDeferredResult(this.CACHE_RESULT_SCALARS.UNSET);
this._enabled = Services.prefs.getBoolPref(
@ -181,7 +190,7 @@ export var AboutHomeStartupCache = {
await this.onShutdown();
};
lazy.AsyncShutdown.quitApplicationGranted.addBlocker(
lazy.AsyncShutdown.appShutdownConfirmed.addBlocker(
"AboutHomeStartupCache: Writing cache",
this._shutdownBlocker,
() => this._cacheProgress
@ -238,7 +247,7 @@ export var AboutHomeStartupCache = {
this._finalized = false;
this._firstPrivilegedProcessCreated = false;
lazy.AsyncShutdown.quitApplicationGranted.removeBlocker(
lazy.AsyncShutdown.appShutdownConfirmed.removeBlocker(
this._shutdownBlocker
);
this._shutdownBlocker = null;
@ -260,7 +269,7 @@ export var AboutHomeStartupCache = {
_cacheProgress: "Not yet begun",
/**
* Called by the AsyncShutdown blocker on quit-application-granted
* Called by the AsyncShutdown blocker on quit-application
* to potentially flush the most recent cache to disk. If one was
* never written during the session, one is generated and written
* before the async function resolves.
@ -377,6 +386,12 @@ export var AboutHomeStartupCache = {
*/
requestCache() {
this.log.trace("Parent is requesting Activity Stream state object.");
if (!this._initted) {
this.log.error("requestCache called despite not initted!");
return { pageInputStream: null, scriptInputStream: null };
}
if (!this._procManager) {
this.log.error("requestCache called with no _procManager!");
return { pageInputStream: null, scriptInputStream: null };

View file

@ -691,7 +691,7 @@ newtab:
description: >
position of section on newtab
type: string
is_secton_followed:
is_section_followed: &is_section_followed
description: >
If click belongs in a section, if that section is followed
type: boolean
@ -1407,10 +1407,7 @@ pocket:
description: >
If click belongs in a section, the numeric position of the section
type: string
is_secton_followed:
description: >
If click belongs in a section, if that section is followed
type: boolean
is_section_followed: *is_section_followed
send_in_pings:
- newtab
@ -1476,10 +1473,7 @@ pocket:
description: >
If click belongs in a section, the numeric position of the section
type: string
is_secton_followed:
description: >
If click belongs in a section, if that section is followed
type: boolean
is_section_followed: *is_section_followed
send_in_pings:
- newtab
@ -1521,10 +1515,7 @@ pocket:
description: >
If click belongs in a section, the numeric position of the section
type: string
is_secton_followed:
description: >
If click belongs in a section, if that section is followed
type: boolean
is_section_followed: *is_section_followed
send_in_pings:
- newtab
@ -1590,10 +1581,7 @@ pocket:
description: >
If click belongs in a section, the numeric position of the section
type: string
is_secton_followed:
description: >
If click belongs in a section, if that section is followed
type: boolean
is_section_followed: *is_section_followed
send_in_pings:
- newtab
@ -1736,10 +1724,7 @@ pocket:
description: >
If event belongs in a section, the numeric position of the section
type: string
is_secton_followed:
description: >
If event belongs in a section, if that section is followed
type: boolean
is_section_followed: *is_section_followed
send_in_pings:
- newtab

View file

@ -3837,9 +3837,10 @@ var gMainPane = {
switch (aFolder) {
case "Desktop":
return Services.dirsvc.get("Desk", Ci.nsIFile);
case "Downloads":
case "Downloads": {
let downloadsDir = await Downloads.getSystemDownloadsDirectory();
return new FileUtils.File(downloadsDir);
}
}
throw new Error(
"ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'"
@ -4004,8 +4005,17 @@ class HandlerListItem {
return;
}
const { id, args } = document.l10n.getAttributes(selectedItem);
const messageIDs = {
"applications-action-save": "applications-action-save-label",
"applications-always-ask": "applications-always-ask-label",
"applications-open-inapp": "applications-open-inapp-label",
"applications-use-app-default": "applications-use-app-default-label",
"applications-use-app": "applications-use-app-label",
"applications-use-os-default": "applications-use-os-default-label",
"applications-use-other": "applications-use-other-label",
};
localizeElement(this.node.querySelector(".actionDescription"), {
id: id + "-label",
id: messageIDs[id],
args,
});
localizeElement(this.node.querySelector(".actionsMenu"), { id, args });
@ -4126,12 +4136,12 @@ class HandlerInfoWrapper {
case Ci.nsIHandlerInfo.useSystemDefault:
return this.iconURLForSystemDefault;
case Ci.nsIHandlerInfo.useHelperApp:
case Ci.nsIHandlerInfo.useHelperApp: {
let preferredApp = this.preferredApplicationHandler;
if (gMainPane.isValidHandlerApp(preferredApp)) {
return gMainPane._getIconURLForHandlerApp(preferredApp);
}
}
// This should never happen, but if preferredAction is set to some weird
// value, then fall back to the generic application icon.
// Explicit fall-through

View file

@ -13,10 +13,14 @@ const NCBP_PREF = "network.cookie.cookieBehavior.pbmode";
const CAT_PREF = "browser.contentblocking.category";
const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled";
const STP_PREF = "privacy.trackingprotection.socialtracking.enabled";
const CM_PREF = "privacy.trackingprotection.cryptomining.enabled";
const CRYPTO_TP_PREF = "privacy.trackingprotection.cryptomining.enabled";
const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled";
const EMAIL_TP_PBM_PREF =
"privacy.trackingprotection.emailtracking.pbmode.enabled";
const CONSENTMANAGER_SKIP_PREF =
"privacy.trackingprotection.consentmanager.skip.enabled";
const CONSENTMANAGER_SKIP_PBM_PREF =
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled";
const LEVEL2_PREF = "privacy.annotate_channels.strict_list.enabled";
const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault";
const REFERRER_TOP_PREF =
@ -331,9 +335,11 @@ add_task(async function testContentBlockingStandardCategory() {
[NCBP_PREF]: null,
[FP_PREF]: null,
[STP_PREF]: null,
[CM_PREF]: null,
[CRYPTO_TP_PREF]: null,
[EMAIL_TP_PREF]: null,
[EMAIL_TP_PBM_PREF]: null,
[CONSENTMANAGER_SKIP_PREF]: null,
[CONSENTMANAGER_SKIP_PBM_PREF]: null,
[LEVEL2_PREF]: null,
[REFERRER_PREF]: null,
[REFERRER_TOP_PREF]: null,
@ -375,7 +381,10 @@ add_task(async function testContentBlockingStandardCategory() {
);
Services.prefs.setBoolPref(STP_PREF, !Services.prefs.getBoolPref(STP_PREF));
Services.prefs.setBoolPref(FP_PREF, !Services.prefs.getBoolPref(FP_PREF));
Services.prefs.setBoolPref(CM_PREF, !Services.prefs.getBoolPref(CM_PREF));
Services.prefs.setBoolPref(
CRYPTO_TP_PREF,
!Services.prefs.getBoolPref(CRYPTO_TP_PREF)
);
Services.prefs.setBoolPref(
EMAIL_TP_PREF,
!Services.prefs.getBoolPref(EMAIL_TP_PREF)
@ -384,6 +393,14 @@ add_task(async function testContentBlockingStandardCategory() {
EMAIL_TP_PBM_PREF,
!Services.prefs.getBoolPref(EMAIL_TP_PBM_PREF)
);
Services.prefs.setBoolPref(
CONSENTMANAGER_SKIP_PREF,
!Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF)
);
Services.prefs.setBoolPref(
CONSENTMANAGER_SKIP_PBM_PREF,
!Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF)
);
Services.prefs.setBoolPref(
LEVEL2_PREF,
!Services.prefs.getBoolPref(LEVEL2_PREF)
@ -480,6 +497,8 @@ add_task(async function testContentBlockingStrictCategory() {
Services.prefs.setBoolPref(TP_PBM_PREF, false);
Services.prefs.setBoolPref(EMAIL_TP_PREF, false);
Services.prefs.setBoolPref(EMAIL_TP_PBM_PREF, false);
Services.prefs.setBoolPref(CONSENTMANAGER_SKIP_PREF, false);
Services.prefs.setBoolPref(CONSENTMANAGER_SKIP_PBM_PREF, false);
Services.prefs.setBoolPref(LEVEL2_PREF, false);
Services.prefs.setBoolPref(REFERRER_PREF, false);
Services.prefs.setBoolPref(REFERRER_TOP_PREF, false);
@ -573,18 +592,18 @@ add_task(async function testContentBlockingStrictCategory() {
`${STP_PREF} has been set to false`
);
break;
case "cm":
case "cryptoTP":
is(
Services.prefs.getBoolPref(CM_PREF),
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
true,
`${CM_PREF} has been set to true`
`${CRYPTO_TP_PREF} has been set to true`
);
break;
case "-cm":
case "-cryptoTP":
is(
Services.prefs.getBoolPref(CM_PREF),
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
false,
`${CM_PREF} has been set to false`
`${CRYPTO_TP_PREF} has been set to false`
);
break;
case "emailTP":
@ -615,18 +634,46 @@ add_task(async function testContentBlockingStrictCategory() {
`${EMAIL_TP_PBM_PREF} has been set to false`
);
break;
case "consentmanagerSkip":
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
true,
`${CONSENTMANAGER_SKIP_PREF} has been set to true`
);
break;
case "-consentmanagerSkip":
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
false,
`${CONSENTMANAGER_SKIP_PREF} has been set to false`
);
break;
case "consentmanagerSkipPrivate":
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
true,
`${CONSENTMANAGER_SKIP_PBM_PREF} has been set to true`
);
break;
case "-consentmanagerSkipPrivate":
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
false,
`${CONSENTMANAGER_SKIP_PBM_PREF} has been set to false`
);
break;
case "lvl2":
is(
Services.prefs.getBoolPref(LEVEL2_PREF),
true,
`${CM_PREF} has been set to true`
`${CRYPTO_TP_PREF} has been set to true`
);
break;
case "-lvl2":
is(
Services.prefs.getBoolPref(LEVEL2_PREF),
false,
`${CM_PREF} has been set to false`
`${CRYPTO_TP_PREF} has been set to false`
);
break;
case "rp":
@ -857,7 +904,7 @@ add_task(async function testContentBlockingCustomCategory() {
NCBP_PREF,
FP_PREF,
STP_PREF,
CM_PREF,
CRYPTO_TP_PREF,
REFERRER_PREF,
REFERRER_TOP_PREF,
OCSP_PREF,
@ -906,7 +953,7 @@ add_task(async function testContentBlockingCustomCategory() {
for (let pref of [
FP_PREF,
STP_PREF,
CM_PREF,
CRYPTO_TP_PREF,
TP_PREF,
TP_PBM_PREF,
REFERRER_PREF,

View file

@ -13,11 +13,15 @@ const NCB_PREF = "network.cookie.cookieBehavior";
const NCBP_PREF = "network.cookie.cookieBehavior.pbmode";
const CAT_PREF = "browser.contentblocking.category";
const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled";
const CM_PREF = "privacy.trackingprotection.cryptomining.enabled";
const CRYPTO_TP_PREF = "privacy.trackingprotection.cryptomining.enabled";
const STP_PREF = "privacy.trackingprotection.socialtracking.enabled";
const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled";
const EMAIL_TP_PBM_PREF =
"privacy.trackingprotection.emailtracking.pbmode.enabled";
const CONSENTMANAGER_SKIP_PREF =
"privacy.trackingprotection.consentmanager.skip.enabled";
const CONSENTMANAGER_SKIP_PBM_PREF =
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled";
const LEVEL2_PREF = "privacy.annotate_channels.strict_list.enabled";
const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault";
const REFERRER_TOP_PREF =
@ -57,8 +61,8 @@ add_task(async function testContentBlockingStandardDefinition() {
`${FP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CM_PREF),
`${CM_PREF} pref has the default value`
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CRYPTO_TP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(STP_PREF),
@ -72,6 +76,14 @@ add_task(async function testContentBlockingStandardDefinition() {
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
`${EMAIL_TP_PBM_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PREF),
`${CONSENTMANAGER_SKIP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PBM_PREF),
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(NCB_PREF),
`${NCB_PREF} pref has the default value`
@ -125,10 +137,16 @@ add_task(async function testContentBlockingStandardDefinition() {
let originalTP = defaults.getBoolPref(TP_PREF);
let originalTPPBM = defaults.getBoolPref(TP_PBM_PREF);
let originalFP = defaults.getBoolPref(FP_PREF);
let originalCM = defaults.getBoolPref(CM_PREF);
let originalCryptoTP = defaults.getBoolPref(CRYPTO_TP_PREF);
let originalSTP = defaults.getBoolPref(STP_PREF);
let originalEmailTP = defaults.getBoolPref(EMAIL_TP_PREF);
let originalEmailTPPBM = defaults.getBoolPref(EMAIL_TP_PBM_PREF);
let originalConsentmanagerSkip = defaults.getBoolPref(
CONSENTMANAGER_SKIP_PREF
);
let originalConsentmanagerSkipPBM = defaults.getBoolPref(
CONSENTMANAGER_SKIP_PBM_PREF
);
let originalNCB = defaults.getIntPref(NCB_PREF);
let originalNCBP = defaults.getIntPref(NCBP_PREF);
let originalLEVEL2 = defaults.getBoolPref(LEVEL2_PREF);
@ -167,10 +185,15 @@ add_task(async function testContentBlockingStandardDefinition() {
defaults.setBoolPref(TP_PREF, !originalTP);
defaults.setBoolPref(TP_PBM_PREF, !originalTPPBM);
defaults.setBoolPref(FP_PREF, !originalFP);
defaults.setBoolPref(CM_PREF, !originalCM);
defaults.setBoolPref(CM_PREF, !originalSTP);
defaults.setBoolPref(CRYPTO_TP_PREF, !originalCryptoTP);
defaults.setBoolPref(CRYPTO_TP_PREF, !originalSTP);
defaults.setBoolPref(EMAIL_TP_PREF, !originalEmailTP);
defaults.setBoolPref(EMAIL_TP_PBM_PREF, !originalEmailTPPBM);
defaults.setBoolPref(CONSENTMANAGER_SKIP_PREF, !originalConsentmanagerSkip);
defaults.setBoolPref(
CONSENTMANAGER_SKIP_PBM_PREF,
!originalConsentmanagerSkipPBM
);
defaults.setIntPref(NCB_PREF, !originalNCB);
defaults.setBoolPref(LEVEL2_PREF, !originalLEVEL2);
defaults.setBoolPref(REFERRER_PREF, !originalREFERRER);
@ -196,8 +219,8 @@ add_task(async function testContentBlockingStandardDefinition() {
`${FP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CM_PREF),
`${CM_PREF} pref has the default value`
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CRYPTO_TP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(STP_PREF),
@ -211,6 +234,14 @@ add_task(async function testContentBlockingStandardDefinition() {
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
`${EMAIL_TP_PBM_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PREF),
`${CONSENTMANAGER_SKIP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PBM_PREF),
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(NCB_PREF),
`${NCB_PREF} pref has the default value`
@ -265,10 +296,15 @@ add_task(async function testContentBlockingStandardDefinition() {
defaults.setBoolPref(TP_PREF, originalTP);
defaults.setBoolPref(TP_PBM_PREF, originalTPPBM);
defaults.setBoolPref(FP_PREF, originalFP);
defaults.setBoolPref(CM_PREF, originalCM);
defaults.setBoolPref(CRYPTO_TP_PREF, originalCryptoTP);
defaults.setBoolPref(STP_PREF, originalSTP);
defaults.setBoolPref(EMAIL_TP_PREF, originalEmailTP);
defaults.setBoolPref(EMAIL_TP_PBM_PREF, originalEmailTPPBM);
defaults.setBoolPref(CONSENTMANAGER_SKIP_PREF, originalConsentmanagerSkip);
defaults.setBoolPref(
CONSENTMANAGER_SKIP_PBM_PREF,
originalConsentmanagerSkipPBM
);
defaults.setIntPref(NCB_PREF, originalNCB);
defaults.setIntPref(NCBP_PREF, originalNCBP);
defaults.setBoolPref(LEVEL2_PREF, originalLEVEL2);
@ -291,7 +327,7 @@ add_task(async function testContentBlockingStrictDefinition() {
let originalStrictPref = defaults.getStringPref(STRICT_DEF_PREF);
defaults.setStringPref(
STRICT_DEF_PREF,
"tp,tpPrivate,fp,cm,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp"
"tp,tpPrivate,fp,cryptoTP,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,consentmanagerSkip,consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp"
);
Services.prefs.setStringPref(CAT_PREF, "strict");
is(
@ -306,7 +342,7 @@ add_task(async function testContentBlockingStrictDefinition() {
);
is(
Services.prefs.getStringPref(STRICT_DEF_PREF),
"tp,tpPrivate,fp,cm,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp",
"tp,tpPrivate,fp,cryptoTP,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,consentmanagerSkip,consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp",
`${STRICT_DEF_PREF} changed to what we set.`
);
@ -323,12 +359,12 @@ add_task(async function testContentBlockingStrictDefinition() {
is(
Services.prefs.getBoolPref(FP_PREF),
true,
`${CM_PREF} pref has been set to true`
`${FP_PREF} pref has been set to true`
);
is(
Services.prefs.getBoolPref(CM_PREF),
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
true,
`${CM_PREF} pref has been set to true`
`${CRYPTO_TP_PREF} pref has been set to true`
);
is(
Services.prefs.getBoolPref(STP_PREF),
@ -345,6 +381,16 @@ add_task(async function testContentBlockingStrictDefinition() {
true,
`${EMAIL_TP_PBM_PREF} pref has been set to true`
);
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
true,
`${CONSENTMANAGER_SKIP_PREF} pref has been set to true`
);
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
true,
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has been set to true`
);
is(
Services.prefs.getIntPref(NCB_PREF),
Ci.nsICookieService.BEHAVIOR_ACCEPT,
@ -422,8 +468,8 @@ add_task(async function testContentBlockingStrictDefinition() {
`${FP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(CM_PREF),
`${CM_PREF} pref has the default value`
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CRYPTO_TP_PREF} pref has the default value`
);
ok(
!Services.prefs.prefHasUserValue(STP_PREF),
@ -488,7 +534,7 @@ add_task(async function testContentBlockingStrictDefinition() {
defaults.setStringPref(
STRICT_DEF_PREF,
"-tpPrivate,-fp,-cm,-tp,cookieBehavior3,cookieBehaviorPBM2,-stp,-emailTP,-emailTPPrivate,-lvl2,-rp,-ocsp,-qps,-qpsPBM,-fpp,-fppPrivate,-3pcd,-btp"
"-tpPrivate,-fp,-cryptoTP,-tp,cookieBehavior3,cookieBehaviorPBM2,-stp,-emailTP,-emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,-lvl2,-rp,-ocsp,-qps,-qpsPBM,-fpp,-fppPrivate,-3pcd,-btp"
);
is(
Services.prefs.getBoolPref(TP_PREF),
@ -506,9 +552,9 @@ add_task(async function testContentBlockingStrictDefinition() {
`${FP_PREF} pref has been set to false`
);
is(
Services.prefs.getBoolPref(CM_PREF),
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
false,
`${CM_PREF} pref has been set to false`
`${CRYPTO_TP_PREF} pref has been set to false`
);
is(
Services.prefs.getBoolPref(STP_PREF),
@ -525,6 +571,16 @@ add_task(async function testContentBlockingStrictDefinition() {
false,
`${EMAIL_TP_PBM_PREF} pref has been set to false`
);
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
false,
`${CONSENTMANAGER_SKIP_PREF} pref has been set to false`
);
is(
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
false,
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has been set to false`
);
is(
Services.prefs.getIntPref(NCB_PREF),
Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN,

View file

@ -149,6 +149,7 @@ engine_list_test(async function test_change_keyword(tree) {
keywordBefore,
"Did not modify keywords."
);
alertSpy.restore();
});
engine_list_test(async function test_rename_engines(tree) {

View file

@ -106,7 +106,7 @@ add_task(async function runTests() {
// cookieBehaviors both are BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN in
// the strict feature value.
await testCookieBlockingInfoStrict(
"tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
"tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
false
);
@ -114,7 +114,7 @@ add_task(async function runTests() {
// cookieBehavior is BEHAVIOR_REJECT_TRACKER and the private cookieBehavior is
// BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN
await testCookieBlockingInfoStrict(
"tp,tpPrivate,cookieBehavior4,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
"tp,tpPrivate,cookieBehavior4,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
true
);

View file

@ -4,7 +4,8 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */
const CB_STRICT_FEATURES_PREF = "browser.contentblocking.features.strict";
const CB_STRICT_FEATURES_VALUE = "tp,tpPrivate,cookieBehavior5,cm,fp,stp,lvl2";
const CB_STRICT_FEATURES_VALUE =
"tp,tpPrivate,cookieBehavior5,cryptoTP,fp,stp,lvl2";
const FPI_PREF = "privacy.firstparty.isolate";
const COOKIE_BEHAVIOR_PREF = "network.cookie.cookieBehavior";
const COOKIE_BEHAVIOR_VALUE = 5;

View file

@ -219,14 +219,12 @@ add_task(async function test_cleanup() {
info(
"5. Altering closedAt to an old date, making sure that stuff gets collected, eventually"
);
// TODO this should also test that the closed tab group is cleaned up, but
// can't be done until restoring tab groups (and thus setBrowserState)
// supports tab groups. See bug1927527.
await promiseCleanup();
let state = getClosedState();
state._closedWindows[0].closedAt = LONG_TIME_AGO;
state.windows[0]._closedTabs[0].closedAt = LONG_TIME_AGO;
state.windows[0].closedGroups[0].closedAt = LONG_TIME_AGO;
state.windows[0]._closedTabs[1].closedAt = Date.now();
let url = state.windows[0]._closedTabs[1].state.entries[0].url;
@ -238,6 +236,7 @@ add_task(async function test_cleanup() {
state = JSON.parse(ss.getBrowserState());
is(state._closedWindows[0], undefined, "5. Second window was forgotten");
is(state.windows[0].closedGroups[0], undefined, "5. Tab group was forgotten");
is(state.windows[0]._closedTabs.length, 1, "5. Only one closed tab left");
is(

View file

@ -109,8 +109,10 @@ var gSetBackground = {
"setDesktopBackground"
);
setDesktopBackground.hidden = false;
var bundle = document.getElementById("backgroundBundle");
setDesktopBackground.label = bundle.getString("DesktopBackgroundSet");
document.l10n.setAttributes(
setDesktopBackground,
"set-desktop-background-accept"
);
setDesktopBackground.disabled = false;
document.getElementById("showDesktopPreferences").hidden = true;
@ -130,13 +132,13 @@ var gSetBackground = {
} else {
Services.obs.addObserver(this, "shell:desktop-background-changed");
var bundle = document.getElementById("backgroundBundle");
var setDesktopBackground = document.getElementById(
"setDesktopBackground"
);
setDesktopBackground.disabled = true;
setDesktopBackground.label = bundle.getString(
"DesktopBackgroundDownloading"
document.l10n.setAttributes(
setDesktopBackground,
"set-desktop-background-downloading"
);
}
this._shell.setDesktopBackground(

View file

@ -36,8 +36,6 @@
<script src="chrome://browser/content/utilityOverlay.js"/>
#endif
<stringbundle id="backgroundBundle"
src="chrome://browser/locale/shellservice.properties"/>
<script src="chrome://browser/content/setDesktopBackground.js"/>
<script src="chrome://global/content/contentAreaUtils.js"/>

View file

@ -6,6 +6,4 @@
#define PREF_CHECKDEFAULTBROWSER "browser.shell.checkDefaultBrowser"
#define PREF_DEFAULTBROWSERCHECKCOUNT "browser.shell.defaultBrowserCheckCount"
#define SHELLSERVICE_PROPERTIES \
"chrome://browser/locale/shellservice.properties"
#define BRAND_PROPERTIES "chrome://branding/locale/brand.properties"

View file

@ -456,7 +456,7 @@ nsWindowsShellService::SetDefaultBrowser(bool aForAllUsers) {
}
/*
* Asynchronious function to Write an ico file to the disk / in a nsIFile.
* Asynchronous function to Write an ico file to the disk / in a nsIFile.
* Limitation: Only square images are supported as of now.
*/
NS_IMETHODIMP
@ -677,21 +677,18 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
rv = request->GetImage(getter_AddRefs(container));
if (!container) return NS_ERROR_FAILURE;
// get the file name from localized strings
nsCOMPtr<nsIStringBundleService> bundleService(
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv));
NS_ENSURE_SUCCESS(rv, rv);
nsCOMPtr<nsIStringBundle> shellBundle;
rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES,
getter_AddRefs(shellBundle));
NS_ENSURE_SUCCESS(rv, rv);
// e.g. "Desktop Background.bmp"
nsAutoString fileLeafName;
rv = shellBundle->GetStringFromName("desktopBackgroundLeafNameWin",
fileLeafName);
NS_ENSURE_SUCCESS(rv, rv);
// get the file name from localized strings, e.g. "Desktop Background", then
// append the extension (".bmp").
nsTArray<nsCString> resIds = {
"browser/browser/setDesktopBackground.ftl"_ns,
};
RefPtr<Localization> l10n = Localization::Create(resIds, true);
nsAutoCString fileLeafNameUtf8;
IgnoredErrorResult locRv;
l10n->FormatValueSync("set-desktop-background-filename"_ns, {},
fileLeafNameUtf8, locRv);
nsAutoString fileLeafName = NS_ConvertUTF8toUTF16(fileLeafNameUtf8);
fileLeafName.AppendLiteral(".bmp");
// get the profile root directory
nsCOMPtr<nsIFile> file;
@ -708,7 +705,7 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
NS_ENSURE_SUCCESS(rv, rv);
// write the bitmap to a file in the profile directory.
// We have to write old bitmap format for Windows 7 wallpapar support.
// We have to write old bitmap format for Windows 7 wallpaper support.
rv = WriteBitmap(file, container);
// if the file was written successfully, set it as the system wallpaper

View file

@ -829,7 +829,7 @@
);
if (
this.smartTabGroupsEnabled &&
(this.#suggestedMlLabel || this.#hasSuggestedMlTabs)
(this.#suggestedMlLabel !== null || this.#hasSuggestedMlTabs)
) {
this.#handleMlTelemetry("save-popup-hidden");
}
@ -1010,7 +1010,7 @@
if (!this.smartTabGroupsEnabled) {
return;
}
if (this.#suggestedMlLabel) {
if (this.#suggestedMlLabel !== null) {
this.#smartTabGroupingManager.handleLabelTelemetry({
action,
numTabsInGroup: this.#activeGroup.tabs.length,
@ -1018,7 +1018,7 @@
userLabel: this.#nameField.value,
id: this.#activeGroup.id,
});
this.#suggestedMlLabel = "";
this.#suggestedMlLabel = null;
}
if (this.#hasSuggestedMlTabs) {
this.#smartTabGroupingManager.handleSuggestTelemetry({

View file

@ -2657,6 +2657,17 @@
if (this.#rtlMode) {
dropBefore = !dropBefore;
}
// Constrain drop direction at the boundary between pinned and
// unpinned tabs so that they don't mix together.
let isOutOfBounds = isPinned
? dropElement.elementIndex >= numPinned
: dropElement.elementIndex < numPinned;
if (isOutOfBounds) {
// Drop after last pinned tab
dropElement = this.ariaFocusableItems[numPinned - 1];
dropBefore = false;
}
}
if (gBrowser._tabGroupsEnabled && isTab(draggedTab) && !isPinned) {

View file

@ -316,3 +316,35 @@ add_task(async function test_optin_telemetry() {
);
cleanup();
});
add_task(async function test_saving_ml_suggested_empty_label_telemetry() {
let { tab, cleanup } = await setup();
let tabgroupEditor = document.getElementById("tab-group-editor");
let tabgroupPanel = tabgroupEditor.panel;
let nameField = tabgroupPanel.querySelector("#tab-group-name");
await openCreatePanel(tabgroupPanel, tab);
nameField.focus();
nameField.value = "Random ML Suggested Label"; // user label matching suggested label
tabgroupEditor.mlLabel = ""; // suggested label
tabgroupPanel.querySelector("#tab-group-editor-button-create").click();
let panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
await panelHidden;
const events = Glean.tabgroup.smartTabTopic.testGetValue();
Assert.equal(events.length, 1, "Should create a label event");
Assert.equal(events[0].extra.action, "save", "Save button was clicked");
Assert.equal(events[0].extra.tabs_in_group, "1", "Number of tabs in group");
Assert.equal(events[0].extra.ml_label_length, "0", "Suggested ML Label");
Assert.equal(
events[0].extra.user_label_length,
"25",
"User input was the same as ml suggested label"
);
Assert.equal(
events[0].extra.model_revision,
"v0.3.4",
"Model revision should be present"
);
cleanup();
});

View file

@ -2,6 +2,12 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const { ASRouterTriggerListeners } = ChromeUtils.importESModule(
"resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs"
);
const { sinon } = ChromeUtils.importESModule(
"resource://testing-common/Sinon.sys.mjs"
);
const { TabStateFlusher } = ChromeUtils.importESModule(
"resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
);
@ -507,6 +513,12 @@ add_task(async function test_tabGroupMoveToNewWindow() {
});
add_task(async function test_TabGroupEvents() {
const triggerHandler = sinon.stub();
const tabGroupCollapsedTrigger =
ASRouterTriggerListeners.get("tabGroupCollapsed");
tabGroupCollapsedTrigger.uninit();
tabGroupCollapsedTrigger.init(triggerHandler);
let tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
let tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
let group;
@ -539,6 +551,7 @@ add_task(async function test_TabGroupEvents() {
let groupCollapsed = BrowserTestUtils.waitForEvent(group, "TabGroupCollapse");
group.collapsed = true;
await groupCollapsed;
Assert.ok(triggerHandler.calledOnce, "Called once after tab group collapsed");
let groupExpanded = BrowserTestUtils.waitForEvent(group, "TabGroupExpand");
group.collapsed = false;
@ -564,6 +577,7 @@ add_task(async function test_TabGroupEvents() {
BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2);
tabGroupCollapsedTrigger.uninit();
});
add_task(async function test_moveTabBetweenGroups() {
@ -1662,6 +1676,12 @@ add_task(async function test_tabsContainNoTabGroups() {
* Tests behavior of the group management panel.
*/
add_task(async function test_tabGroupCreatePanel() {
const triggerHandler = sinon.stub();
const tabGroupCreatedTrigger =
ASRouterTriggerListeners.get("tabGroupCreated");
tabGroupCreatedTrigger.uninit();
tabGroupCreatedTrigger.init(triggerHandler);
let tabgroupEditor = document.getElementById("tab-group-editor");
let tabgroupPanel = tabgroupEditor.panel;
let nameField = tabgroupPanel.querySelector("#tab-group-name");
@ -1747,8 +1767,14 @@ add_task(async function test_tabGroupCreatePanel() {
"Panel should be dismissed after clicking Create and new group should remain"
);
panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
let done = BrowserTestUtils.waitForEvent(
tabgroupEditor,
"TabGroupCreateDone"
);
tabgroupPanel.querySelector("#tab-group-editor-button-create").click();
await panelHidden;
await done;
Assert.ok(triggerHandler.called, "Called after tab group created");
Assert.equal(tabgroupPanel.state, "closed", "Tabgroup edit panel is closed");
Assert.equal(group.label, "Shopping");
Assert.equal(group.color, "red");
@ -1790,6 +1816,7 @@ add_task(async function test_tabGroupCreatePanel() {
let removePromise = BrowserTestUtils.waitForEvent(group, "TabGroupRemoved");
tabgroupPanel.querySelector("#tabGroupEditor_deleteGroup").click();
await Promise.all([panelHidden, removePromise]);
tabGroupCreatedTrigger.uninit();
});
async function createTabGroupAndOpenEditPanel(tabs = []) {
@ -1964,6 +1991,11 @@ add_task(async function test_saveDisabledForUnimportantGroup() {
});
add_task(async function test_saveAndCloseGroup() {
const triggerHandler = sinon.stub();
const tabGroupSavedTrigger = ASRouterTriggerListeners.get("tabGroupSaved");
tabGroupSavedTrigger.uninit();
tabGroupSavedTrigger.init(triggerHandler);
let tab = await addTab("about:mozilla");
let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel([tab]);
let tabgroupPanel = tabgroupEditor.panel;
@ -1982,6 +2014,7 @@ add_task(async function test_saveAndCloseGroup() {
saveAndCloseGroupButton.click();
await Promise.all(events);
Assert.ok(triggerHandler.calledOnce, "Called once after tab group saved");
Assert.ok(
!gBrowser.getTabGroupById(group.id),
"Group was removed from browser"
@ -1991,6 +2024,7 @@ add_task(async function test_saveAndCloseGroup() {
SessionStore.forgetSavedTabGroup(group.id);
BrowserTestUtils.removeTab(tab);
tabGroupSavedTrigger.uninit();
});
add_task(async function test_saveAndCloseGroupViaMiddleClick() {

View file

@ -0,0 +1,68 @@
/* vim: se cin sw=2 ts=2 et filetype=javascript :
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const kWidgetId = "taskbar-tabs-button";
const kEnabledPref = "browser.taskbarTabs.enabled";
import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
const kWebAppWindowFeatures =
"chrome,dialog=no,titlebar,close,toolbar,location,personalbar=no,status,menubar=no,resizable,minimizable,scrollbars";
let lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
});
export let TaskbarTabs = {
async init(window) {
if (
AppConstants.platform != "win" ||
!Services.prefs.getBoolPref(kEnabledPref, false) ||
window.document.documentElement.hasAttribute("taskbartab")
) {
return;
}
let taskbarTabsButton = window.document.getElementById(kWidgetId);
taskbarTabsButton.addEventListener("click", this, true);
taskbarTabsButton.hidden = false;
},
async handleEvent(event) {
let gBrowser = event.view.gBrowser;
await lazy.BrowserWindowTracker.promiseOpenWindow({
features: kWebAppWindowFeatures,
args: this._generateArgs(gBrowser.selectedTab),
});
},
/**
* Returns an array of args to pass into Services.ww.openWindow.
* The first element will be the tab to be opened, the second element
* will be a nsIWritablePropertyBag with a 'taskbartab' property
*
* The tab to be opened with the web app
*
* @param {MozTabbrowserTab} tab The tab we will open as a taskbar tab
*
* @returns {nsIMutableArray}
*/
_generateArgs(tab) {
let extraOptions = Cc["@mozilla.org/hash-property-bag;1"].createInstance(
Ci.nsIWritablePropertyBag2
);
extraOptions.setPropertyAsBool("taskbartab", true);
let args = Cc["@mozilla.org/array;1"].createInstance(Ci.nsIMutableArray);
args.appendElement(tab);
args.appendElement(extraOptions);
args.appendElement(null);
return args;
},
};

View file

@ -4,7 +4,8 @@
# 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 += [
EXTRA_JS_MODULES.taskbartabs += [
"TaskbarTabs.sys.mjs",
"TaskbarTabUI.sys.mjs",
]

View file

@ -1,6 +1,16 @@
[DEFAULT]
support-files = ["head.js"]
prefs = [
"browser.taskbarTabs.enabled=true"
]
["browser_taskBarTabs_module.js"]
support-files = [
"../../../tabbrowser/test/browser/tabs/dummy_page.html",
]
run-if = ["os == 'win'"]
["browser_taskbarTabs_chromeTest.js"]
run-if = ["os == 'win'"]

View file

@ -0,0 +1,50 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
ChromeUtils.defineESModuleGetters(this, {
BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
});
const BASE_URL = "https://example.com/browser/browser/modules/test/browser/";
add_task(async function createTaskBarTabTest() {
let createTaskbarTabButton = window.document.getElementById(
"taskbar-tabs-button"
);
ok(createTaskbarTabButton, "Taskbar tab page action button should exist");
is(
createTaskbarTabButton.hidden,
false,
"Taskbar tab page action button should not be hidden"
);
await BrowserTestUtils.openNewForegroundTab({
gBrowser: window.gBrowser,
url: BASE_URL + "dummy_page.html",
});
let newWinPromise = BrowserTestUtils.waitForNewWindow();
// Create a taskbar tab window
const clickEvent = new PointerEvent("click", {
view: window,
});
createTaskbarTabButton.dispatchEvent(clickEvent);
let taskbarTabWindow = await newWinPromise;
ok(
taskbarTabWindow.document.documentElement.hasAttribute("taskbartab"),
"The window HTML should have a taskbartab attribute"
);
is(
BrowserWindowTracker.getAllVisibleTabs().length,
2,
"The number of existing tabs should be two"
);
await BrowserTestUtils.closeWindow(taskbarTabWindow);
});

View file

@ -32,6 +32,8 @@ skip-if = [
["browser_autofill_address_level.js"]
["browser_autofill_address_name.js"]
["browser_autofill_address_select.js"]
["browser_autofill_address_select_inexact.js"]

View file

@ -0,0 +1,123 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
"use strict";
const TEST_PROFILE = {
"given-name": "John",
"additional-name": "Middle",
"family-name": "Doe",
organization: "Mozilla",
email: "john.doe@mozilla.com",
country: "US",
"street-address": "123 Sesame Street",
};
add_autofill_heuristic_tests([
{
description: "Test consecutive family-name/given-name input pairs",
fixtureData: `<form>
<input id="family-name-1" autocomplete="family-name">
<input id="given-name-1" autocomplete="given-name">
<input id="family-name-2" autocomplete="family-name">
<input id="given-name-2" autocomplete="given-name">
<input id="email" autocomplete="email">
<input id="organization" autocomplete="organization">
</form>`,
profile: TEST_PROFILE,
expectedResult: [
{
default: {
reason: "autocomplete",
},
fields: [
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{ fieldName: "email", autofill: TEST_PROFILE.email },
{ fieldName: "organization", autofill: TEST_PROFILE.organization },
],
},
],
},
{
description:
"Test consecutive given-name/additional-name/family-name input pairs",
fixtureData: `<form>
<input id="given-name-1" autocomplete="given-name">
<input id="additional-name-1" autocomplete="additional-name">
<input id="family-name-1" autocomplete="family-name">
<input id="given-name-2" autocomplete="given-name">
<input id="additional-name-2" autocomplete="additional-name">
<input id="family-name-2" autocomplete="family-name">
<input id="email" autocomplete="email">
<input id="organization" autocomplete="organization">
</form>`,
profile: TEST_PROFILE,
expectedResult: [
{
default: {
reason: "autocomplete",
},
fields: [
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{
fieldName: "additional-name",
autofill: TEST_PROFILE["additional-name"],
},
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{
fieldName: "additional-name",
autofill: TEST_PROFILE["additional-name"],
},
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "email", autofill: TEST_PROFILE.email },
{ fieldName: "organization", autofill: TEST_PROFILE.organization },
],
},
],
},
{
description: "Test non-consecutive family-name/given-name input pairs",
fixtureData: `<form>
<input id="email" autocomplete="email">
<input id="given-name-1" autocomplete="given-name">
<input id="family-name-1" autocomplete="family-name">
<input id="organization" autocomplete="organization">
<input id="given-name-2" autocomplete="given-name">
<input id="family-name-2" autocomplete="family-name">
<input id="country" autocomplete="country">
<input id="street-address" autocomplete="street-address">
</form>`,
profile: TEST_PROFILE,
expectedResult: [
{
default: {
reason: "autocomplete",
},
fields: [
{ fieldName: "email", autofill: TEST_PROFILE.email },
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "organization", autofill: TEST_PROFILE.organization },
],
},
{
default: {
reason: "autocomplete",
},
fields: [
{ fieldName: "given-name", autofill: TEST_PROFILE["given-name"] },
{ fieldName: "family-name", autofill: TEST_PROFILE["family-name"] },
{ fieldName: "country", autofill: TEST_PROFILE.country },
{
fieldName: "street-address",
autofill: TEST_PROFILE["street-address"],
},
],
},
],
},
]);

View file

@ -132,7 +132,7 @@ function CardSection({
data: {
section: sectionKey,
section_position: sectionPosition,
is_secton_followed: following,
is_section_followed: following,
},
})
);

View file

@ -71,10 +71,10 @@ export const DSSource = ({
// Otherwise display a default source.
return (
<p className="source clamp">
<div className="source-wrapper">
{icon_src && <img src={icon_src} height="16" width="16" alt="" />}
{source}
</p>
<p className="source clamp">{source}</p>
</div>
);
};
@ -370,7 +370,7 @@ export class _DSCard extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
}
: {}),
},
@ -399,7 +399,7 @@ export class _DSCard extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
}
: {}),
},
@ -443,7 +443,7 @@ export class _DSCard extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
}
: {}),
},
@ -533,7 +533,7 @@ export class _DSCard extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
}
: {}),
},
@ -797,7 +797,7 @@ export class _DSCard extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
}
: {}),
},
@ -884,7 +884,7 @@ export class _DSCard extends React.PureComponent {
is_list_card={this.props.isListCard}
section={this.props.section}
section_position={this.props.sectionPosition}
is_secton_followed={this.props.sectionFollowed}
is_section_followed={this.props.sectionFollowed}
format={format}
isSectionsCard={this.props.mayHaveSectionsCards}
/>

View file

@ -251,18 +251,21 @@ $ds-card-image-gradient-solid: rgba(0, 0, 0, 100%);
);
}
.source {
-webkit-line-clamp: 1;
margin-bottom: 2px;
font-size: 13px;
color: var(--newtab-text-secondary-color);
.source-wrapper {
display: flex;
margin-block-end: var(--space-xxsmall);
align-items: center;
img {
border-radius: var(--border-radius-small);
margin-inline-end: var(--space-small);
}
}
.source {
-webkit-line-clamp: 1;
font-size: var(--font-size-small);
color: var(--newtab-text-secondary-color);
span {
display: inline-block;
@ -496,6 +499,7 @@ $ds-card-image-gradient-solid: rgba(0, 0, 0, 100%);
}
.source {
-webkit-line-clamp: 1;
color: var(--newtab-text-secondary-text);
font-size: var(--font-size-small);
}

View file

@ -20,6 +20,7 @@
width: 100%;
height: 100%;
object-fit: cover;
border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
}
.placeholder-image {

View file

@ -82,7 +82,7 @@ export class _DSLinkMenu extends React.PureComponent {
? {
section: this.props.section,
section_position: this.props.section_position,
is_secton_followed: this.props.is_secton_followed,
is_section_followed: this.props.is_section_followed,
}
: {}),
}}

View file

@ -124,7 +124,7 @@ export class ImpressionStats extends React.PureComponent {
? {
section: link.section,
section_position: link.section_position,
is_secton_followed: link.is_secton_followed,
is_section_followed: link.is_section_followed,
}
: {}),
})),

View file

@ -79,7 +79,7 @@ export const LinkMenuOptions = {
? {
section: site.section,
section_position: site.section_position,
is_secton_followed: site.is_secton_followed,
is_section_followed: site.is_section_followed,
}
: {}),
},
@ -134,7 +134,7 @@ export const LinkMenuOptions = {
? {
section: site.section,
section_position: site.section_position,
is_secton_followed: site.is_secton_followed,
is_section_followed: site.is_section_followed,
}
: {}),
})),

View file

@ -6400,18 +6400,20 @@ main section {
-webkit-line-clamp: 3;
line-height: 20px;
}
.ds-card .meta .source {
-webkit-line-clamp: 1;
margin-bottom: 2px;
font-size: 13px;
color: var(--newtab-text-secondary-color);
.ds-card .meta .source-wrapper {
display: flex;
margin-block-end: var(--space-xxsmall);
align-items: center;
}
.ds-card .meta .source img {
.ds-card .meta .source-wrapper img {
border-radius: var(--border-radius-small);
margin-inline-end: var(--space-small);
}
.ds-card .meta .source {
-webkit-line-clamp: 1;
font-size: var(--font-size-small);
color: var(--newtab-text-secondary-color);
}
.ds-card .meta .source span {
display: inline-block;
}
@ -6592,6 +6594,7 @@ main section {
line-height: normal;
}
.ds-card-grid .sections-card-ui .meta .source {
-webkit-line-clamp: 1;
color: var(--newtab-text-secondary-text);
font-size: var(--font-size-small);
}
@ -6728,6 +6731,7 @@ main section {
width: 100%;
height: 100%;
object-fit: cover;
border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
}
.ds-image .placeholder-image {
overflow: hidden;

View file

@ -1763,7 +1763,7 @@ const LinkMenuOptions = {
? {
section: site.section,
section_position: site.section_position,
is_secton_followed: site.is_secton_followed,
is_section_followed: site.is_section_followed,
}
: {}),
},
@ -1818,7 +1818,7 @@ const LinkMenuOptions = {
? {
section: site.section,
section_position: site.section_position,
is_secton_followed: site.is_secton_followed,
is_section_followed: site.is_section_followed,
}
: {}),
})),
@ -2458,7 +2458,7 @@ class _DSLinkMenu extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.section_position,
is_secton_followed: this.props.is_secton_followed
is_section_followed: this.props.is_section_followed
} : {})
}
})));
@ -2628,7 +2628,7 @@ class ImpressionStats_ImpressionStats extends (external_React_default()).PureCom
...(link.section ? {
section: link.section,
section_position: link.section_position,
is_secton_followed: link.is_secton_followed
is_section_followed: link.is_section_followed
} : {})
})),
firstVisibleTimestamp: this.props.firstVisibleTimestamp
@ -3251,14 +3251,16 @@ const DSSource = ({
}
// Otherwise display a default source.
return /*#__PURE__*/external_React_default().createElement("p", {
className: "source clamp"
return /*#__PURE__*/external_React_default().createElement("div", {
className: "source-wrapper"
}, icon_src && /*#__PURE__*/external_React_default().createElement("img", {
src: icon_src,
height: "16",
width: "16",
alt: ""
}), source);
}), /*#__PURE__*/external_React_default().createElement("p", {
className: "source clamp"
}, source));
};
const DefaultMeta = ({
source,
@ -3486,7 +3488,7 @@ class _DSCard extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed
is_section_followed: this.props.sectionFollowed
} : {})
}
}));
@ -3512,7 +3514,7 @@ class _DSCard extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed
is_section_followed: this.props.sectionFollowed
} : {})
}]
}));
@ -3551,7 +3553,7 @@ class _DSCard extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed
is_section_followed: this.props.sectionFollowed
} : {})
}
}));
@ -3626,7 +3628,7 @@ class _DSCard extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed
is_section_followed: this.props.sectionFollowed
} : {})
}
}));
@ -3837,7 +3839,7 @@ class _DSCard extends (external_React_default()).PureComponent {
...(this.props.section ? {
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed
is_section_followed: this.props.sectionFollowed
} : {})
}],
dispatch: this.props.dispatch,
@ -3910,7 +3912,7 @@ class _DSCard extends (external_React_default()).PureComponent {
is_list_card: this.props.isListCard,
section: this.props.section,
section_position: this.props.sectionPosition,
is_secton_followed: this.props.sectionFollowed,
is_section_followed: this.props.sectionFollowed,
format: format,
isSectionsCard: this.props.mayHaveSectionsCards
}))));
@ -10680,7 +10682,7 @@ function CardSection({
data: {
section: sectionKey,
section_position: sectionPosition,
is_secton_followed: following
is_section_followed: following
}
}));
}, [dispatch, sectionKey, sectionPosition, following]);

View file

@ -575,7 +575,7 @@ export class TelemetryFeed {
format,
section,
section_position,
is_secton_followed,
is_section_followed,
} = action.data.value ?? {};
if (
action.data.source === "POPULAR_TOPICS" ||
@ -599,7 +599,7 @@ export class TelemetryFeed {
? {
section,
section_position,
is_secton_followed,
is_section_followed,
}
: {}),
matches_selected_topic,
@ -657,7 +657,7 @@ export class TelemetryFeed {
topic,
section,
section_position,
is_secton_followed,
is_section_followed,
} = action.data.value ?? {};
Glean.pocket.thumbVotingInteraction.record({
newtab_visit_id: session.session_id,
@ -680,7 +680,7 @@ export class TelemetryFeed {
? {
section,
section_position,
is_secton_followed,
is_section_followed,
}
: {}),
});
@ -705,7 +705,7 @@ export class TelemetryFeed {
format,
section,
section_position,
is_secton_followed,
is_section_followed,
} = action.data.value ?? {};
Glean.pocket.save.record({
newtab_visit_id: session.session_id,
@ -715,7 +715,7 @@ export class TelemetryFeed {
? {
section,
section_position,
is_secton_followed,
is_section_followed,
}
: {}),
topic,
@ -988,7 +988,7 @@ export class TelemetryFeed {
handleCardSectionUserEvent(action) {
const session = this.sessions.get(au.getPortIdOfSender(action));
if (session) {
const { section, section_position, event_source, is_secton_followed } =
const { section, section_position, event_source, is_section_followed } =
action.data;
switch (action.type) {
case "BLOCK_SECTION":
@ -1012,7 +1012,7 @@ export class TelemetryFeed {
newtab_visit_id: session.session_id,
section,
section_position,
is_secton_followed,
is_section_followed,
});
break;
case "FOLLOW_SECTION":
@ -1211,7 +1211,7 @@ export class TelemetryFeed {
? {
section: datum.section,
section_position: datum.section_position,
is_secton_followed: datum.is_secton_followed,
is_section_followed: datum.is_section_followed,
}
: {}),
// We conditionally add in a few props.
@ -1288,7 +1288,7 @@ export class TelemetryFeed {
? {
section: tile.section,
section_position: tile.section_position,
is_secton_followed: tile.is_secton_followed,
is_section_followed: tile.is_section_followed,
}
: {}),
position: tile.pos,

View file

@ -212,12 +212,30 @@ let AVAILABLE_PIP_OVERRIDES;
},
},
iq: {
"https://*.iq.com/play/*": {
videoWrapperScriptPath: "video-wrappers/iq.js",
},
},
kick: {
"https://*.kick.com/*": {
visibilityThreshold: 0.7,
},
},
joyn: {
"https://www.joyn.de/play/*": {
videoWrapperScriptPath: "video-wrappers/joyn.js",
},
"https://www.joyn.at/play/*": {
videoWrapperScriptPath: "video-wrappers/joyn.js",
},
"https://www.joyn.ch/play/*": {
videoWrapperScriptPath: "video-wrappers/joyn.js",
},
},
laracasts: {
"https://*.laracasts.com/*": { policy: TOGGLE_POLICIES.ONE_QUARTER },
},

View file

@ -0,0 +1,96 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
class PictureInPictureVideoWrapper {
constructor() {
this.player = window.wrappedJSObject.playerObject;
}
play(video) {
let playPauseButton = document.querySelector(
`[data-player-hook="btnplaypause"]`
);
if (video.paused) {
playPauseButton?.click();
}
}
pause(video) {
let playPauseButton = document.querySelector(
`[data-player-hook="btnplaypause"]`
);
if (!video.paused) {
playPauseButton?.click();
}
}
setCurrentTime(video, position) {
this.player.seek(position);
}
setCaptionContainerObserver(video, updateCaptionsFunction) {
let container = document.querySelector(`[data-player-hook="plgcontainer"]`);
const selector = [
`[data-player-hook="subtitleelem"]`,
".subtitle_text",
].join(",");
if (container) {
updateCaptionsFunction("");
const callback = mutationList => {
if (mutationList) {
let changed = false;
for (const mutation of mutationList) {
if (mutation.target.matches?.(selector)) {
changed = true;
break;
}
}
if (!changed) {
return;
}
}
let subtitles = container.querySelectorAll(
`.iqp-subtitle:has(> [data-player-hook="subtitleelem"] > .subtitle_text)`
);
if (!subtitles.length) {
updateCaptionsFunction("");
return;
}
if (subtitles.length > 1) {
subtitles = Array.from(subtitles).sort(
(a, b) => a.offsetTop - b.offsetTop
);
}
updateCaptionsFunction(
Array.from(subtitles, x => x.innerText.trim())
.filter(String)
.join("\n")
);
};
callback();
this.captionsObserver = new MutationObserver(callback);
this.captionsObserver.observe(container, {
childList: true,
subtree: true,
});
}
}
removeCaptionContainerObserver() {
this.captionsObserver?.disconnect();
}
}
this.PictureInPictureVideoWrapper = PictureInPictureVideoWrapper;

View file

@ -0,0 +1,41 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
class PictureInPictureVideoWrapper {
setCaptionContainerObserver(video, updateCaptionsFunction) {
let container = document.querySelector(
"#trackable-player-element > article"
);
if (container) {
const callback = () => {
let text = container.querySelector(
`:scope > div > div > div > div[role="cue"]`
)?.innerText;
if (!text) {
updateCaptionsFunction("");
return;
}
updateCaptionsFunction(text);
};
callback();
this.captionsObserver = new MutationObserver(callback);
this.captionsObserver.observe(container, {
childList: true,
});
}
}
removeCaptionContainerObserver() {
this.captionsObserver?.disconnect();
}
}
this.PictureInPictureVideoWrapper = PictureInPictureVideoWrapper;

View file

@ -792,10 +792,6 @@
"issue": "firefox-blocked-completely",
"matches": ["*://*.aptsovation.com/*"]
},
"1894682": {
"issue": "firefox-blocked-completely",
"matches": ["*://*.arboretumapartments.com/*"]
},
"1898964": {
"issue": "firefox-blocked-completely",
"matches": ["*://*.breakpointeandcoronado.com/*"]
@ -886,21 +882,6 @@
}
]
},
"1786404": {
"label": "business.help.royalmail.com",
"bugs": {
"1786404": {
"issue": "firefox-blocked-completely",
"matches": ["*://business.help.royalmail.com/app/webforms/*"]
}
},
"interventions": [
{
"platforms": ["all"],
"ua_string": ["change_Firefox_to_FireFox"]
}
]
},
"1799968": {
"label": "www.samsung.com",
"bugs": {
@ -1587,57 +1568,6 @@
}
]
},
"1844503": {
"label": "nicochannel.jp",
"bugs": {
"1844503": {
"issue": "firefox-blocked-completely",
"matches": [
"*://*.ado-dokidokihimitsukichi-daigakuimo.com/*",
"*://*.ahnbohyun-fc.com/*",
"*://*.banbanzai-fc.com/*",
"*://*.canan8181.com/*",
"*://*.gs-ch.com/*",
"*://*.itomiku-fc.jp/*",
"*://*.kawahara-no.jp/*",
"*://*.keisuke-ueda.jp/*",
"*://*.kemomimirefle.net/*",
"*://*.kyoten-waku-officialfc.com/*",
"*://*.maziyabacity.com/*",
"*://*.nicochannel.jp/*",
"*://*.p-jinriki-fc.com/*",
"*://*.pizzaradio.jp/*",
"*://*.quizknock-schole.com/*",
"*://*.rnqq.jp/*",
"*://*.ryogomatsumaru.com/*",
"*://*.sae-okazaki.com/*",
"*://*.sakuraknights.com/*",
"*://*.salon-de-horizon.jp/*",
"*://*.serina-official.com/*",
"*://*.shibuya-abemas.com/*",
"*://*.styleparty-fc.jp/*",
"*://*.suzuka-ouji-officialfc.com/*",
"*://*.takahashifumiya.com/*",
"*://*.tokinosora-fc.com/*",
"*://*.tymstorage.jp/*",
"*://*.yamingfc.net/*"
]
},
"1948817": {
"issue": "firefox-blocked-completely",
"matches": ["*://*.qlover.jp/*"]
}
},
"interventions": [
{
"platforms": ["all"],
"content_scripts": {
"js": ["bug1849058-nicochannel.jp-picture-in-picture-shim.js"]
},
"ua_string": ["Chrome", "add_Firefox_as_Gecko"]
}
]
},
"1845299": {
"label": "Google Slides",
"bugs": {
@ -1989,23 +1919,6 @@
}
]
},
"1886591": {
"label": "la-vache-noire.com",
"bugs": {
"1886591": {
"issue": "broken-cookie-banner",
"matches": ["*://la-vache-noire.com/*"]
}
},
"interventions": [
{
"platforms": ["all"],
"content_scripts": {
"css": ["bug1886591-la-vache-noire.com-cookie-banner-fix.css"]
}
}
]
},
"1886616": {
"label": "www.six-group.com",
"bugs": {
@ -2569,6 +2482,21 @@
}
]
},
"1902403": {
"label": "musicstore.auone.jp",
"bugs": {
"1385206": {
"issue": "firefox-blocked-completely",
"matches": ["*://musicstore.auone.jp/*"]
}
},
"interventions": [
{
"platforms": ["all"],
"ua_string": ["Chrome"]
}
]
},
"1902459": {
"label": "coupangplay.com",
"bugs": {

View file

@ -4,12 +4,40 @@
"use strict";
/* global ExtensionAPI, Services */
/* global ExtensionAPI, ExtensionCommon, Services */
this.testUtils = class extends ExtensionAPI {
getAPI() {
getAPI(context) {
const { EventManager } = ExtensionCommon;
let messageListener;
return {
testUtils: {
onMessage: new EventManager({
context,
name: "testUtils.onMessage",
register: fire => {
if (!messageListener) {
const obs = {
receiveMessage({ data }) {
fire
.async(data)
.then(retval => {
Services.ppmm.broadcastAsyncMessage(
`WebCompat:${data.name}:Done`,
retval
);
})
.catch(() => {}); // ignore Message Manager disconnects
},
};
Services.cpmm.addMessageListener("WebCompat", obs);
messageListener = () => {
Services.cpmm.removeMessageListener("WebCompat", obs);
};
}
return messageListener;
},
}).api(),
async interventionsActive() {
Services.ppmm.sharedData.set(
"WebCompatTests:InterventionsStatus",

View file

@ -2,6 +2,19 @@
{
"namespace": "testUtils",
"description": "experimental API extension to let tests know the addon's status",
"events": [
{
"name": "onMessage",
"type": "function",
"parameters": [
{
"name": "name",
"type": "object",
"description": "The preference which changed"
}
]
}
],
"functions": [
{
"name": "interventionsActive",

View file

@ -262,6 +262,9 @@ this.trackingProtection = class extends ExtensionAPI {
async revoke(allowListId) {
manager.revoke(allowListId);
},
async clearResourceCache() {
ChromeUtils.clearResourceCache({ target: "content" });
},
async wasRequestUnblocked(requestId, isPrivate) {
if (!manager) {
return false;

View file

@ -141,6 +141,13 @@
],
"async": true
},
{
"name": "clearResourceCache",
"type": "function",
"description": "Clear in-memory resource cache to reflect the changes to the allow-list for the subsequent requests",
"parameters": [],
"async": true
},
{
"name": "wasRequestUnblocked",
"type": "function",

View file

@ -1,15 +0,0 @@
/* 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/. */
/**
* la-vache-noire.com - Cookie banner is invisible
* Bug #1886591 - https://bugzilla.mozilla.org/show_bug.cgi?id=1886591
* WebCompat issue #131867 - https://webcompat.com/issues/131867
*
* The site nests position:sticky elements, which renders the inner one
* as invisible. We set the inner one to position:fixed as a workaround.
*/
#cookie-bar {
position: fixed;
}

View file

@ -1,27 +0,0 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
/**
* Bug 1849058 - Shim PictureInPictureWindow for nicochannel.jp
* WebCompat issue #124463 - https://webcompat.com/issues/124463
*
* The page is showing unsupported message based on typeof
* window.PictureInPictureWindow, which is undefined in Firefox.
* Shimming it to `class {}` makes the pages work.
*/
/* globals exportFunction */
console.info(
"PictureInPictureWindow was shimmed for compatibility reasons. See https://bugzilla.mozilla.org/show_bug.cgi?id=1849058 for details."
);
window.wrappedJSObject.PictureInPictureWindow = exportFunction(
class {},
window
);
Object.getPrototypeOf(document).wrappedJSObject.pictureInPictureElement = null;

View file

@ -0,0 +1,26 @@
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
const info = new Error().fileName.split("#")[1]?.split(":");
if (info) {
const bug = info.shift().split("_")[0];
const interventions =
info
.map(type => {
switch (type) {
case "css":
return "CSS";
case "ua":
return "user-agent string";
}
return "";
})
.filter(n => n)
.join(" and ") || "interventions";
console.info(
`Custom ${interventions} being applied for compatibility reasons. See https://bugzilla.mozilla.org/show_bug.cgi?id=${bug} for details.`
);
}

View file

@ -37,6 +37,17 @@ class Interventions {
this.checkInterventionPref();
}, this.INTERVENTION_PREF);
this.checkInterventionPref();
browser.testUtils.onMessage.addListener(async ({ name, data }) => {
switch (name) {
case "UpdateInterventions": {
await this.disableInterventions(data);
await this.enableInterventions(data);
return data;
}
}
return null;
});
}
checkInterventionPref() {
@ -67,26 +78,31 @@ class Interventions {
return this._availableInterventions;
}
_getActiveInterventionById(whichId) {
return this._availableInterventions.find(({ id }) => id === whichId);
}
isEnabled() {
return this._interventionsEnabled;
}
async enableInterventions() {
async enableInterventions(whichInterventions = this._availableInterventions) {
await this._enablingOrDisablingOperationInProgress;
this._enablingOrDisablingOperationInProgress = new Promise(done => {
this._enableInterventionsNow();
done();
this._enableInterventionsNow(whichInterventions).then(done);
});
return this._enablingOrDisablingOperationInProgress;
}
async disableInterventions() {
async disableInterventions(
whichInterventions = this._availableInterventions
) {
await this._enablingOrDisablingOperationInProgress;
this._enablingOrDisablingOperationInProgress = new Promise(done => {
for (const config of this._availableInterventions) {
for (const config of whichInterventions) {
this._disableInterventionNow(config);
}
@ -102,7 +118,7 @@ class Interventions {
return this._enablingOrDisablingOperationInProgress;
}
async _enableInterventionsNow() {
async _enableInterventionsNow(whichInterventions) {
await this._enablingOrDisablingOperationInProgress;
const skipped = [];
@ -114,7 +130,7 @@ class Interventions {
const { os } = await browser.runtime.getPlatformInfo();
this.currentPlatform = os;
for (const config of this._availableInterventions) {
for (const config of whichInterventions) {
for (const intervention of config.interventions) {
if (
await InterventionHelpers.shouldSkip(
@ -155,9 +171,8 @@ class Interventions {
this._interventionsEnabled = true;
this._aboutCompatBroker.portsToAboutCompatTabs.broadcast({
interventionsChanged: this._aboutCompatBroker.filterInterventions(
this._availableInterventions
),
interventionsChanged:
this._aboutCompatBroker.filterInterventions(whichInterventions),
});
await browser.testUtils.interventionsActive();
@ -202,15 +217,32 @@ class Interventions {
for (const intervention of config.interventions) {
await this._changeCustomFuncs("enable", label, intervention, config);
await this._enableContentScripts(label, intervention, matches);
await this._enableContentScripts(config.id, label, intervention, matches);
await this._enableUAOverrides(label, intervention, matches);
await this._enableRequestBlocks(label, intervention, blocks);
}
if (!this._getActiveInterventionById(config.id)) {
this._availableInterventions.push(config);
console.info("Added webcompat intervention", config.id, config);
} else {
for (const [index, oldConfig] of this._availableInterventions.entries()) {
if (oldConfig.id === config.id && oldConfig !== config) {
console.info("Replaced webcompat intervention", oldConfig.id, config);
this._availableInterventions[index] = config;
}
}
}
config.active = true;
}
async _disableInterventionNow(config) {
async _disableInterventionNow(_config) {
const config = this._getActiveInterventionById(_config?.id ?? _config);
if (!config) {
return;
}
const { active, label, interventions } = config;
if (!active) {
@ -330,12 +362,9 @@ class Interventions {
console.info(`Blocking requests as specified for ${label}`);
}
async _enableContentScripts(label, intervention, matches) {
if (!("content_scripts" in intervention)) {
return;
}
async _enableContentScripts(bug, label, intervention, matches) {
const scriptsToReg = this._buildContentScriptRegistrations(
bug,
label,
intervention,
matches
@ -390,18 +419,14 @@ class Interventions {
}
}
_buildContentScriptRegistrations(label, intervention, matches) {
_buildContentScriptRegistrations(bug, label, intervention, matches) {
const registration = {
id: `webcompat intervention for ${label}`,
matches,
persistAcrossSessions: false,
};
let { all_frames, css, js, run_at } = intervention.content_scripts;
if (!css && !js) {
console.error(`Missing js or css for content_script in ${label}`);
return [];
}
let { all_frames, css, js, run_at } = intervention.content_scripts ?? {};
if (all_frames) {
registration.allFrames = true;
}
@ -420,6 +445,17 @@ class Interventions {
}
return `injections/js/${item}`;
});
} else {
// Ensure that we log a console message.
const info = [bug];
if (css) {
info.push("css");
}
if (intervention.ua_string) {
info.push("ua");
}
registration.js = [`injections/js/log_message.js#${info.join(":")}`];
registration.runAt = "document_idle";
}
if (run_at) {
registration.runAt = run_at;

View file

@ -124,7 +124,7 @@ class Shim {
browser.aboutConfigPrefs.onPrefChange.addListener(async () => {
const value = await browser.aboutConfigPrefs.getPref(pref);
this._disabledPrefValue = value;
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}, pref);
this.ready = Promise.all([
@ -233,14 +233,14 @@ class Shim {
set disabledBySmartblockEmbedPref(value) {
this._disabledBySmartblockEmbedPref = value;
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}
onAllShimsEnabled() {
const wasEnabled = this.enabled;
this._disabledGlobally = false;
if (!wasEnabled) {
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}
}
@ -248,7 +248,7 @@ class Shim {
const wasEnabled = this.enabled;
this._disabledGlobally = true;
if (wasEnabled) {
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}
}
@ -256,7 +256,7 @@ class Shim {
const wasEnabled = this.enabled;
this._disabledForSession = false;
if (!wasEnabled) {
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}
}
@ -264,19 +264,19 @@ class Shim {
const wasEnabled = this.enabled;
this._disabledForSession = true;
if (wasEnabled) {
this._onEnabledStateChanged();
this._onEnabledStateChanged({ alsoClearResourceCache: true });
}
}
async _onEnabledStateChanged() {
async _onEnabledStateChanged({ alsoClearResourceCache = false } = {}) {
this.manager?.onShimStateChanged(this.id);
if (!this.enabled) {
await this._unregisterContentScripts();
await this._revokeRequestsInETP();
await this._revokeRequestsInETP(alsoClearResourceCache);
return browser.testUtils.shimsInactive();
}
await this._registerContentScripts();
await this._allowRequestsInETP();
await this._allowRequestsInETP(alsoClearResourceCache);
return browser.testUtils.shimsActive();
}
@ -350,11 +350,13 @@ class Shim {
this._contentScriptRegistrations = [];
}
async _allowRequestsInETP() {
async _allowRequestsInETP(alsoClearResourceCache) {
let modified = false;
const matches = this.matches.map(m => m.patterns).flat();
if (matches.length) {
// ensure requests shimmed in both PB and non-PB modes
await browser.trackingProtection.shim(this.id, matches);
modified = true;
}
if (this._hostOptIns.size) {
@ -366,6 +368,7 @@ class Shim {
false,
Array.from(this._hostOptIns)
);
modified = true;
}
}
@ -378,12 +381,20 @@ class Shim {
true,
Array.from(this._pBModeHostOptIns)
);
modified = true;
}
}
if (this._haveCheckedEnabledPrefs && alsoClearResourceCache && modified) {
this.clearResourceCache();
}
}
_revokeRequestsInETP() {
return browser.trackingProtection.revoke(this.id);
async _revokeRequestsInETP(alsoClearResourceCache) {
await browser.trackingProtection.revoke(this.id);
if (this._haveCheckedEnabledPrefs && alsoClearResourceCache) {
this.clearResourceCache();
}
}
setActiveOnTab(tabId, active = true) {
@ -486,6 +497,7 @@ class Shim {
isPrivateMode,
Array.from(activeHostOptIns)
);
this.clearResourceCache();
}
}
@ -525,6 +537,7 @@ class Shim {
isPrivateMode,
Array.from(activeHostOptIns)
);
this.clearResourceCache();
}
}
@ -541,8 +554,13 @@ class Shim {
forPrivateMode,
Array.from(activeHostOptIns)
);
this.clearResourceCache();
}
}
clearResourceCache() {
return browser.trackingProtection.clearResourceCache();
}
}
class Shims {
@ -568,10 +586,20 @@ class Shims {
this._checkSmartblockEmbedsEnabledPref();
}, this.SMARTBLOCK_EMBEDS_ENABLED_PREF);
this._haveCheckedEnabledPrefs = Promise.all([
// NOTE: Methods that uses the prefs should await
// _haveCheckedEnabledPrefsPromise, in order to make sure the
// prefs are all read.
// Methods that potentially clears the resource cache should check
// _haveCheckedEnabledPrefs, in order to avoid clearing the
// resource cache during the startup.
this._haveCheckedEnabledPrefs = false;
this._haveCheckedEnabledPrefsPromise = Promise.all([
this._checkEnabledPref(),
this._checkSmartblockEmbedsEnabledPref(),
]);
this._haveCheckedEnabledPrefsPromise.then(() => {
this._haveCheckedEnabledPrefs = true;
});
// handles unblock message coming in from protections panel
browser.trackingProtection.onSmartBlockEmbedUnblock.addListener(
@ -1011,7 +1039,7 @@ class Shims {
}
async _redirectLogos(details) {
await this._haveCheckedEnabledPrefs;
await this._haveCheckedEnabledPrefsPromise;
if (!this.enabled) {
return { cancel: true };
@ -1047,7 +1075,7 @@ class Shims {
}
async _onHeadersReceived(details) {
await this._haveCheckedEnabledPrefs;
await this._haveCheckedEnabledPrefsPromise;
for (const shim of this.shims.values()) {
await shim.ready;
@ -1081,7 +1109,7 @@ class Shims {
}
async _onBeforeSendHeaders(details) {
await this._haveCheckedEnabledPrefs;
await this._haveCheckedEnabledPrefsPromise;
const { frameId, requestHeaders, tabId } = details;
@ -1138,7 +1166,7 @@ class Shims {
// eslint-disable-next-line complexity
async _ensureShimForRequestOnTab(details) {
await this._haveCheckedEnabledPrefs;
await this._haveCheckedEnabledPrefsPromise;
if (!this.enabled) {
return undefined;

View file

@ -2,7 +2,7 @@
"manifest_version": 2,
"name": "Web Compatibility Interventions",
"description": "Urgent post-release fixes for web compatibility.",
"version": "139.0.0",
"version": "139.1.0",
"browser_specific_settings": {
"gecko": {
"id": "webcompat@mozilla.org",

View file

@ -14,6 +14,8 @@ support-files = [
["browser_aboutcompat.js"]
["browser_console_messages.js"]
["browser_interventions.js"]
["browser_shims.js"]

View file

@ -0,0 +1,106 @@
"use strict";
function promiseWebCompatAddonReady() {
return TestUtils.waitForCondition(() => {
return (
Services.ppmm.sharedData.get("WebCompatTests:InterventionsStatus") ===
"active"
);
});
}
function sendWebCompatAddonCommand(name, data) {
return new Promise(done => {
const listener = {
receiveMessage(message) {
Services.cpmm.removeMessageListener(`WebCompat:${name}:Done`, listener);
done(message.data);
},
};
Services.cpmm.addMessageListener(`WebCompat:${name}:Done`, listener);
Services.ppmm.broadcastAsyncMessage("WebCompat", { name, data });
});
}
async function verifyConsoleMessage(interventions, expectedString) {
const config = {
id: "bugnumber_test",
label: "test intervention",
bugs: {
issue1: {
matches: ["*://example.com/*"],
},
},
interventions: interventions.map(i =>
Object.assign({ platforms: ["all"] }, i)
),
};
const results = await sendWebCompatAddonCommand("UpdateInterventions", [
config,
]);
ok(results[0].active, "Test intervention is active");
const tab = await BrowserTestUtils.openNewForegroundTab(
gBrowser,
"https://example.com"
);
const browser = gBrowser.selectedBrowser;
const innerWindowId = browser.innerWindowID;
const msgs = await ContentTask.spawn(
browser,
{ innerWindowId },
async function (args) {
const ConsoleAPIStorage = Cc[
"@mozilla.org/consoleAPI-storage;1"
].getService(Ci.nsIConsoleAPIStorage);
return ConsoleAPIStorage.getEvents(args.innerWindowId);
}
);
is(
msgs.map(m => `${m.level}:${m.arguments[0]}`).join("\n"),
expectedString
? `info:${expectedString} See https://bugzilla.mozilla.org/show_bug.cgi?id=bugnumber for details.`
: "",
`The expected message was logged for ${JSON.stringify(interventions)}`
);
BrowserTestUtils.removeTab(tab);
}
add_task(async function test_messages() {
await promiseWebCompatAddonReady();
// If no CSS, JS or UA intervention is provided, we default to "interventions".
await verifyConsoleMessage(
[{}],
"Custom interventions being applied for compatibility reasons."
);
// If no JS intervention is provided, but CSS and/or UA ones are, we list them.
await verifyConsoleMessage(
[{ content_scripts: { css: [] } }],
"Custom CSS being applied for compatibility reasons."
);
await verifyConsoleMessage(
[{ ua_string: ["add_Chrome"] }],
"Custom user-agent string being applied for compatibility reasons."
);
await verifyConsoleMessage(
[{ ua_string: ["add_Chrome"], content_scripts: { css: [] } }],
"Custom CSS and user-agent string being applied for compatibility reasons."
);
// If there is a JS intervention, it is responsible for logging any messages..
await verifyConsoleMessage(
[
{
ua_string: ["add_Chrome"],
content_scripts: { css: [], js: ["log_message.js#bugnumber:css"] },
},
],
"Custom CSS being applied for compatibility reasons."
);
// ..and it is allowed to log nothing at all.
await verifyConsoleMessage([{ content_scripts: { js: [] } }], undefined);
});

View file

@ -0,0 +1,10 @@
# 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 https://mozilla.org/MPL/2.0/.
## Taskbar Tab urlbar button, will appear if
## browser.taskbarTabs.enabled = true and the user
## navigates to a website.
taskbar-tab-urlbar-button-open =
.tooltiptext = Add to taskbar

View file

@ -3,7 +3,7 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
## Error messages for failed HTTP web requests.
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status#client_error_responses
## Variables:
## $status (Number) - HTTP status code, for example 403

View file

@ -467,10 +467,6 @@ applications-type-description-with-type = { $type-description } ({ $type })
# $type (string) - The MIME type (e.g application/binary)
applications-file-ending-with-type = { applications-file-ending } ({ $type })
# Variables:
# $plugin-name (string) - Name of a plugin (e.g Adobe Flash)
applications-use-plugin-in =
.label = Use { $plugin-name } (in { -brand-short-name })
applications-open-inapp =
.label = Open in { -brand-short-name }
@ -478,9 +474,6 @@ applications-open-inapp =
## selected label element based on the string from
## the selected menu item.
applications-use-plugin-in-label =
.value = { applications-use-plugin-in.label }
applications-action-save-label =
.value = { applications-action-save.label }

View file

@ -11,8 +11,15 @@ set-desktop-background-accept =
open-desktop-prefs =
.label = Open Desktop Preferences
set-desktop-background-downloading =
.label = Saving Picture…
set-background-preview-unavailable = Preview unavailable
# Name of the file that will be used as the desktop background. The
# extension ".bmp" is added by the system.
set-desktop-background-filename = Desktop Background
# This refers to the wallpaper "spanning" multiple monitors when the
# user has more than one. Only some of the entire image will be on
# each monitor. This should ideally match the wording in Windows' own

View file

@ -13,9 +13,6 @@ sidebar-menu-history =
sidebar-menu-synced-tabs =
.label = Synced Tabs
sidebar-menu-megalist =
.label = Passwords
sidebar-menu-close =
.label = Close Sidebar

View file

@ -1,7 +0,0 @@
# 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/.
desktopBackgroundLeafNameWin=Desktop Background.bmp
DesktopBackgroundDownloading=Saving Picture…
DesktopBackgroundSet=Set Desktop Background

View file

@ -41,7 +41,6 @@ SUMMARY_REBOOT_REQUIRED_INSTALL=A restart of your computer may be required to co
SUMMARY_REBOOT_REQUIRED_UNINSTALL=A restart of your computer may be required to complete the uninstall.
SUMMARY_INSTALL_CLICK=Click Install to continue.
SUMMARY_UPGRADE_CLICK=Click Upgrade to continue.
SURVEY_TEXT=&Tell us what you thought of $BrandShortName
LAUNCH_TEXT=&Launch $BrandShortName now
CREATE_ICONS_DESC=Create icons for $BrandShortName:
ICONS_DESKTOP=On my &desktop
@ -61,9 +60,7 @@ ERROR_CREATE_DIRECTORY_PREFIX=Error creating directory:
ERROR_CREATE_DIRECTORY_SUFFIX=Click Cancel to stop the installation or\nRetry to try again.
UN_CONFIRM_PAGE_TITLE=Uninstall $BrandFullName
UN_CONFIRM_PAGE_SUBTITLE=Remove $BrandFullName from your computer.
UN_CONFIRM_UNINSTALLED_FROM=$BrandShortName will be uninstalled from the following location:
UN_CONFIRM_CLICK=Click Uninstall to continue.
UN_REFRESH_PAGE_TITLE=Refresh $BrandShortName Instead?
UN_REFRESH_PAGE_EXPLANATION=If youre having problems with $BrandShortName, a refresh can help.\n\nThis will restore the default settings and remove add-ons. Start fresh for optimal performance.
@ -73,7 +70,6 @@ UN_REFRESH_BUTTON=&Refresh $BrandShortName
BANNER_CHECK_EXISTING=Checking existing installation…
STATUS_INSTALL_APP=Installing $BrandShortName…
STATUS_INSTALL_LANG=Installing Language Files (${AB_CD})…
STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
STATUS_CLEANUP=A Little Housekeeping…

View file

@ -20,6 +20,7 @@
preview/smartTabGroups.ftl (../locales-preview/smartTabGroups.ftl)
preview/tabUnload.ftl (../locales-preview/tabUnload.ftl)
preview/reportContentTemporary.ftl (../locales-preview/reportContentTemporary.ftl)
preview/taskbartabs.ftl (../locales-preview/taskbartabs.ftl)
@AB_CD@.jar:
% locale browser @AB_CD@ %locale/browser/
@ -29,7 +30,6 @@
locale/browser/search.properties (%chrome/browser/search.properties)
locale/browser/siteData.properties (%chrome/browser/siteData.properties)
locale/browser/sitePermissions.properties (%chrome/browser/sitePermissions.properties)
locale/browser/shellservice.properties (%chrome/browser/shellservice.properties)
locale/browser/taskbar.properties (%chrome/browser/taskbar.properties)
locale/browser/downloads/downloads.properties (%chrome/browser/downloads/downloads.properties)
locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties)

View file

@ -17,7 +17,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"af": {
"pin": false,
@ -37,7 +37,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"an": {
"pin": false,
@ -57,7 +57,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ar": {
"pin": false,
@ -77,7 +77,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ast": {
"pin": false,
@ -97,7 +97,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"az": {
"pin": false,
@ -117,7 +117,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"be": {
"pin": false,
@ -137,7 +137,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"bg": {
"pin": false,
@ -157,7 +157,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"bn": {
"pin": false,
@ -177,7 +177,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"bo": {
"pin": false,
@ -197,7 +197,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"br": {
"pin": false,
@ -217,7 +217,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"brx": {
"pin": false,
@ -237,7 +237,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"bs": {
"pin": false,
@ -257,7 +257,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ca": {
"pin": false,
@ -277,7 +277,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ca-valencia": {
"pin": false,
@ -297,7 +297,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"cak": {
"pin": false,
@ -317,7 +317,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ckb": {
"pin": false,
@ -337,7 +337,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"cs": {
"pin": false,
@ -357,7 +357,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"cy": {
"pin": false,
@ -377,7 +377,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"da": {
"pin": false,
@ -397,7 +397,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"de": {
"pin": false,
@ -417,7 +417,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"dsb": {
"pin": false,
@ -437,7 +437,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"el": {
"pin": false,
@ -457,7 +457,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"en-CA": {
"pin": false,
@ -477,7 +477,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"en-GB": {
"pin": false,
@ -497,7 +497,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"eo": {
"pin": false,
@ -517,7 +517,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"es-AR": {
"pin": false,
@ -537,7 +537,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"es-CL": {
"pin": false,
@ -557,7 +557,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"es-ES": {
"pin": false,
@ -577,7 +577,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"es-MX": {
"pin": false,
@ -597,7 +597,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"et": {
"pin": false,
@ -617,7 +617,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"eu": {
"pin": false,
@ -637,7 +637,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"fa": {
"pin": false,
@ -657,7 +657,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ff": {
"pin": false,
@ -677,7 +677,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"fi": {
"pin": false,
@ -697,7 +697,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"fr": {
"pin": false,
@ -717,7 +717,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"fur": {
"pin": false,
@ -737,7 +737,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"fy-NL": {
"pin": false,
@ -757,7 +757,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ga-IE": {
"pin": false,
@ -777,7 +777,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"gd": {
"pin": false,
@ -797,7 +797,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"gl": {
"pin": false,
@ -817,7 +817,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"gn": {
"pin": false,
@ -837,7 +837,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"gu-IN": {
"pin": false,
@ -857,7 +857,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"he": {
"pin": false,
@ -877,7 +877,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hi-IN": {
"pin": false,
@ -897,7 +897,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hr": {
"pin": false,
@ -917,7 +917,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hsb": {
"pin": false,
@ -937,7 +937,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hu": {
"pin": false,
@ -957,7 +957,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hy-AM": {
"pin": false,
@ -977,7 +977,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"hye": {
"pin": false,
@ -997,7 +997,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ia": {
"pin": false,
@ -1017,7 +1017,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"id": {
"pin": false,
@ -1037,7 +1037,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"is": {
"pin": false,
@ -1057,7 +1057,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"it": {
"pin": false,
@ -1077,7 +1077,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ja": {
"pin": false,
@ -1095,7 +1095,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ja-JP-mac": {
"pin": false,
@ -1103,7 +1103,7 @@
"macosx64",
"macosx64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ka": {
"pin": false,
@ -1123,7 +1123,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"kab": {
"pin": false,
@ -1143,7 +1143,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"kk": {
"pin": false,
@ -1163,7 +1163,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"km": {
"pin": false,
@ -1183,7 +1183,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"kn": {
"pin": false,
@ -1203,7 +1203,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ko": {
"pin": false,
@ -1223,7 +1223,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"lij": {
"pin": false,
@ -1243,7 +1243,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"lo": {
"pin": false,
@ -1263,7 +1263,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"lt": {
"pin": false,
@ -1283,7 +1283,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ltg": {
"pin": false,
@ -1303,7 +1303,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"lv": {
"pin": false,
@ -1323,7 +1323,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"meh": {
"pin": false,
@ -1343,7 +1343,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"mk": {
"pin": false,
@ -1363,7 +1363,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ml": {
"pin": false,
@ -1383,7 +1383,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"mr": {
"pin": false,
@ -1403,7 +1403,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ms": {
"pin": false,
@ -1423,7 +1423,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"my": {
"pin": false,
@ -1443,7 +1443,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"nb-NO": {
"pin": false,
@ -1463,7 +1463,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ne-NP": {
"pin": false,
@ -1483,7 +1483,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"nl": {
"pin": false,
@ -1503,7 +1503,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"nn-NO": {
"pin": false,
@ -1523,7 +1523,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"oc": {
"pin": false,
@ -1543,7 +1543,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"pa-IN": {
"pin": false,
@ -1563,7 +1563,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"pl": {
"pin": false,
@ -1583,7 +1583,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"pt-BR": {
"pin": false,
@ -1603,7 +1603,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"pt-PT": {
"pin": false,
@ -1623,7 +1623,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"rm": {
"pin": false,
@ -1643,7 +1643,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ro": {
"pin": false,
@ -1663,7 +1663,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ru": {
"pin": false,
@ -1683,7 +1683,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sat": {
"pin": false,
@ -1703,7 +1703,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sc": {
"pin": false,
@ -1723,7 +1723,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"scn": {
"pin": false,
@ -1743,7 +1743,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sco": {
"pin": false,
@ -1763,7 +1763,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"si": {
"pin": false,
@ -1783,7 +1783,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sk": {
"pin": false,
@ -1803,7 +1803,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"skr": {
"pin": false,
@ -1823,7 +1823,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sl": {
"pin": false,
@ -1843,7 +1843,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"son": {
"pin": false,
@ -1863,7 +1863,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sq": {
"pin": false,
@ -1883,7 +1883,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sr": {
"pin": false,
@ -1903,7 +1903,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"sv-SE": {
"pin": false,
@ -1923,7 +1923,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"szl": {
"pin": false,
@ -1943,7 +1943,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ta": {
"pin": false,
@ -1963,7 +1963,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"te": {
"pin": false,
@ -1983,7 +1983,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"tg": {
"pin": false,
@ -2003,7 +2003,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"th": {
"pin": false,
@ -2023,7 +2023,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"tl": {
"pin": false,
@ -2043,7 +2043,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"tr": {
"pin": false,
@ -2063,7 +2063,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"trs": {
"pin": false,
@ -2083,7 +2083,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"uk": {
"pin": false,
@ -2103,7 +2103,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"ur": {
"pin": false,
@ -2123,7 +2123,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"uz": {
"pin": false,
@ -2143,7 +2143,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"vi": {
"pin": false,
@ -2163,7 +2163,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"wo": {
"pin": false,
@ -2183,7 +2183,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"xh": {
"pin": false,
@ -2203,7 +2203,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"zh-CN": {
"pin": false,
@ -2223,7 +2223,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
},
"zh-TW": {
"pin": false,
@ -2243,6 +2243,6 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
}
}

View file

@ -16,7 +16,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
},
"en-CA": {
"platforms": [
@ -35,7 +35,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
},
"he": {
"platforms": [
@ -54,7 +54,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
},
"it": {
"platforms": [
@ -73,7 +73,7 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
},
"ja": {
"platforms": [
@ -90,13 +90,13 @@
"win64-aarch64-devedition",
"win64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
},
"ja-JP-mac": {
"platforms": [
"macosx64",
"macosx64-devedition"
],
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
"revision": "main"
}
}

View file

@ -16,7 +16,9 @@ ChromeUtils.defineESModuleGetters(lazy, {
const ABOUT_URL = "about:newtab";
const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
const TOPIC_APP_QUIT = "quit-application-granted";
// AboutHomeStartupCache needs us in "quit-application", so stay alive longer.
// TODO: We could better have a shared async shutdown blocker?
const TOPIC_APP_QUIT = "profile-before-change";
const BROWSER_READY_NOTIFICATION = "sessionstore-windows-restored";
const BUILTIN_ADDON_ID = "newtab@mozilla.org";
@ -256,10 +258,7 @@ export const AboutNewTab = {
observe(subject, topic) {
switch (topic) {
case TOPIC_APP_QUIT: {
// We defer to this to the next tick of the event loop since the
// AboutHomeStartupCache might want to read from the ActivityStream
// store during TOPIC_APP_QUIT.
Services.tm.dispatchToMainThread(() => this.uninit());
this.uninit();
break;
}
case BROWSER_READY_NOTIFICATION: {

View file

@ -249,12 +249,18 @@ export var ExtensionsUI = {
});
}
// We don't want to show the incognito checkbox in the update prompt or
// optional prompt (which shouldn't be possible in this case), but it's
// fine for installs (including sideload).
const shouldShowIncognitoCheckbox =
!info.type || info.type === "sideload";
this.showPermissionsPrompt(
browser,
strings,
icon,
info.addon,
true /* shouldShowIncognitoCheckbox */
shouldShowIncognitoCheckbox
).then(answer => {
if (answer) {
info.resolve();

View file

@ -9,12 +9,6 @@ const gContentPrefs = Cc["@mozilla.org/content-pref/service;1"].getService(
);
const gZoomPropertyName = "browser.content.full-zoom";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
});
export var ZoomUI = {
init(aWindow) {
aWindow.addEventListener("EndSwapDocShells", onEndSwapDocShells, true);
@ -119,22 +113,19 @@ function onZoomChange(event) {
* @param {boolean} aAnimate Should be True for all cases unless the zoom
* change is related to tab switching. Optional
*/
async function updateZoomUI(aBrowser, aAnimate = false) {
export async function updateZoomUI(aBrowser, aAnimate = false) {
let win = aBrowser.ownerGlobal;
if (!win.gBrowser || win.gBrowser.selectedBrowser != aBrowser) {
if (
!win.gBrowser ||
win.gBrowser.selectedBrowser != aBrowser ||
aBrowser.browsingContext.topChromeWindow != win
) {
return;
}
let appMenuZoomReset = lazy.PanelMultiView.getViewNode(
win.document,
let appMenuZoomReset = win.document.getElementById(
"appMenu-zoomReset-button2"
);
// Exit early if UI elements aren't present.
if (!appMenuZoomReset) {
return;
}
let customizableZoomControls = win.document.getElementById("zoom-controls");
let customizableZoomReset = win.document.getElementById("zoom-reset-button");
let urlbarZoomButton = win.document.getElementById("urlbar-zoom-button");

View file

@ -22,26 +22,17 @@ html|*.addon-webext-perm-list {
list-style: none;
&.webext-perm-granted {
list-style-position: inside;
list-style-type: disc;
/* NOTE: Insert line breaks on long permission strings (or domain name included
* in the localized string that ends up be overflowing */
overflow-wrap: break-word;
}
/* style the permissions list items that are not editable to use the check.svg image */
&.webext-perm-granted::before {
content: "";
background-image: url("chrome://global/skin/icons/check.svg");
background-repeat: no-repeat;
-moz-context-properties: fill;
fill: currentColor;
/* style the permissions list items to match sizes and margins used by the
* checkbox xul element to make sure they are properly aligned with the
* private browsing checkbox at the end of the list. */
display: inline-flex;
width: var(--checkbox-size);
height: var(--checkbox-size);
margin-inline-end: var(--checkbox-margin-inline);
vertical-align: text-bottom;
/* Add some space between the list of permissions and the private browsing
* checkbox. */
& + &.webext-perm-privatebrowsing {
margin-top: var(--space-medium);
}
}
}
@ -74,15 +65,7 @@ html|ul.webext-perm-domains-list {
}
}
.addon-webext-perm-single-entry {
margin-top: 11px;
/* NOTE: Insert line breaks on long permission strings (or domain name included
* in the localized string that ends up be overflowing */
overflow-wrap: break-word;
}
.addon-webext-perm-text,
.addon-webext-perm-single-entry {
.addon-webext-perm-text {
margin-inline-start: 0;
}

View file

@ -49,7 +49,9 @@
}
&[lwtheme] {
--link-color: light-dark(rgb(0, 97, 224), rgb(0, 221, 255));
--link-color: light-dark(var(--color-blue-50), var(--color-cyan-50));
--link-color-hover: light-dark(var(--color-blue-60), var(--color-cyan-30));
--link-color-active: light-dark(var(--color-blue-70), var(--color-cyan-20));
--tabs-navbar-separator-color: light-dark(rgba(0,0,0,.1), rgba(0,0,0,.3));
--attention-dot-color: light-dark(#2ac3a2, #54ffbd);

View file

@ -10,6 +10,8 @@
flex: 1;
justify-content: center;
align-items: center;
margin: 0;
padding: 0;
> .menu-iconic-text,
> .menu-accel-container {

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