Update On Wed Apr 2 20:54:28 CEST 2025
This commit is contained in:
parent
c2daad41dd
commit
b8ea620731
2825 changed files with 58980 additions and 36938 deletions
2
CLOBBER
2
CLOBBER
|
@ -22,4 +22,4 @@
|
|||
# changes to stick? As of bug 928195, this shouldn't be necessary! Please
|
||||
# don't change CLOBBER for WebIDL changes any more.
|
||||
|
||||
Merge day clobber 2025-03-31
|
||||
Modified build files in third_party/libwebrtc - Bug 1952339 - Vendor libwebrtc from a416f1c7a9
|
||||
|
|
52
Cargo.lock
generated
52
Cargo.lock
generated
|
@ -642,6 +642,26 @@ version = "3.15.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa"
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.22.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6b1fc10dbac614ebc03540c9dbd60e83887fda27794998c6528f1782047d540"
|
||||
dependencies = [
|
||||
"bytemuck_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "bytemuck_derive"
|
||||
version = "1.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
version = "1.5.0"
|
||||
|
@ -929,12 +949,13 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "codespan-reporting"
|
||||
version = "0.11.1"
|
||||
version = "0.12.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
|
||||
checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"termcolor",
|
||||
"unicode-width 0.1.999",
|
||||
"unicode-width 0.2.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -4507,7 +4528,7 @@ checksum = "a2983372caf4480544083767bf2d27defafe32af49ab4df3a0b7fc90793a3664"
|
|||
[[package]]
|
||||
name = "naga"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
|
@ -4524,7 +4545,6 @@ dependencies = [
|
|||
"serde",
|
||||
"spirv",
|
||||
"strum",
|
||||
"termcolor",
|
||||
"thiserror 2.0.9",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
@ -4649,6 +4669,7 @@ dependencies = [
|
|||
"nserror",
|
||||
"nsstring",
|
||||
"qlog",
|
||||
"static_assertions",
|
||||
"static_prefs",
|
||||
"thin-vec",
|
||||
"uuid",
|
||||
|
@ -5562,14 +5583,15 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "ron"
|
||||
version = "0.8.1"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b91f7eff05f748767f183df4320a63d6936e9c6107d97c9e6bdd9784f4289c94"
|
||||
checksum = "63f3aa105dea217ef30d89581b65a4d527a19afc95ef5750be3890e8d3c5b837"
|
||||
dependencies = [
|
||||
"base64 0.21.999",
|
||||
"base64 0.22.1",
|
||||
"bitflags 2.9.0",
|
||||
"serde",
|
||||
"serde_derive",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -7386,11 +7408,13 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "wgpu-core"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"bit-set",
|
||||
"bit-vec",
|
||||
"bitflags 2.9.0",
|
||||
"bytemuck",
|
||||
"cfg_aliases",
|
||||
"document-features",
|
||||
"hashbrown 0.14.5",
|
||||
|
@ -7414,7 +7438,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "wgpu-core-deps-apple"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
@ -7422,7 +7446,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "wgpu-core-deps-windows-linux-android"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"wgpu-hal",
|
||||
]
|
||||
|
@ -7430,7 +7454,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "wgpu-hal"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"android_system_properties",
|
||||
"arrayvec",
|
||||
|
@ -7438,6 +7462,7 @@ dependencies = [
|
|||
"bit-set",
|
||||
"bitflags 2.9.0",
|
||||
"block",
|
||||
"bytemuck",
|
||||
"cfg_aliases",
|
||||
"core-graphics-types 0.1.999",
|
||||
"gpu-alloc",
|
||||
|
@ -7465,9 +7490,10 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "wgpu-types"
|
||||
version = "24.0.0"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c6286791febc64cf8ef054b5356c2669327ef51c#c6286791febc64cf8ef054b5356c2669327ef51c"
|
||||
source = "git+https://github.com/gfx-rs/wgpu?rev=c7c79a0dc9356081a884b5518d1c08ce7a09c7c5#c7c79a0dc9356081a884b5518d1c08ce7a09c7c5"
|
||||
dependencies = [
|
||||
"bitflags 2.9.0",
|
||||
"bytemuck",
|
||||
"js-sys",
|
||||
"log",
|
||||
"serde",
|
||||
|
|
|
@ -182,6 +182,17 @@ class AccAttributes {
|
|||
return nullptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
const T* GetAttributeWeakPtr(nsAtom* aAttrName) const {
|
||||
if (auto value = mData.Lookup(aAttrName)) {
|
||||
if (value->is<RefPtr<T>>()) {
|
||||
const T* ref = value->as<RefPtr<T>>();
|
||||
return ref;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
Maybe<T&> GetMutableAttribute(nsAtom* aAttrName) const {
|
||||
static_assert(std::is_same_v<nsTArray<int32_t>, T> ||
|
||||
|
|
|
@ -1544,10 +1544,10 @@ already_AddRefed<AccAttributes> RemoteAccessible::DefaultTextAttributes() {
|
|||
return result.forget();
|
||||
}
|
||||
|
||||
RefPtr<const AccAttributes> RemoteAccessible::GetCachedARIAAttributes() const {
|
||||
const AccAttributes* RemoteAccessible::GetCachedARIAAttributes() const {
|
||||
ASSERT_DOMAINS_ACTIVE(CacheDomain::ARIA);
|
||||
if (mCachedFields) {
|
||||
auto attrs = mCachedFields->GetAttributeRefPtr<AccAttributes>(
|
||||
auto attrs = mCachedFields->GetAttributeWeakPtr<AccAttributes>(
|
||||
CacheKey::ARIAAttributes);
|
||||
VERIFY_CACHE(CacheDomain::ARIA);
|
||||
return attrs;
|
||||
|
@ -1845,7 +1845,7 @@ void RemoteAccessible::LiveRegionAttributes(nsAString* aLive,
|
|||
if (!mCachedFields) {
|
||||
return;
|
||||
}
|
||||
RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes();
|
||||
auto attrs = GetCachedARIAAttributes();
|
||||
if (!attrs) {
|
||||
return;
|
||||
}
|
||||
|
@ -2329,7 +2329,7 @@ Maybe<int32_t> RemoteAccessible::GetIntARIAAttr(nsAtom* aAttrName) const {
|
|||
if (RequestDomainsIfInactive(CacheDomain::ARIA)) {
|
||||
return Nothing();
|
||||
}
|
||||
if (RefPtr<const AccAttributes> attrs = GetCachedARIAAttributes()) {
|
||||
if (auto attrs = GetCachedARIAAttributes()) {
|
||||
if (auto val = attrs->GetAttribute<int32_t>(aAttrName)) {
|
||||
return val;
|
||||
}
|
||||
|
|
|
@ -354,7 +354,7 @@ class RemoteAccessible : public Accessible, public HyperTextAccessibleBase {
|
|||
Maybe<const nsTArray<int32_t>&> GetCachedTextLines();
|
||||
nsRect GetCachedCharRect(int32_t aOffset);
|
||||
RefPtr<const AccAttributes> GetCachedTextAttributes();
|
||||
RefPtr<const AccAttributes> GetCachedARIAAttributes() const;
|
||||
const AccAttributes* GetCachedARIAAttributes() const;
|
||||
|
||||
nsString GetCachedHTMLNameAttribute() const;
|
||||
|
||||
|
|
|
@ -565,16 +565,18 @@ function prompt(aActor, aBrowser, aRequest) {
|
|||
}
|
||||
const reqAudioOutput = !!audioOutputDevices.length;
|
||||
|
||||
const isFile = principal.schemeIs("file");
|
||||
const stringId = getPromptMessageId(
|
||||
reqVideoInput,
|
||||
reqAudioInput,
|
||||
reqAudioOutput,
|
||||
!!aRequest.secondOrigin
|
||||
!!aRequest.secondOrigin,
|
||||
isFile
|
||||
);
|
||||
let message;
|
||||
let originToShow;
|
||||
if (principal.schemeIs("file")) {
|
||||
message = localization.formatValueSync(stringId + "-with-file");
|
||||
if (isFile) {
|
||||
message = localization.formatValueSync(stringId);
|
||||
originToShow = null;
|
||||
} else {
|
||||
message = localization.formatValueSync(stringId, {
|
||||
|
@ -1333,63 +1335,101 @@ function prompt(aActor, aBrowser, aRequest) {
|
|||
* @param {"AudioCapture" | "Microphone" | null} reqAudioInput
|
||||
* @param {boolean} reqAudioOutput
|
||||
* @param {boolean} delegation - Is the access delegated to a third party?
|
||||
* @param {boolean} isFile - Is the request coming from a file?
|
||||
* @returns {string} Localization message identifier
|
||||
*/
|
||||
function getPromptMessageId(
|
||||
reqVideoInput,
|
||||
reqAudioInput,
|
||||
reqAudioOutput,
|
||||
delegation
|
||||
delegation,
|
||||
isFile
|
||||
) {
|
||||
switch (reqVideoInput) {
|
||||
case "Camera":
|
||||
switch (reqAudioInput) {
|
||||
case "Microphone":
|
||||
return delegation
|
||||
? "webrtc-allow-share-camera-and-microphone-unsafe-delegation"
|
||||
: "webrtc-allow-share-camera-and-microphone";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-camera-and-microphone-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-camera-and-microphone-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-camera-and-microphone";
|
||||
case "AudioCapture":
|
||||
return delegation
|
||||
? "webrtc-allow-share-camera-and-audio-capture-unsafe-delegation"
|
||||
: "webrtc-allow-share-camera-and-audio-capture";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-camera-and-audio-capture-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-camera-and-audio-capture-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-camera-and-audio-capture";
|
||||
default:
|
||||
return delegation
|
||||
? "webrtc-allow-share-camera-unsafe-delegation"
|
||||
: "webrtc-allow-share-camera";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-camera-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-camera-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-camera";
|
||||
}
|
||||
|
||||
case "Screen":
|
||||
switch (reqAudioInput) {
|
||||
case "Microphone":
|
||||
return delegation
|
||||
? "webrtc-allow-share-screen-and-microphone-unsafe-delegation"
|
||||
: "webrtc-allow-share-screen-and-microphone";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-screen-and-microphone-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-screen-and-microphone-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-screen-and-microphone";
|
||||
case "AudioCapture":
|
||||
return delegation
|
||||
? "webrtc-allow-share-screen-and-audio-capture-unsafe-delegation"
|
||||
: "webrtc-allow-share-screen-and-audio-capture";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-screen-and-audio-capture-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-screen-and-audio-capture-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-screen-and-audio-capture";
|
||||
default:
|
||||
return delegation
|
||||
? "webrtc-allow-share-screen-unsafe-delegation"
|
||||
: "webrtc-allow-share-screen";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-screen-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-screen-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-screen";
|
||||
}
|
||||
|
||||
default:
|
||||
switch (reqAudioInput) {
|
||||
case "Microphone":
|
||||
return delegation
|
||||
? "webrtc-allow-share-microphone-unsafe-delegation"
|
||||
: "webrtc-allow-share-microphone";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-microphone-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-microphone-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-microphone";
|
||||
case "AudioCapture":
|
||||
return delegation
|
||||
? "webrtc-allow-share-audio-capture-unsafe-delegation"
|
||||
: "webrtc-allow-share-audio-capture";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-audio-capture-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-audio-capture-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-audio-capture";
|
||||
default:
|
||||
// This should be always true, if we've reached this far.
|
||||
if (reqAudioOutput) {
|
||||
return delegation
|
||||
? "webrtc-allow-share-speaker-unsafe-delegation"
|
||||
: "webrtc-allow-share-speaker";
|
||||
if (isFile) {
|
||||
return "webrtc-allow-share-speaker-with-file";
|
||||
}
|
||||
if (delegation) {
|
||||
return "webrtc-allow-share-speaker-unsafe-delegation";
|
||||
}
|
||||
return "webrtc-allow-share-speaker";
|
||||
}
|
||||
return undefined;
|
||||
}
|
||||
|
|
|
@ -377,6 +377,8 @@ pref("browser.warnOnQuit", true);
|
|||
|
||||
pref("browser.overlink-delay", 80);
|
||||
|
||||
pref("browser.taskbarTabs.enabled", false);
|
||||
|
||||
pref("browser.theme.colorway-closet", true);
|
||||
|
||||
#if defined(MOZ_WIDGET_GTK)
|
||||
|
@ -2325,9 +2327,9 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
|
|||
// Fingerprinting:
|
||||
// "fp": fingerprinting blocking enabled
|
||||
// "-fp": fingerprinting blocking disabled
|
||||
// Cryptomining:
|
||||
// "cm": cryptomining blocking enabled
|
||||
// "-cm": cryptomining blocking disabled
|
||||
// Cryptomining Tracking Protection:
|
||||
// "cryptoTP": cryptomining blocking enabled
|
||||
// "-cryptoTP": cryptomining blocking disabled
|
||||
// Social Tracking Protection:
|
||||
// "stp": social tracking protection enabled
|
||||
// "-stp": social tracking protection disabled
|
||||
|
@ -2337,6 +2339,12 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
|
|||
// Email Tracking Protection in private windows:
|
||||
// "emailTPPrivate": email tracking protection in private windows enabled
|
||||
// "-emailTPPrivate": email tracking protection in private windows disabled
|
||||
// Consent Manager Skipping:
|
||||
// "consentmanagerSkip": consent manager skipping enabled
|
||||
// "-consentmanagerSkip": consent manager skipping disabled
|
||||
// Consent Manager Skipping in private windows:
|
||||
// "consentmanagerSkipPrivate": consent manager skipping in private windows enabled
|
||||
// "-consentmanagerSkipPrivate": consent manager skipping in private windows disabled
|
||||
// Level 2 Tracking list in normal windows:
|
||||
// "lvl2": Level 2 tracking list enabled
|
||||
// "-lvl2": Level 2 tracking list disabled
|
||||
|
@ -2382,7 +2390,7 @@ pref("browser.contentblocking.reject-and-isolate-cookies.preferences.ui.enabled"
|
|||
// "btp": BTP enabled
|
||||
// "-btp": BTP disabled
|
||||
// One value from each section must be included in the browser.contentblocking.features.strict pref.
|
||||
pref("browser.contentblocking.features.strict", "tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,btp");
|
||||
pref("browser.contentblocking.features.strict", "tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,btp");
|
||||
|
||||
// Hide the "Change Block List" link for trackers/tracking content in the custom
|
||||
// Content Blocking/ETP panel. By default, it will not be visible. There is also
|
||||
|
|
|
@ -140,9 +140,6 @@ customElements.define(
|
|||
|
||||
this.textEl = this.querySelector("#addon-webext-perm-text");
|
||||
this.introEl = this.querySelector("#addon-webext-perm-intro");
|
||||
this.permsSingleEl = this.querySelector(
|
||||
"#addon-webext-perm-single-entry"
|
||||
);
|
||||
this.permsListEl = this.querySelector("#addon-webext-perm-list");
|
||||
|
||||
this.render();
|
||||
|
@ -154,15 +151,6 @@ customElements.define(
|
|||
return !(showIncognitoCheckbox || strings.msgs.length);
|
||||
}
|
||||
|
||||
get hasMultiplePermissionsEntries() {
|
||||
const { strings, showIncognitoCheckbox } =
|
||||
this.notification.options.customElementOptions;
|
||||
return (
|
||||
strings.msgs.length > 1 ||
|
||||
(strings.msgs.length === 1 && showIncognitoCheckbox)
|
||||
);
|
||||
}
|
||||
|
||||
get domainsSet() {
|
||||
if (!this.notification?.options?.customElementOptions) {
|
||||
return undefined;
|
||||
|
@ -187,7 +175,7 @@ customElements.define(
|
|||
const { strings, showIncognitoCheckbox, isUserScriptsRequest } =
|
||||
this.notification.options.customElementOptions;
|
||||
|
||||
const { textEl, introEl, permsSingleEl, permsListEl } = this;
|
||||
const { textEl, introEl, permsListEl } = this;
|
||||
|
||||
const HTML_NS = "http://www.w3.org/1999/xhtml";
|
||||
const doc = this.ownerDocument;
|
||||
|
@ -218,37 +206,8 @@ customElements.define(
|
|||
return;
|
||||
}
|
||||
|
||||
// If there are multiple permissions entries to be shown,
|
||||
// add to the list element one entry for each granted permission
|
||||
// (and one for the private browsing checkbox, if it should
|
||||
// be shown) and return earlier.
|
||||
if (this.hasMultiplePermissionsEntries) {
|
||||
for (let [idx, msg] of strings.msgs.entries()) {
|
||||
let item = doc.createElementNS(HTML_NS, "li");
|
||||
item.classList.add("webext-perm-granted");
|
||||
if (
|
||||
this.hasFullDomainsList &&
|
||||
this.#isFullDomainsListEntryIndex(idx)
|
||||
) {
|
||||
item.append(this.#createFullDomainsListFragment(msg));
|
||||
} else {
|
||||
item.textContent = msg;
|
||||
}
|
||||
permsListEl.appendChild(item);
|
||||
}
|
||||
if (showIncognitoCheckbox) {
|
||||
let item = doc.createElementNS(HTML_NS, "li");
|
||||
item.classList.add(
|
||||
"webext-perm-optional",
|
||||
"webext-perm-privatebrowsing"
|
||||
);
|
||||
item.appendChild(this.#createPrivateBrowsingCheckbox());
|
||||
permsListEl.appendChild(item);
|
||||
}
|
||||
permsListEl.hidden = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// We only expect a single permission for a userScripts request per
|
||||
// https://searchfox.org/mozilla-central/rev/5fb48bf50516ed2529d533e5dfe49b4752efb8b8/browser/modules/ExtensionsUI.sys.mjs#308-313.
|
||||
if (isUserScriptsRequest) {
|
||||
// The "userScripts" permission cannot be granted until the user has
|
||||
// confirmed again in the notification's content, as described at
|
||||
|
@ -262,32 +221,37 @@ customElements.define(
|
|||
|
||||
this.#setAllowButtonEnabled(false);
|
||||
|
||||
permsSingleEl.append(checkboxEl, warningEl);
|
||||
permsSingleEl.classList.add("webext-perm-optional");
|
||||
permsSingleEl.hidden = false;
|
||||
return;
|
||||
}
|
||||
|
||||
// Render a single permission entry, which will be either:
|
||||
// - an entry for the private browsing checkbox
|
||||
// - or single granted permission entry.
|
||||
if (showIncognitoCheckbox) {
|
||||
permsSingleEl.appendChild(this.#createPrivateBrowsingCheckbox());
|
||||
permsSingleEl.hidden = false;
|
||||
permsSingleEl.classList.add(
|
||||
"webext-perm-optional",
|
||||
"webext-perm-privatebrowsing"
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
const msg = strings.msgs[0];
|
||||
if (this.hasFullDomainsList && this.#isFullDomainsListEntryIndex(0)) {
|
||||
permsSingleEl.append(this.#createFullDomainsListFragment(msg));
|
||||
let item = doc.createElementNS(HTML_NS, "li");
|
||||
item.append(checkboxEl, warningEl);
|
||||
item.classList.add("webext-perm-optional");
|
||||
permsListEl.append(item);
|
||||
} else {
|
||||
permsSingleEl.textContent = msg;
|
||||
for (let [idx, msg] of strings.msgs.entries()) {
|
||||
let item = doc.createElementNS(HTML_NS, "li");
|
||||
item.classList.add("webext-perm-granted");
|
||||
if (
|
||||
this.hasFullDomainsList &&
|
||||
this.#isFullDomainsListEntryIndex(idx)
|
||||
) {
|
||||
item.append(this.#createFullDomainsListFragment(msg));
|
||||
} else {
|
||||
item.textContent = msg;
|
||||
}
|
||||
permsListEl.appendChild(item);
|
||||
}
|
||||
|
||||
if (showIncognitoCheckbox) {
|
||||
let item = doc.createElementNS(HTML_NS, "li");
|
||||
item.classList.add(
|
||||
"webext-perm-optional",
|
||||
"webext-perm-privatebrowsing"
|
||||
);
|
||||
item.appendChild(this.#createPrivateBrowsingCheckbox());
|
||||
permsListEl.appendChild(item);
|
||||
}
|
||||
}
|
||||
permsSingleEl.hidden = false;
|
||||
|
||||
permsListEl.hidden = false;
|
||||
}
|
||||
|
||||
#createFullDomainsListFragment(msg) {
|
||||
|
@ -317,7 +281,7 @@ customElements.define(
|
|||
}
|
||||
|
||||
#clearChildElements() {
|
||||
const { textEl, introEl, permsSingleEl, permsListEl } = this;
|
||||
const { textEl, introEl, permsListEl } = this;
|
||||
|
||||
// Clear all changes to the child elements that may have been changed
|
||||
// by a previous call of the render method.
|
||||
|
@ -328,13 +292,6 @@ customElements.define(
|
|||
introEl.textContent = "";
|
||||
introEl.hidden = true;
|
||||
|
||||
permsSingleEl.textContent = "";
|
||||
permsSingleEl.hidden = true;
|
||||
permsSingleEl.classList.remove(
|
||||
"webext-perm-optional",
|
||||
"webext-perm-privatebrowsing"
|
||||
);
|
||||
|
||||
permsListEl.textContent = "";
|
||||
permsListEl.hidden = true;
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@
|
|||
|
||||
<stringbundleset id="stringbundleset">
|
||||
<stringbundle id="bundle_brand" src="chrome://branding/locale/brand.properties"/>
|
||||
<stringbundle id="bundle_shell" src="chrome://browser/locale/shellservice.properties"/>
|
||||
</stringbundleset>
|
||||
|
||||
<!-- The event listeners are defined by _initCommandSet in browser-init.js -->
|
||||
|
|
|
@ -88,7 +88,7 @@ ChromeUtils.defineESModuleGetters(this, {
|
|||
TabCrashHandler: "resource:///modules/ContentCrashHandlers.sys.mjs",
|
||||
TabsSetupFlowManager:
|
||||
"resource:///modules/firefox-view-tabs-setup-manager.sys.mjs",
|
||||
TaskbarTabUI: "resource:///modules/TaskbarTabUI.sys.mjs",
|
||||
TaskbarTabUI: "resource:///modules/taskbartabs/TaskbarTabUI.sys.mjs",
|
||||
TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs",
|
||||
ToolbarContextMenu: "resource:///modules/ToolbarContextMenu.sys.mjs",
|
||||
ToolbarDropHandler: "resource:///modules/ToolbarDropHandler.sys.mjs",
|
||||
|
|
|
@ -30,7 +30,11 @@
|
|||
data-l10n-sync="true">
|
||||
<head>
|
||||
<!-- CSP might be disabled by C++ code. -->
|
||||
#if defined(EARLY_BETA_OR_EARLIER)
|
||||
<meta http-equiv="Content-Security-Policy" content="script-src chrome: moz-src: resource: 'report-sample'" />
|
||||
#else
|
||||
<meta http-equiv="Content-Security-Policy" content="script-src-attr 'none' 'report-sample'" />
|
||||
#endif
|
||||
|
||||
<!-- The "global.css" stylesheet is imported first to allow other stylesheets to
|
||||
override rules using selectors with the same specificity. This applies to
|
||||
|
@ -101,6 +105,7 @@
|
|||
<link rel="localization" href="preview/onboarding.ftl"/>
|
||||
<link rel="localization" href="preview/smartTabGroups.ftl"/>
|
||||
<link rel="localization" href="preview/tabUnload.ftl"/>
|
||||
<link rel="localization" href="preview/taskbartabs.ftl"/>
|
||||
|
||||
<title data-l10n-id="browser-main-window-default-title"></title>
|
||||
|
||||
|
|
|
@ -382,6 +382,13 @@
|
|||
<image id="picture-in-picture-button-icon"
|
||||
class="urlbar-icon"/>
|
||||
</hbox>
|
||||
<hbox id="taskbar-tabs-button"
|
||||
class="urlbar-page-action"
|
||||
role="button"
|
||||
data-l10n-id="taskbar-tab-urlbar-button-open"
|
||||
hidden="true">
|
||||
<image class="urlbar-icon"/>
|
||||
</hbox>
|
||||
<hbox id="translations-button"
|
||||
class="urlbar-page-action"
|
||||
role="button"
|
||||
|
|
|
@ -198,7 +198,8 @@ document.addEventListener(
|
|||
#tracking-protection-icon-container,
|
||||
#identity-icon-box,
|
||||
#identity-permission-box,
|
||||
#translations-button
|
||||
#translations-button,
|
||||
#taskbar-tabs-button
|
||||
`);
|
||||
if (!element) {
|
||||
return;
|
||||
|
|
|
@ -119,7 +119,6 @@
|
|||
<popupnotificationcontent class="addon-webext-perm-notification-content" orient="vertical">
|
||||
<description id="addon-webext-perm-text" class="addon-webext-perm-text"/>
|
||||
<label id="addon-webext-perm-intro" class="addon-webext-perm-text"/>
|
||||
<label id="addon-webext-perm-single-entry" class="addon-webext-perm-single-entry"/>
|
||||
<html:ul id="addon-webext-perm-list" class="addon-webext-perm-list"/>
|
||||
</popupnotificationcontent>
|
||||
</popupnotification>
|
||||
|
|
|
@ -53,7 +53,7 @@ function onExtra1() {
|
|||
showResetDialog();
|
||||
}
|
||||
|
||||
function onLoad() {
|
||||
window.addEventListener("load", () => {
|
||||
const dialog = document.getElementById("safeModeDialog");
|
||||
if (appStartup.automaticSafeModeNecessary) {
|
||||
document.getElementById("autoSafeMode").hidden = false;
|
||||
|
@ -72,4 +72,4 @@ function onLoad() {
|
|||
document.addEventListener("dialogaccept", onDefaultButton);
|
||||
document.addEventListener("dialogcancel", onCancel);
|
||||
document.addEventListener("dialogextra1", onExtra1);
|
||||
}
|
||||
});
|
||||
|
|
|
@ -4,12 +4,13 @@
|
|||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<?csp default-src chrome: resource:; style-src chrome: 'unsafe-inline'; ?>
|
||||
|
||||
<window
|
||||
xmlns:html="http://www.w3.org/1999/xhtml"
|
||||
xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
|
||||
data-l10n-id="troubleshoot-mode-window"
|
||||
data-l10n-attrs="title,style"
|
||||
onload="onLoad()"
|
||||
>
|
||||
<dialog
|
||||
id="safeModeDialog"
|
||||
|
|
|
@ -23,8 +23,8 @@ add_setup(async function () {
|
|||
"social-tracking.example.org",
|
||||
],
|
||||
// Whitelist trackertest.org loaded by default in trackingPage.html
|
||||
["urlclassifier.trackingSkipURLs", "trackertest.org"],
|
||||
["urlclassifier.trackingAnnotationSkipURLs", "trackertest.org"],
|
||||
["urlclassifier.trackingSkipURLs", "*://trackertest.org/*"],
|
||||
["urlclassifier.trackingAnnotationSkipURLs", "*://trackertest.org/*"],
|
||||
["privacy.trackingprotection.enabled", false],
|
||||
["privacy.trackingprotection.annotate_channels", true],
|
||||
],
|
||||
|
|
|
@ -25,8 +25,8 @@ add_setup(async function () {
|
|||
["privacy.trackingprotection.fingerprinting.enabled", true],
|
||||
["privacy.socialtracking.block_cookies.enabled", true],
|
||||
// Allowlist trackertest.org loaded by default in trackingPage.html
|
||||
["urlclassifier.trackingSkipURLs", "trackertest.org"],
|
||||
["urlclassifier.trackingAnnotationSkipURLs", "trackertest.org"],
|
||||
["urlclassifier.trackingSkipURLs", "*://trackertest.org/*"],
|
||||
["urlclassifier.trackingAnnotationSkipURLs", "*://trackertest.org/*"],
|
||||
// Additional denylisted hosts.
|
||||
[
|
||||
"urlclassifier.trackingAnnotationTable.testEntries",
|
||||
|
|
|
@ -273,6 +273,10 @@ add_task(async function test_sideloading() {
|
|||
[["webext-perms-host-description-all-urls"]],
|
||||
kSideloaded
|
||||
);
|
||||
ok(
|
||||
panel.querySelector(".webext-perm-privatebrowsing checkbox"),
|
||||
"Expect incognito checkbox in sideload prompt"
|
||||
);
|
||||
|
||||
// Accept the permissions
|
||||
panel.button.click();
|
||||
|
|
|
@ -141,11 +141,14 @@ async function backgroundUpdateTest(url, id, checkIconFn) {
|
|||
// The original extension has 1 promptable permission and the new one
|
||||
// has 2 (history and <all_urls>) plus 1 non-promptable permission (cookies).
|
||||
// So we should only see the 1 new promptable permission in the notification.
|
||||
let singlePermissionEl = document.getElementById(
|
||||
"addon-webext-perm-single-entry"
|
||||
let permissionsListEl = document.getElementById("addon-webext-perm-list");
|
||||
ok(!permissionsListEl.hidden, "Permissions list is visible");
|
||||
ok(permissionsListEl.textContent, "Permissions list contains text");
|
||||
is(
|
||||
permissionsListEl.childElementCount,
|
||||
1,
|
||||
"Expect only 1 permission entry in the Permissions list"
|
||||
);
|
||||
ok(!singlePermissionEl.hidden, "Single permission entry is not hidden");
|
||||
ok(singlePermissionEl.textContent, "Single permission entry text is set");
|
||||
|
||||
// Cancel the update.
|
||||
panel.secondaryButton.click();
|
||||
|
|
|
@ -227,7 +227,6 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
|
|||
let icon = panel.getAttribute("icon");
|
||||
let learnMoreLink = panel.querySelector(".popup-notification-learnmore-link");
|
||||
let ul = document.getElementById("addon-webext-perm-list");
|
||||
let singleDataEl = document.getElementById("addon-webext-perm-single-entry");
|
||||
|
||||
if (checkIcon instanceof RegExp) {
|
||||
ok(
|
||||
|
@ -254,8 +253,8 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
|
|||
ok(description.startsWith(exp.at(0)), "Description is the expected one");
|
||||
ok(description.endsWith(exp.at(-1)), "Description is the expected one");
|
||||
|
||||
const hasPBCheckbox = !!(
|
||||
singleDataEl.querySelector("checkbox") || ul.querySelector("checkbox")
|
||||
const hasPBCheckbox = !!ul.querySelector(
|
||||
"li.webext-perm-privatebrowsing > checkbox"
|
||||
);
|
||||
|
||||
is(
|
||||
|
@ -266,21 +265,12 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
|
|||
|
||||
if (!permissions.length && !hasPBCheckbox) {
|
||||
ok(ul.hidden, "Permissions list is hidden");
|
||||
ok(singleDataEl.hidden, "Expect a single permission entry to be hidden");
|
||||
} else if (!permissions.length) {
|
||||
ok(ul.hidden, "Permissions list is hidden");
|
||||
ok(
|
||||
!singleDataEl.hidden,
|
||||
"Expect a single permission entry for the private browsing checkbox to not be hidden"
|
||||
);
|
||||
ok(
|
||||
singleDataEl.querySelector("checkbox"),
|
||||
"Expect a checkbox inside the single permission entry"
|
||||
);
|
||||
ok(singleDataEl.textContent, "Single entry text content should not empty");
|
||||
is(ul.childElementCount, 0, "Permission list should have no entries");
|
||||
ok(!ul.hidden, "Permissions list is visible");
|
||||
ok(hasPBCheckbox, "Expect a checkbox inside the list of permissions");
|
||||
is(ul.childElementCount, 1, "Permission list should have an entry");
|
||||
} else if (permissions.length === 1 && hasPBCheckbox) {
|
||||
ok(!ul.hidden, "Permissions list to not be hidden");
|
||||
ok(!ul.hidden, "Permissions list is visible");
|
||||
is(ul.childElementCount, 2, "Expect 2 entries in the permissions list");
|
||||
is(
|
||||
ul.children[0].textContent,
|
||||
|
@ -296,16 +286,8 @@ function checkNotification(panel, checkIcon, permissions, sideloaded) {
|
|||
lastEntry.querySelector("checkbox"),
|
||||
"Expect a checkbox inside the last permissions list entry"
|
||||
);
|
||||
} else if (permissions.length === 1 && !hasPBCheckbox) {
|
||||
ok(ul.hidden, "Permissions list to be hidden");
|
||||
ok(!ul.childElementCount, "Permission list has no entries");
|
||||
} else {
|
||||
ok(singleDataEl.hidden, "Single permission data entry is hidden");
|
||||
ok(
|
||||
!singleDataEl.textContent,
|
||||
"Single permission data label has not been set"
|
||||
);
|
||||
ok(!ul.hidden, "Permissions list to not be hidden");
|
||||
ok(!ul.hidden, "Permissions list is visible");
|
||||
for (let i in permissions) {
|
||||
let [key, param] = permissions[i];
|
||||
const expected = formatExtValue(key, param);
|
||||
|
|
|
@ -540,8 +540,9 @@ const WebRTCIndicator = {
|
|||
toggleEl.checked
|
||||
);
|
||||
Services.ppmm.sharedData.flush();
|
||||
let l10nId =
|
||||
"webrtc-microphone-" + (toggleEl.checked ? "muted" : "unmuted");
|
||||
let l10nId = toggleEl.checked
|
||||
? "webrtc-microphone-muted"
|
||||
: "webrtc-microphone-unmuted";
|
||||
document.l10n.setAttributes(toggleEl, l10nId);
|
||||
},
|
||||
|
||||
|
@ -557,7 +558,9 @@ const WebRTCIndicator = {
|
|||
toggleCameraMute(toggleEl) {
|
||||
Services.ppmm.sharedData.set("WebRTC:GlobalCameraMute", toggleEl.checked);
|
||||
Services.ppmm.sharedData.flush();
|
||||
let l10nId = "webrtc-camera-" + (toggleEl.checked ? "muted" : "unmuted");
|
||||
let l10nId = toggleEl.checked
|
||||
? "webrtc-camera-muted"
|
||||
: "webrtc-camera-unmuted";
|
||||
document.l10n.setAttributes(toggleEl, l10nId);
|
||||
},
|
||||
|
||||
|
|
|
@ -33,6 +33,7 @@ category browser-window-delayed-startup moz-src:///browser/components/search/Sea
|
|||
|
||||
category browser-window-unload resource:///modules/BrowserDOMWindow.sys.mjs BrowserDOMWindow.teardownInWindow
|
||||
category browser-window-unload moz-src:///browser/components/tabbrowser/NewTabPagePreloading.sys.mjs NewTabPagePreloading.removePreloadedBrowser
|
||||
category browser-window-delayed-startup resource:///modules/taskbartabs/TaskbarTabs.sys.mjs TaskbarTabs.init
|
||||
|
||||
# App startup consumers
|
||||
category browser-idle-startup resource:///modules/PlacesUIUtils.sys.mjs PlacesUIUtils.unblockToolbars
|
||||
|
|
|
@ -324,43 +324,8 @@ function openBrowserWindow(
|
|||
}
|
||||
|
||||
if (isStartup) {
|
||||
let win = Services.wm.getMostRecentWindow("navigator:blank");
|
||||
let win = gBrowserContentHandler.replaceStartupWindow(args, forcePrivate);
|
||||
if (win) {
|
||||
// Remove the windowtype of our blank window so that we don't close it
|
||||
// later on when seeing cmdLine.preventDefault is true.
|
||||
win.document.documentElement.removeAttribute("windowtype");
|
||||
|
||||
if (forcePrivate) {
|
||||
win.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing =
|
||||
true;
|
||||
|
||||
if (
|
||||
AppConstants.platform == "win" &&
|
||||
Services.prefs.getBoolPref(
|
||||
"browser.privateWindowSeparation.enabled",
|
||||
true
|
||||
)
|
||||
) {
|
||||
lazy.WinTaskbar.setGroupIdForWindow(
|
||||
win,
|
||||
lazy.WinTaskbar.defaultPrivateGroupId
|
||||
);
|
||||
lazy.WindowsUIUtils.setWindowIconFromExe(
|
||||
win,
|
||||
Services.dirsvc.get("XREExeF", Ci.nsIFile).path,
|
||||
// This corresponds to the definitions in
|
||||
// nsNativeAppSupportWin.h
|
||||
PRIVATE_BROWSING_ICON_INDEX
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let openTime = win.openTime;
|
||||
win.location = AppConstants.BROWSER_CHROME_URL;
|
||||
win.arguments = args; // <-- needs to be a plain JS array here.
|
||||
|
||||
ChromeUtils.addProfilerMarker("earlyBlankWindowVisible", openTime);
|
||||
lazy.BrowserWindowTracker.registerOpeningWindow(win, forcePrivate);
|
||||
return win;
|
||||
}
|
||||
}
|
||||
|
@ -1178,6 +1143,52 @@ nsBrowserContentHandler.prototype = {
|
|||
request.cancel(Cr.NS_BINDING_ABORTED);
|
||||
},
|
||||
|
||||
/**
|
||||
* Replace the startup UI window created in BrowserGlue with an actual window
|
||||
*/
|
||||
replaceStartupWindow(args, forcePrivate) {
|
||||
let win = Services.wm.getMostRecentWindow("navigator:blank");
|
||||
if (win) {
|
||||
// Remove the windowtype of our blank window so that we don't close it
|
||||
// later on when seeing cmdLine.preventDefault is true.
|
||||
win.document.documentElement.removeAttribute("windowtype");
|
||||
|
||||
if (forcePrivate) {
|
||||
win.docShell.QueryInterface(Ci.nsILoadContext).usePrivateBrowsing =
|
||||
true;
|
||||
|
||||
if (
|
||||
AppConstants.platform == "win" &&
|
||||
Services.prefs.getBoolPref(
|
||||
"browser.privateWindowSeparation.enabled",
|
||||
true
|
||||
)
|
||||
) {
|
||||
lazy.WinTaskbar.setGroupIdForWindow(
|
||||
win,
|
||||
lazy.WinTaskbar.defaultPrivateGroupId
|
||||
);
|
||||
lazy.WindowsUIUtils.setWindowIconFromExe(
|
||||
win,
|
||||
Services.dirsvc.get("XREExeF", Ci.nsIFile).path,
|
||||
// This corresponds to the definitions in
|
||||
// nsNativeAppSupportWin.h
|
||||
PRIVATE_BROWSING_ICON_INDEX
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
let openTime = win.openTime;
|
||||
win.location = AppConstants.BROWSER_CHROME_URL;
|
||||
win.arguments = args; // <-- needs to be a plain JS array here.
|
||||
|
||||
ChromeUtils.addProfilerMarker("earlyBlankWindowVisible", openTime);
|
||||
lazy.BrowserWindowTracker.registerOpeningWindow(win, forcePrivate);
|
||||
return win;
|
||||
}
|
||||
return null;
|
||||
},
|
||||
|
||||
/* nsICommandLineValidator */
|
||||
validate: function bch_validate(cmdLine) {
|
||||
var urlFlagIdx = cmdLine.findFlag("url", false);
|
||||
|
|
|
@ -4808,6 +4808,8 @@ var ContentBlockingCategoriesPrefs = {
|
|||
"privacy.trackingprotection.cryptomining.enabled": null,
|
||||
"privacy.trackingprotection.emailtracking.enabled": null,
|
||||
"privacy.trackingprotection.emailtracking.pbmode.enabled": null,
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled": null,
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled": null,
|
||||
"privacy.annotate_channels.strict_list.enabled": null,
|
||||
"network.http.referer.disallowCrossSiteRelaxingDefault": null,
|
||||
"network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation":
|
||||
|
@ -4830,6 +4832,8 @@ var ContentBlockingCategoriesPrefs = {
|
|||
"privacy.trackingprotection.cryptomining.enabled": null,
|
||||
"privacy.trackingprotection.emailtracking.enabled": null,
|
||||
"privacy.trackingprotection.emailtracking.pbmode.enabled": null,
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled": null,
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled": null,
|
||||
"privacy.annotate_channels.strict_list.enabled": null,
|
||||
"network.http.referer.disallowCrossSiteRelaxingDefault": null,
|
||||
"network.http.referer.disallowCrossSiteRelaxingDefault.top_navigation":
|
||||
|
@ -4877,12 +4881,12 @@ var ContentBlockingCategoriesPrefs = {
|
|||
"privacy.trackingprotection.fingerprinting.enabled"
|
||||
] = false;
|
||||
break;
|
||||
case "cm":
|
||||
case "cryptoTP":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.cryptomining.enabled"
|
||||
] = true;
|
||||
break;
|
||||
case "-cm":
|
||||
case "-cryptoTP":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.cryptomining.enabled"
|
||||
] = false;
|
||||
|
@ -4917,6 +4921,26 @@ var ContentBlockingCategoriesPrefs = {
|
|||
"privacy.trackingprotection.emailtracking.pbmode.enabled"
|
||||
] = false;
|
||||
break;
|
||||
case "consentmanagerSkip":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled"
|
||||
] = true;
|
||||
break;
|
||||
case "-consentmanagerSkip":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled"
|
||||
] = false;
|
||||
break;
|
||||
case "consentmanagerSkipPrivate":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled"
|
||||
] = true;
|
||||
break;
|
||||
case "-consentmanagerSkipPrivate":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled"
|
||||
] = false;
|
||||
break;
|
||||
case "lvl2":
|
||||
this.CATEGORY_PREFS[type][
|
||||
"privacy.annotate_channels.strict_list.enabled"
|
||||
|
|
|
@ -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",
|
||||
{
|
||||
|
|
|
@ -656,282 +656,6 @@ const MESSAGES = () => {
|
|||
},
|
||||
skip_in_tests: "not tested in automation",
|
||||
},
|
||||
{
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
|
||||
template: "feature_callout",
|
||||
content: {
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
|
||||
template: "multistage",
|
||||
backdrop: "transparent",
|
||||
transitions: false,
|
||||
disableHistoryUpdates: true,
|
||||
tour_pref_name:
|
||||
"messaging-system-action.fakespot-opted-out-survey.progress",
|
||||
tour_pref_default_value:
|
||||
'{"screen":"FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_1","complete":false}',
|
||||
screens: [
|
||||
{
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_1",
|
||||
force_hide_steps_indicator: true,
|
||||
anchors: [
|
||||
{
|
||||
selector: "#shopping-sidebar-button",
|
||||
panel_position: {
|
||||
anchor_attachment: "bottomcenter",
|
||||
callout_attachment: "topright",
|
||||
},
|
||||
no_open_on_anchor: true,
|
||||
arrow_width: "22.62742",
|
||||
},
|
||||
],
|
||||
content: {
|
||||
position: "callout",
|
||||
layout: "survey",
|
||||
width: "332px",
|
||||
padding: "20",
|
||||
title: {
|
||||
string_id: "shopping-survey-headline",
|
||||
},
|
||||
title_logo: {
|
||||
imageURL: "chrome://branding/content/about-logo.png",
|
||||
},
|
||||
secondary_button: {
|
||||
label: {
|
||||
string_id: "shopping-survey-submit-button-label",
|
||||
},
|
||||
style: "primary",
|
||||
action: {
|
||||
type: "MULTI_ACTION",
|
||||
collectSelect: true,
|
||||
data: {
|
||||
actions: [
|
||||
{
|
||||
type: "SET_PREF",
|
||||
data: {
|
||||
pref: {
|
||||
name: "messaging-system-action.fakespot-opted-out-survey.progress",
|
||||
value:
|
||||
'{"screen":"FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_2","complete":false}',
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
disabled: "hasActiveMultiSelect",
|
||||
},
|
||||
dismiss_button: {
|
||||
action: {
|
||||
type: "MULTI_ACTION",
|
||||
collectSelect: true,
|
||||
data: {
|
||||
actions: [
|
||||
{
|
||||
type: "BLOCK_MESSAGE",
|
||||
data: {
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
|
||||
},
|
||||
},
|
||||
{
|
||||
type: "SET_PREF",
|
||||
data: {
|
||||
pref: {
|
||||
name: "messaging-system-action.fakespot-opted-out-survey.progress",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
dismiss: true,
|
||||
},
|
||||
label: {
|
||||
string_id: "shopping-onboarding-dialog-close-button",
|
||||
},
|
||||
size: "small",
|
||||
},
|
||||
tiles: {
|
||||
type: "multiselect",
|
||||
style: {
|
||||
flexDirection: "column",
|
||||
alignItems: "flex-start",
|
||||
},
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-multiselect-label",
|
||||
},
|
||||
data: [
|
||||
{
|
||||
id: "fakespot-opted-out-survey-hard-to-understand",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-hard-to-understand",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
randomize: true,
|
||||
},
|
||||
{
|
||||
id: "fakespot-opted-out-survey-too-slow",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-too-slow",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
randomize: true,
|
||||
},
|
||||
{
|
||||
id: "fakespot-opted-out-survey-not-accurate",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-not-accurate",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
randomize: true,
|
||||
},
|
||||
{
|
||||
id: "fakespot-opted-out-survey-not-helpful",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-not-helpful",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
randomize: true,
|
||||
},
|
||||
{
|
||||
id: "fakespot-opted-out-survey-check-reviews-myself",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-check-myself",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
randomize: true,
|
||||
},
|
||||
{
|
||||
id: "fakespot-opted-out-survey-other",
|
||||
type: "checkbox",
|
||||
defaultValue: false,
|
||||
label: {
|
||||
string_id: "shopping-survey-opted-out-other",
|
||||
},
|
||||
icon: {
|
||||
style: {
|
||||
marginInline: "2px 8px",
|
||||
},
|
||||
},
|
||||
group: "checkboxes",
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY_2",
|
||||
force_hide_steps_indicator: true,
|
||||
anchors: [
|
||||
{
|
||||
selector: "#shopping-sidebar-button",
|
||||
panel_position: {
|
||||
anchor_attachment: "bottomcenter",
|
||||
callout_attachment: "topright",
|
||||
},
|
||||
no_open_on_anchor: true,
|
||||
arrow_width: "22.62742",
|
||||
},
|
||||
],
|
||||
content: {
|
||||
layout: "inline",
|
||||
position: "callout",
|
||||
title: {
|
||||
string_id: "shopping-survey-thanks-title",
|
||||
},
|
||||
title_logo: {
|
||||
imageURL:
|
||||
"https://firefox-settings-attachments.cdn.mozilla.net/main-workspace/ms-images/706c7a85-cf23-442e-8a92-7ebc7f537375.svg",
|
||||
},
|
||||
dismiss_button: {
|
||||
action: {
|
||||
type: "SET_PREF",
|
||||
data: {
|
||||
pref: {
|
||||
name: "messaging-system-action.fakespot-opted-out-survey.progress",
|
||||
},
|
||||
},
|
||||
dismiss: true,
|
||||
},
|
||||
label: {
|
||||
string_id: "shopping-onboarding-dialog-close-button",
|
||||
},
|
||||
size: "small",
|
||||
},
|
||||
page_event_listeners: [
|
||||
{
|
||||
params: {
|
||||
type: "timeout",
|
||||
options: {
|
||||
once: true,
|
||||
interval: 20000,
|
||||
},
|
||||
},
|
||||
action: {
|
||||
dismiss: true,
|
||||
},
|
||||
},
|
||||
{
|
||||
params: {
|
||||
type: "tourend",
|
||||
options: {
|
||||
once: true,
|
||||
},
|
||||
},
|
||||
action: {
|
||||
type: "BLOCK_MESSAGE",
|
||||
data: {
|
||||
id: "FAKESPOT_CALLOUT_OPTED_OUT_SURVEY",
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
priority: 2,
|
||||
targeting:
|
||||
"'browser.shopping.experience2023.optedIn' | preferenceValue == 2 && !'browser.shopping.experience2023.active' | preferenceValue && 'browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features' | preferenceValue != false && !'browser.shopping.experience2023.integratedSidebar' | preferenceValue",
|
||||
trigger: {
|
||||
id: "preferenceObserver",
|
||||
params: ["browser.shopping.experience2023.optedIn"],
|
||||
},
|
||||
skip_in_tests: "it's not tested in automation",
|
||||
},
|
||||
{
|
||||
id: "ADDONS_STAFF_PICK_PT_2",
|
||||
template: "feature_callout",
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
[DEFAULT]
|
||||
skip-if = ["os == 'android'"]
|
||||
|
||||
["test_fxa_menu_message.html"]
|
||||
|
|
|
@ -3,7 +3,6 @@ prefs = [
|
|||
"browser.backup.scheduled.enabled=false",
|
||||
]
|
||||
support-files = ["head.js"]
|
||||
skip-if = ["os == 'android'"]
|
||||
|
||||
["test_backup_settings.html"]
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ ChromeUtils.defineESModuleGetters(this, {
|
|||
MenuMessage: "resource:///modules/asrouter/MenuMessage.sys.mjs",
|
||||
NewTabUtils: "resource://gre/modules/NewTabUtils.sys.mjs",
|
||||
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
|
||||
updateZoomUI: "resource:///modules/ZoomUI.sys.mjs",
|
||||
});
|
||||
|
||||
/**
|
||||
|
@ -661,6 +662,7 @@ const PanelUI = {
|
|||
let message = ASRouter.getMessageById(messageId);
|
||||
ASRouter.addImpression(message);
|
||||
}
|
||||
updateZoomUI(gBrowser.selectedBrowser);
|
||||
},
|
||||
|
||||
_onHelpViewShow() {
|
||||
|
|
|
@ -2,6 +2,11 @@
|
|||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
"use strict";
|
||||
|
||||
// Prevent intermittent TV job failure hit due to the entire test file
|
||||
// taking longer than the default per-testfile timeout on macOS builds
|
||||
// while running in chaos mode.
|
||||
requestLongerTimeout(2);
|
||||
|
||||
async function runTests(options) {
|
||||
async function background(getTests) {
|
||||
let manifest = browser.runtime.getManifest();
|
||||
|
|
|
@ -242,7 +242,9 @@ add_task(async function testOptionalPermissionsDialogShowsFullDomainsList() {
|
|||
domainsListLength: 1,
|
||||
verifyDialog(popupContentEl) {
|
||||
assertNoDomainsList(popupContentEl);
|
||||
assertOneDomainPermission(popupContentEl.permsSingleEl);
|
||||
// This will fail if there are other unexpected permission strings
|
||||
// listed in the permissions list.
|
||||
assertOneDomainPermission(popupContentEl.permsListEl);
|
||||
},
|
||||
},
|
||||
{
|
||||
|
@ -263,7 +265,7 @@ add_task(async function testOptionalPermissionsDialogShowsFullDomainsList() {
|
|||
optional_permissions: [],
|
||||
domainsListLength: 10,
|
||||
verifyDialog(popupContentEl) {
|
||||
const domainsListEl = popupContentEl.permsSingleEl.querySelector(
|
||||
const domainsListEl = popupContentEl.permsListEl.querySelector(
|
||||
".webext-perm-domains-list"
|
||||
);
|
||||
Assert.ok(domainsListEl, "Expect domains list element to be found");
|
||||
|
|
|
@ -3,6 +3,5 @@
|
|||
["test_card_container.html"]
|
||||
|
||||
["test_fxview_search_textbox.html"]
|
||||
skip-if = ["debug"]
|
||||
|
||||
["test_fxview_tab_list.html"]
|
||||
|
|
|
@ -12,8 +12,8 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
|||
BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs",
|
||||
});
|
||||
|
||||
// TODO put in actual link probably same as labs bug 1951144
|
||||
const FEEDBACK_LINK = "https://connect.mozilla.org/";
|
||||
const FEEDBACK_LINK =
|
||||
"https://connect.mozilla.org/t5/discussions/try-out-link-previews-on-firefox-labs/td-p/92012";
|
||||
|
||||
/**
|
||||
* Class representing a link preview element.
|
||||
|
@ -227,7 +227,7 @@ class LinkPreviewCard extends MozLitElement {
|
|||
<p>
|
||||
Key points are AI-generated and may have mistakes.
|
||||
<a @click=${this.handleLink} href=${FEEDBACK_LINK}>
|
||||
Foxfooding feedback
|
||||
Share feedback
|
||||
</a>
|
||||
</p>
|
||||
<p>
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
[DEFAULT]
|
||||
skip-if = ["os == 'android'"]
|
||||
support-files = ["../head-common.js"]
|
||||
|
||||
["test_migration_wizard.html"]
|
||||
|
|
|
@ -110,6 +110,15 @@ export var AboutHomeStartupCache = {
|
|||
throw new Error("AboutHomeStartupCache already initted.");
|
||||
}
|
||||
|
||||
if (
|
||||
Services.startup.isInOrBeyondShutdownPhase(
|
||||
Ci.nsIAppStartup.SHUTDOWN_PHASE_APPSHUTDOWNCONFIRMED
|
||||
)
|
||||
) {
|
||||
// Stay not initted, such that using us will reject or be a no-op.
|
||||
return;
|
||||
}
|
||||
|
||||
this.setDeferredResult(this.CACHE_RESULT_SCALARS.UNSET);
|
||||
|
||||
this._enabled = Services.prefs.getBoolPref(
|
||||
|
@ -181,7 +190,7 @@ export var AboutHomeStartupCache = {
|
|||
await this.onShutdown();
|
||||
};
|
||||
|
||||
lazy.AsyncShutdown.quitApplicationGranted.addBlocker(
|
||||
lazy.AsyncShutdown.appShutdownConfirmed.addBlocker(
|
||||
"AboutHomeStartupCache: Writing cache",
|
||||
this._shutdownBlocker,
|
||||
() => this._cacheProgress
|
||||
|
@ -238,7 +247,7 @@ export var AboutHomeStartupCache = {
|
|||
this._finalized = false;
|
||||
this._firstPrivilegedProcessCreated = false;
|
||||
|
||||
lazy.AsyncShutdown.quitApplicationGranted.removeBlocker(
|
||||
lazy.AsyncShutdown.appShutdownConfirmed.removeBlocker(
|
||||
this._shutdownBlocker
|
||||
);
|
||||
this._shutdownBlocker = null;
|
||||
|
@ -260,7 +269,7 @@ export var AboutHomeStartupCache = {
|
|||
_cacheProgress: "Not yet begun",
|
||||
|
||||
/**
|
||||
* Called by the AsyncShutdown blocker on quit-application-granted
|
||||
* Called by the AsyncShutdown blocker on quit-application
|
||||
* to potentially flush the most recent cache to disk. If one was
|
||||
* never written during the session, one is generated and written
|
||||
* before the async function resolves.
|
||||
|
@ -377,6 +386,12 @@ export var AboutHomeStartupCache = {
|
|||
*/
|
||||
requestCache() {
|
||||
this.log.trace("Parent is requesting Activity Stream state object.");
|
||||
|
||||
if (!this._initted) {
|
||||
this.log.error("requestCache called despite not initted!");
|
||||
return { pageInputStream: null, scriptInputStream: null };
|
||||
}
|
||||
|
||||
if (!this._procManager) {
|
||||
this.log.error("requestCache called with no _procManager!");
|
||||
return { pageInputStream: null, scriptInputStream: null };
|
||||
|
|
|
@ -691,7 +691,7 @@ newtab:
|
|||
description: >
|
||||
position of section on newtab
|
||||
type: string
|
||||
is_secton_followed:
|
||||
is_section_followed: &is_section_followed
|
||||
description: >
|
||||
If click belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
|
@ -1407,10 +1407,7 @@ pocket:
|
|||
description: >
|
||||
If click belongs in a section, the numeric position of the section
|
||||
type: string
|
||||
is_secton_followed:
|
||||
description: >
|
||||
If click belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
is_section_followed: *is_section_followed
|
||||
send_in_pings:
|
||||
- newtab
|
||||
|
||||
|
@ -1476,10 +1473,7 @@ pocket:
|
|||
description: >
|
||||
If click belongs in a section, the numeric position of the section
|
||||
type: string
|
||||
is_secton_followed:
|
||||
description: >
|
||||
If click belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
is_section_followed: *is_section_followed
|
||||
send_in_pings:
|
||||
- newtab
|
||||
|
||||
|
@ -1521,10 +1515,7 @@ pocket:
|
|||
description: >
|
||||
If click belongs in a section, the numeric position of the section
|
||||
type: string
|
||||
is_secton_followed:
|
||||
description: >
|
||||
If click belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
is_section_followed: *is_section_followed
|
||||
send_in_pings:
|
||||
- newtab
|
||||
|
||||
|
@ -1590,10 +1581,7 @@ pocket:
|
|||
description: >
|
||||
If click belongs in a section, the numeric position of the section
|
||||
type: string
|
||||
is_secton_followed:
|
||||
description: >
|
||||
If click belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
is_section_followed: *is_section_followed
|
||||
send_in_pings:
|
||||
- newtab
|
||||
|
||||
|
@ -1736,10 +1724,7 @@ pocket:
|
|||
description: >
|
||||
If event belongs in a section, the numeric position of the section
|
||||
type: string
|
||||
is_secton_followed:
|
||||
description: >
|
||||
If event belongs in a section, if that section is followed
|
||||
type: boolean
|
||||
is_section_followed: *is_section_followed
|
||||
send_in_pings:
|
||||
- newtab
|
||||
|
||||
|
|
|
@ -3837,9 +3837,10 @@ var gMainPane = {
|
|||
switch (aFolder) {
|
||||
case "Desktop":
|
||||
return Services.dirsvc.get("Desk", Ci.nsIFile);
|
||||
case "Downloads":
|
||||
case "Downloads": {
|
||||
let downloadsDir = await Downloads.getSystemDownloadsDirectory();
|
||||
return new FileUtils.File(downloadsDir);
|
||||
}
|
||||
}
|
||||
throw new Error(
|
||||
"ASSERTION FAILED: folder type should be 'Desktop' or 'Downloads'"
|
||||
|
@ -4004,8 +4005,17 @@ class HandlerListItem {
|
|||
return;
|
||||
}
|
||||
const { id, args } = document.l10n.getAttributes(selectedItem);
|
||||
const messageIDs = {
|
||||
"applications-action-save": "applications-action-save-label",
|
||||
"applications-always-ask": "applications-always-ask-label",
|
||||
"applications-open-inapp": "applications-open-inapp-label",
|
||||
"applications-use-app-default": "applications-use-app-default-label",
|
||||
"applications-use-app": "applications-use-app-label",
|
||||
"applications-use-os-default": "applications-use-os-default-label",
|
||||
"applications-use-other": "applications-use-other-label",
|
||||
};
|
||||
localizeElement(this.node.querySelector(".actionDescription"), {
|
||||
id: id + "-label",
|
||||
id: messageIDs[id],
|
||||
args,
|
||||
});
|
||||
localizeElement(this.node.querySelector(".actionsMenu"), { id, args });
|
||||
|
@ -4126,12 +4136,12 @@ class HandlerInfoWrapper {
|
|||
case Ci.nsIHandlerInfo.useSystemDefault:
|
||||
return this.iconURLForSystemDefault;
|
||||
|
||||
case Ci.nsIHandlerInfo.useHelperApp:
|
||||
case Ci.nsIHandlerInfo.useHelperApp: {
|
||||
let preferredApp = this.preferredApplicationHandler;
|
||||
if (gMainPane.isValidHandlerApp(preferredApp)) {
|
||||
return gMainPane._getIconURLForHandlerApp(preferredApp);
|
||||
}
|
||||
|
||||
}
|
||||
// This should never happen, but if preferredAction is set to some weird
|
||||
// value, then fall back to the generic application icon.
|
||||
// Explicit fall-through
|
||||
|
|
|
@ -13,10 +13,14 @@ const NCBP_PREF = "network.cookie.cookieBehavior.pbmode";
|
|||
const CAT_PREF = "browser.contentblocking.category";
|
||||
const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled";
|
||||
const STP_PREF = "privacy.trackingprotection.socialtracking.enabled";
|
||||
const CM_PREF = "privacy.trackingprotection.cryptomining.enabled";
|
||||
const CRYPTO_TP_PREF = "privacy.trackingprotection.cryptomining.enabled";
|
||||
const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled";
|
||||
const EMAIL_TP_PBM_PREF =
|
||||
"privacy.trackingprotection.emailtracking.pbmode.enabled";
|
||||
const CONSENTMANAGER_SKIP_PREF =
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled";
|
||||
const CONSENTMANAGER_SKIP_PBM_PREF =
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled";
|
||||
const LEVEL2_PREF = "privacy.annotate_channels.strict_list.enabled";
|
||||
const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault";
|
||||
const REFERRER_TOP_PREF =
|
||||
|
@ -331,9 +335,11 @@ add_task(async function testContentBlockingStandardCategory() {
|
|||
[NCBP_PREF]: null,
|
||||
[FP_PREF]: null,
|
||||
[STP_PREF]: null,
|
||||
[CM_PREF]: null,
|
||||
[CRYPTO_TP_PREF]: null,
|
||||
[EMAIL_TP_PREF]: null,
|
||||
[EMAIL_TP_PBM_PREF]: null,
|
||||
[CONSENTMANAGER_SKIP_PREF]: null,
|
||||
[CONSENTMANAGER_SKIP_PBM_PREF]: null,
|
||||
[LEVEL2_PREF]: null,
|
||||
[REFERRER_PREF]: null,
|
||||
[REFERRER_TOP_PREF]: null,
|
||||
|
@ -375,7 +381,10 @@ add_task(async function testContentBlockingStandardCategory() {
|
|||
);
|
||||
Services.prefs.setBoolPref(STP_PREF, !Services.prefs.getBoolPref(STP_PREF));
|
||||
Services.prefs.setBoolPref(FP_PREF, !Services.prefs.getBoolPref(FP_PREF));
|
||||
Services.prefs.setBoolPref(CM_PREF, !Services.prefs.getBoolPref(CM_PREF));
|
||||
Services.prefs.setBoolPref(
|
||||
CRYPTO_TP_PREF,
|
||||
!Services.prefs.getBoolPref(CRYPTO_TP_PREF)
|
||||
);
|
||||
Services.prefs.setBoolPref(
|
||||
EMAIL_TP_PREF,
|
||||
!Services.prefs.getBoolPref(EMAIL_TP_PREF)
|
||||
|
@ -384,6 +393,14 @@ add_task(async function testContentBlockingStandardCategory() {
|
|||
EMAIL_TP_PBM_PREF,
|
||||
!Services.prefs.getBoolPref(EMAIL_TP_PBM_PREF)
|
||||
);
|
||||
Services.prefs.setBoolPref(
|
||||
CONSENTMANAGER_SKIP_PREF,
|
||||
!Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF)
|
||||
);
|
||||
Services.prefs.setBoolPref(
|
||||
CONSENTMANAGER_SKIP_PBM_PREF,
|
||||
!Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF)
|
||||
);
|
||||
Services.prefs.setBoolPref(
|
||||
LEVEL2_PREF,
|
||||
!Services.prefs.getBoolPref(LEVEL2_PREF)
|
||||
|
@ -480,6 +497,8 @@ add_task(async function testContentBlockingStrictCategory() {
|
|||
Services.prefs.setBoolPref(TP_PBM_PREF, false);
|
||||
Services.prefs.setBoolPref(EMAIL_TP_PREF, false);
|
||||
Services.prefs.setBoolPref(EMAIL_TP_PBM_PREF, false);
|
||||
Services.prefs.setBoolPref(CONSENTMANAGER_SKIP_PREF, false);
|
||||
Services.prefs.setBoolPref(CONSENTMANAGER_SKIP_PBM_PREF, false);
|
||||
Services.prefs.setBoolPref(LEVEL2_PREF, false);
|
||||
Services.prefs.setBoolPref(REFERRER_PREF, false);
|
||||
Services.prefs.setBoolPref(REFERRER_TOP_PREF, false);
|
||||
|
@ -573,18 +592,18 @@ add_task(async function testContentBlockingStrictCategory() {
|
|||
`${STP_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "cm":
|
||||
case "cryptoTP":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CM_PREF),
|
||||
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
|
||||
true,
|
||||
`${CM_PREF} has been set to true`
|
||||
`${CRYPTO_TP_PREF} has been set to true`
|
||||
);
|
||||
break;
|
||||
case "-cm":
|
||||
case "-cryptoTP":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CM_PREF),
|
||||
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
|
||||
false,
|
||||
`${CM_PREF} has been set to false`
|
||||
`${CRYPTO_TP_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "emailTP":
|
||||
|
@ -615,18 +634,46 @@ add_task(async function testContentBlockingStrictCategory() {
|
|||
`${EMAIL_TP_PBM_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "consentmanagerSkip":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
|
||||
true,
|
||||
`${CONSENTMANAGER_SKIP_PREF} has been set to true`
|
||||
);
|
||||
break;
|
||||
case "-consentmanagerSkip":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
|
||||
false,
|
||||
`${CONSENTMANAGER_SKIP_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "consentmanagerSkipPrivate":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
true,
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} has been set to true`
|
||||
);
|
||||
break;
|
||||
case "-consentmanagerSkipPrivate":
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
false,
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "lvl2":
|
||||
is(
|
||||
Services.prefs.getBoolPref(LEVEL2_PREF),
|
||||
true,
|
||||
`${CM_PREF} has been set to true`
|
||||
`${CRYPTO_TP_PREF} has been set to true`
|
||||
);
|
||||
break;
|
||||
case "-lvl2":
|
||||
is(
|
||||
Services.prefs.getBoolPref(LEVEL2_PREF),
|
||||
false,
|
||||
`${CM_PREF} has been set to false`
|
||||
`${CRYPTO_TP_PREF} has been set to false`
|
||||
);
|
||||
break;
|
||||
case "rp":
|
||||
|
@ -857,7 +904,7 @@ add_task(async function testContentBlockingCustomCategory() {
|
|||
NCBP_PREF,
|
||||
FP_PREF,
|
||||
STP_PREF,
|
||||
CM_PREF,
|
||||
CRYPTO_TP_PREF,
|
||||
REFERRER_PREF,
|
||||
REFERRER_TOP_PREF,
|
||||
OCSP_PREF,
|
||||
|
@ -906,7 +953,7 @@ add_task(async function testContentBlockingCustomCategory() {
|
|||
for (let pref of [
|
||||
FP_PREF,
|
||||
STP_PREF,
|
||||
CM_PREF,
|
||||
CRYPTO_TP_PREF,
|
||||
TP_PREF,
|
||||
TP_PBM_PREF,
|
||||
REFERRER_PREF,
|
||||
|
|
|
@ -13,11 +13,15 @@ const NCB_PREF = "network.cookie.cookieBehavior";
|
|||
const NCBP_PREF = "network.cookie.cookieBehavior.pbmode";
|
||||
const CAT_PREF = "browser.contentblocking.category";
|
||||
const FP_PREF = "privacy.trackingprotection.fingerprinting.enabled";
|
||||
const CM_PREF = "privacy.trackingprotection.cryptomining.enabled";
|
||||
const CRYPTO_TP_PREF = "privacy.trackingprotection.cryptomining.enabled";
|
||||
const STP_PREF = "privacy.trackingprotection.socialtracking.enabled";
|
||||
const EMAIL_TP_PREF = "privacy.trackingprotection.emailtracking.enabled";
|
||||
const EMAIL_TP_PBM_PREF =
|
||||
"privacy.trackingprotection.emailtracking.pbmode.enabled";
|
||||
const CONSENTMANAGER_SKIP_PREF =
|
||||
"privacy.trackingprotection.consentmanager.skip.enabled";
|
||||
const CONSENTMANAGER_SKIP_PBM_PREF =
|
||||
"privacy.trackingprotection.consentmanager.skip.pbmode.enabled";
|
||||
const LEVEL2_PREF = "privacy.annotate_channels.strict_list.enabled";
|
||||
const REFERRER_PREF = "network.http.referer.disallowCrossSiteRelaxingDefault";
|
||||
const REFERRER_TOP_PREF =
|
||||
|
@ -57,8 +61,8 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
`${FP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CM_PREF),
|
||||
`${CM_PREF} pref has the default value`
|
||||
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
|
||||
`${CRYPTO_TP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(STP_PREF),
|
||||
|
@ -72,6 +76,14 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
|
||||
`${EMAIL_TP_PBM_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PREF),
|
||||
`${CONSENTMANAGER_SKIP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(NCB_PREF),
|
||||
`${NCB_PREF} pref has the default value`
|
||||
|
@ -125,10 +137,16 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
let originalTP = defaults.getBoolPref(TP_PREF);
|
||||
let originalTPPBM = defaults.getBoolPref(TP_PBM_PREF);
|
||||
let originalFP = defaults.getBoolPref(FP_PREF);
|
||||
let originalCM = defaults.getBoolPref(CM_PREF);
|
||||
let originalCryptoTP = defaults.getBoolPref(CRYPTO_TP_PREF);
|
||||
let originalSTP = defaults.getBoolPref(STP_PREF);
|
||||
let originalEmailTP = defaults.getBoolPref(EMAIL_TP_PREF);
|
||||
let originalEmailTPPBM = defaults.getBoolPref(EMAIL_TP_PBM_PREF);
|
||||
let originalConsentmanagerSkip = defaults.getBoolPref(
|
||||
CONSENTMANAGER_SKIP_PREF
|
||||
);
|
||||
let originalConsentmanagerSkipPBM = defaults.getBoolPref(
|
||||
CONSENTMANAGER_SKIP_PBM_PREF
|
||||
);
|
||||
let originalNCB = defaults.getIntPref(NCB_PREF);
|
||||
let originalNCBP = defaults.getIntPref(NCBP_PREF);
|
||||
let originalLEVEL2 = defaults.getBoolPref(LEVEL2_PREF);
|
||||
|
@ -167,10 +185,15 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
defaults.setBoolPref(TP_PREF, !originalTP);
|
||||
defaults.setBoolPref(TP_PBM_PREF, !originalTPPBM);
|
||||
defaults.setBoolPref(FP_PREF, !originalFP);
|
||||
defaults.setBoolPref(CM_PREF, !originalCM);
|
||||
defaults.setBoolPref(CM_PREF, !originalSTP);
|
||||
defaults.setBoolPref(CRYPTO_TP_PREF, !originalCryptoTP);
|
||||
defaults.setBoolPref(CRYPTO_TP_PREF, !originalSTP);
|
||||
defaults.setBoolPref(EMAIL_TP_PREF, !originalEmailTP);
|
||||
defaults.setBoolPref(EMAIL_TP_PBM_PREF, !originalEmailTPPBM);
|
||||
defaults.setBoolPref(CONSENTMANAGER_SKIP_PREF, !originalConsentmanagerSkip);
|
||||
defaults.setBoolPref(
|
||||
CONSENTMANAGER_SKIP_PBM_PREF,
|
||||
!originalConsentmanagerSkipPBM
|
||||
);
|
||||
defaults.setIntPref(NCB_PREF, !originalNCB);
|
||||
defaults.setBoolPref(LEVEL2_PREF, !originalLEVEL2);
|
||||
defaults.setBoolPref(REFERRER_PREF, !originalREFERRER);
|
||||
|
@ -196,8 +219,8 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
`${FP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CM_PREF),
|
||||
`${CM_PREF} pref has the default value`
|
||||
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
|
||||
`${CRYPTO_TP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(STP_PREF),
|
||||
|
@ -211,6 +234,14 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
!Services.prefs.prefHasUserValue(EMAIL_TP_PBM_PREF),
|
||||
`${EMAIL_TP_PBM_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PREF),
|
||||
`${CONSENTMANAGER_SKIP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(NCB_PREF),
|
||||
`${NCB_PREF} pref has the default value`
|
||||
|
@ -265,10 +296,15 @@ add_task(async function testContentBlockingStandardDefinition() {
|
|||
defaults.setBoolPref(TP_PREF, originalTP);
|
||||
defaults.setBoolPref(TP_PBM_PREF, originalTPPBM);
|
||||
defaults.setBoolPref(FP_PREF, originalFP);
|
||||
defaults.setBoolPref(CM_PREF, originalCM);
|
||||
defaults.setBoolPref(CRYPTO_TP_PREF, originalCryptoTP);
|
||||
defaults.setBoolPref(STP_PREF, originalSTP);
|
||||
defaults.setBoolPref(EMAIL_TP_PREF, originalEmailTP);
|
||||
defaults.setBoolPref(EMAIL_TP_PBM_PREF, originalEmailTPPBM);
|
||||
defaults.setBoolPref(CONSENTMANAGER_SKIP_PREF, originalConsentmanagerSkip);
|
||||
defaults.setBoolPref(
|
||||
CONSENTMANAGER_SKIP_PBM_PREF,
|
||||
originalConsentmanagerSkipPBM
|
||||
);
|
||||
defaults.setIntPref(NCB_PREF, originalNCB);
|
||||
defaults.setIntPref(NCBP_PREF, originalNCBP);
|
||||
defaults.setBoolPref(LEVEL2_PREF, originalLEVEL2);
|
||||
|
@ -291,7 +327,7 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
let originalStrictPref = defaults.getStringPref(STRICT_DEF_PREF);
|
||||
defaults.setStringPref(
|
||||
STRICT_DEF_PREF,
|
||||
"tp,tpPrivate,fp,cm,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp"
|
||||
"tp,tpPrivate,fp,cryptoTP,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,consentmanagerSkip,consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp"
|
||||
);
|
||||
Services.prefs.setStringPref(CAT_PREF, "strict");
|
||||
is(
|
||||
|
@ -306,7 +342,7 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
);
|
||||
is(
|
||||
Services.prefs.getStringPref(STRICT_DEF_PREF),
|
||||
"tp,tpPrivate,fp,cm,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp",
|
||||
"tp,tpPrivate,fp,cryptoTP,cookieBehavior0,cookieBehaviorPBM0,stp,emailTP,emailTPPrivate,consentmanagerSkip,consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,qps,qpsPBM,fpp,fppPrivate,3pcd,btp",
|
||||
`${STRICT_DEF_PREF} changed to what we set.`
|
||||
);
|
||||
|
||||
|
@ -323,12 +359,12 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
is(
|
||||
Services.prefs.getBoolPref(FP_PREF),
|
||||
true,
|
||||
`${CM_PREF} pref has been set to true`
|
||||
`${FP_PREF} pref has been set to true`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CM_PREF),
|
||||
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
|
||||
true,
|
||||
`${CM_PREF} pref has been set to true`
|
||||
`${CRYPTO_TP_PREF} pref has been set to true`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(STP_PREF),
|
||||
|
@ -345,6 +381,16 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
true,
|
||||
`${EMAIL_TP_PBM_PREF} pref has been set to true`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
|
||||
true,
|
||||
`${CONSENTMANAGER_SKIP_PREF} pref has been set to true`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
true,
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has been set to true`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getIntPref(NCB_PREF),
|
||||
Ci.nsICookieService.BEHAVIOR_ACCEPT,
|
||||
|
@ -422,8 +468,8 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
`${FP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(CM_PREF),
|
||||
`${CM_PREF} pref has the default value`
|
||||
!Services.prefs.prefHasUserValue(CRYPTO_TP_PREF),
|
||||
`${CRYPTO_TP_PREF} pref has the default value`
|
||||
);
|
||||
ok(
|
||||
!Services.prefs.prefHasUserValue(STP_PREF),
|
||||
|
@ -488,7 +534,7 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
|
||||
defaults.setStringPref(
|
||||
STRICT_DEF_PREF,
|
||||
"-tpPrivate,-fp,-cm,-tp,cookieBehavior3,cookieBehaviorPBM2,-stp,-emailTP,-emailTPPrivate,-lvl2,-rp,-ocsp,-qps,-qpsPBM,-fpp,-fppPrivate,-3pcd,-btp"
|
||||
"-tpPrivate,-fp,-cryptoTP,-tp,cookieBehavior3,cookieBehaviorPBM2,-stp,-emailTP,-emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,-lvl2,-rp,-ocsp,-qps,-qpsPBM,-fpp,-fppPrivate,-3pcd,-btp"
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(TP_PREF),
|
||||
|
@ -506,9 +552,9 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
`${FP_PREF} pref has been set to false`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CM_PREF),
|
||||
Services.prefs.getBoolPref(CRYPTO_TP_PREF),
|
||||
false,
|
||||
`${CM_PREF} pref has been set to false`
|
||||
`${CRYPTO_TP_PREF} pref has been set to false`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(STP_PREF),
|
||||
|
@ -525,6 +571,16 @@ add_task(async function testContentBlockingStrictDefinition() {
|
|||
false,
|
||||
`${EMAIL_TP_PBM_PREF} pref has been set to false`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PREF),
|
||||
false,
|
||||
`${CONSENTMANAGER_SKIP_PREF} pref has been set to false`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getBoolPref(CONSENTMANAGER_SKIP_PBM_PREF),
|
||||
false,
|
||||
`${CONSENTMANAGER_SKIP_PBM_PREF} pref has been set to false`
|
||||
);
|
||||
is(
|
||||
Services.prefs.getIntPref(NCB_PREF),
|
||||
Ci.nsICookieService.BEHAVIOR_LIMIT_FOREIGN,
|
||||
|
|
|
@ -149,6 +149,7 @@ engine_list_test(async function test_change_keyword(tree) {
|
|||
keywordBefore,
|
||||
"Did not modify keywords."
|
||||
);
|
||||
alertSpy.restore();
|
||||
});
|
||||
|
||||
engine_list_test(async function test_rename_engines(tree) {
|
||||
|
|
|
@ -106,7 +106,7 @@ add_task(async function runTests() {
|
|||
// cookieBehaviors both are BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN in
|
||||
// the strict feature value.
|
||||
await testCookieBlockingInfoStrict(
|
||||
"tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
|
||||
"tp,tpPrivate,cookieBehavior5,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
|
||||
false
|
||||
);
|
||||
|
||||
|
@ -114,7 +114,7 @@ add_task(async function runTests() {
|
|||
// cookieBehavior is BEHAVIOR_REJECT_TRACKER and the private cookieBehavior is
|
||||
// BEHAVIOR_REJECT_TRACKER_AND_PARTITION_FOREIGN
|
||||
await testCookieBlockingInfoStrict(
|
||||
"tp,tpPrivate,cookieBehavior4,cookieBehaviorPBM5,cm,fp,stp,emailTP,emailTPPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
|
||||
"tp,tpPrivate,cookieBehavior4,cookieBehaviorPBM5,cryptoTP,fp,stp,emailTP,emailTPPrivate,-consentmanagerSkip,-consentmanagerSkipPrivate,lvl2,rp,rpTop,ocsp,fpp,fppPrivate,3pcd",
|
||||
true
|
||||
);
|
||||
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
* http://creativecommons.org/publicdomain/zero/1.0/ */
|
||||
|
||||
const CB_STRICT_FEATURES_PREF = "browser.contentblocking.features.strict";
|
||||
const CB_STRICT_FEATURES_VALUE = "tp,tpPrivate,cookieBehavior5,cm,fp,stp,lvl2";
|
||||
const CB_STRICT_FEATURES_VALUE =
|
||||
"tp,tpPrivate,cookieBehavior5,cryptoTP,fp,stp,lvl2";
|
||||
const FPI_PREF = "privacy.firstparty.isolate";
|
||||
const COOKIE_BEHAVIOR_PREF = "network.cookie.cookieBehavior";
|
||||
const COOKIE_BEHAVIOR_VALUE = 5;
|
||||
|
|
|
@ -219,14 +219,12 @@ add_task(async function test_cleanup() {
|
|||
info(
|
||||
"5. Altering closedAt to an old date, making sure that stuff gets collected, eventually"
|
||||
);
|
||||
// TODO this should also test that the closed tab group is cleaned up, but
|
||||
// can't be done until restoring tab groups (and thus setBrowserState)
|
||||
// supports tab groups. See bug1927527.
|
||||
await promiseCleanup();
|
||||
|
||||
let state = getClosedState();
|
||||
state._closedWindows[0].closedAt = LONG_TIME_AGO;
|
||||
state.windows[0]._closedTabs[0].closedAt = LONG_TIME_AGO;
|
||||
state.windows[0].closedGroups[0].closedAt = LONG_TIME_AGO;
|
||||
state.windows[0]._closedTabs[1].closedAt = Date.now();
|
||||
let url = state.windows[0]._closedTabs[1].state.entries[0].url;
|
||||
|
||||
|
@ -238,6 +236,7 @@ add_task(async function test_cleanup() {
|
|||
|
||||
state = JSON.parse(ss.getBrowserState());
|
||||
is(state._closedWindows[0], undefined, "5. Second window was forgotten");
|
||||
is(state.windows[0].closedGroups[0], undefined, "5. Tab group was forgotten");
|
||||
|
||||
is(state.windows[0]._closedTabs.length, 1, "5. Only one closed tab left");
|
||||
is(
|
||||
|
|
|
@ -109,8 +109,10 @@ var gSetBackground = {
|
|||
"setDesktopBackground"
|
||||
);
|
||||
setDesktopBackground.hidden = false;
|
||||
var bundle = document.getElementById("backgroundBundle");
|
||||
setDesktopBackground.label = bundle.getString("DesktopBackgroundSet");
|
||||
document.l10n.setAttributes(
|
||||
setDesktopBackground,
|
||||
"set-desktop-background-accept"
|
||||
);
|
||||
setDesktopBackground.disabled = false;
|
||||
|
||||
document.getElementById("showDesktopPreferences").hidden = true;
|
||||
|
@ -130,13 +132,13 @@ var gSetBackground = {
|
|||
} else {
|
||||
Services.obs.addObserver(this, "shell:desktop-background-changed");
|
||||
|
||||
var bundle = document.getElementById("backgroundBundle");
|
||||
var setDesktopBackground = document.getElementById(
|
||||
"setDesktopBackground"
|
||||
);
|
||||
setDesktopBackground.disabled = true;
|
||||
setDesktopBackground.label = bundle.getString(
|
||||
"DesktopBackgroundDownloading"
|
||||
document.l10n.setAttributes(
|
||||
setDesktopBackground,
|
||||
"set-desktop-background-downloading"
|
||||
);
|
||||
}
|
||||
this._shell.setDesktopBackground(
|
||||
|
|
|
@ -36,8 +36,6 @@
|
|||
<script src="chrome://browser/content/utilityOverlay.js"/>
|
||||
#endif
|
||||
|
||||
<stringbundle id="backgroundBundle"
|
||||
src="chrome://browser/locale/shellservice.properties"/>
|
||||
<script src="chrome://browser/content/setDesktopBackground.js"/>
|
||||
<script src="chrome://global/content/contentAreaUtils.js"/>
|
||||
|
||||
|
|
|
@ -6,6 +6,4 @@
|
|||
#define PREF_CHECKDEFAULTBROWSER "browser.shell.checkDefaultBrowser"
|
||||
#define PREF_DEFAULTBROWSERCHECKCOUNT "browser.shell.defaultBrowserCheckCount"
|
||||
|
||||
#define SHELLSERVICE_PROPERTIES \
|
||||
"chrome://browser/locale/shellservice.properties"
|
||||
#define BRAND_PROPERTIES "chrome://branding/locale/brand.properties"
|
||||
|
|
|
@ -456,7 +456,7 @@ nsWindowsShellService::SetDefaultBrowser(bool aForAllUsers) {
|
|||
}
|
||||
|
||||
/*
|
||||
* Asynchronious function to Write an ico file to the disk / in a nsIFile.
|
||||
* Asynchronous function to Write an ico file to the disk / in a nsIFile.
|
||||
* Limitation: Only square images are supported as of now.
|
||||
*/
|
||||
NS_IMETHODIMP
|
||||
|
@ -677,21 +677,18 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
|
|||
rv = request->GetImage(getter_AddRefs(container));
|
||||
if (!container) return NS_ERROR_FAILURE;
|
||||
|
||||
// get the file name from localized strings
|
||||
nsCOMPtr<nsIStringBundleService> bundleService(
|
||||
do_GetService(NS_STRINGBUNDLE_CONTRACTID, &rv));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
nsCOMPtr<nsIStringBundle> shellBundle;
|
||||
rv = bundleService->CreateBundle(SHELLSERVICE_PROPERTIES,
|
||||
getter_AddRefs(shellBundle));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// e.g. "Desktop Background.bmp"
|
||||
nsAutoString fileLeafName;
|
||||
rv = shellBundle->GetStringFromName("desktopBackgroundLeafNameWin",
|
||||
fileLeafName);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
// get the file name from localized strings, e.g. "Desktop Background", then
|
||||
// append the extension (".bmp").
|
||||
nsTArray<nsCString> resIds = {
|
||||
"browser/browser/setDesktopBackground.ftl"_ns,
|
||||
};
|
||||
RefPtr<Localization> l10n = Localization::Create(resIds, true);
|
||||
nsAutoCString fileLeafNameUtf8;
|
||||
IgnoredErrorResult locRv;
|
||||
l10n->FormatValueSync("set-desktop-background-filename"_ns, {},
|
||||
fileLeafNameUtf8, locRv);
|
||||
nsAutoString fileLeafName = NS_ConvertUTF8toUTF16(fileLeafNameUtf8);
|
||||
fileLeafName.AppendLiteral(".bmp");
|
||||
|
||||
// get the profile root directory
|
||||
nsCOMPtr<nsIFile> file;
|
||||
|
@ -708,7 +705,7 @@ nsWindowsShellService::SetDesktopBackground(dom::Element* aElement,
|
|||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
|
||||
// write the bitmap to a file in the profile directory.
|
||||
// We have to write old bitmap format for Windows 7 wallpapar support.
|
||||
// We have to write old bitmap format for Windows 7 wallpaper support.
|
||||
rv = WriteBitmap(file, container);
|
||||
|
||||
// if the file was written successfully, set it as the system wallpaper
|
||||
|
|
|
@ -829,7 +829,7 @@
|
|||
);
|
||||
if (
|
||||
this.smartTabGroupsEnabled &&
|
||||
(this.#suggestedMlLabel || this.#hasSuggestedMlTabs)
|
||||
(this.#suggestedMlLabel !== null || this.#hasSuggestedMlTabs)
|
||||
) {
|
||||
this.#handleMlTelemetry("save-popup-hidden");
|
||||
}
|
||||
|
@ -1010,7 +1010,7 @@
|
|||
if (!this.smartTabGroupsEnabled) {
|
||||
return;
|
||||
}
|
||||
if (this.#suggestedMlLabel) {
|
||||
if (this.#suggestedMlLabel !== null) {
|
||||
this.#smartTabGroupingManager.handleLabelTelemetry({
|
||||
action,
|
||||
numTabsInGroup: this.#activeGroup.tabs.length,
|
||||
|
@ -1018,7 +1018,7 @@
|
|||
userLabel: this.#nameField.value,
|
||||
id: this.#activeGroup.id,
|
||||
});
|
||||
this.#suggestedMlLabel = "";
|
||||
this.#suggestedMlLabel = null;
|
||||
}
|
||||
if (this.#hasSuggestedMlTabs) {
|
||||
this.#smartTabGroupingManager.handleSuggestTelemetry({
|
||||
|
|
|
@ -2657,6 +2657,17 @@
|
|||
if (this.#rtlMode) {
|
||||
dropBefore = !dropBefore;
|
||||
}
|
||||
|
||||
// Constrain drop direction at the boundary between pinned and
|
||||
// unpinned tabs so that they don't mix together.
|
||||
let isOutOfBounds = isPinned
|
||||
? dropElement.elementIndex >= numPinned
|
||||
: dropElement.elementIndex < numPinned;
|
||||
if (isOutOfBounds) {
|
||||
// Drop after last pinned tab
|
||||
dropElement = this.ariaFocusableItems[numPinned - 1];
|
||||
dropBefore = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (gBrowser._tabGroupsEnabled && isTab(draggedTab) && !isPinned) {
|
||||
|
|
|
@ -316,3 +316,35 @@ add_task(async function test_optin_telemetry() {
|
|||
);
|
||||
cleanup();
|
||||
});
|
||||
|
||||
add_task(async function test_saving_ml_suggested_empty_label_telemetry() {
|
||||
let { tab, cleanup } = await setup();
|
||||
let tabgroupEditor = document.getElementById("tab-group-editor");
|
||||
let tabgroupPanel = tabgroupEditor.panel;
|
||||
let nameField = tabgroupPanel.querySelector("#tab-group-name");
|
||||
|
||||
await openCreatePanel(tabgroupPanel, tab);
|
||||
nameField.focus();
|
||||
nameField.value = "Random ML Suggested Label"; // user label matching suggested label
|
||||
tabgroupEditor.mlLabel = ""; // suggested label
|
||||
tabgroupPanel.querySelector("#tab-group-editor-button-create").click();
|
||||
let panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
|
||||
await panelHidden;
|
||||
|
||||
const events = Glean.tabgroup.smartTabTopic.testGetValue();
|
||||
Assert.equal(events.length, 1, "Should create a label event");
|
||||
Assert.equal(events[0].extra.action, "save", "Save button was clicked");
|
||||
Assert.equal(events[0].extra.tabs_in_group, "1", "Number of tabs in group");
|
||||
Assert.equal(events[0].extra.ml_label_length, "0", "Suggested ML Label");
|
||||
Assert.equal(
|
||||
events[0].extra.user_label_length,
|
||||
"25",
|
||||
"User input was the same as ml suggested label"
|
||||
);
|
||||
Assert.equal(
|
||||
events[0].extra.model_revision,
|
||||
"v0.3.4",
|
||||
"Model revision should be present"
|
||||
);
|
||||
cleanup();
|
||||
});
|
||||
|
|
|
@ -2,6 +2,12 @@
|
|||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
const { ASRouterTriggerListeners } = ChromeUtils.importESModule(
|
||||
"resource:///modules/asrouter/ASRouterTriggerListeners.sys.mjs"
|
||||
);
|
||||
const { sinon } = ChromeUtils.importESModule(
|
||||
"resource://testing-common/Sinon.sys.mjs"
|
||||
);
|
||||
const { TabStateFlusher } = ChromeUtils.importESModule(
|
||||
"resource:///modules/sessionstore/TabStateFlusher.sys.mjs"
|
||||
);
|
||||
|
@ -507,6 +513,12 @@ add_task(async function test_tabGroupMoveToNewWindow() {
|
|||
});
|
||||
|
||||
add_task(async function test_TabGroupEvents() {
|
||||
const triggerHandler = sinon.stub();
|
||||
const tabGroupCollapsedTrigger =
|
||||
ASRouterTriggerListeners.get("tabGroupCollapsed");
|
||||
tabGroupCollapsedTrigger.uninit();
|
||||
tabGroupCollapsedTrigger.init(triggerHandler);
|
||||
|
||||
let tab1 = BrowserTestUtils.addTab(gBrowser, "about:blank");
|
||||
let tab2 = BrowserTestUtils.addTab(gBrowser, "about:blank");
|
||||
let group;
|
||||
|
@ -539,6 +551,7 @@ add_task(async function test_TabGroupEvents() {
|
|||
let groupCollapsed = BrowserTestUtils.waitForEvent(group, "TabGroupCollapse");
|
||||
group.collapsed = true;
|
||||
await groupCollapsed;
|
||||
Assert.ok(triggerHandler.calledOnce, "Called once after tab group collapsed");
|
||||
|
||||
let groupExpanded = BrowserTestUtils.waitForEvent(group, "TabGroupExpand");
|
||||
group.collapsed = false;
|
||||
|
@ -564,6 +577,7 @@ add_task(async function test_TabGroupEvents() {
|
|||
|
||||
BrowserTestUtils.removeTab(tab1);
|
||||
BrowserTestUtils.removeTab(tab2);
|
||||
tabGroupCollapsedTrigger.uninit();
|
||||
});
|
||||
|
||||
add_task(async function test_moveTabBetweenGroups() {
|
||||
|
@ -1662,6 +1676,12 @@ add_task(async function test_tabsContainNoTabGroups() {
|
|||
* Tests behavior of the group management panel.
|
||||
*/
|
||||
add_task(async function test_tabGroupCreatePanel() {
|
||||
const triggerHandler = sinon.stub();
|
||||
const tabGroupCreatedTrigger =
|
||||
ASRouterTriggerListeners.get("tabGroupCreated");
|
||||
tabGroupCreatedTrigger.uninit();
|
||||
tabGroupCreatedTrigger.init(triggerHandler);
|
||||
|
||||
let tabgroupEditor = document.getElementById("tab-group-editor");
|
||||
let tabgroupPanel = tabgroupEditor.panel;
|
||||
let nameField = tabgroupPanel.querySelector("#tab-group-name");
|
||||
|
@ -1747,8 +1767,14 @@ add_task(async function test_tabGroupCreatePanel() {
|
|||
"Panel should be dismissed after clicking Create and new group should remain"
|
||||
);
|
||||
panelHidden = BrowserTestUtils.waitForPopupEvent(tabgroupPanel, "hidden");
|
||||
let done = BrowserTestUtils.waitForEvent(
|
||||
tabgroupEditor,
|
||||
"TabGroupCreateDone"
|
||||
);
|
||||
tabgroupPanel.querySelector("#tab-group-editor-button-create").click();
|
||||
await panelHidden;
|
||||
await done;
|
||||
Assert.ok(triggerHandler.called, "Called after tab group created");
|
||||
Assert.equal(tabgroupPanel.state, "closed", "Tabgroup edit panel is closed");
|
||||
Assert.equal(group.label, "Shopping");
|
||||
Assert.equal(group.color, "red");
|
||||
|
@ -1790,6 +1816,7 @@ add_task(async function test_tabGroupCreatePanel() {
|
|||
let removePromise = BrowserTestUtils.waitForEvent(group, "TabGroupRemoved");
|
||||
tabgroupPanel.querySelector("#tabGroupEditor_deleteGroup").click();
|
||||
await Promise.all([panelHidden, removePromise]);
|
||||
tabGroupCreatedTrigger.uninit();
|
||||
});
|
||||
|
||||
async function createTabGroupAndOpenEditPanel(tabs = []) {
|
||||
|
@ -1964,6 +1991,11 @@ add_task(async function test_saveDisabledForUnimportantGroup() {
|
|||
});
|
||||
|
||||
add_task(async function test_saveAndCloseGroup() {
|
||||
const triggerHandler = sinon.stub();
|
||||
const tabGroupSavedTrigger = ASRouterTriggerListeners.get("tabGroupSaved");
|
||||
tabGroupSavedTrigger.uninit();
|
||||
tabGroupSavedTrigger.init(triggerHandler);
|
||||
|
||||
let tab = await addTab("about:mozilla");
|
||||
let { tabgroupEditor, group } = await createTabGroupAndOpenEditPanel([tab]);
|
||||
let tabgroupPanel = tabgroupEditor.panel;
|
||||
|
@ -1982,6 +2014,7 @@ add_task(async function test_saveAndCloseGroup() {
|
|||
saveAndCloseGroupButton.click();
|
||||
await Promise.all(events);
|
||||
|
||||
Assert.ok(triggerHandler.calledOnce, "Called once after tab group saved");
|
||||
Assert.ok(
|
||||
!gBrowser.getTabGroupById(group.id),
|
||||
"Group was removed from browser"
|
||||
|
@ -1991,6 +2024,7 @@ add_task(async function test_saveAndCloseGroup() {
|
|||
SessionStore.forgetSavedTabGroup(group.id);
|
||||
|
||||
BrowserTestUtils.removeTab(tab);
|
||||
tabGroupSavedTrigger.uninit();
|
||||
});
|
||||
|
||||
add_task(async function test_saveAndCloseGroupViaMiddleClick() {
|
||||
|
|
68
browser/components/taskbartabs/TaskbarTabs.sys.mjs
Normal file
68
browser/components/taskbartabs/TaskbarTabs.sys.mjs
Normal 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;
|
||||
},
|
||||
};
|
|
@ -4,7 +4,8 @@
|
|||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
EXTRA_JS_MODULES += [
|
||||
EXTRA_JS_MODULES.taskbartabs += [
|
||||
"TaskbarTabs.sys.mjs",
|
||||
"TaskbarTabUI.sys.mjs",
|
||||
]
|
||||
|
||||
|
|
|
@ -1,6 +1,16 @@
|
|||
[DEFAULT]
|
||||
support-files = ["head.js"]
|
||||
|
||||
prefs = [
|
||||
"browser.taskbarTabs.enabled=true"
|
||||
]
|
||||
|
||||
["browser_taskBarTabs_module.js"]
|
||||
support-files = [
|
||||
"../../../tabbrowser/test/browser/tabs/dummy_page.html",
|
||||
]
|
||||
run-if = ["os == 'win'"]
|
||||
|
||||
["browser_taskbarTabs_chromeTest.js"]
|
||||
run-if = ["os == 'win'"]
|
||||
|
||||
|
|
|
@ -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);
|
||||
});
|
|
@ -32,6 +32,8 @@ skip-if = [
|
|||
|
||||
["browser_autofill_address_level.js"]
|
||||
|
||||
["browser_autofill_address_name.js"]
|
||||
|
||||
["browser_autofill_address_select.js"]
|
||||
|
||||
["browser_autofill_address_select_inexact.js"]
|
||||
|
|
|
@ -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"],
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
},
|
||||
]);
|
|
@ -132,7 +132,7 @@ function CardSection({
|
|||
data: {
|
||||
section: sectionKey,
|
||||
section_position: sectionPosition,
|
||||
is_secton_followed: following,
|
||||
is_section_followed: following,
|
||||
},
|
||||
})
|
||||
);
|
||||
|
|
|
@ -71,10 +71,10 @@ export const DSSource = ({
|
|||
|
||||
// Otherwise display a default source.
|
||||
return (
|
||||
<p className="source clamp">
|
||||
<div className="source-wrapper">
|
||||
{icon_src && <img src={icon_src} height="16" width="16" alt="" />}
|
||||
{source}
|
||||
</p>
|
||||
<p className="source clamp">{source}</p>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
|
@ -370,7 +370,7 @@ export class _DSCard extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -399,7 +399,7 @@ export class _DSCard extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -443,7 +443,7 @@ export class _DSCard extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -533,7 +533,7 @@ export class _DSCard extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -797,7 +797,7 @@ export class _DSCard extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -884,7 +884,7 @@ export class _DSCard extends React.PureComponent {
|
|||
is_list_card={this.props.isListCard}
|
||||
section={this.props.section}
|
||||
section_position={this.props.sectionPosition}
|
||||
is_secton_followed={this.props.sectionFollowed}
|
||||
is_section_followed={this.props.sectionFollowed}
|
||||
format={format}
|
||||
isSectionsCard={this.props.mayHaveSectionsCards}
|
||||
/>
|
||||
|
|
|
@ -251,18 +251,21 @@ $ds-card-image-gradient-solid: rgba(0, 0, 0, 100%);
|
|||
);
|
||||
}
|
||||
|
||||
.source {
|
||||
-webkit-line-clamp: 1;
|
||||
margin-bottom: 2px;
|
||||
font-size: 13px;
|
||||
color: var(--newtab-text-secondary-color);
|
||||
.source-wrapper {
|
||||
display: flex;
|
||||
margin-block-end: var(--space-xxsmall);
|
||||
align-items: center;
|
||||
|
||||
img {
|
||||
border-radius: var(--border-radius-small);
|
||||
margin-inline-end: var(--space-small);
|
||||
}
|
||||
}
|
||||
|
||||
.source {
|
||||
-webkit-line-clamp: 1;
|
||||
font-size: var(--font-size-small);
|
||||
color: var(--newtab-text-secondary-color);
|
||||
|
||||
span {
|
||||
display: inline-block;
|
||||
|
@ -496,6 +499,7 @@ $ds-card-image-gradient-solid: rgba(0, 0, 0, 100%);
|
|||
}
|
||||
|
||||
.source {
|
||||
-webkit-line-clamp: 1;
|
||||
color: var(--newtab-text-secondary-text);
|
||||
font-size: var(--font-size-small);
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
|
||||
}
|
||||
|
||||
.placeholder-image {
|
||||
|
|
|
@ -82,7 +82,7 @@ export class _DSLinkMenu extends React.PureComponent {
|
|||
? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.section_position,
|
||||
is_secton_followed: this.props.is_secton_followed,
|
||||
is_section_followed: this.props.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
}}
|
||||
|
|
|
@ -124,7 +124,7 @@ export class ImpressionStats extends React.PureComponent {
|
|||
? {
|
||||
section: link.section,
|
||||
section_position: link.section_position,
|
||||
is_secton_followed: link.is_secton_followed,
|
||||
is_section_followed: link.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
})),
|
||||
|
|
|
@ -79,7 +79,7 @@ export const LinkMenuOptions = {
|
|||
? {
|
||||
section: site.section,
|
||||
section_position: site.section_position,
|
||||
is_secton_followed: site.is_secton_followed,
|
||||
is_section_followed: site.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -134,7 +134,7 @@ export const LinkMenuOptions = {
|
|||
? {
|
||||
section: site.section,
|
||||
section_position: site.section_position,
|
||||
is_secton_followed: site.is_secton_followed,
|
||||
is_section_followed: site.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
})),
|
||||
|
|
|
@ -6400,18 +6400,20 @@ main section {
|
|||
-webkit-line-clamp: 3;
|
||||
line-height: 20px;
|
||||
}
|
||||
.ds-card .meta .source {
|
||||
-webkit-line-clamp: 1;
|
||||
margin-bottom: 2px;
|
||||
font-size: 13px;
|
||||
color: var(--newtab-text-secondary-color);
|
||||
.ds-card .meta .source-wrapper {
|
||||
display: flex;
|
||||
margin-block-end: var(--space-xxsmall);
|
||||
align-items: center;
|
||||
}
|
||||
.ds-card .meta .source img {
|
||||
.ds-card .meta .source-wrapper img {
|
||||
border-radius: var(--border-radius-small);
|
||||
margin-inline-end: var(--space-small);
|
||||
}
|
||||
.ds-card .meta .source {
|
||||
-webkit-line-clamp: 1;
|
||||
font-size: var(--font-size-small);
|
||||
color: var(--newtab-text-secondary-color);
|
||||
}
|
||||
.ds-card .meta .source span {
|
||||
display: inline-block;
|
||||
}
|
||||
|
@ -6592,6 +6594,7 @@ main section {
|
|||
line-height: normal;
|
||||
}
|
||||
.ds-card-grid .sections-card-ui .meta .source {
|
||||
-webkit-line-clamp: 1;
|
||||
color: var(--newtab-text-secondary-text);
|
||||
font-size: var(--font-size-small);
|
||||
}
|
||||
|
@ -6728,6 +6731,7 @@ main section {
|
|||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
border-radius: var(--border-radius-large) var(--border-radius-large) 0 0;
|
||||
}
|
||||
.ds-image .placeholder-image {
|
||||
overflow: hidden;
|
||||
|
|
|
@ -1763,7 +1763,7 @@ const LinkMenuOptions = {
|
|||
? {
|
||||
section: site.section,
|
||||
section_position: site.section_position,
|
||||
is_secton_followed: site.is_secton_followed,
|
||||
is_section_followed: site.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
},
|
||||
|
@ -1818,7 +1818,7 @@ const LinkMenuOptions = {
|
|||
? {
|
||||
section: site.section,
|
||||
section_position: site.section_position,
|
||||
is_secton_followed: site.is_secton_followed,
|
||||
is_section_followed: site.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
})),
|
||||
|
@ -2458,7 +2458,7 @@ class _DSLinkMenu extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.section_position,
|
||||
is_secton_followed: this.props.is_secton_followed
|
||||
is_section_followed: this.props.is_section_followed
|
||||
} : {})
|
||||
}
|
||||
})));
|
||||
|
@ -2628,7 +2628,7 @@ class ImpressionStats_ImpressionStats extends (external_React_default()).PureCom
|
|||
...(link.section ? {
|
||||
section: link.section,
|
||||
section_position: link.section_position,
|
||||
is_secton_followed: link.is_secton_followed
|
||||
is_section_followed: link.is_section_followed
|
||||
} : {})
|
||||
})),
|
||||
firstVisibleTimestamp: this.props.firstVisibleTimestamp
|
||||
|
@ -3251,14 +3251,16 @@ const DSSource = ({
|
|||
}
|
||||
|
||||
// Otherwise display a default source.
|
||||
return /*#__PURE__*/external_React_default().createElement("p", {
|
||||
className: "source clamp"
|
||||
return /*#__PURE__*/external_React_default().createElement("div", {
|
||||
className: "source-wrapper"
|
||||
}, icon_src && /*#__PURE__*/external_React_default().createElement("img", {
|
||||
src: icon_src,
|
||||
height: "16",
|
||||
width: "16",
|
||||
alt: ""
|
||||
}), source);
|
||||
}), /*#__PURE__*/external_React_default().createElement("p", {
|
||||
className: "source clamp"
|
||||
}, source));
|
||||
};
|
||||
const DefaultMeta = ({
|
||||
source,
|
||||
|
@ -3486,7 +3488,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed
|
||||
is_section_followed: this.props.sectionFollowed
|
||||
} : {})
|
||||
}
|
||||
}));
|
||||
|
@ -3512,7 +3514,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed
|
||||
is_section_followed: this.props.sectionFollowed
|
||||
} : {})
|
||||
}]
|
||||
}));
|
||||
|
@ -3551,7 +3553,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed
|
||||
is_section_followed: this.props.sectionFollowed
|
||||
} : {})
|
||||
}
|
||||
}));
|
||||
|
@ -3626,7 +3628,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed
|
||||
is_section_followed: this.props.sectionFollowed
|
||||
} : {})
|
||||
}
|
||||
}));
|
||||
|
@ -3837,7 +3839,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
...(this.props.section ? {
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed
|
||||
is_section_followed: this.props.sectionFollowed
|
||||
} : {})
|
||||
}],
|
||||
dispatch: this.props.dispatch,
|
||||
|
@ -3910,7 +3912,7 @@ class _DSCard extends (external_React_default()).PureComponent {
|
|||
is_list_card: this.props.isListCard,
|
||||
section: this.props.section,
|
||||
section_position: this.props.sectionPosition,
|
||||
is_secton_followed: this.props.sectionFollowed,
|
||||
is_section_followed: this.props.sectionFollowed,
|
||||
format: format,
|
||||
isSectionsCard: this.props.mayHaveSectionsCards
|
||||
}))));
|
||||
|
@ -10680,7 +10682,7 @@ function CardSection({
|
|||
data: {
|
||||
section: sectionKey,
|
||||
section_position: sectionPosition,
|
||||
is_secton_followed: following
|
||||
is_section_followed: following
|
||||
}
|
||||
}));
|
||||
}, [dispatch, sectionKey, sectionPosition, following]);
|
||||
|
|
|
@ -575,7 +575,7 @@ export class TelemetryFeed {
|
|||
format,
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
} = action.data.value ?? {};
|
||||
if (
|
||||
action.data.source === "POPULAR_TOPICS" ||
|
||||
|
@ -599,7 +599,7 @@ export class TelemetryFeed {
|
|||
? {
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
matches_selected_topic,
|
||||
|
@ -657,7 +657,7 @@ export class TelemetryFeed {
|
|||
topic,
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
} = action.data.value ?? {};
|
||||
Glean.pocket.thumbVotingInteraction.record({
|
||||
newtab_visit_id: session.session_id,
|
||||
|
@ -680,7 +680,7 @@ export class TelemetryFeed {
|
|||
? {
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
});
|
||||
|
@ -705,7 +705,7 @@ export class TelemetryFeed {
|
|||
format,
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
} = action.data.value ?? {};
|
||||
Glean.pocket.save.record({
|
||||
newtab_visit_id: session.session_id,
|
||||
|
@ -715,7 +715,7 @@ export class TelemetryFeed {
|
|||
? {
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
topic,
|
||||
|
@ -988,7 +988,7 @@ export class TelemetryFeed {
|
|||
handleCardSectionUserEvent(action) {
|
||||
const session = this.sessions.get(au.getPortIdOfSender(action));
|
||||
if (session) {
|
||||
const { section, section_position, event_source, is_secton_followed } =
|
||||
const { section, section_position, event_source, is_section_followed } =
|
||||
action.data;
|
||||
switch (action.type) {
|
||||
case "BLOCK_SECTION":
|
||||
|
@ -1012,7 +1012,7 @@ export class TelemetryFeed {
|
|||
newtab_visit_id: session.session_id,
|
||||
section,
|
||||
section_position,
|
||||
is_secton_followed,
|
||||
is_section_followed,
|
||||
});
|
||||
break;
|
||||
case "FOLLOW_SECTION":
|
||||
|
@ -1211,7 +1211,7 @@ export class TelemetryFeed {
|
|||
? {
|
||||
section: datum.section,
|
||||
section_position: datum.section_position,
|
||||
is_secton_followed: datum.is_secton_followed,
|
||||
is_section_followed: datum.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
// We conditionally add in a few props.
|
||||
|
@ -1288,7 +1288,7 @@ export class TelemetryFeed {
|
|||
? {
|
||||
section: tile.section,
|
||||
section_position: tile.section_position,
|
||||
is_secton_followed: tile.is_secton_followed,
|
||||
is_section_followed: tile.is_section_followed,
|
||||
}
|
||||
: {}),
|
||||
position: tile.pos,
|
||||
|
|
|
@ -212,12 +212,30 @@ let AVAILABLE_PIP_OVERRIDES;
|
|||
},
|
||||
},
|
||||
|
||||
iq: {
|
||||
"https://*.iq.com/play/*": {
|
||||
videoWrapperScriptPath: "video-wrappers/iq.js",
|
||||
},
|
||||
},
|
||||
|
||||
kick: {
|
||||
"https://*.kick.com/*": {
|
||||
visibilityThreshold: 0.7,
|
||||
},
|
||||
},
|
||||
|
||||
joyn: {
|
||||
"https://www.joyn.de/play/*": {
|
||||
videoWrapperScriptPath: "video-wrappers/joyn.js",
|
||||
},
|
||||
"https://www.joyn.at/play/*": {
|
||||
videoWrapperScriptPath: "video-wrappers/joyn.js",
|
||||
},
|
||||
"https://www.joyn.ch/play/*": {
|
||||
videoWrapperScriptPath: "video-wrappers/joyn.js",
|
||||
},
|
||||
},
|
||||
|
||||
laracasts: {
|
||||
"https://*.laracasts.com/*": { policy: TOGGLE_POLICIES.ONE_QUARTER },
|
||||
},
|
||||
|
|
96
browser/extensions/pictureinpicture/video-wrappers/iq.js
Normal file
96
browser/extensions/pictureinpicture/video-wrappers/iq.js
Normal 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;
|
41
browser/extensions/pictureinpicture/video-wrappers/joyn.js
Normal file
41
browser/extensions/pictureinpicture/video-wrappers/joyn.js
Normal 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;
|
|
@ -792,10 +792,6 @@
|
|||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://*.aptsovation.com/*"]
|
||||
},
|
||||
"1894682": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://*.arboretumapartments.com/*"]
|
||||
},
|
||||
"1898964": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://*.breakpointeandcoronado.com/*"]
|
||||
|
@ -886,21 +882,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"1786404": {
|
||||
"label": "business.help.royalmail.com",
|
||||
"bugs": {
|
||||
"1786404": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://business.help.royalmail.com/app/webforms/*"]
|
||||
}
|
||||
},
|
||||
"interventions": [
|
||||
{
|
||||
"platforms": ["all"],
|
||||
"ua_string": ["change_Firefox_to_FireFox"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"1799968": {
|
||||
"label": "www.samsung.com",
|
||||
"bugs": {
|
||||
|
@ -1587,57 +1568,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"1844503": {
|
||||
"label": "nicochannel.jp",
|
||||
"bugs": {
|
||||
"1844503": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": [
|
||||
"*://*.ado-dokidokihimitsukichi-daigakuimo.com/*",
|
||||
"*://*.ahnbohyun-fc.com/*",
|
||||
"*://*.banbanzai-fc.com/*",
|
||||
"*://*.canan8181.com/*",
|
||||
"*://*.gs-ch.com/*",
|
||||
"*://*.itomiku-fc.jp/*",
|
||||
"*://*.kawahara-no.jp/*",
|
||||
"*://*.keisuke-ueda.jp/*",
|
||||
"*://*.kemomimirefle.net/*",
|
||||
"*://*.kyoten-waku-officialfc.com/*",
|
||||
"*://*.maziyabacity.com/*",
|
||||
"*://*.nicochannel.jp/*",
|
||||
"*://*.p-jinriki-fc.com/*",
|
||||
"*://*.pizzaradio.jp/*",
|
||||
"*://*.quizknock-schole.com/*",
|
||||
"*://*.rnqq.jp/*",
|
||||
"*://*.ryogomatsumaru.com/*",
|
||||
"*://*.sae-okazaki.com/*",
|
||||
"*://*.sakuraknights.com/*",
|
||||
"*://*.salon-de-horizon.jp/*",
|
||||
"*://*.serina-official.com/*",
|
||||
"*://*.shibuya-abemas.com/*",
|
||||
"*://*.styleparty-fc.jp/*",
|
||||
"*://*.suzuka-ouji-officialfc.com/*",
|
||||
"*://*.takahashifumiya.com/*",
|
||||
"*://*.tokinosora-fc.com/*",
|
||||
"*://*.tymstorage.jp/*",
|
||||
"*://*.yamingfc.net/*"
|
||||
]
|
||||
},
|
||||
"1948817": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://*.qlover.jp/*"]
|
||||
}
|
||||
},
|
||||
"interventions": [
|
||||
{
|
||||
"platforms": ["all"],
|
||||
"content_scripts": {
|
||||
"js": ["bug1849058-nicochannel.jp-picture-in-picture-shim.js"]
|
||||
},
|
||||
"ua_string": ["Chrome", "add_Firefox_as_Gecko"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"1845299": {
|
||||
"label": "Google Slides",
|
||||
"bugs": {
|
||||
|
@ -1989,23 +1919,6 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"1886591": {
|
||||
"label": "la-vache-noire.com",
|
||||
"bugs": {
|
||||
"1886591": {
|
||||
"issue": "broken-cookie-banner",
|
||||
"matches": ["*://la-vache-noire.com/*"]
|
||||
}
|
||||
},
|
||||
"interventions": [
|
||||
{
|
||||
"platforms": ["all"],
|
||||
"content_scripts": {
|
||||
"css": ["bug1886591-la-vache-noire.com-cookie-banner-fix.css"]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"1886616": {
|
||||
"label": "www.six-group.com",
|
||||
"bugs": {
|
||||
|
@ -2569,6 +2482,21 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
"1902403": {
|
||||
"label": "musicstore.auone.jp",
|
||||
"bugs": {
|
||||
"1385206": {
|
||||
"issue": "firefox-blocked-completely",
|
||||
"matches": ["*://musicstore.auone.jp/*"]
|
||||
}
|
||||
},
|
||||
"interventions": [
|
||||
{
|
||||
"platforms": ["all"],
|
||||
"ua_string": ["Chrome"]
|
||||
}
|
||||
]
|
||||
},
|
||||
"1902459": {
|
||||
"label": "coupangplay.com",
|
||||
"bugs": {
|
||||
|
|
|
@ -4,12 +4,40 @@
|
|||
|
||||
"use strict";
|
||||
|
||||
/* global ExtensionAPI, Services */
|
||||
/* global ExtensionAPI, ExtensionCommon, Services */
|
||||
|
||||
this.testUtils = class extends ExtensionAPI {
|
||||
getAPI() {
|
||||
getAPI(context) {
|
||||
const { EventManager } = ExtensionCommon;
|
||||
let messageListener;
|
||||
return {
|
||||
testUtils: {
|
||||
onMessage: new EventManager({
|
||||
context,
|
||||
name: "testUtils.onMessage",
|
||||
register: fire => {
|
||||
if (!messageListener) {
|
||||
const obs = {
|
||||
receiveMessage({ data }) {
|
||||
fire
|
||||
.async(data)
|
||||
.then(retval => {
|
||||
Services.ppmm.broadcastAsyncMessage(
|
||||
`WebCompat:${data.name}:Done`,
|
||||
retval
|
||||
);
|
||||
})
|
||||
.catch(() => {}); // ignore Message Manager disconnects
|
||||
},
|
||||
};
|
||||
Services.cpmm.addMessageListener("WebCompat", obs);
|
||||
messageListener = () => {
|
||||
Services.cpmm.removeMessageListener("WebCompat", obs);
|
||||
};
|
||||
}
|
||||
return messageListener;
|
||||
},
|
||||
}).api(),
|
||||
async interventionsActive() {
|
||||
Services.ppmm.sharedData.set(
|
||||
"WebCompatTests:InterventionsStatus",
|
||||
|
|
|
@ -2,6 +2,19 @@
|
|||
{
|
||||
"namespace": "testUtils",
|
||||
"description": "experimental API extension to let tests know the addon's status",
|
||||
"events": [
|
||||
{
|
||||
"name": "onMessage",
|
||||
"type": "function",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "name",
|
||||
"type": "object",
|
||||
"description": "The preference which changed"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"functions": [
|
||||
{
|
||||
"name": "interventionsActive",
|
||||
|
|
|
@ -262,6 +262,9 @@ this.trackingProtection = class extends ExtensionAPI {
|
|||
async revoke(allowListId) {
|
||||
manager.revoke(allowListId);
|
||||
},
|
||||
async clearResourceCache() {
|
||||
ChromeUtils.clearResourceCache({ target: "content" });
|
||||
},
|
||||
async wasRequestUnblocked(requestId, isPrivate) {
|
||||
if (!manager) {
|
||||
return false;
|
||||
|
|
|
@ -141,6 +141,13 @@
|
|||
],
|
||||
"async": true
|
||||
},
|
||||
{
|
||||
"name": "clearResourceCache",
|
||||
"type": "function",
|
||||
"description": "Clear in-memory resource cache to reflect the changes to the allow-list for the subsequent requests",
|
||||
"parameters": [],
|
||||
"async": true
|
||||
},
|
||||
{
|
||||
"name": "wasRequestUnblocked",
|
||||
"type": "function",
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
26
browser/extensions/webcompat/injections/js/log_message.js
Normal file
26
browser/extensions/webcompat/injections/js/log_message.js
Normal 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.`
|
||||
);
|
||||
}
|
|
@ -37,6 +37,17 @@ class Interventions {
|
|||
this.checkInterventionPref();
|
||||
}, this.INTERVENTION_PREF);
|
||||
this.checkInterventionPref();
|
||||
|
||||
browser.testUtils.onMessage.addListener(async ({ name, data }) => {
|
||||
switch (name) {
|
||||
case "UpdateInterventions": {
|
||||
await this.disableInterventions(data);
|
||||
await this.enableInterventions(data);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
checkInterventionPref() {
|
||||
|
@ -67,26 +78,31 @@ class Interventions {
|
|||
return this._availableInterventions;
|
||||
}
|
||||
|
||||
_getActiveInterventionById(whichId) {
|
||||
return this._availableInterventions.find(({ id }) => id === whichId);
|
||||
}
|
||||
|
||||
isEnabled() {
|
||||
return this._interventionsEnabled;
|
||||
}
|
||||
|
||||
async enableInterventions() {
|
||||
async enableInterventions(whichInterventions = this._availableInterventions) {
|
||||
await this._enablingOrDisablingOperationInProgress;
|
||||
|
||||
this._enablingOrDisablingOperationInProgress = new Promise(done => {
|
||||
this._enableInterventionsNow();
|
||||
done();
|
||||
this._enableInterventionsNow(whichInterventions).then(done);
|
||||
});
|
||||
|
||||
return this._enablingOrDisablingOperationInProgress;
|
||||
}
|
||||
|
||||
async disableInterventions() {
|
||||
async disableInterventions(
|
||||
whichInterventions = this._availableInterventions
|
||||
) {
|
||||
await this._enablingOrDisablingOperationInProgress;
|
||||
|
||||
this._enablingOrDisablingOperationInProgress = new Promise(done => {
|
||||
for (const config of this._availableInterventions) {
|
||||
for (const config of whichInterventions) {
|
||||
this._disableInterventionNow(config);
|
||||
}
|
||||
|
||||
|
@ -102,7 +118,7 @@ class Interventions {
|
|||
return this._enablingOrDisablingOperationInProgress;
|
||||
}
|
||||
|
||||
async _enableInterventionsNow() {
|
||||
async _enableInterventionsNow(whichInterventions) {
|
||||
await this._enablingOrDisablingOperationInProgress;
|
||||
|
||||
const skipped = [];
|
||||
|
@ -114,7 +130,7 @@ class Interventions {
|
|||
const { os } = await browser.runtime.getPlatformInfo();
|
||||
this.currentPlatform = os;
|
||||
|
||||
for (const config of this._availableInterventions) {
|
||||
for (const config of whichInterventions) {
|
||||
for (const intervention of config.interventions) {
|
||||
if (
|
||||
await InterventionHelpers.shouldSkip(
|
||||
|
@ -155,9 +171,8 @@ class Interventions {
|
|||
|
||||
this._interventionsEnabled = true;
|
||||
this._aboutCompatBroker.portsToAboutCompatTabs.broadcast({
|
||||
interventionsChanged: this._aboutCompatBroker.filterInterventions(
|
||||
this._availableInterventions
|
||||
),
|
||||
interventionsChanged:
|
||||
this._aboutCompatBroker.filterInterventions(whichInterventions),
|
||||
});
|
||||
|
||||
await browser.testUtils.interventionsActive();
|
||||
|
@ -202,15 +217,32 @@ class Interventions {
|
|||
|
||||
for (const intervention of config.interventions) {
|
||||
await this._changeCustomFuncs("enable", label, intervention, config);
|
||||
await this._enableContentScripts(label, intervention, matches);
|
||||
await this._enableContentScripts(config.id, label, intervention, matches);
|
||||
await this._enableUAOverrides(label, intervention, matches);
|
||||
await this._enableRequestBlocks(label, intervention, blocks);
|
||||
}
|
||||
|
||||
if (!this._getActiveInterventionById(config.id)) {
|
||||
this._availableInterventions.push(config);
|
||||
console.info("Added webcompat intervention", config.id, config);
|
||||
} else {
|
||||
for (const [index, oldConfig] of this._availableInterventions.entries()) {
|
||||
if (oldConfig.id === config.id && oldConfig !== config) {
|
||||
console.info("Replaced webcompat intervention", oldConfig.id, config);
|
||||
this._availableInterventions[index] = config;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
config.active = true;
|
||||
}
|
||||
|
||||
async _disableInterventionNow(config) {
|
||||
async _disableInterventionNow(_config) {
|
||||
const config = this._getActiveInterventionById(_config?.id ?? _config);
|
||||
if (!config) {
|
||||
return;
|
||||
}
|
||||
|
||||
const { active, label, interventions } = config;
|
||||
|
||||
if (!active) {
|
||||
|
@ -330,12 +362,9 @@ class Interventions {
|
|||
console.info(`Blocking requests as specified for ${label}`);
|
||||
}
|
||||
|
||||
async _enableContentScripts(label, intervention, matches) {
|
||||
if (!("content_scripts" in intervention)) {
|
||||
return;
|
||||
}
|
||||
|
||||
async _enableContentScripts(bug, label, intervention, matches) {
|
||||
const scriptsToReg = this._buildContentScriptRegistrations(
|
||||
bug,
|
||||
label,
|
||||
intervention,
|
||||
matches
|
||||
|
@ -390,18 +419,14 @@ class Interventions {
|
|||
}
|
||||
}
|
||||
|
||||
_buildContentScriptRegistrations(label, intervention, matches) {
|
||||
_buildContentScriptRegistrations(bug, label, intervention, matches) {
|
||||
const registration = {
|
||||
id: `webcompat intervention for ${label}`,
|
||||
matches,
|
||||
persistAcrossSessions: false,
|
||||
};
|
||||
|
||||
let { all_frames, css, js, run_at } = intervention.content_scripts;
|
||||
if (!css && !js) {
|
||||
console.error(`Missing js or css for content_script in ${label}`);
|
||||
return [];
|
||||
}
|
||||
let { all_frames, css, js, run_at } = intervention.content_scripts ?? {};
|
||||
if (all_frames) {
|
||||
registration.allFrames = true;
|
||||
}
|
||||
|
@ -420,6 +445,17 @@ class Interventions {
|
|||
}
|
||||
return `injections/js/${item}`;
|
||||
});
|
||||
} else {
|
||||
// Ensure that we log a console message.
|
||||
const info = [bug];
|
||||
if (css) {
|
||||
info.push("css");
|
||||
}
|
||||
if (intervention.ua_string) {
|
||||
info.push("ua");
|
||||
}
|
||||
registration.js = [`injections/js/log_message.js#${info.join(":")}`];
|
||||
registration.runAt = "document_idle";
|
||||
}
|
||||
if (run_at) {
|
||||
registration.runAt = run_at;
|
||||
|
|
|
@ -124,7 +124,7 @@ class Shim {
|
|||
browser.aboutConfigPrefs.onPrefChange.addListener(async () => {
|
||||
const value = await browser.aboutConfigPrefs.getPref(pref);
|
||||
this._disabledPrefValue = value;
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}, pref);
|
||||
|
||||
this.ready = Promise.all([
|
||||
|
@ -233,14 +233,14 @@ class Shim {
|
|||
|
||||
set disabledBySmartblockEmbedPref(value) {
|
||||
this._disabledBySmartblockEmbedPref = value;
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}
|
||||
|
||||
onAllShimsEnabled() {
|
||||
const wasEnabled = this.enabled;
|
||||
this._disabledGlobally = false;
|
||||
if (!wasEnabled) {
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -248,7 +248,7 @@ class Shim {
|
|||
const wasEnabled = this.enabled;
|
||||
this._disabledGlobally = true;
|
||||
if (wasEnabled) {
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -256,7 +256,7 @@ class Shim {
|
|||
const wasEnabled = this.enabled;
|
||||
this._disabledForSession = false;
|
||||
if (!wasEnabled) {
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -264,19 +264,19 @@ class Shim {
|
|||
const wasEnabled = this.enabled;
|
||||
this._disabledForSession = true;
|
||||
if (wasEnabled) {
|
||||
this._onEnabledStateChanged();
|
||||
this._onEnabledStateChanged({ alsoClearResourceCache: true });
|
||||
}
|
||||
}
|
||||
|
||||
async _onEnabledStateChanged() {
|
||||
async _onEnabledStateChanged({ alsoClearResourceCache = false } = {}) {
|
||||
this.manager?.onShimStateChanged(this.id);
|
||||
if (!this.enabled) {
|
||||
await this._unregisterContentScripts();
|
||||
await this._revokeRequestsInETP();
|
||||
await this._revokeRequestsInETP(alsoClearResourceCache);
|
||||
return browser.testUtils.shimsInactive();
|
||||
}
|
||||
await this._registerContentScripts();
|
||||
await this._allowRequestsInETP();
|
||||
await this._allowRequestsInETP(alsoClearResourceCache);
|
||||
return browser.testUtils.shimsActive();
|
||||
}
|
||||
|
||||
|
@ -350,11 +350,13 @@ class Shim {
|
|||
this._contentScriptRegistrations = [];
|
||||
}
|
||||
|
||||
async _allowRequestsInETP() {
|
||||
async _allowRequestsInETP(alsoClearResourceCache) {
|
||||
let modified = false;
|
||||
const matches = this.matches.map(m => m.patterns).flat();
|
||||
if (matches.length) {
|
||||
// ensure requests shimmed in both PB and non-PB modes
|
||||
await browser.trackingProtection.shim(this.id, matches);
|
||||
modified = true;
|
||||
}
|
||||
|
||||
if (this._hostOptIns.size) {
|
||||
|
@ -366,6 +368,7 @@ class Shim {
|
|||
false,
|
||||
Array.from(this._hostOptIns)
|
||||
);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -378,12 +381,20 @@ class Shim {
|
|||
true,
|
||||
Array.from(this._pBModeHostOptIns)
|
||||
);
|
||||
modified = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (this._haveCheckedEnabledPrefs && alsoClearResourceCache && modified) {
|
||||
this.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
_revokeRequestsInETP() {
|
||||
return browser.trackingProtection.revoke(this.id);
|
||||
async _revokeRequestsInETP(alsoClearResourceCache) {
|
||||
await browser.trackingProtection.revoke(this.id);
|
||||
if (this._haveCheckedEnabledPrefs && alsoClearResourceCache) {
|
||||
this.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
setActiveOnTab(tabId, active = true) {
|
||||
|
@ -486,6 +497,7 @@ class Shim {
|
|||
isPrivateMode,
|
||||
Array.from(activeHostOptIns)
|
||||
);
|
||||
this.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -525,6 +537,7 @@ class Shim {
|
|||
isPrivateMode,
|
||||
Array.from(activeHostOptIns)
|
||||
);
|
||||
this.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -541,8 +554,13 @@ class Shim {
|
|||
forPrivateMode,
|
||||
Array.from(activeHostOptIns)
|
||||
);
|
||||
this.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
clearResourceCache() {
|
||||
return browser.trackingProtection.clearResourceCache();
|
||||
}
|
||||
}
|
||||
|
||||
class Shims {
|
||||
|
@ -568,10 +586,20 @@ class Shims {
|
|||
this._checkSmartblockEmbedsEnabledPref();
|
||||
}, this.SMARTBLOCK_EMBEDS_ENABLED_PREF);
|
||||
|
||||
this._haveCheckedEnabledPrefs = Promise.all([
|
||||
// NOTE: Methods that uses the prefs should await
|
||||
// _haveCheckedEnabledPrefsPromise, in order to make sure the
|
||||
// prefs are all read.
|
||||
// Methods that potentially clears the resource cache should check
|
||||
// _haveCheckedEnabledPrefs, in order to avoid clearing the
|
||||
// resource cache during the startup.
|
||||
this._haveCheckedEnabledPrefs = false;
|
||||
this._haveCheckedEnabledPrefsPromise = Promise.all([
|
||||
this._checkEnabledPref(),
|
||||
this._checkSmartblockEmbedsEnabledPref(),
|
||||
]);
|
||||
this._haveCheckedEnabledPrefsPromise.then(() => {
|
||||
this._haveCheckedEnabledPrefs = true;
|
||||
});
|
||||
|
||||
// handles unblock message coming in from protections panel
|
||||
browser.trackingProtection.onSmartBlockEmbedUnblock.addListener(
|
||||
|
@ -1011,7 +1039,7 @@ class Shims {
|
|||
}
|
||||
|
||||
async _redirectLogos(details) {
|
||||
await this._haveCheckedEnabledPrefs;
|
||||
await this._haveCheckedEnabledPrefsPromise;
|
||||
|
||||
if (!this.enabled) {
|
||||
return { cancel: true };
|
||||
|
@ -1047,7 +1075,7 @@ class Shims {
|
|||
}
|
||||
|
||||
async _onHeadersReceived(details) {
|
||||
await this._haveCheckedEnabledPrefs;
|
||||
await this._haveCheckedEnabledPrefsPromise;
|
||||
|
||||
for (const shim of this.shims.values()) {
|
||||
await shim.ready;
|
||||
|
@ -1081,7 +1109,7 @@ class Shims {
|
|||
}
|
||||
|
||||
async _onBeforeSendHeaders(details) {
|
||||
await this._haveCheckedEnabledPrefs;
|
||||
await this._haveCheckedEnabledPrefsPromise;
|
||||
|
||||
const { frameId, requestHeaders, tabId } = details;
|
||||
|
||||
|
@ -1138,7 +1166,7 @@ class Shims {
|
|||
|
||||
// eslint-disable-next-line complexity
|
||||
async _ensureShimForRequestOnTab(details) {
|
||||
await this._haveCheckedEnabledPrefs;
|
||||
await this._haveCheckedEnabledPrefsPromise;
|
||||
|
||||
if (!this.enabled) {
|
||||
return undefined;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
"manifest_version": 2,
|
||||
"name": "Web Compatibility Interventions",
|
||||
"description": "Urgent post-release fixes for web compatibility.",
|
||||
"version": "139.0.0",
|
||||
"version": "139.1.0",
|
||||
"browser_specific_settings": {
|
||||
"gecko": {
|
||||
"id": "webcompat@mozilla.org",
|
||||
|
|
|
@ -14,6 +14,8 @@ support-files = [
|
|||
|
||||
["browser_aboutcompat.js"]
|
||||
|
||||
["browser_console_messages.js"]
|
||||
|
||||
["browser_interventions.js"]
|
||||
|
||||
["browser_shims.js"]
|
||||
|
|
|
@ -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);
|
||||
});
|
10
browser/locales-preview/taskbartabs.ftl
Normal file
10
browser/locales-preview/taskbartabs.ftl
Normal 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
|
|
@ -3,7 +3,7 @@
|
|||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
## Error messages for failed HTTP web requests.
|
||||
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses
|
||||
## https://developer.mozilla.org/en-US/docs/Web/HTTP/Reference/Status#client_error_responses
|
||||
## Variables:
|
||||
## $status (Number) - HTTP status code, for example 403
|
||||
|
||||
|
|
|
@ -467,10 +467,6 @@ applications-type-description-with-type = { $type-description } ({ $type })
|
|||
# $type (string) - The MIME type (e.g application/binary)
|
||||
applications-file-ending-with-type = { applications-file-ending } ({ $type })
|
||||
|
||||
# Variables:
|
||||
# $plugin-name (string) - Name of a plugin (e.g Adobe Flash)
|
||||
applications-use-plugin-in =
|
||||
.label = Use { $plugin-name } (in { -brand-short-name })
|
||||
applications-open-inapp =
|
||||
.label = Open in { -brand-short-name }
|
||||
|
||||
|
@ -478,9 +474,6 @@ applications-open-inapp =
|
|||
## selected label element based on the string from
|
||||
## the selected menu item.
|
||||
|
||||
applications-use-plugin-in-label =
|
||||
.value = { applications-use-plugin-in.label }
|
||||
|
||||
applications-action-save-label =
|
||||
.value = { applications-action-save.label }
|
||||
|
||||
|
|
|
@ -11,8 +11,15 @@ set-desktop-background-accept =
|
|||
open-desktop-prefs =
|
||||
.label = Open Desktop Preferences
|
||||
|
||||
set-desktop-background-downloading =
|
||||
.label = Saving Picture…
|
||||
|
||||
set-background-preview-unavailable = Preview unavailable
|
||||
|
||||
# Name of the file that will be used as the desktop background. The
|
||||
# extension ".bmp" is added by the system.
|
||||
set-desktop-background-filename = Desktop Background
|
||||
|
||||
# This refers to the wallpaper "spanning" multiple monitors when the
|
||||
# user has more than one. Only some of the entire image will be on
|
||||
# each monitor. This should ideally match the wording in Windows' own
|
||||
|
|
|
@ -13,9 +13,6 @@ sidebar-menu-history =
|
|||
sidebar-menu-synced-tabs =
|
||||
.label = Synced Tabs
|
||||
|
||||
sidebar-menu-megalist =
|
||||
.label = Passwords
|
||||
|
||||
sidebar-menu-close =
|
||||
.label = Close Sidebar
|
||||
|
||||
|
|
|
@ -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
|
|
@ -41,7 +41,6 @@ SUMMARY_REBOOT_REQUIRED_INSTALL=A restart of your computer may be required to co
|
|||
SUMMARY_REBOOT_REQUIRED_UNINSTALL=A restart of your computer may be required to complete the uninstall.
|
||||
SUMMARY_INSTALL_CLICK=Click Install to continue.
|
||||
SUMMARY_UPGRADE_CLICK=Click Upgrade to continue.
|
||||
SURVEY_TEXT=&Tell us what you thought of $BrandShortName
|
||||
LAUNCH_TEXT=&Launch $BrandShortName now
|
||||
CREATE_ICONS_DESC=Create icons for $BrandShortName:
|
||||
ICONS_DESKTOP=On my &desktop
|
||||
|
@ -61,9 +60,7 @@ ERROR_CREATE_DIRECTORY_PREFIX=Error creating directory:
|
|||
ERROR_CREATE_DIRECTORY_SUFFIX=Click Cancel to stop the installation or\nRetry to try again.
|
||||
|
||||
UN_CONFIRM_PAGE_TITLE=Uninstall $BrandFullName
|
||||
UN_CONFIRM_PAGE_SUBTITLE=Remove $BrandFullName from your computer.
|
||||
UN_CONFIRM_UNINSTALLED_FROM=$BrandShortName will be uninstalled from the following location:
|
||||
UN_CONFIRM_CLICK=Click Uninstall to continue.
|
||||
|
||||
UN_REFRESH_PAGE_TITLE=Refresh $BrandShortName Instead?
|
||||
UN_REFRESH_PAGE_EXPLANATION=If you’re having problems with $BrandShortName, a refresh can help.\n\nThis will restore the default settings and remove add-ons. Start fresh for optimal performance.
|
||||
|
@ -73,7 +70,6 @@ UN_REFRESH_BUTTON=&Refresh $BrandShortName
|
|||
BANNER_CHECK_EXISTING=Checking existing installation…
|
||||
|
||||
STATUS_INSTALL_APP=Installing $BrandShortName…
|
||||
STATUS_INSTALL_LANG=Installing Language Files (${AB_CD})…
|
||||
STATUS_UNINSTALL_MAIN=Uninstalling $BrandShortName…
|
||||
STATUS_CLEANUP=A Little Housekeeping…
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@
|
|||
preview/smartTabGroups.ftl (../locales-preview/smartTabGroups.ftl)
|
||||
preview/tabUnload.ftl (../locales-preview/tabUnload.ftl)
|
||||
preview/reportContentTemporary.ftl (../locales-preview/reportContentTemporary.ftl)
|
||||
preview/taskbartabs.ftl (../locales-preview/taskbartabs.ftl)
|
||||
|
||||
@AB_CD@.jar:
|
||||
% locale browser @AB_CD@ %locale/browser/
|
||||
|
@ -29,7 +30,6 @@
|
|||
locale/browser/search.properties (%chrome/browser/search.properties)
|
||||
locale/browser/siteData.properties (%chrome/browser/siteData.properties)
|
||||
locale/browser/sitePermissions.properties (%chrome/browser/sitePermissions.properties)
|
||||
locale/browser/shellservice.properties (%chrome/browser/shellservice.properties)
|
||||
locale/browser/taskbar.properties (%chrome/browser/taskbar.properties)
|
||||
locale/browser/downloads/downloads.properties (%chrome/browser/downloads/downloads.properties)
|
||||
locale/browser/places/bookmarkProperties.properties (%chrome/browser/places/bookmarkProperties.properties)
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"af": {
|
||||
"pin": false,
|
||||
|
@ -37,7 +37,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"an": {
|
||||
"pin": false,
|
||||
|
@ -57,7 +57,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ar": {
|
||||
"pin": false,
|
||||
|
@ -77,7 +77,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ast": {
|
||||
"pin": false,
|
||||
|
@ -97,7 +97,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"az": {
|
||||
"pin": false,
|
||||
|
@ -117,7 +117,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"be": {
|
||||
"pin": false,
|
||||
|
@ -137,7 +137,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"bg": {
|
||||
"pin": false,
|
||||
|
@ -157,7 +157,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"bn": {
|
||||
"pin": false,
|
||||
|
@ -177,7 +177,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"bo": {
|
||||
"pin": false,
|
||||
|
@ -197,7 +197,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"br": {
|
||||
"pin": false,
|
||||
|
@ -217,7 +217,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"brx": {
|
||||
"pin": false,
|
||||
|
@ -237,7 +237,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"bs": {
|
||||
"pin": false,
|
||||
|
@ -257,7 +257,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ca": {
|
||||
"pin": false,
|
||||
|
@ -277,7 +277,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ca-valencia": {
|
||||
"pin": false,
|
||||
|
@ -297,7 +297,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"cak": {
|
||||
"pin": false,
|
||||
|
@ -317,7 +317,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ckb": {
|
||||
"pin": false,
|
||||
|
@ -337,7 +337,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"cs": {
|
||||
"pin": false,
|
||||
|
@ -357,7 +357,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"cy": {
|
||||
"pin": false,
|
||||
|
@ -377,7 +377,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"da": {
|
||||
"pin": false,
|
||||
|
@ -397,7 +397,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"de": {
|
||||
"pin": false,
|
||||
|
@ -417,7 +417,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"dsb": {
|
||||
"pin": false,
|
||||
|
@ -437,7 +437,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"el": {
|
||||
"pin": false,
|
||||
|
@ -457,7 +457,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"en-CA": {
|
||||
"pin": false,
|
||||
|
@ -477,7 +477,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"en-GB": {
|
||||
"pin": false,
|
||||
|
@ -497,7 +497,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"eo": {
|
||||
"pin": false,
|
||||
|
@ -517,7 +517,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"es-AR": {
|
||||
"pin": false,
|
||||
|
@ -537,7 +537,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"es-CL": {
|
||||
"pin": false,
|
||||
|
@ -557,7 +557,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"es-ES": {
|
||||
"pin": false,
|
||||
|
@ -577,7 +577,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"es-MX": {
|
||||
"pin": false,
|
||||
|
@ -597,7 +597,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"et": {
|
||||
"pin": false,
|
||||
|
@ -617,7 +617,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"eu": {
|
||||
"pin": false,
|
||||
|
@ -637,7 +637,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"fa": {
|
||||
"pin": false,
|
||||
|
@ -657,7 +657,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ff": {
|
||||
"pin": false,
|
||||
|
@ -677,7 +677,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"fi": {
|
||||
"pin": false,
|
||||
|
@ -697,7 +697,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"fr": {
|
||||
"pin": false,
|
||||
|
@ -717,7 +717,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"fur": {
|
||||
"pin": false,
|
||||
|
@ -737,7 +737,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"fy-NL": {
|
||||
"pin": false,
|
||||
|
@ -757,7 +757,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ga-IE": {
|
||||
"pin": false,
|
||||
|
@ -777,7 +777,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"gd": {
|
||||
"pin": false,
|
||||
|
@ -797,7 +797,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"gl": {
|
||||
"pin": false,
|
||||
|
@ -817,7 +817,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"gn": {
|
||||
"pin": false,
|
||||
|
@ -837,7 +837,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"gu-IN": {
|
||||
"pin": false,
|
||||
|
@ -857,7 +857,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"he": {
|
||||
"pin": false,
|
||||
|
@ -877,7 +877,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hi-IN": {
|
||||
"pin": false,
|
||||
|
@ -897,7 +897,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hr": {
|
||||
"pin": false,
|
||||
|
@ -917,7 +917,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hsb": {
|
||||
"pin": false,
|
||||
|
@ -937,7 +937,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hu": {
|
||||
"pin": false,
|
||||
|
@ -957,7 +957,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hy-AM": {
|
||||
"pin": false,
|
||||
|
@ -977,7 +977,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"hye": {
|
||||
"pin": false,
|
||||
|
@ -997,7 +997,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ia": {
|
||||
"pin": false,
|
||||
|
@ -1017,7 +1017,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"id": {
|
||||
"pin": false,
|
||||
|
@ -1037,7 +1037,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"is": {
|
||||
"pin": false,
|
||||
|
@ -1057,7 +1057,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"it": {
|
||||
"pin": false,
|
||||
|
@ -1077,7 +1077,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ja": {
|
||||
"pin": false,
|
||||
|
@ -1095,7 +1095,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ja-JP-mac": {
|
||||
"pin": false,
|
||||
|
@ -1103,7 +1103,7 @@
|
|||
"macosx64",
|
||||
"macosx64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ka": {
|
||||
"pin": false,
|
||||
|
@ -1123,7 +1123,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"kab": {
|
||||
"pin": false,
|
||||
|
@ -1143,7 +1143,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"kk": {
|
||||
"pin": false,
|
||||
|
@ -1163,7 +1163,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"km": {
|
||||
"pin": false,
|
||||
|
@ -1183,7 +1183,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"kn": {
|
||||
"pin": false,
|
||||
|
@ -1203,7 +1203,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ko": {
|
||||
"pin": false,
|
||||
|
@ -1223,7 +1223,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"lij": {
|
||||
"pin": false,
|
||||
|
@ -1243,7 +1243,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"lo": {
|
||||
"pin": false,
|
||||
|
@ -1263,7 +1263,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"lt": {
|
||||
"pin": false,
|
||||
|
@ -1283,7 +1283,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ltg": {
|
||||
"pin": false,
|
||||
|
@ -1303,7 +1303,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"lv": {
|
||||
"pin": false,
|
||||
|
@ -1323,7 +1323,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"meh": {
|
||||
"pin": false,
|
||||
|
@ -1343,7 +1343,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"mk": {
|
||||
"pin": false,
|
||||
|
@ -1363,7 +1363,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ml": {
|
||||
"pin": false,
|
||||
|
@ -1383,7 +1383,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"mr": {
|
||||
"pin": false,
|
||||
|
@ -1403,7 +1403,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ms": {
|
||||
"pin": false,
|
||||
|
@ -1423,7 +1423,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"my": {
|
||||
"pin": false,
|
||||
|
@ -1443,7 +1443,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"nb-NO": {
|
||||
"pin": false,
|
||||
|
@ -1463,7 +1463,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ne-NP": {
|
||||
"pin": false,
|
||||
|
@ -1483,7 +1483,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"nl": {
|
||||
"pin": false,
|
||||
|
@ -1503,7 +1503,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"nn-NO": {
|
||||
"pin": false,
|
||||
|
@ -1523,7 +1523,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"oc": {
|
||||
"pin": false,
|
||||
|
@ -1543,7 +1543,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"pa-IN": {
|
||||
"pin": false,
|
||||
|
@ -1563,7 +1563,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"pl": {
|
||||
"pin": false,
|
||||
|
@ -1583,7 +1583,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"pt-BR": {
|
||||
"pin": false,
|
||||
|
@ -1603,7 +1603,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"pt-PT": {
|
||||
"pin": false,
|
||||
|
@ -1623,7 +1623,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"rm": {
|
||||
"pin": false,
|
||||
|
@ -1643,7 +1643,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ro": {
|
||||
"pin": false,
|
||||
|
@ -1663,7 +1663,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ru": {
|
||||
"pin": false,
|
||||
|
@ -1683,7 +1683,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sat": {
|
||||
"pin": false,
|
||||
|
@ -1703,7 +1703,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sc": {
|
||||
"pin": false,
|
||||
|
@ -1723,7 +1723,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"scn": {
|
||||
"pin": false,
|
||||
|
@ -1743,7 +1743,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sco": {
|
||||
"pin": false,
|
||||
|
@ -1763,7 +1763,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"si": {
|
||||
"pin": false,
|
||||
|
@ -1783,7 +1783,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sk": {
|
||||
"pin": false,
|
||||
|
@ -1803,7 +1803,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"skr": {
|
||||
"pin": false,
|
||||
|
@ -1823,7 +1823,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sl": {
|
||||
"pin": false,
|
||||
|
@ -1843,7 +1843,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"son": {
|
||||
"pin": false,
|
||||
|
@ -1863,7 +1863,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sq": {
|
||||
"pin": false,
|
||||
|
@ -1883,7 +1883,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sr": {
|
||||
"pin": false,
|
||||
|
@ -1903,7 +1903,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"sv-SE": {
|
||||
"pin": false,
|
||||
|
@ -1923,7 +1923,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"szl": {
|
||||
"pin": false,
|
||||
|
@ -1943,7 +1943,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ta": {
|
||||
"pin": false,
|
||||
|
@ -1963,7 +1963,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"te": {
|
||||
"pin": false,
|
||||
|
@ -1983,7 +1983,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"tg": {
|
||||
"pin": false,
|
||||
|
@ -2003,7 +2003,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"th": {
|
||||
"pin": false,
|
||||
|
@ -2023,7 +2023,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"tl": {
|
||||
"pin": false,
|
||||
|
@ -2043,7 +2043,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"tr": {
|
||||
"pin": false,
|
||||
|
@ -2063,7 +2063,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"trs": {
|
||||
"pin": false,
|
||||
|
@ -2083,7 +2083,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"uk": {
|
||||
"pin": false,
|
||||
|
@ -2103,7 +2103,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"ur": {
|
||||
"pin": false,
|
||||
|
@ -2123,7 +2123,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"uz": {
|
||||
"pin": false,
|
||||
|
@ -2143,7 +2143,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"vi": {
|
||||
"pin": false,
|
||||
|
@ -2163,7 +2163,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"wo": {
|
||||
"pin": false,
|
||||
|
@ -2183,7 +2183,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"xh": {
|
||||
"pin": false,
|
||||
|
@ -2203,7 +2203,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"zh-CN": {
|
||||
"pin": false,
|
||||
|
@ -2223,7 +2223,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
},
|
||||
"zh-TW": {
|
||||
"pin": false,
|
||||
|
@ -2243,6 +2243,6 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "1f3a680b0d835e8a29dc7548b2e5717069f65ecd"
|
||||
"revision": "9bce5ffa5a6c0a3f75201081aaedff002eeb44ad"
|
||||
}
|
||||
}
|
|
@ -16,7 +16,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
},
|
||||
"en-CA": {
|
||||
"platforms": [
|
||||
|
@ -35,7 +35,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
},
|
||||
"he": {
|
||||
"platforms": [
|
||||
|
@ -54,7 +54,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
},
|
||||
"it": {
|
||||
"platforms": [
|
||||
|
@ -73,7 +73,7 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
},
|
||||
"ja": {
|
||||
"platforms": [
|
||||
|
@ -90,13 +90,13 @@
|
|||
"win64-aarch64-devedition",
|
||||
"win64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
},
|
||||
"ja-JP-mac": {
|
||||
"platforms": [
|
||||
"macosx64",
|
||||
"macosx64-devedition"
|
||||
],
|
||||
"revision": "ff6c9d55d4c1d558576bb6ca615179d8f9969f21"
|
||||
"revision": "main"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -16,7 +16,9 @@ ChromeUtils.defineESModuleGetters(lazy, {
|
|||
|
||||
const ABOUT_URL = "about:newtab";
|
||||
const PREF_ACTIVITY_STREAM_DEBUG = "browser.newtabpage.activity-stream.debug";
|
||||
const TOPIC_APP_QUIT = "quit-application-granted";
|
||||
// AboutHomeStartupCache needs us in "quit-application", so stay alive longer.
|
||||
// TODO: We could better have a shared async shutdown blocker?
|
||||
const TOPIC_APP_QUIT = "profile-before-change";
|
||||
const BROWSER_READY_NOTIFICATION = "sessionstore-windows-restored";
|
||||
const BUILTIN_ADDON_ID = "newtab@mozilla.org";
|
||||
|
||||
|
@ -256,10 +258,7 @@ export const AboutNewTab = {
|
|||
observe(subject, topic) {
|
||||
switch (topic) {
|
||||
case TOPIC_APP_QUIT: {
|
||||
// We defer to this to the next tick of the event loop since the
|
||||
// AboutHomeStartupCache might want to read from the ActivityStream
|
||||
// store during TOPIC_APP_QUIT.
|
||||
Services.tm.dispatchToMainThread(() => this.uninit());
|
||||
this.uninit();
|
||||
break;
|
||||
}
|
||||
case BROWSER_READY_NOTIFICATION: {
|
||||
|
|
|
@ -249,12 +249,18 @@ export var ExtensionsUI = {
|
|||
});
|
||||
}
|
||||
|
||||
// We don't want to show the incognito checkbox in the update prompt or
|
||||
// optional prompt (which shouldn't be possible in this case), but it's
|
||||
// fine for installs (including sideload).
|
||||
const shouldShowIncognitoCheckbox =
|
||||
!info.type || info.type === "sideload";
|
||||
|
||||
this.showPermissionsPrompt(
|
||||
browser,
|
||||
strings,
|
||||
icon,
|
||||
info.addon,
|
||||
true /* shouldShowIncognitoCheckbox */
|
||||
shouldShowIncognitoCheckbox
|
||||
).then(answer => {
|
||||
if (answer) {
|
||||
info.resolve();
|
||||
|
|
|
@ -9,12 +9,6 @@ const gContentPrefs = Cc["@mozilla.org/content-pref/service;1"].getService(
|
|||
);
|
||||
const gZoomPropertyName = "browser.content.full-zoom";
|
||||
|
||||
const lazy = {};
|
||||
|
||||
ChromeUtils.defineESModuleGetters(lazy, {
|
||||
PanelMultiView: "resource:///modules/PanelMultiView.sys.mjs",
|
||||
});
|
||||
|
||||
export var ZoomUI = {
|
||||
init(aWindow) {
|
||||
aWindow.addEventListener("EndSwapDocShells", onEndSwapDocShells, true);
|
||||
|
@ -119,22 +113,19 @@ function onZoomChange(event) {
|
|||
* @param {boolean} aAnimate Should be True for all cases unless the zoom
|
||||
* change is related to tab switching. Optional
|
||||
*/
|
||||
async function updateZoomUI(aBrowser, aAnimate = false) {
|
||||
export async function updateZoomUI(aBrowser, aAnimate = false) {
|
||||
let win = aBrowser.ownerGlobal;
|
||||
if (!win.gBrowser || win.gBrowser.selectedBrowser != aBrowser) {
|
||||
if (
|
||||
!win.gBrowser ||
|
||||
win.gBrowser.selectedBrowser != aBrowser ||
|
||||
aBrowser.browsingContext.topChromeWindow != win
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
let appMenuZoomReset = lazy.PanelMultiView.getViewNode(
|
||||
win.document,
|
||||
let appMenuZoomReset = win.document.getElementById(
|
||||
"appMenu-zoomReset-button2"
|
||||
);
|
||||
|
||||
// Exit early if UI elements aren't present.
|
||||
if (!appMenuZoomReset) {
|
||||
return;
|
||||
}
|
||||
|
||||
let customizableZoomControls = win.document.getElementById("zoom-controls");
|
||||
let customizableZoomReset = win.document.getElementById("zoom-reset-button");
|
||||
let urlbarZoomButton = win.document.getElementById("urlbar-zoom-button");
|
||||
|
|
|
@ -22,26 +22,17 @@ html|*.addon-webext-perm-list {
|
|||
list-style: none;
|
||||
|
||||
&.webext-perm-granted {
|
||||
list-style-position: inside;
|
||||
list-style-type: disc;
|
||||
/* NOTE: Insert line breaks on long permission strings (or domain name included
|
||||
* in the localized string that ends up be overflowing */
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
/* style the permissions list items that are not editable to use the check.svg image */
|
||||
&.webext-perm-granted::before {
|
||||
content: "";
|
||||
background-image: url("chrome://global/skin/icons/check.svg");
|
||||
background-repeat: no-repeat;
|
||||
-moz-context-properties: fill;
|
||||
fill: currentColor;
|
||||
/* style the permissions list items to match sizes and margins used by the
|
||||
* checkbox xul element to make sure they are properly aligned with the
|
||||
* private browsing checkbox at the end of the list. */
|
||||
display: inline-flex;
|
||||
width: var(--checkbox-size);
|
||||
height: var(--checkbox-size);
|
||||
margin-inline-end: var(--checkbox-margin-inline);
|
||||
vertical-align: text-bottom;
|
||||
/* Add some space between the list of permissions and the private browsing
|
||||
* checkbox. */
|
||||
& + &.webext-perm-privatebrowsing {
|
||||
margin-top: var(--space-medium);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,15 +65,7 @@ html|ul.webext-perm-domains-list {
|
|||
}
|
||||
}
|
||||
|
||||
.addon-webext-perm-single-entry {
|
||||
margin-top: 11px;
|
||||
/* NOTE: Insert line breaks on long permission strings (or domain name included
|
||||
* in the localized string that ends up be overflowing */
|
||||
overflow-wrap: break-word;
|
||||
}
|
||||
|
||||
.addon-webext-perm-text,
|
||||
.addon-webext-perm-single-entry {
|
||||
.addon-webext-perm-text {
|
||||
margin-inline-start: 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -49,7 +49,9 @@
|
|||
}
|
||||
|
||||
&[lwtheme] {
|
||||
--link-color: light-dark(rgb(0, 97, 224), rgb(0, 221, 255));
|
||||
--link-color: light-dark(var(--color-blue-50), var(--color-cyan-50));
|
||||
--link-color-hover: light-dark(var(--color-blue-60), var(--color-cyan-30));
|
||||
--link-color-active: light-dark(var(--color-blue-70), var(--color-cyan-20));
|
||||
--tabs-navbar-separator-color: light-dark(rgba(0,0,0,.1), rgba(0,0,0,.3));
|
||||
--attention-dot-color: light-dark(#2ac3a2, #54ffbd);
|
||||
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
flex: 1;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
|
||||
> .menu-iconic-text,
|
||||
> .menu-accel-container {
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue