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 # changes to stick? As of bug 928195, this shouldn't be necessary! Please
# don't change CLOBBER for WebIDL changes any more. # 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" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" 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]] [[package]]
name = "byteorder" name = "byteorder"
version = "1.5.0" version = "1.5.0"
@ -929,12 +949,13 @@ dependencies = [
[[package]] [[package]]
name = "codespan-reporting" name = "codespan-reporting"
version = "0.11.1" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
dependencies = [ dependencies = [
"serde",
"termcolor", "termcolor",
"unicode-width 0.1.999", "unicode-width 0.2.0",
] ]
[[package]] [[package]]
@ -4507,7 +4528,7 @@ checksum = "a2983372caf4480544083767bf2d27defafe32af49ab4df3a0b7fc90793a3664"
[[package]] [[package]]
name = "naga" name = "naga"
version = "24.0.0" 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 = [ dependencies = [
"arrayvec", "arrayvec",
"bit-set", "bit-set",
@ -4524,7 +4545,6 @@ dependencies = [
"serde", "serde",
"spirv", "spirv",
"strum", "strum",
"termcolor",
"thiserror 2.0.9", "thiserror 2.0.9",
"unicode-ident", "unicode-ident",
] ]
@ -4649,6 +4669,7 @@ dependencies = [
"nserror", "nserror",
"nsstring", "nsstring",
"qlog", "qlog",
"static_assertions",
"static_prefs", "static_prefs",
"thin-vec", "thin-vec",
"uuid", "uuid",
@ -5562,14 +5583,15 @@ dependencies = [
[[package]] [[package]]
name = "ron" name = "ron"
version = "0.8.1" version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94" checksum = "63f3aa105dea217ef30d89581b65a4d527a19afc95ef5750be3890e8d3c5b837"
dependencies = [ dependencies = [
"base64 0.21.999", "base64 0.22.1",
"bitflags 2.9.0", "bitflags 2.9.0",
"serde", "serde",
"serde_derive", "serde_derive",
"unicode-ident",
] ]
[[package]] [[package]]
@ -7386,11 +7408,13 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-core" name = "wgpu-core"
version = "24.0.0" 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 = [ dependencies = [
"arrayvec", "arrayvec",
"bit-set",
"bit-vec", "bit-vec",
"bitflags 2.9.0", "bitflags 2.9.0",
"bytemuck",
"cfg_aliases", "cfg_aliases",
"document-features", "document-features",
"hashbrown 0.14.5", "hashbrown 0.14.5",
@ -7414,7 +7438,7 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-core-deps-apple" name = "wgpu-core-deps-apple"
version = "24.0.0" 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 = [ dependencies = [
"wgpu-hal", "wgpu-hal",
] ]
@ -7422,7 +7446,7 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-core-deps-windows-linux-android" name = "wgpu-core-deps-windows-linux-android"
version = "24.0.0" 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 = [ dependencies = [
"wgpu-hal", "wgpu-hal",
] ]
@ -7430,7 +7454,7 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-hal" name = "wgpu-hal"
version = "24.0.0" 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 = [ dependencies = [
"android_system_properties", "android_system_properties",
"arrayvec", "arrayvec",
@ -7438,6 +7462,7 @@ dependencies = [
"bit-set", "bit-set",
"bitflags 2.9.0", "bitflags 2.9.0",
"block", "block",
"bytemuck",
"cfg_aliases", "cfg_aliases",
"core-graphics-types 0.1.999", "core-graphics-types 0.1.999",
"gpu-alloc", "gpu-alloc",
@ -7465,9 +7490,10 @@ dependencies = [
[[package]] [[package]]
name = "wgpu-types" name = "wgpu-types"
version = "24.0.0" 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 = [ dependencies = [
"bitflags 2.9.0", "bitflags 2.9.0",
"bytemuck",
"js-sys", "js-sys",
"log", "log",
"serde", "serde",

View file

@ -182,6 +182,17 @@ class AccAttributes {
return nullptr; 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> template <typename T>
Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const { Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const {
static_assert(std::is_same_v<nsTArray<int32_t>, T> || static_assert(std::is_same_v<nsTArray<int32_t>, T> ||

View file

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

View file

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

View file

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

View file

@ -377,6 +377,8 @@ pref("browser.warnOnQuit", true);
pref("browser.overlink-delay", 80); pref("browser.overlink-delay", 80);
pref("browser.taskbarTabs.enabled", false);
pref("browser.theme.colorway-closet", true); pref("browser.theme.colorway-closet", true);
#if defined(MOZ_WIDGET_GTK) #if defined(MOZ_WIDGET_GTK)
@ -2325,9 +2327,9 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
// Fingerprinting: // Fingerprinting:
// "fp": fingerprinting blocking enabled // "fp": fingerprinting blocking enabled
// "-fp": fingerprinting blocking disabled // "-fp": fingerprinting blocking disabled
// Cryptomining: // Cryptomining Tracking Protection:
// "cm": cryptomining blocking enabled // "cryptoTP": cryptomining blocking enabled
// "-cm": cryptomining blocking disabled // "-cryptoTP": cryptomining blocking disabled
// Social Tracking Protection: // Social Tracking Protection:
// "stp": social tracking protection enabled // "stp": social tracking protection enabled
// "-stp": social tracking protection disabled // "-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: // Email Tracking Protection in private windows:
// "emailTPPrivate": email tracking protection in private windows enabled // "emailTPPrivate": email tracking protection in private windows enabled
// "-emailTPPrivate": email tracking protection in private windows disabled // "-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: // Level 2 Tracking list in normal windows:
// "lvl2": Level 2 tracking list enabled // "lvl2": Level 2 tracking list enabled
// "-lvl2": Level 2 tracking list disabled // "-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 enabled
// "-btp": BTP disabled // "-btp": BTP disabled
// One value from each section must be included in the browser.contentblocking.features.strict pref. // 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 // 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 // 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.textEl = this.querySelector("#addon-webext-perm-text");
this.introEl = this.querySelector("#addon-webext-perm-intro"); 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.permsListEl = this.querySelector("#addon-webext-perm-list");
this.render(); this.render();
@ -154,15 +151,6 @@ customElements.define(
return !(showIncognitoCheckbox || strings.msgs.length); 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() { get domainsSet() {
if (!this.notification?.options?.customElementOptions) { if (!this.notification?.options?.customElementOptions) {
return undefined; return undefined;
@ -187,7 +175,7 @@ customElements.define(
const { strings, showIncognitoCheckbox, isUserScriptsRequest } = const { strings, showIncognitoCheckbox, isUserScriptsRequest } =
this.notification.options.customElementOptions; 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 HTML_NS = "http://www.w3.org/1999/xhtml";
const doc = this.ownerDocument; const doc = this.ownerDocument;
@ -218,37 +206,8 @@ customElements.define(
return; return;
} }
// If there are multiple permissions entries to be shown, // We only expect a single permission for a userScripts request per
// add to the list element one entry for each granted permission // https://searchfox.org/mozilla-central/rev/5fb48bf50516ed2529d533e5dfe49b4752efb8b8/browser/modules/ExtensionsUI.sys.mjs#308-313.
// (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;
}
if (isUserScriptsRequest) { if (isUserScriptsRequest) {
// The "userScripts" permission cannot be granted until the user has // The "userScripts" permission cannot be granted until the user has
// confirmed again in the notification's content, as described at // confirmed again in the notification's content, as described at
@ -262,32 +221,37 @@ customElements.define(
this.#setAllowButtonEnabled(false); this.#setAllowButtonEnabled(false);
permsSingleEl.append(checkboxEl, warningEl); let item = doc.createElementNS(HTML_NS, "li");
permsSingleEl.classList.add("webext-perm-optional"); item.append(checkboxEl, warningEl);
permsSingleEl.hidden = false; item.classList.add("webext-perm-optional");
return; permsListEl.append(item);
}
// 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));
} else { } 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) { #createFullDomainsListFragment(msg) {
@ -317,7 +281,7 @@ customElements.define(
} }
#clearChildElements() { #clearChildElements() {
const { textEl, introEl, permsSingleEl, permsListEl } = this; const { textEl, introEl, permsListEl } = this;
// Clear all changes to the child elements that may have been changed // Clear all changes to the child elements that may have been changed
// by a previous call of the render method. // by a previous call of the render method.
@ -328,13 +292,6 @@ customElements.define(
introEl.textContent = ""; introEl.textContent = "";
introEl.hidden = true; introEl.hidden = true;
permsSingleEl.textContent = "";
permsSingleEl.hidden = true;
permsSingleEl.classList.remove(
"webext-perm-optional",
"webext-perm-privatebrowsing"
);
permsListEl.textContent = ""; permsListEl.textContent = "";
permsListEl.hidden = true; permsListEl.hidden = true;
} }

View file

@ -11,7 +11,6 @@
<stringbundleset id="stringbundleset"> <stringbundleset id="stringbundleset">
<stringbundle id="bundle_brand" src="chrome://branding/locale/brand.properties"/> <stringbundle id="bundle_brand" src="chrome://branding/locale/brand.properties"/>
<stringbundle id="bundle_shell" src="chrome://browser/locale/shellservice.properties"/>
</stringbundleset> </stringbundleset>
<!-- The event listeners are defined by _initCommandSet in browser-init.js --> <!-- 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", TabCrashHandler: "resource:///modules/ContentCrashHandlers.sys.mjs",
TabsSetupFlowManager: TabsSetupFlowManager:
"resource:///modules/firefox-view-tabs-setup-manager.sys.mjs", "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", TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs",
ToolbarContextMenu: "resource:///modules/ToolbarContextMenu.sys.mjs", ToolbarContextMenu: "resource:///modules/ToolbarContextMenu.sys.mjs",
ToolbarDropHandler: "resource:///modules/ToolbarDropHandler.sys.mjs", ToolbarDropHandler: "resource:///modules/ToolbarDropHandler.sys.mjs",

View file

@ -30,7 +30,11 @@
data-l10n-sync="true"> data-l10n-sync="true">
<head> <head>
<!-- CSP might be disabled by C++ code. --> <!-- 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'" /> <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 <!-- The "global.css" stylesheet is imported first to allow other stylesheets to
override rules using selectors with the same specificity. This applies 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/onboarding.ftl"/>
<link rel="localization" href="preview/smartTabGroups.ftl"/> <link rel="localization" href="preview/smartTabGroups.ftl"/>
<link rel="localization" href="preview/tabUnload.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> <title data-l10n-id="browser-main-window-default-title"></title>

View file

@ -382,6 +382,13 @@
<image id="picture-in-picture-button-icon" <image id="picture-in-picture-button-icon"
class="urlbar-icon"/> class="urlbar-icon"/>
</hbox> </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" <hbox id="translations-button"
class="urlbar-page-action" class="urlbar-page-action"
role="button" role="button"

View file

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

View file

@ -119,7 +119,6 @@
<popupnotificationcontent class="addon-webext-perm-notification-content" orient="vertical"> <popupnotificationcontent class="addon-webext-perm-notification-content" orient="vertical">
<description id="addon-webext-perm-text" class="addon-webext-perm-text"/> <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-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"/> <html:ul id="addon-webext-perm-list" class="addon-webext-perm-list"/>
</popupnotificationcontent> </popupnotificationcontent>
</popupnotification> </popupnotification>

View file

@ -53,7 +53,7 @@ function onExtra1() {
showResetDialog(); showResetDialog();
} }
function onLoad() { window.addEventListener("load", () => {
const dialog = document.getElementById("safeModeDialog"); const dialog = document.getElementById("safeModeDialog");
if (appStartup.automaticSafeModeNecessary) { if (appStartup.automaticSafeModeNecessary) {
document.getElementById("autoSafeMode").hidden = false; document.getElementById("autoSafeMode").hidden = false;
@ -72,4 +72,4 @@ function onLoad() {
document.addEventListener("dialogaccept", onDefaultButton); document.addEventListener("dialogaccept", onDefaultButton);
document.addEventListener("dialogcancel", onCancel); document.addEventListener("dialogcancel", onCancel);
document.addEventListener("dialogextra1", onExtra1); 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 - 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/. --> - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
<?csp default-src chrome: resource:; style-src chrome: 'unsafe-inline'; ?>
<window <window
xmlns:html="http://www.w3.org/1999/xhtml" xmlns:html="http://www.w3.org/1999/xhtml"
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
data-l10n-id="troubleshoot-mode-window" data-l10n-id="troubleshoot-mode-window"
data-l10n-attrs="title,style" data-l10n-attrs="title,style"
onload="onLoad()"
> >
<dialog <dialog
id="safeModeDialog" id="safeModeDialog"

View file

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

View file

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

View file

@ -273,6 +273,10 @@ add_task(async function test_sideloading() {
[["webext-perms-host-description-all-urls"]], [["webext-perms-host-description-all-urls"]],
kSideloaded kSideloaded
); );
ok(
panel.querySelector(".webext-perm-privatebrowsing checkbox"),
"Expect incognito checkbox in sideload prompt"
);
// Accept the permissions // Accept the permissions
panel.button.click(); 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 // The original extension has 1 promptable permission and the new one
// has 2 (history and <all_urls>) plus 1 non-promptable permission (cookies). // 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. // So we should only see the 1 new promptable permission in the notification.
let singlePermissionEl = document.getElementById( let permissionsListEl = document.getElementById("addon-webext-perm-list");
"addon-webext-perm-single-entry" 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. // Cancel the update.
panel.secondaryButton.click(); panel.secondaryButton.click();

View file

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

View file

@ -540,8 +540,9 @@ const WebRTCIndicator = {
toggleEl.checked toggleEl.checked
); );
Services.ppmm.sharedData.flush(); Services.ppmm.sharedData.flush();
let l10nId = let l10nId = toggleEl.checked
"webrtc-microphone-" + (toggleEl.checked ? "muted" : "unmuted"); ? "webrtc-microphone-muted"
: "webrtc-microphone-unmuted";
document.l10n.setAttributes(toggleEl, l10nId); document.l10n.setAttributes(toggleEl, l10nId);
}, },
@ -557,7 +558,9 @@ const WebRTCIndicator = {
toggleCameraMute(toggleEl) { toggleCameraMute(toggleEl) {
Services.ppmm.sharedData.set("WebRTC:GlobalCameraMute", toggleEl.checked); Services.ppmm.sharedData.set("WebRTC:GlobalCameraMute", toggleEl.checked);
Services.ppmm.sharedData.flush(); 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); 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 resource:///modules/BrowserDOMWindow.sys.mjs BrowserDOMWindow.teardownInWindow
category browser-window-unload moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs NewTabPagePreloading.removePreloadedBrowser 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 # App startup consumers
category browser-idle-startup resource:///modules/PlacesUIUtils.sys.mjs PlacesUIUtils.unblockToolbars category browser-idle-startup resource:///modules/PlacesUIUtils.sys.mjs PlacesUIUtils.unblockToolbars

View file

@ -324,43 +324,8 @@ function openBrowserWindow(
} }
if (isStartup) { if (isStartup) {
let win = Services.wm.getMostRecentWindow("navigator:blank"); let win = gBrowserContentHandler.replaceStartupWindow(args, forcePrivate);
if (win) { 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 win;
} }
} }
@ -1178,6 +1143,52 @@ nsBrowserContentHandler.prototype = {
request.cancel(Cr.NS_BINDING_ABORTED); 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 */ /* nsICommandLineValidator */
validate: function bch_validate(cmdLine) { validate: function bch_validate(cmdLine) {
var urlFlagIdx = cmdLine.findFlag("url", false); var urlFlagIdx = cmdLine.findFlag("url", false);

View file

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

View file

@ -656,282 +656,6 @@ const MESSAGES = () => {
}, },
skip_in_tests: "not tested in automation", 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", id: "ADDONS_STAFF_PICK_PT_2",
template: "feature_callout", template: "feature_callout",

View file

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

View file

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

View file

@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(this, {
MenuMessage: "resource:///modules/asrouter/MenuMessage.sys.mjs", MenuMessage: "resource:///modules/asrouter/MenuMessage.sys.mjs",
NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs", NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs",
PanelMultiView: "resource:///modules/PanelMultiView.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); let message = ASRouter.getMessageById(messageId);
ASRouter.addImpression(message); ASRouter.addImpression(message);
} }
updateZoomUI(gBrowser.selectedBrowser);
}, },
_onHelpViewShow() { _onHelpViewShow() {

View file

@ -2,6 +2,11 @@
/* vim: set sts=2 sw=2 et tw=80: */ /* vim: set sts=2 sw=2 et tw=80: */
"use strict"; "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 runTests(options) {
async function background(getTests) { async function background(getTests) {
let manifest = browser.runtime.getManifest(); let manifest = browser.runtime.getManifest();

View file

@ -242,7 +242,9 @@ add_task(async function testOptionalPermissionsDialogShowsFullDomainsList() {
domainsListLength: 1, domainsListLength: 1,
verifyDialog(popupContentEl) { verifyDialog(popupContentEl) {
assertNoDomainsList(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: [], optional_permissions: [],
domainsListLength: 10, domainsListLength: 10,
verifyDialog(popupContentEl) { verifyDialog(popupContentEl) {
const domainsListEl = popupContentEl.permsSingleEl.querySelector( const domainsListEl = popupContentEl.permsListEl.querySelector(
".webext-perm-domains-list" ".webext-perm-domains-list"
); );
Assert.ok(domainsListEl, "Expect domains list element to be found"); Assert.ok(domainsListEl, "Expect domains list element to be found");

View file

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

View file

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

View file

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

View file

@ -110,6 +110,15 @@ export var AboutHomeStartupCache = {
throw new Error("AboutHomeStartupCache already initted."); 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.setDeferredResult(this.CACHE_RESULT_SCALARS.UNSET);
this._enabled = Services.prefs.getBoolPref( this._enabled = Services.prefs.getBoolPref(
@ -181,7 +190,7 @@ export var AboutHomeStartupCache = {
await this.onShutdown(); await this.onShutdown();
}; };
lazy.AsyncShutdown.quitApplicationGranted.addBlocker( lazy.AsyncShutdown.appShutdownConfirmed.addBlocker(
"AboutHomeStartupCache: Writing cache", "AboutHomeStartupCache: Writing cache",
this._shutdownBlocker, this._shutdownBlocker,
() => this._cacheProgress () => this._cacheProgress
@ -238,7 +247,7 @@ export var AboutHomeStartupCache = {
this._finalized = false; this._finalized = false;
this._firstPrivilegedProcessCreated = false; this._firstPrivilegedProcessCreated = false;
lazy.AsyncShutdown.quitApplicationGranted.removeBlocker( lazy.AsyncShutdown.appShutdownConfirmed.removeBlocker(
this._shutdownBlocker this._shutdownBlocker
); );
this._shutdownBlocker = null; this._shutdownBlocker = null;
@ -260,7 +269,7 @@ export var AboutHomeStartupCache = {
_cacheProgress: "Not yet begun", _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 * to potentially flush the most recent cache to disk. If one was
* never written during the session, one is generated and written * never written during the session, one is generated and written
* before the async function resolves. * before the async function resolves.
@ -377,6 +386,12 @@ export var AboutHomeStartupCache = {
*/ */
requestCache() { requestCache() {
this.log.trace("Parent is requesting Activity Stream state object."); 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) { if (!this._procManager) {
this.log.error("requestCache called with no _procManager!"); this.log.error("requestCache called with no _procManager!");
return { pageInputStream: null, scriptInputStream: null }; return { pageInputStream: null, scriptInputStream: null };

View file

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

View file

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

View file

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

View file

@ -13,11 +13,15 @@ const NCB_PREF = "network.cookie.cookieBehavior";
const NCBP_PREF = "network.cookie.cookieBehavior.pbmode"; const NCBP_PREF = "network.cookie.cookieBehavior.pbmode";
const CAT_PREF = "browser.contentblocking.category"; const CAT_PREF = "browser.contentblocking.category";
const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled"; 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 STP_PREF = "privacy.trackingprotection.socialtracking.enabled";
const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled"; const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled";
const EMAIL_TP_PBM_PREF = const EMAIL_TP_PBM_PREF =
"privacy.trackingprotection.emailtracking.pbmode.enabled"; "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 LEVEL2_PREF = "privacy.annotate_channels.strict_list.enabled";
const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault"; const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault";
const REFERRER_TOP_PREF = const REFERRER_TOP_PREF =
@ -57,8 +61,8 @@ add_task(async function testContentBlockingStandardDefinition() {
`${FP_PREF} pref has the default value` `${FP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(CM_PREF), !Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CM_PREF} pref has the default value` `${CRYPTO_TP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(STP_PREF), !Services.prefs.prefHasUserValue(STP_PREF),
@ -72,6 +76,14 @@ add_task(async function testContentBlockingStandardDefinition() {
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF), !Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
`${EMAIL_TP_PBM_PREF} pref has the default value` `${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( ok(
!Services.prefs.prefHasUserValue(NCB_PREF), !Services.prefs.prefHasUserValue(NCB_PREF),
`${NCB_PREF} pref has the default value` `${NCB_PREF} pref has the default value`
@ -125,10 +137,16 @@ add_task(async function testContentBlockingStandardDefinition() {
let originalTP = defaults.getBoolPref(TP_PREF); let originalTP = defaults.getBoolPref(TP_PREF);
let originalTPPBM = defaults.getBoolPref(TP_PBM_PREF); let originalTPPBM = defaults.getBoolPref(TP_PBM_PREF);
let originalFP = defaults.getBoolPref(FP_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 originalSTP = defaults.getBoolPref(STP_PREF);
let originalEmailTP = defaults.getBoolPref(EMAIL_TP_PREF); let originalEmailTP = defaults.getBoolPref(EMAIL_TP_PREF);
let originalEmailTPPBM = defaults.getBoolPref(EMAIL_TP_PBM_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 originalNCB = defaults.getIntPref(NCB_PREF);
let originalNCBP = defaults.getIntPref(NCBP_PREF); let originalNCBP = defaults.getIntPref(NCBP_PREF);
let originalLEVEL2 = defaults.getBoolPref(LEVEL2_PREF); let originalLEVEL2 = defaults.getBoolPref(LEVEL2_PREF);
@ -167,10 +185,15 @@ add_task(async function testContentBlockingStandardDefinition() {
defaults.setBoolPref(TP_PREF, !originalTP); defaults.setBoolPref(TP_PREF, !originalTP);
defaults.setBoolPref(TP_PBM_PREF, !originalTPPBM); defaults.setBoolPref(TP_PBM_PREF, !originalTPPBM);
defaults.setBoolPref(FP_PREF, !originalFP); defaults.setBoolPref(FP_PREF, !originalFP);
defaults.setBoolPref(CM_PREF, !originalCM); defaults.setBoolPref(CRYPTO_TP_PREF, !originalCryptoTP);
defaults.setBoolPref(CM_PREF, !originalSTP); defaults.setBoolPref(CRYPTO_TP_PREF, !originalSTP);
defaults.setBoolPref(EMAIL_TP_PREF, !originalEmailTP); defaults.setBoolPref(EMAIL_TP_PREF, !originalEmailTP);
defaults.setBoolPref(EMAIL_TP_PBM_PREF, !originalEmailTPPBM); 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(NCB_PREF, !originalNCB);
defaults.setBoolPref(LEVEL2_PREF, !originalLEVEL2); defaults.setBoolPref(LEVEL2_PREF, !originalLEVEL2);
defaults.setBoolPref(REFERRER_PREF, !originalREFERRER); defaults.setBoolPref(REFERRER_PREF, !originalREFERRER);
@ -196,8 +219,8 @@ add_task(async function testContentBlockingStandardDefinition() {
`${FP_PREF} pref has the default value` `${FP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(CM_PREF), !Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CM_PREF} pref has the default value` `${CRYPTO_TP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(STP_PREF), !Services.prefs.prefHasUserValue(STP_PREF),
@ -211,6 +234,14 @@ add_task(async function testContentBlockingStandardDefinition() {
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF), !Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
`${EMAIL_TP_PBM_PREF} pref has the default value` `${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( ok(
!Services.prefs.prefHasUserValue(NCB_PREF), !Services.prefs.prefHasUserValue(NCB_PREF),
`${NCB_PREF} pref has the default value` `${NCB_PREF} pref has the default value`
@ -265,10 +296,15 @@ add_task(async function testContentBlockingStandardDefinition() {
defaults.setBoolPref(TP_PREF, originalTP); defaults.setBoolPref(TP_PREF, originalTP);
defaults.setBoolPref(TP_PBM_PREF, originalTPPBM); defaults.setBoolPref(TP_PBM_PREF, originalTPPBM);
defaults.setBoolPref(FP_PREF, originalFP); defaults.setBoolPref(FP_PREF, originalFP);
defaults.setBoolPref(CM_PREF, originalCM); defaults.setBoolPref(CRYPTO_TP_PREF, originalCryptoTP);
defaults.setBoolPref(STP_PREF, originalSTP); defaults.setBoolPref(STP_PREF, originalSTP);
defaults.setBoolPref(EMAIL_TP_PREF, originalEmailTP); defaults.setBoolPref(EMAIL_TP_PREF, originalEmailTP);
defaults.setBoolPref(EMAIL_TP_PBM_PREF, originalEmailTPPBM); 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(NCB_PREF, originalNCB);
defaults.setIntPref(NCBP_PREF, originalNCBP); defaults.setIntPref(NCBP_PREF, originalNCBP);
defaults.setBoolPref(LEVEL2_PREF, originalLEVEL2); defaults.setBoolPref(LEVEL2_PREF, originalLEVEL2);
@ -291,7 +327,7 @@ add_task(async function testContentBlockingStrictDefinition() {
let originalStrictPref = defaults.getStringPref(STRICT_DEF_PREF); let originalStrictPref = defaults.getStringPref(STRICT_DEF_PREF);
defaults.setStringPref( defaults.setStringPref(
STRICT_DEF_PREF, 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"); Services.prefs.setStringPref(CAT_PREF, "strict");
is( is(
@ -306,7 +342,7 @@ add_task(async function testContentBlockingStrictDefinition() {
); );
is( is(
Services.prefs.getStringPref(STRICT_DEF_PREF), 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.` `${STRICT_DEF_PREF} changed to what we set.`
); );
@ -323,12 +359,12 @@ add_task(async function testContentBlockingStrictDefinition() {
is( is(
Services.prefs.getBoolPref(FP_PREF), Services.prefs.getBoolPref(FP_PREF),
true, true,
`${CM_PREF} pref has been set to true` `${FP_PREF} pref has been set to true`
); );
is( is(
Services.prefs.getBoolPref(CM_PREF), Services.prefs.getBoolPref(CRYPTO_TP_PREF),
true, true,
`${CM_PREF} pref has been set to true` `${CRYPTO_TP_PREF} pref has been set to true`
); );
is( is(
Services.prefs.getBoolPref(STP_PREF), Services.prefs.getBoolPref(STP_PREF),
@ -345,6 +381,16 @@ add_task(async function testContentBlockingStrictDefinition() {
true, true,
`${EMAIL_TP_PBM_PREF} pref has been set to 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( is(
Services.prefs.getIntPref(NCB_PREF), Services.prefs.getIntPref(NCB_PREF),
Ci.nsICookieService.BEHAVIOR_ACCEPT, Ci.nsICookieService.BEHAVIOR_ACCEPT,
@ -422,8 +468,8 @@ add_task(async function testContentBlockingStrictDefinition() {
`${FP_PREF} pref has the default value` `${FP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(CM_PREF), !Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
`${CM_PREF} pref has the default value` `${CRYPTO_TP_PREF} pref has the default value`
); );
ok( ok(
!Services.prefs.prefHasUserValue(STP_PREF), !Services.prefs.prefHasUserValue(STP_PREF),
@ -488,7 +534,7 @@ add_task(async function testContentBlockingStrictDefinition() {
defaults.setStringPref( defaults.setStringPref(
STRICT_DEF_PREF, 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( is(
Services.prefs.getBoolPref(TP_PREF), Services.prefs.getBoolPref(TP_PREF),
@ -506,9 +552,9 @@ add_task(async function testContentBlockingStrictDefinition() {
`${FP_PREF} pref has been set to false` `${FP_PREF} pref has been set to false`
); );
is( is(
Services.prefs.getBoolPref(CM_PREF), Services.prefs.getBoolPref(CRYPTO_TP_PREF),
false, false,
`${CM_PREF} pref has been set to false` `${CRYPTO_TP_PREF} pref has been set to false`
); );
is( is(
Services.prefs.getBoolPref(STP_PREF), Services.prefs.getBoolPref(STP_PREF),
@ -525,6 +571,16 @@ add_task(async function testContentBlockingStrictDefinition() {
false, false,
`${EMAIL_TP_PBM_PREF} pref has been set to 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( is(
Services.prefs.getIntPref(NCB_PREF), Services.prefs.getIntPref(NCB_PREF),
Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN, Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN,

View file

@ -149,6 +149,7 @@ engine_list_test(async function test_change_keyword(tree) {
keywordBefore, keywordBefore,
"Did not modify keywords." "Did not modify keywords."
); );
alertSpy.restore();
}); });
engine_list_test(async function test_rename_engines(tree) { 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 // cookieBehaviors both are BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN in
// the strict feature value. // the strict feature value.
await testCookieBlockingInfoStrict( 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 false
); );
@ -114,7 +114,7 @@ add_task(async function runTests() {
// cookieBehavior is BEHAVIOR_REJECT_TRACKER and the private cookieBehavior is // cookieBehavior is BEHAVIOR_REJECT_TRACKER and the private cookieBehavior is
// BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN // BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN
await testCookieBlockingInfoStrict( 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 true
); );

View file

@ -4,7 +4,8 @@
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
const CB_STRICT_FEATURES_PREF = "browser.contentblocking.features.strict"; 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 FPI_PREF = "privacy.firstparty.isolate";
const COOKIE_BEHAVIOR_PREF = "network.cookie.cookieBehavior"; const COOKIE_BEHAVIOR_PREF = "network.cookie.cookieBehavior";
const COOKIE_BEHAVIOR_VALUE = 5; const COOKIE_BEHAVIOR_VALUE = 5;

View file

@ -219,14 +219,12 @@ add_task(async function test_cleanup() {
info( info(
"5. Altering closedAt to an old date, making sure that stuff gets collected, eventually" "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(); await promiseCleanup();
let state = getClosedState(); let state = getClosedState();
state._closedWindows[0].closedAt = LONG_TIME_AGO; state._closedWindows[0].closedAt = LONG_TIME_AGO;
state.windows[0]._closedTabs[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(); state.windows[0]._closedTabs[1].closedAt = Date.now();
let url = state.windows[0]._closedTabs[1].state.entries[0].url; 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()); state = JSON.parse(ss.getBrowserState());
is(state._closedWindows[0], undefined, "5. Second window was forgotten"); 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(state.windows[0]._closedTabs.length, 1, "5. Only one closed tab left");
is( is(

View file

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

View file

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

View file

@ -6,6 +6,4 @@
#define PREF_CHECKDEFAULTBROWSER "browser.shell.checkDefaultBrowser" #define PREF_CHECKDEFAULTBROWSER "browser.shell.checkDefaultBrowser"
#define PREF_DEFAULTBROWSERCHECKCOUNT "browser.shell.defaultBrowserCheckCount" #define PREF_DEFAULTBROWSERCHECKCOUNT "browser.shell.defaultBrowserCheckCount"
#define SHELLSERVICE_PROPERTIES \
"chrome://browser/locale/shellservice.properties"
#define BRAND_PROPERTIES "chrome://branding/locale/brand.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. * Limitation: Only square images are supported as of now.
*/ */
NS_IMETHODIMP NS_IMETHODIMP
@ -677,21 +677,18 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
rv = request->GetImage(getter_AddRefs(container)); rv = request->GetImage(getter_AddRefs(container));
if (!container) return NS_ERROR_FAILURE; if (!container) return NS_ERROR_FAILURE;
// get the file name from localized strings // get the file name from localized strings, e.g. "Desktop Background", then
nsCOMPtr<nsIStringBundleService> bundleService( // append the extension (".bmp").
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv)); nsTArray<nsCString> resIds = {
NS_ENSURE_SUCCESS(rv, rv); "browser/browser/setDesktopBackground.ftl"_ns,
};
nsCOMPtr<nsIStringBundle> shellBundle; RefPtr<Localization> l10n = Localization::Create(resIds, true);
rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES, nsAutoCString fileLeafNameUtf8;
getter_AddRefs(shellBundle)); IgnoredErrorResult locRv;
NS_ENSURE_SUCCESS(rv, rv); l10n->FormatValueSync("set-desktop-background-filename"_ns, {},
fileLeafNameUtf8, locRv);
// e.g. "Desktop Background.bmp" nsAutoString fileLeafName = NS_ConvertUTF8toUTF16(fileLeafNameUtf8);
nsAutoString fileLeafName; fileLeafName.AppendLiteral(".bmp");
rv = shellBundle->GetStringFromName("desktopBackgroundLeafNameWin",
fileLeafName);
NS_ENSURE_SUCCESS(rv, rv);
// get the profile root directory // get the profile root directory
nsCOMPtr<nsIFile> file; nsCOMPtr<nsIFile> file;
@ -708,7 +705,7 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
NS_ENSURE_SUCCESS(rv, rv); NS_ENSURE_SUCCESS(rv, rv);
// write the bitmap to a file in the profile directory. // 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); rv = WriteBitmap(file, container);
// if the file was written successfully, set it as the system wallpaper // if the file was written successfully, set it as the system wallpaper

View file

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

View file

@ -2657,6 +2657,17 @@
if (this.#rtlMode) { if (this.#rtlMode) {
dropBefore = !dropBefore; 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) { if (gBrowser._tabGroupsEnabled && isTab(draggedTab) && !isPinned) {

View file

@ -316,3 +316,35 @@ add_task(async function test_optin_telemetry() {
); );
cleanup(); 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 * 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/. */ * 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( const { TabStateFlusher } = ChromeUtils.importESModule(
"resource:///modules/sessionstore/TabStateFlusher.sys.mjs" "resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
); );
@ -507,6 +513,12 @@ add_task(async function test_tabGroupMoveToNewWindow() {
}); });
add_task(async function test_TabGroupEvents() { 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 tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
let tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank"); let tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
let group; let group;
@ -539,6 +551,7 @@ add_task(async function test_TabGroupEvents() {
let groupCollapsed = BrowserTestUtils.waitForEvent(group, "TabGroupCollapse"); let groupCollapsed = BrowserTestUtils.waitForEvent(group, "TabGroupCollapse");
group.collapsed = true; group.collapsed = true;
await groupCollapsed; await groupCollapsed;
Assert.ok(triggerHandler.calledOnce, "Called once after tab group collapsed");
let groupExpanded = BrowserTestUtils.waitForEvent(group, "TabGroupExpand"); let groupExpanded = BrowserTestUtils.waitForEvent(group, "TabGroupExpand");
group.collapsed = false; group.collapsed = false;
@ -564,6 +577,7 @@ add_task(async function test_TabGroupEvents() {
BrowserTestUtils.removeTab(tab1); BrowserTestUtils.removeTab(tab1);
BrowserTestUtils.removeTab(tab2); BrowserTestUtils.removeTab(tab2);
tabGroupCollapsedTrigger.uninit();
}); });
add_task(async function test_moveTabBetweenGroups() { add_task(async function test_moveTabBetweenGroups() {
@ -1662,6 +1676,12 @@ add_task(async function test_tabsContainNoTabGroups() {
* Tests behavior of the group management panel. * Tests behavior of the group management panel.
*/ */
add_task(async function test_tabGroupCreatePanel() { 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 tabgroupEditor = document.getElementById("tab-group-editor");
let tabgroupPanel = tabgroupEditor.panel; let tabgroupPanel = tabgroupEditor.panel;
let nameField = tabgroupPanel.querySelector("#tab-group-name"); 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" "Panel should be dismissed after clicking Create and new group should remain"
); );
panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden"); panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
let done = BrowserTestUtils.waitForEvent(
tabgroupEditor,
"TabGroupCreateDone"
);
tabgroupPanel.querySelector("#tab-group-editor-button-create").click(); tabgroupPanel.querySelector("#tab-group-editor-button-create").click();
await panelHidden; 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(tabgroupPanel.state, "closed", "Tabgroup edit panel is closed");
Assert.equal(group.label, "Shopping"); Assert.equal(group.label, "Shopping");
Assert.equal(group.color, "red"); Assert.equal(group.color, "red");
@ -1790,6 +1816,7 @@ add_task(async function test_tabGroupCreatePanel() {
let removePromise = BrowserTestUtils.waitForEvent(group, "TabGroupRemoved"); let removePromise = BrowserTestUtils.waitForEvent(group, "TabGroupRemoved");
tabgroupPanel.querySelector("#tabGroupEditor_deleteGroup").click(); tabgroupPanel.querySelector("#tabGroupEditor_deleteGroup").click();
await Promise.all([panelHidden, removePromise]); await Promise.all([panelHidden, removePromise]);
tabGroupCreatedTrigger.uninit();
}); });
async function createTabGroupAndOpenEditPanel(tabs = []) { async function createTabGroupAndOpenEditPanel(tabs = []) {
@ -1964,6 +1991,11 @@ add_task(async function test_saveDisabledForUnimportantGroup() {
}); });
add_task(async function test_saveAndCloseGroup() { 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 tab = await addTab("about:mozilla");
let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel([tab]); let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel([tab]);
let tabgroupPanel = tabgroupEditor.panel; let tabgroupPanel = tabgroupEditor.panel;
@ -1982,6 +2014,7 @@ add_task(async function test_saveAndCloseGroup() {
saveAndCloseGroupButton.click(); saveAndCloseGroupButton.click();
await Promise.all(events); await Promise.all(events);
Assert.ok(triggerHandler.calledOnce, "Called once after tab group saved");
Assert.ok( Assert.ok(
!gBrowser.getTabGroupById(group.id), !gBrowser.getTabGroupById(group.id),
"Group was removed from browser" "Group was removed from browser"
@ -1991,6 +2024,7 @@ add_task(async function test_saveAndCloseGroup() {
SessionStore.forgetSavedTabGroup(group.id); SessionStore.forgetSavedTabGroup(group.id);
BrowserTestUtils.removeTab(tab); BrowserTestUtils.removeTab(tab);
tabGroupSavedTrigger.uninit();
}); });
add_task(async function test_saveAndCloseGroupViaMiddleClick() { 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 # 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/. # 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", "TaskbarTabUI.sys.mjs",
] ]

View file

@ -1,6 +1,16 @@
[DEFAULT] [DEFAULT]
support-files = ["head.js"] 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"] ["browser_taskbarTabs_chromeTest.js"]
run-if = ["os == 'win'"] 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_level.js"]
["browser_autofill_address_name.js"]
["browser_autofill_address_select.js"] ["browser_autofill_address_select.js"]
["browser_autofill_address_select_inexact.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: { data: {
section: sectionKey, section: sectionKey,
section_position: sectionPosition, 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. // Otherwise display a default source.
return ( return (
<p className="source clamp"> <div className="source-wrapper">
{icon_src && <img src={icon_src} height="16" width="16" alt="" />} {icon_src && <img src={icon_src} height="16" width="16" alt="" />}
{source} <p className="source clamp">{source}</p>
</p> </div>
); );
}; };
@ -370,7 +370,7 @@ export class _DSCard extends React.PureComponent {
? { ? {
section: this.props.section, section: this.props.section,
section_position: this.props.sectionPosition, 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: this.props.section,
section_position: this.props.sectionPosition, 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: this.props.section,
section_position: this.props.sectionPosition, 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: this.props.section,
section_position: this.props.sectionPosition, 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: this.props.section,
section_position: this.props.sectionPosition, 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} is_list_card={this.props.isListCard}
section={this.props.section} section={this.props.section}
section_position={this.props.sectionPosition} section_position={this.props.sectionPosition}
is_secton_followed={this.props.sectionFollowed} is_section_followed={this.props.sectionFollowed}
format={format} format={format}
isSectionsCard={this.props.mayHaveSectionsCards} isSectionsCard={this.props.mayHaveSectionsCards}
/> />

View file

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

View file

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

View file

@ -82,7 +82,7 @@ export class _DSLinkMenu extends React.PureComponent {
? { ? {
section: this.props.section, section: this.props.section,
section_position: this.props.section_position, 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: link.section,
section_position: link.section_position, 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: site.section,
section_position: site.section_position, 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: site.section,
section_position: site.section_position, 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; -webkit-line-clamp: 3;
line-height: 20px; line-height: 20px;
} }
.ds-card .meta .source { .ds-card .meta .source-wrapper {
-webkit-line-clamp: 1;
margin-bottom: 2px;
font-size: 13px;
color: var(--newtab-text-secondary-color);
display: flex; display: flex;
margin-block-end: var(--space-xxsmall);
align-items: center; align-items: center;
} }
.ds-card .meta .source img { .ds-card .meta .source-wrapper img {
border-radius: var(--border-radius-small); border-radius: var(--border-radius-small);
margin-inline-end: var(--space-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 { .ds-card .meta .source span {
display: inline-block; display: inline-block;
} }
@ -6592,6 +6594,7 @@ main section {
line-height: normal; line-height: normal;
} }
.ds-card-grid .sections-card-ui .meta .source { .ds-card-grid .sections-card-ui .meta .source {
-webkit-line-clamp: 1;
color: var(--newtab-text-secondary-text); color: var(--newtab-text-secondary-text);
font-size: var(--font-size-small); font-size: var(--font-size-small);
} }
@ -6728,6 +6731,7 @@ main section {
width: 100%; width: 100%;
height: 100%; height: 100%;
object-fit: cover; object-fit: cover;
border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
} }
.ds-image .placeholder-image { .ds-image .placeholder-image {
overflow: hidden; overflow: hidden;

View file

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

View file

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

View file

@ -212,12 +212,30 @@ let AVAILABLE_PIP_OVERRIDES;
}, },
}, },
iq: {
"https://*.iq.com/play/*": {
videoWrapperScriptPath: "video-wrappers/iq.js",
},
},
kick: { kick: {
"https://*.kick.com/*": { "https://*.kick.com/*": {
visibilityThreshold: 0.7, 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: { laracasts: {
"https://*.laracasts.com/*": { policy: TOGGLE_POLICIES.ONE_QUARTER }, "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", "issue": "firefox-blocked-completely",
"matches": ["*://*.aptsovation.com/*"] "matches": ["*://*.aptsovation.com/*"]
}, },
"1894682": {
"issue": "firefox-blocked-completely",
"matches": ["*://*.arboretumapartments.com/*"]
},
"1898964": { "1898964": {
"issue": "firefox-blocked-completely", "issue": "firefox-blocked-completely",
"matches": ["*://*.breakpointeandcoronado.com/*"] "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": { "1799968": {
"label": "www.samsung.com", "label": "www.samsung.com",
"bugs": { "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": { "1845299": {
"label": "Google Slides", "label": "Google Slides",
"bugs": { "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": { "1886616": {
"label": "www.six-group.com", "label": "www.six-group.com",
"bugs": { "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": { "1902459": {
"label": "coupangplay.com", "label": "coupangplay.com",
"bugs": { "bugs": {

View file

@ -4,12 +4,40 @@
"use strict"; "use strict";
/* global ExtensionAPI, Services */ /* global ExtensionAPI, ExtensionCommon, Services */
this.testUtils = class extends ExtensionAPI { this.testUtils = class extends ExtensionAPI {
getAPI() { getAPI(context) {
const { EventManager } = ExtensionCommon;
let messageListener;
return { return {
testUtils: { 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() { async interventionsActive() {
Services.ppmm.sharedData.set( Services.ppmm.sharedData.set(
"WebCompatTests:InterventionsStatus", "WebCompatTests:InterventionsStatus",

View file

@ -2,6 +2,19 @@
{ {
"namespace": "testUtils", "namespace": "testUtils",
"description": "experimental API extension to let tests know the addon's status", "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": [ "functions": [
{ {
"name": "interventionsActive", "name": "interventionsActive",

View file

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

View file

@ -141,6 +141,13 @@
], ],
"async": true "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", "name": "wasRequestUnblocked",
"type": "function", "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.checkInterventionPref();
}, this.INTERVENTION_PREF); }, this.INTERVENTION_PREF);
this.checkInterventionPref(); 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() { checkInterventionPref() {
@ -67,26 +78,31 @@ class Interventions {
return this._availableInterventions; return this._availableInterventions;
} }
_getActiveInterventionById(whichId) {
return this._availableInterventions.find(({ id }) => id === whichId);
}
isEnabled() { isEnabled() {
return this._interventionsEnabled; return this._interventionsEnabled;
} }
async enableInterventions() { async enableInterventions(whichInterventions = this._availableInterventions) {
await this._enablingOrDisablingOperationInProgress; await this._enablingOrDisablingOperationInProgress;
this._enablingOrDisablingOperationInProgress = new Promise(done => { this._enablingOrDisablingOperationInProgress = new Promise(done => {
this._enableInterventionsNow(); this._enableInterventionsNow(whichInterventions).then(done);
done();
}); });
return this._enablingOrDisablingOperationInProgress; return this._enablingOrDisablingOperationInProgress;
} }
async disableInterventions() { async disableInterventions(
whichInterventions = this._availableInterventions
) {
await this._enablingOrDisablingOperationInProgress; await this._enablingOrDisablingOperationInProgress;
this._enablingOrDisablingOperationInProgress = new Promise(done => { this._enablingOrDisablingOperationInProgress = new Promise(done => {
for (const config of this._availableInterventions) { for (const config of whichInterventions) {
this._disableInterventionNow(config); this._disableInterventionNow(config);
} }
@ -102,7 +118,7 @@ class Interventions {
return this._enablingOrDisablingOperationInProgress; return this._enablingOrDisablingOperationInProgress;
} }
async _enableInterventionsNow() { async _enableInterventionsNow(whichInterventions) {
await this._enablingOrDisablingOperationInProgress; await this._enablingOrDisablingOperationInProgress;
const skipped = []; const skipped = [];
@ -114,7 +130,7 @@ class Interventions {
const { os } = await browser.runtime.getPlatformInfo(); const { os } = await browser.runtime.getPlatformInfo();
this.currentPlatform = os; this.currentPlatform = os;
for (const config of this._availableInterventions) { for (const config of whichInterventions) {
for (const intervention of config.interventions) { for (const intervention of config.interventions) {
if ( if (
await InterventionHelpers.shouldSkip( await InterventionHelpers.shouldSkip(
@ -155,9 +171,8 @@ class Interventions {
this._interventionsEnabled = true; this._interventionsEnabled = true;
this._aboutCompatBroker.portsToAboutCompatTabs.broadcast({ this._aboutCompatBroker.portsToAboutCompatTabs.broadcast({
interventionsChanged: this._aboutCompatBroker.filterInterventions( interventionsChanged:
this._availableInterventions this._aboutCompatBroker.filterInterventions(whichInterventions),
),
}); });
await browser.testUtils.interventionsActive(); await browser.testUtils.interventionsActive();
@ -202,15 +217,32 @@ class Interventions {
for (const intervention of config.interventions) { for (const intervention of config.interventions) {
await this._changeCustomFuncs("enable", label, intervention, config); 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._enableUAOverrides(label, intervention, matches);
await this._enableRequestBlocks(label, intervention, blocks); 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; config.active = true;
} }
async _disableInterventionNow(config) { async _disableInterventionNow(_config) {
const config = this._getActiveInterventionById(_config?.id ?? _config);
if (!config) {
return;
}
const { active, label, interventions } = config; const { active, label, interventions } = config;
if (!active) { if (!active) {
@ -330,12 +362,9 @@ class Interventions {
console.info(`Blocking requests as specified for ${label}`); console.info(`Blocking requests as specified for ${label}`);
} }
async _enableContentScripts(label, intervention, matches) { async _enableContentScripts(bug, label, intervention, matches) {
if (!("content_scripts" in intervention)) {
return;
}
const scriptsToReg = this._buildContentScriptRegistrations( const scriptsToReg = this._buildContentScriptRegistrations(
bug,
label, label,
intervention, intervention,
matches matches
@ -390,18 +419,14 @@ class Interventions {
} }
} }
_buildContentScriptRegistrations(label, intervention, matches) { _buildContentScriptRegistrations(bug, label, intervention, matches) {
const registration = { const registration = {
id: `webcompat intervention for ${label}`, id: `webcompat intervention for ${label}`,
matches, matches,
persistAcrossSessions: false, persistAcrossSessions: false,
}; };
let { all_frames, css, js, run_at } = intervention.content_scripts; 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 [];
}
if (all_frames) { if (all_frames) {
registration.allFrames = true; registration.allFrames = true;
} }
@ -420,6 +445,17 @@ class Interventions {
} }
return `injections/js/${item}`; 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) { if (run_at) {
registration.runAt = run_at; registration.runAt = run_at;

View file

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

View file

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

View file

@ -14,6 +14,8 @@ support-files = [
["browser_aboutcompat.js"] ["browser_aboutcompat.js"]
["browser_console_messages.js"]
["browser_interventions.js"] ["browser_interventions.js"]
["browser_shims.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/. # file, You can obtain one at http://mozilla.org/MPL/2.0/.
## Error messages for failed HTTP web requests. ## 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: ## Variables:
## $status (Number) - HTTP status code, for example 403 ## $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) # $type (string) - The MIME type (e.g application/binary)
applications-file-ending-with-type = { applications-file-ending } ({ $type }) 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 = applications-open-inapp =
.label = Open in { -brand-short-name } .label = Open in { -brand-short-name }
@ -478,9 +474,6 @@ applications-open-inapp =
## selected label element based on the string from ## selected label element based on the string from
## the selected menu item. ## the selected menu item.
applications-use-plugin-in-label =
.value = { applications-use-plugin-in.label }
applications-action-save-label = applications-action-save-label =
.value = { applications-action-save.label } .value = { applications-action-save.label }

View file

@ -11,8 +11,15 @@ set-desktop-background-accept =
open-desktop-prefs = open-desktop-prefs =
.label = Open Desktop Preferences .label = Open Desktop Preferences
set-desktop-background-downloading =
.label = Saving Picture…
set-background-preview-unavailable = Preview unavailable 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 # This refers to the wallpaper "spanning" multiple monitors when the
# user has more than one. Only some of the entire image will be on # 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 # each monitor. This should ideally match the wording in Windows' own

View file

@ -13,9 +13,6 @@ sidebar-menu-history =
sidebar-menu-synced-tabs = sidebar-menu-synced-tabs =
.label = Synced Tabs .label = Synced Tabs
sidebar-menu-megalist =
.label = Passwords
sidebar-menu-close = sidebar-menu-close =
.label = Close Sidebar .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_REBOOT_REQUIRED_UNINSTALL=A restart of your computer may be required to complete the uninstall.
SUMMARY_INSTALL_CLICK=Click Install to continue. SUMMARY_INSTALL_CLICK=Click Install to continue.
SUMMARY_UPGRADE_CLICK=Click Upgrade to continue. SUMMARY_UPGRADE_CLICK=Click Upgrade to continue.
SURVEY_TEXT=&Tell us what you thought of $BrandShortName
LAUNCH_TEXT=&Launch $BrandShortName now LAUNCH_TEXT=&Launch $BrandShortName now
CREATE_ICONS_DESC=Create icons for $BrandShortName: CREATE_ICONS_DESC=Create icons for $BrandShortName:
ICONS_DESKTOP=On my &desktop 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. ERROR_CREATE_DIRECTORY_SUFFIX=Click Cancel to stop the installation or\nRetry to try again.
UN_CONFIRM_PAGE_TITLE=Uninstall $BrandFullName 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_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_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. 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… BANNER_CHECK_EXISTING=Checking existing installation…
STATUS_INSTALL_APP=Installing $BrandShortName… STATUS_INSTALL_APP=Installing $BrandShortName…
STATUS_INSTALL_LANG=Installing Language Files (${AB_CD})…
STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName… STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
STATUS_CLEANUP=A Little Housekeeping… STATUS_CLEANUP=A Little Housekeeping…

View file

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

View file

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

View file

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

View file

@ -16,7 +16,9 @@ ChromeUtils.defineESModuleGetters(lazy, {
const ABOUT_URL = "about:newtab"; const ABOUT_URL = "about:newtab";
const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug"; 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 BROWSER_READY_NOTIFICATION = "sessionstore-windows-restored";
const BUILTIN_ADDON_ID = "newtab@mozilla.org"; const BUILTIN_ADDON_ID = "newtab@mozilla.org";
@ -256,10 +258,7 @@ export const AboutNewTab = {
observe(subject, topic) { observe(subject, topic) {
switch (topic) { switch (topic) {
case TOPIC_APP_QUIT: { case TOPIC_APP_QUIT: {
// We defer to this to the next tick of the event loop since the this.uninit();
// AboutHomeStartupCache might want to read from the ActivityStream
// store during TOPIC_APP_QUIT.
Services.tm.dispatchToMainThread(() => this.uninit());
break; break;
} }
case BROWSER_READY_NOTIFICATION: { 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( this.showPermissionsPrompt(
browser, browser,
strings, strings,
icon, icon,
info.addon, info.addon,
true /* shouldShowIncognitoCheckbox */ shouldShowIncognitoCheckbox
).then(answer => { ).then(answer => {
if (answer) { if (answer) {
info.resolve(); 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 gZoomPropertyName = "browser.content.full-zoom";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
});
export var ZoomUI = { export var ZoomUI = {
init(aWindow) { init(aWindow) {
aWindow.addEventListener("EndSwapDocShells", onEndSwapDocShells, true); aWindow.addEventListener("EndSwapDocShells", onEndSwapDocShells, true);
@ -119,22 +113,19 @@ function onZoomChange(event) {
* @param {boolean} aAnimate Should be True for all cases unless the zoom * @param {boolean} aAnimate Should be True for all cases unless the zoom
* change is related to tab switching. Optional * change is related to tab switching. Optional
*/ */
async function updateZoomUI(aBrowser, aAnimate = false) { export async function updateZoomUI(aBrowser, aAnimate = false) {
let win = aBrowser.ownerGlobal; let win = aBrowser.ownerGlobal;
if (!win.gBrowser || win.gBrowser.selectedBrowser != aBrowser) { if (
!win.gBrowser ||
win.gBrowser.selectedBrowser != aBrowser ||
aBrowser.browsingContext.topChromeWindow != win
) {
return; return;
} }
let appMenuZoomReset = lazy.PanelMultiView.getViewNode( let appMenuZoomReset = win.document.getElementById(
win.document,
"appMenu-zoomReset-button2" "appMenu-zoomReset-button2"
); );
// Exit early if UI elements aren't present.
if (!appMenuZoomReset) {
return;
}
let customizableZoomControls = win.document.getElementById("zoom-controls"); let customizableZoomControls = win.document.getElementById("zoom-controls");
let customizableZoomReset = win.document.getElementById("zoom-reset-button"); let customizableZoomReset = win.document.getElementById("zoom-reset-button");
let urlbarZoomButton = win.document.getElementById("urlbar-zoom-button"); let urlbarZoomButton = win.document.getElementById("urlbar-zoom-button");

View file

@ -22,26 +22,17 @@ html|*.addon-webext-perm-list {
list-style: none; list-style: none;
&.webext-perm-granted { &.webext-perm-granted {
list-style-position: inside;
list-style-type: disc;
/* NOTE: Insert line breaks on long permission strings (or domain name included /* NOTE: Insert line breaks on long permission strings (or domain name included
* in the localized string that ends up be overflowing */ * in the localized string that ends up be overflowing */
overflow-wrap: break-word; overflow-wrap: break-word;
} }
/* style the permissions list items that are not editable to use the check.svg image */ /* Add some space between the list of permissions and the private browsing
&.webext-perm-granted::before { * checkbox. */
content: ""; & + &.webext-perm-privatebrowsing {
background-image: url("chrome://global/skin/icons/check.svg"); margin-top: var(--space-medium);
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;
} }
} }
} }
@ -74,15 +65,7 @@ html|ul.webext-perm-domains-list {
} }
} }
.addon-webext-perm-single-entry { .addon-webext-perm-text {
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 {
margin-inline-start: 0; margin-inline-start: 0;
} }

View file

@ -49,7 +49,9 @@
} }
&[lwtheme] { &[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)); --tabs-navbar-separator-color: light-dark(rgba(0,0,0,.1), rgba(0,0,0,.3));
--attention-dot-color: light-dark(#2ac3a2, #54ffbd); --attention-dot-color: light-dark(#2ac3a2, #54ffbd);

View file

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

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