Update On Mon Apr 7 20:24:16 CEST 2025

This commit is contained in:
github-action[bot] 2025-04-07 20:24:16 +02:00
parent ff87719c89
commit 7f6c3906d7
701 changed files with 9196 additions and 2404 deletions

View file

@ -1,33 +0,0 @@
1; /* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
/* 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/. */
import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
const lazy = {};
ChromeUtils.defineESModuleGetters(lazy, {
RFPHelper: "resource://gre/modules/RFPHelper.sys.mjs",
});
const kPrefLetterboxing = "privacy.resistFingerprinting.letterboxing";
XPCOMUtils.defineLazyPreferenceGetter(
lazy,
"isLetterboxingEnabled",
kPrefLetterboxing,
false
);
export class RFPHelperParent extends JSWindowActorParent {
receiveMessage(aMessage) {
if (
lazy.isLetterboxingEnabled &&
aMessage.name == "Letterboxing:ContentSizeUpdated"
) {
let browser = this.browsingContext.top.embedderElement;
let window = browser.ownerGlobal;
lazy.RFPHelper.contentSizeUpdated(window);
}
}
}

View file

@ -1945,7 +1945,7 @@ pref("browser.newtabpage.activity-stream.discoverystream.spocMessageVariant", ""
pref("browser.newtabpage.activity-stream.discoverystream.sendToPocket.enabled", true);
// Pref enabling content reporting
pref("browser.newtabpage.activity-stream.discoverystream.reportContent.enabled", false);
pref("browser.newtabpage.activity-stream.discoverystream.reportAds.enabled", false);
// List of regions that do not get stories, regardless of locale-list-config.
pref("browser.newtabpage.activity-stream.discoverystream.region-stories-block", "");

View file

@ -297,7 +297,7 @@ add_task(async function test_forceEnrollUpdatesMessages() {
await assertMessageInState("xman_test_message");
await ExperimentManager.unenroll(`optin-${experiment.slug}`, "cleanup");
await ExperimentManager.unenroll(`optin-${experiment.slug}`);
await SpecialPowers.popPrefEnv();
await cleanup();
});

View file

@ -2,12 +2,11 @@
* 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 PREF_TEST_ORIGINS = "browser.uitour.testingOrigins";
const UITOUR_PERMISSION = "uitour";
import { UITourUtils } from "moz-src:///browser/components/uitour/UITourUtils.sys.mjs";
export class UITourChild extends JSWindowActorChild {
handleEvent(event) {
if (!this.ensureTrustedOrigin()) {
if (!UITourUtils.ensureTrustedOrigin(this.manager)) {
return;
}
@ -18,62 +17,6 @@ export class UITourChild extends JSWindowActorChild {
});
}
isTestingOrigin(aURI) {
let testingOrigins = Services.prefs.getStringPref(PREF_TEST_ORIGINS, "");
if (!testingOrigins) {
return false;
}
// Allow any testing origins (comma-seperated).
for (let origin of testingOrigins.split(/\s*,\s*/)) {
try {
let testingURI = Services.io.newURI(origin);
if (aURI.prePath == testingURI.prePath) {
return true;
}
} catch (ex) {
console.error(ex);
}
}
return false;
}
// This function is copied from UITour.sys.mjs.
isSafeScheme(aURI) {
let allowedSchemes = new Set(["https", "about"]);
if (!allowedSchemes.has(aURI.scheme)) {
return false;
}
return true;
}
ensureTrustedOrigin() {
if (this.browsingContext.top != this.browsingContext) {
return false;
}
let uri = this.document.documentURIObject;
if (uri.schemeIs("chrome")) {
return true;
}
if (!this.isSafeScheme(uri)) {
return false;
}
let permission = Services.perms.testPermissionFromPrincipal(
this.document.nodePrincipal,
UITOUR_PERMISSION
);
if (permission == Services.perms.ALLOW_ACTION) {
return true;
}
return this.isTestingOrigin(uri);
}
receiveMessage(aMessage) {
switch (aMessage.name) {
case "UITour:SendPageCallback":
@ -86,7 +29,7 @@ export class UITourChild extends JSWindowActorChild {
}
sendPageEvent(type, detail) {
if (!this.ensureTrustedOrigin()) {
if (!UITourUtils.ensureTrustedOrigin(this.manager)) {
return;
}

View file

@ -3,9 +3,13 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
import { UITour } from "moz-src:///browser/components/uitour/UITour.sys.mjs";
import { UITourUtils } from "moz-src:///browser/components/uitour/UITourUtils.sys.mjs";
export class UITourParent extends JSWindowActorParent {
receiveMessage(message) {
if (!UITourUtils.ensureTrustedOrigin(this.manager)) {
return;
}
switch (message.name) {
case "UITour:onPageEvent":
if (this.manager.rootFrameLoader) {

View file

@ -0,0 +1,84 @@
/* 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 PREF_TEST_ORIGINS = "browser.uitour.testingOrigins";
const UITOUR_PERMISSION = "uitour";
export let UITourUtils = {
/**
* Check if we've got a testing origin.
*
* @param {nsIURI} uri
* The URI to check
* @returns {boolean}
* Whether or not it's a testing origin.
*/
isTestingOrigin(uri) {
let testingOrigins = Services.prefs.getStringPref(PREF_TEST_ORIGINS, "");
if (!testingOrigins) {
return false;
}
// Allow any testing origins (comma-seperated).
for (let origin of testingOrigins.split(/\s*,\s*/)) {
try {
let testingURI = Services.io.newURI(origin);
if (uri.prePath == testingURI.prePath) {
return true;
}
} catch (ex) {
console.error(ex);
}
}
return false;
},
/**
*
* @param {WindowGlobalChild|WindowGlobalParent} windowGlobal
* The parent/child representation of a window global to check if we can
* use UITour.
* @returns {boolean}
* Whether or not we can use UITour here.
*/
ensureTrustedOrigin(windowGlobal) {
// If we're not top-most or no longer current, bail out immediately.
if (windowGlobal.browsingContext.parent || !windowGlobal.isCurrentGlobal) {
return false;
}
let principal, uri;
// We can get either a WindowGlobalParent or WindowGlobalChild, depending on
// what process we're called in, and determining the secure context-ness and
// principal + URI needs different approaches based on this.
if (WindowGlobalParent.isInstance(windowGlobal)) {
if (!windowGlobal.browsingContext.secureBrowserUI?.isSecureContext) {
return false;
}
principal = windowGlobal.documentPrincipal;
uri = windowGlobal.documentURI;
} else {
if (!windowGlobal.contentWindow?.isSecureContext) {
return false;
}
let document = windowGlobal.contentWindow.document;
principal = document?.nodePrincipal;
uri = document?.documentURIObject;
}
if (!principal) {
return false;
}
let permission = Services.perms.testPermissionFromPrincipal(
principal,
UITOUR_PERMISSION
);
if (permission == Services.perms.ALLOW_ACTION) {
return true;
}
return uri && this.isTestingOrigin(uri);
},
};

View file

@ -2,7 +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/.
MOZ_SRC_FILES += ["UITour.sys.mjs", "UITourChild.sys.mjs", "UITourParent.sys.mjs"]
MOZ_SRC_FILES += [
"UITour.sys.mjs",
"UITourChild.sys.mjs",
"UITourParent.sys.mjs",
"UITourUtils.sys.mjs",
]
BROWSER_CHROME_MANIFESTS += [
"test/browser.toml",

View file

@ -16,6 +16,10 @@ add_task(async function test_privatebrowsing_window() {
const ABOUT_ORIGIN_WITH_UITOUR_DEFAULT = "about:newtab";
const HTTPS_ORIGIN_WITH_UITOUR_DEFAULT = "https://www.mozilla.org";
let { UITourUtils } = ChromeUtils.importESModule(
"moz-src:///browser/components/uitour/UITourUtils.sys.mjs"
);
let win = await BrowserTestUtils.openNewBrowserWindow({ private: true });
let browser = win.gBrowser.selectedBrowser;
@ -26,10 +30,21 @@ add_task(async function test_privatebrowsing_window() {
BrowserTestUtils.startLoadingURIString(browser, uri);
await BrowserTestUtils.browserLoaded(browser);
Assert.ok(
UITourUtils.ensureTrustedOrigin(
browser.browsingContext.currentWindowGlobal
),
"Page should be considered trusted for UITour in the parent."
);
await SpecialPowers.spawn(browser, [], async () => {
let actor = content.windowGlobalChild.getActor("UITour");
// eslint-disable-next-line no-shadow
let { UITourUtils } = ChromeUtils.importESModule(
"moz-src:///browser/components/uitour/UITourUtils.sys.mjs"
);
Assert.ok(
actor.ensureTrustedOrigin(),
UITourUtils.ensureTrustedOrigin(actor.manager),
"Page should be considered trusted for UITour."
);
});

View file

@ -158,11 +158,16 @@ The following scalars are recorded for Firefox Suggest. For general information
on scalar telemetry in Firefox, see the
:doc:`/toolkit/components/telemetry/collection/scalars` document.
browser.ui.interaction.preferences_panePrivacy
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
browser.ui.interaction.preferences_paneSearch
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
This keyed scalar is incremented each time the user clicks a Firefox Suggest
checkbox or toggle switch in the preferences UI. Keys are the following:
checkbox or toggle switch in the preferences UI.
Note: These are also recorded in different forms under the
``contextual.services.quicksuggest.*`` telemetry described below.
Keys are the following:
:firefoxSuggestBestMatch:
This key is incremented when the "Top pick" checkbox is clicked. In 120 this
@ -173,10 +178,10 @@ checkbox or toggle switch in the preferences UI. Keys are the following:
:firefoxSuggestDataCollectionToggle:
This key is incremented when the toggle switch for data collection
is clicked.
:firefoxSuggestNonsponsoredToggle:
:firefoxSuggestNonsponsored:
This key is incremented when the toggle switch for non-sponsored suggestions
is clicked.
:firefoxSuggestSponsoredToggle:
:firefoxSuggestSponsored:
This key is incremented when the toggle switch for sponsored suggestions
is clicked.
@ -194,10 +199,18 @@ Changelog
Removed ``firefoxSuggestBestMatch`` and
``firefoxSuggestBestMatchLearnMore``. [Bug 1857391_]
Firefox 123.0
Recording moved from ``browser.ui.interaction.preferences_panePrivacy`` to
``browser.ui.interaction.preferences_paneSearch``. [Bug 1852048_]
``firefoxSuggestNonsponsoredToggle`` was renamed to ``firefoxSuggestNonsponsored``
``firefoxSuggestSponsoredToggle`` was renamed to ``firefoxSuggestSponsored``
``
.. _1735976: https://bugzilla.mozilla.org/show_bug.cgi?id=1735976
.. _1755100: https://bugzilla.mozilla.org/show_bug.cgi?id=1755100
.. _1756917: https://bugzilla.mozilla.org/show_bug.cgi?id=1756917
.. _1857391: https://bugzilla.mozilla.org/show_bug.cgi?id=1857391
.. _1852048: https://bugzilla.mozilla.org/show_bug.cgi?id=1852048
contextual.services.quicksuggest.block_dynamic_wikipedia
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

View file

@ -291,6 +291,10 @@ urlbar.searchmode.*
Used when the user selects a keyword offer result.
- ``oneoff``
Used when the user selects a one-off engine in the Urlbar.
- ``searchbutton``
Used when the user entered search mode via the unified search button.
Added in Firefox 133, but the unified search button was not enabled in
release until 136.
- ``shortcut``
Used when the user enters search mode with a keyboard shortcut or menu bar
item (e.g. ``Accel+K``).
@ -365,6 +369,14 @@ urlbar.searchmode.*
Please note that symbols cannot trigger the ``urlbar.searchmode.keywordoffer``
telemetry, as symbols are only valid for typed. [Bug `1919180`_]
Firefox 133
Added ``urlbar.searchmode.searchbutton``:
- This new probe is for accesses to search mode from the unified search
button. The button was released in Firefox 136 and replaced the previous
one-off buttons (``urlbar.searchmode.oneoff``).
Added Glean equivalents of the probes as labeled counters.
urlbar.picked.*
~~~~~~~~~~~~~~~

View file

@ -253,8 +253,9 @@ export class _DiscoveryStreamBase extends React.PureComponent {
const { config } = this.props.DiscoveryStream;
const topicSelectionEnabled =
this.props.Prefs.values["discoverystream.topicSelection.enabled"];
const reportContentEnabled =
this.props.Prefs.values["discoverystream.reportContent.enabled"];
const reportAdsEnabled =
this.props.Prefs.values["discoverystream.reportAds.enabled"];
const spocsEnabled = this.props.Prefs.values["unifiedAds.spocs.enabled"];
// Allow rendering without extracting special components
if (!config.collapsible) {
@ -319,16 +320,19 @@ export class _DiscoveryStreamBase extends React.PureComponent {
}
}
// Render a DS-style TopSites then the rest if any in a collapsible section
const { DiscoveryStream } = this.props;
return (
<React.Fragment>
{this.props.DiscoveryStream.isPrivacyInfoModalVisible && (
<DSPrivacyModal dispatch={this.props.dispatch} />
)}
{reportContentEnabled && (
{/* Reporting stories/articles will only be available in sections, not the default card grid */}
{((reportAdsEnabled && spocsEnabled) || sectionsEnabled) && (
<ReportContent spocs={DiscoveryStream.spocs} />
)}
{topSites &&
this.renderLayout([
{

View file

@ -49,6 +49,7 @@ export const AdBanner = ({
};
const sectionsEnabled = prefs["discoverystream.sections.enabled"];
const showAdReporting = prefs["discoverystream.reportAds.enabled"];
const { width: imgWidth, height: imgHeight } = getDimensions(spoc.format);
@ -89,7 +90,7 @@ export const AdBanner = ({
spoc={spoc}
position={row}
type={type}
prefs={prefs}
showAdReporting={showAdReporting}
/>
<SafeAnchor
className="ad-banner-link"

View file

@ -17,16 +17,20 @@ import { LinkMenu } from "../../LinkMenu/LinkMenu";
* @param spoc
* @param position
* @param type
* @param showAdReporting
* @returns {Element}
* @constructor
*/
export function AdBannerContextMenu({ dispatch, spoc, position, type, prefs }) {
const PREF_REPORT_CONTENT_ENABLED = "discoverystream.reportContent.enabled";
const showReporting = prefs[PREF_REPORT_CONTENT_ENABLED];
export function AdBannerContextMenu({
dispatch,
spoc,
position,
type,
showAdReporting,
}) {
const ADBANNER_CONTEXT_MENU_OPTIONS = [
"BlockAdUrl",
...(showReporting ? ["ReportAd"] : []),
...(showAdReporting ? ["ReportAd"] : []),
"ManageSponsoredContent",
"OurSponsorsAndYourPrivacy",
];

View file

@ -12,15 +12,15 @@ export class _DSLinkMenu extends React.PureComponent {
render() {
const { index, dispatch } = this.props;
let TOP_STORIES_CONTEXT_MENU_OPTIONS;
const PREF_REPORT_CONTENT_ENABLED = "discoverystream.reportContent.enabled";
const PREF_REPORT_ADS_ENABLED = "discoverystream.reportAds.enabled";
const prefs = this.props.Prefs.values;
const showReporting = prefs[PREF_REPORT_CONTENT_ENABLED];
const showAdsReporting = prefs[PREF_REPORT_ADS_ENABLED];
const isSpoc = this.props.card_type === "spoc";
if (isSpoc) {
TOP_STORIES_CONTEXT_MENU_OPTIONS = [
"BlockUrl",
...(showReporting ? ["ReportAd"] : []),
...(showAdsReporting ? ["ReportAd"] : []),
"ManageSponsoredContent",
"OurSponsorsAndYourPrivacy",
];
@ -31,7 +31,7 @@ export class _DSLinkMenu extends React.PureComponent {
TOP_STORIES_CONTEXT_MENU_OPTIONS = [
"CheckBookmark",
...(showReporting && this.props.section ? ["ReportContent"] : []),
...(this.props.section ? ["ReportContent"] : []),
...saveToPocketOptions,
"Separator",
"OpenInNewWindow",
@ -41,9 +41,6 @@ export class _DSLinkMenu extends React.PureComponent {
];
}
// eslint-disable-next-line no-console
console.log("dslinkmenu prop", this.props);
const type = this.props.type || "DISCOVERY_STREAM";
const title = this.props.title || this.props.source;

View file

@ -515,6 +515,7 @@ export const LinkMenuOptions = {
ManageSponsoredContent: () => ({
id: "newtab-menu-manage-sponsored-content",
action: ac.OnlyToMain({ type: at.SETTINGS_OPEN }),
userEvent: "OPEN_NEWTAB_PREFS",
}),
OurSponsorsAndYourPrivacy: () => ({
id: "newtab-menu-our-sponsors-and-your-privacy",
@ -524,6 +525,7 @@ export const LinkMenuOptions = {
url: "https://support.mozilla.org/kb/pocket-sponsored-stories-new-tabs",
},
}),
userEvent: "CLICK_PRIVACY_INFO",
}),
ReportAd: site => {
return {

View file

@ -2202,6 +2202,7 @@ const LinkMenuOptions = {
ManageSponsoredContent: () => ({
id: "newtab-menu-manage-sponsored-content",
action: actionCreators.OnlyToMain({ type: actionTypes.SETTINGS_OPEN }),
userEvent: "OPEN_NEWTAB_PREFS",
}),
OurSponsorsAndYourPrivacy: () => ({
id: "newtab-menu-our-sponsors-and-your-privacy",
@ -2211,6 +2212,7 @@ const LinkMenuOptions = {
url: "https://support.mozilla.org/kb/pocket-sponsored-stories-new-tabs",
},
}),
userEvent: "CLICK_PRIVACY_INFO",
}),
ReportAd: site => {
return {
@ -2437,19 +2439,16 @@ class _DSLinkMenu extends (external_React_default()).PureComponent {
dispatch
} = this.props;
let TOP_STORIES_CONTEXT_MENU_OPTIONS;
const PREF_REPORT_CONTENT_ENABLED = "discoverystream.reportContent.enabled";
const PREF_REPORT_ADS_ENABLED = "discoverystream.reportAds.enabled";
const prefs = this.props.Prefs.values;
const showReporting = prefs[PREF_REPORT_CONTENT_ENABLED];
const showAdsReporting = prefs[PREF_REPORT_ADS_ENABLED];
const isSpoc = this.props.card_type === "spoc";
if (isSpoc) {
TOP_STORIES_CONTEXT_MENU_OPTIONS = ["BlockUrl", ...(showReporting ? ["ReportAd"] : []), "ManageSponsoredContent", "OurSponsorsAndYourPrivacy"];
TOP_STORIES_CONTEXT_MENU_OPTIONS = ["BlockUrl", ...(showAdsReporting ? ["ReportAd"] : []), "ManageSponsoredContent", "OurSponsorsAndYourPrivacy"];
} else {
const saveToPocketOptions = this.props.pocket_button_enabled ? ["CheckArchiveFromPocket", "CheckSavedToPocket"] : [];
TOP_STORIES_CONTEXT_MENU_OPTIONS = ["CheckBookmark", ...(showReporting && this.props.section ? ["ReportContent"] : []), ...saveToPocketOptions, "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
TOP_STORIES_CONTEXT_MENU_OPTIONS = ["CheckBookmark", ...(this.props.section ? ["ReportContent"] : []), ...saveToPocketOptions, "Separator", "OpenInNewWindow", "OpenInPrivateWindow", "Separator", "BlockUrl"];
}
// eslint-disable-next-line no-console
console.log("dslinkmenu prop", this.props);
const type = this.props.type || "DISCOVERY_STREAM";
const title = this.props.title || this.props.source;
return /*#__PURE__*/external_React_default().createElement("div", {
@ -4521,6 +4520,7 @@ function ListFeed({
* @param spoc
* @param position
* @param type
* @param showAdReporting
* @returns {Element}
* @constructor
*/
@ -4529,11 +4529,9 @@ function AdBannerContextMenu({
spoc,
position,
type,
prefs
showAdReporting
}) {
const PREF_REPORT_CONTENT_ENABLED = "discoverystream.reportContent.enabled";
const showReporting = prefs[PREF_REPORT_CONTENT_ENABLED];
const ADBANNER_CONTEXT_MENU_OPTIONS = ["BlockAdUrl", ...(showReporting ? ["ReportAd"] : []), "ManageSponsoredContent", "OurSponsorsAndYourPrivacy"];
const ADBANNER_CONTEXT_MENU_OPTIONS = ["BlockAdUrl", ...(showAdReporting ? ["ReportAd"] : []), "ManageSponsoredContent", "OurSponsorsAndYourPrivacy"];
const [showContextMenu, setShowContextMenu] = (0,external_React_namespaceObject.useState)(false);
const onClick = e => {
e.preventDefault();
@ -4633,6 +4631,7 @@ const AdBanner = ({
};
};
const sectionsEnabled = prefs["discoverystream.sections.enabled"];
const showAdReporting = prefs["discoverystream.reportAds.enabled"];
const {
width: imgWidth,
height: imgHeight
@ -4675,7 +4674,7 @@ const AdBanner = ({
spoc: spoc,
position: row,
type: type,
prefs: prefs
showAdReporting: showAdReporting
}), /*#__PURE__*/external_React_default().createElement(SafeAnchor, {
className: "ad-banner-link",
url: spoc.url,
@ -11412,7 +11411,8 @@ class _DiscoveryStreamBase extends (external_React_default()).PureComponent {
config
} = this.props.DiscoveryStream;
const topicSelectionEnabled = this.props.Prefs.values["discoverystream.topicSelection.enabled"];
const reportContentEnabled = this.props.Prefs.values["discoverystream.reportContent.enabled"];
const reportAdsEnabled = this.props.Prefs.values["discoverystream.reportAds.enabled"];
const spocsEnabled = this.props.Prefs.values["unifiedAds.spocs.enabled"];
// Allow rendering without extracting special components
if (!config.collapsible) {
@ -11474,14 +11474,12 @@ class _DiscoveryStreamBase extends (external_React_default()).PureComponent {
sectionTitle = "Editors Picks";
}
}
// Render a DS-style TopSites then the rest if any in a collapsible section
const {
DiscoveryStream
} = this.props;
return /*#__PURE__*/external_React_default().createElement((external_React_default()).Fragment, null, this.props.DiscoveryStream.isPrivacyInfoModalVisible && /*#__PURE__*/external_React_default().createElement(DSPrivacyModal, {
dispatch: this.props.dispatch
}), reportContentEnabled && /*#__PURE__*/external_React_default().createElement(ReportContent, {
}), (reportAdsEnabled && spocsEnabled || sectionsEnabled) && /*#__PURE__*/external_React_default().createElement(ReportContent, {
spocs: DiscoveryStream.spocs
}), topSites && this.renderLayout([{
width: 12,

View file

@ -610,10 +610,9 @@ export const PREFS_CONFIG = new Map([
},
],
[
"discoverystream.reportContent.enabled",
"discoverystream.reportAds.enabled",
{
title:
"Boolean flag to enable reporting content and ads from the context menu",
title: "Boolean flag to enable reporting ads from the context menu",
value: false,
},
],

View file

@ -11,9 +11,7 @@ describe("<AdBannerContextMenu>", () => {
spoc: { url: "https://www.test.com/", shim: "aaabbbcccddd" },
position: 1,
type: "billboard",
prefs: {
"discoverystream.reportContent.enabled": true,
},
prefs: {},
};
beforeEach(() => {
@ -53,8 +51,34 @@ describe("<AdBannerContextMenu>", () => {
].forEach(prop => assert.property(linkMenuProps, prop));
});
it("should pass through the correct menu options to LinkMenu for ad banners", () => {
const reportPref = props.prefs["discoverystream.reportContent.enabled"];
it("should pass through the correct menu options to LinkMenu for ad banners with reporting INCLUDED", () => {
const propsWithReporting = {
...props,
showAdReporting: true,
};
wrapper = shallow(<AdBannerContextMenu {...propsWithReporting} />);
wrapper.find("moz-button").simulate("click", {
preventDefault: () => {},
});
const linkMenuProps = wrapper.find(LinkMenu).props();
const linkMenuOptions = [
"BlockAdUrl",
"ReportAd",
"ManageSponsoredContent",
"OurSponsorsAndYourPrivacy",
];
assert.deepEqual(linkMenuProps.options, linkMenuOptions);
});
it("should pass through correct menu options to LinkMenu for ad banner with reporting EXCLUDED", () => {
const propsWithoutReporting = {
...props,
showAdReporting: false,
};
wrapper = shallow(<AdBannerContextMenu {...propsWithoutReporting} />);
wrapper.find("moz-button").simulate("click", {
preventDefault: () => {},
});
@ -66,18 +90,7 @@ describe("<AdBannerContextMenu>", () => {
"OurSponsorsAndYourPrivacy",
];
const optionsWithReporting = [
"BlockAdUrl",
"ReportAd",
"ManageSponsoredContent",
"OurSponsorsAndYourPrivacy",
];
const expectedOptions = reportPref
? optionsWithReporting
: linkMenuOptions;
assert.deepEqual(linkMenuProps.options, expectedOptions);
assert.deepEqual(linkMenuProps.options, linkMenuOptions);
});
});
});

View file

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

View file

@ -2849,7 +2849,7 @@ void nsPIDOMWindowInner::TryToCacheTopInnerWindow() {
}
}
void nsPIDOMWindowInner::UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) {
void nsGlobalWindowInner::UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) {
MOZ_ASSERT(NS_IsMainThread());
if (aDelta == 0) {
@ -2865,7 +2865,7 @@ void nsPIDOMWindowInner::UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) {
counter += aDelta;
}
bool nsGlobalWindowInner::HasActiveIndexedDBDatabases() {
bool nsGlobalWindowInner::HasActiveIndexedDBDatabases() const {
MOZ_ASSERT(NS_IsMainThread());
return mTopInnerWindow ? mTopInnerWindow->mNumOfIndexedDBDatabases > 0

View file

@ -335,12 +335,15 @@ class nsGlobalWindowInner final : public mozilla::dom::EventTarget,
void Freeze(bool aIncludeSubWindows = true);
void Thaw(bool aIncludeSubWindows = true);
virtual bool IsFrozen() const override;
virtual bool HasActiveIndexedDBDatabases() override;
virtual bool HasActiveIndexedDBDatabases() const override;
virtual bool HasActivePeerConnections() override;
virtual bool HasOpenWebSockets() const override;
virtual bool HasScheduledNormalOrHighPriorityWebTasks() const override;
void SyncStateFromParentWindow();
virtual void UpdateWebSocketCount(int32_t aDelta) override;
// Increase/Decrease the number of active IndexedDB databases for the
// decision making of timeout-throttling.
virtual void UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) override;
// Called on the current inner window of a browsing context when its
// background state changes according to selected tab or visibility of the

View file

@ -336,7 +336,7 @@ class nsIGlobalObject : public nsISupports {
}
// Return true if there is any active IndexedDB databases which could block
// timeout-throttling.
virtual bool HasActiveIndexedDBDatabases() { return false; }
virtual bool HasActiveIndexedDBDatabases() const { return false; }
/**
* Check whether the active peer connection count is non-zero.
*/
@ -352,6 +352,9 @@ class nsIGlobalObject : public nsISupports {
}
virtual void UpdateWebSocketCount(int32_t aDelta) {};
// Increase/Decrease the number of active IndexedDB databases for the
// decision making of timeout-throttling.
virtual void UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) {}
/**
* Report a localized error message to the error console. Currently this

View file

@ -340,10 +340,6 @@ class nsPIDOMWindowInner : public mozIDOMWindow {
// indexedDB counters.
void TryToCacheTopInnerWindow();
// Increase/Decrease the number of active IndexedDB databases for the
// decision making of timeout-throttling.
void UpdateActiveIndexedDBDatabaseCount(int32_t aDelta);
mozilla::Maybe<mozilla::dom::ClientInfo> GetClientInfo() const;
mozilla::Maybe<mozilla::dom::ClientState> GetClientState() const;
mozilla::Maybe<mozilla::dom::ServiceWorkerDescriptor> GetController() const;

View file

@ -178,6 +178,7 @@ interface WindowGlobalChild {
readonly attribute boolean isInProcess;
readonly attribute BrowsingContext browsingContext;
readonly attribute WindowContext windowContext;
readonly attribute WindowProxy? contentWindow;
readonly attribute boolean isCurrentGlobal;

View file

@ -404,8 +404,8 @@ void IDBFactory::UpdateActiveDatabaseCount(int32_t aDelta) {
(mActiveDatabaseCount + aDelta) < mActiveDatabaseCount);
mActiveDatabaseCount += aDelta;
if (nsGlobalWindowInner* win = GetOwnerWindow()) {
win->UpdateActiveIndexedDBDatabaseCount(aDelta);
if (nsIGlobalObject* global = GetOwnerGlobal()) {
global->UpdateActiveIndexedDBDatabaseCount(aDelta);
}
}

View file

@ -258,6 +258,13 @@ dom::BrowsingContext* WindowGlobalChild::BrowsingContext() {
return mWindowContext->GetBrowsingContext();
}
Nullable<WindowProxyHolder> WindowGlobalChild::GetContentWindow() {
if (IsCurrentGlobal()) {
return WindowProxyHolder(BrowsingContext());
}
return nullptr;
}
uint64_t WindowGlobalChild::InnerWindowId() {
return mWindowContext->InnerWindowId();
}

View file

@ -14,6 +14,7 @@
#include "nsWrapperCache.h"
#include "mozilla/dom/Document.h"
#include "mozilla/dom/WindowGlobalActor.h"
#include "mozilla/dom/WindowProxyHolder.h"
class nsGlobalWindowInner;
class nsDocShell;
@ -53,6 +54,8 @@ class WindowGlobalChild final : public WindowGlobalActor,
dom::WindowContext* WindowContext() const { return mWindowContext; }
nsGlobalWindowInner* GetWindowGlobal() const { return mWindowGlobal; }
Nullable<WindowProxyHolder> GetContentWindow();
// Has this actor been shut down
bool IsClosed() { return !CanSend(); }
void Destroy();

View file

@ -2699,12 +2699,7 @@ void QuotaManager::UpdateOriginAccessTime(
MutexAutoUnlock autoUnlock(mQuotaMutex);
auto op = CreateSaveOriginAccessTimeOp(WrapMovingNotNullUnchecked(this),
aOriginMetadata, timestamp);
RegisterNormalOriginOp(*op);
op->RunImmediately();
SaveOriginAccessTime(aOriginMetadata, timestamp);
}
}
@ -6589,6 +6584,21 @@ RefPtr<BoolPromise> QuotaManager::InitializeAllTemporaryOrigins() {
return promise;
}
RefPtr<BoolPromise> QuotaManager::SaveOriginAccessTime(
const OriginMetadata& aOriginMetadata, int64_t aTimestamp) {
AssertIsOnOwningThread();
MOZ_ASSERT(aOriginMetadata.mPersistenceType != PERSISTENCE_TYPE_PERSISTENT);
auto saveOriginAccessTimeOp = CreateSaveOriginAccessTimeOp(
WrapMovingNotNullUnchecked(this), aOriginMetadata, aTimestamp);
RegisterNormalOriginOp(*saveOriginAccessTimeOp);
saveOriginAccessTimeOp->RunImmediately();
return saveOriginAccessTimeOp->OnResults();
}
RefPtr<OriginUsageMetadataArrayPromise> QuotaManager::GetUsage(
bool aGetAll, RefPtr<BoolPromise> aOnCancelPromise) {
AssertIsOnOwningThread();

View file

@ -114,7 +114,7 @@ class FinalizeOriginEvictionOp : public OriginOperationBase {
};
class SaveOriginAccessTimeOp
: public OpenStorageDirectoryHelper<NormalOriginOperationBase> {
: public OpenStorageDirectoryHelper<ResolvableNormalOriginOp<bool>> {
const OriginMetadata mOriginMetadata;
int64_t mTimestamp;
@ -129,8 +129,6 @@ class SaveOriginAccessTimeOp
AssertIsOnOwningThread();
}
NS_INLINE_DECL_REFCOUNTING(SaveOriginAccessTimeOp, override)
private:
~SaveOriginAccessTimeOp() = default;
@ -138,7 +136,7 @@ class SaveOriginAccessTimeOp
virtual nsresult DoDirectoryWork(QuotaManager& aQuotaManager) override;
virtual void SendResults() override;
bool UnwrapResolveValue() override { return true; }
void CloseDirectory() override;
};
@ -1006,7 +1004,7 @@ RefPtr<OriginOperationBase> CreateFinalizeOriginEvictionOp(
std::move(aLocks));
}
RefPtr<NormalOriginOperationBase> CreateSaveOriginAccessTimeOp(
RefPtr<ResolvableNormalOriginOp<bool>> CreateSaveOriginAccessTimeOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const OriginMetadata& aOriginMetadata, int64_t aTimestamp) {
return MakeRefPtr<SaveOriginAccessTimeOp>(std::move(aQuotaManager),
@ -1331,8 +1329,6 @@ nsresult SaveOriginAccessTimeOp::DoDirectoryWork(QuotaManager& aQuotaManager) {
return NS_OK;
}
void SaveOriginAccessTimeOp::SendResults() {}
void SaveOriginAccessTimeOp::CloseDirectory() {
AssertIsOnOwningThread();

View file

@ -45,7 +45,7 @@ RefPtr<OriginOperationBase> CreateFinalizeOriginEvictionOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
nsTArray<RefPtr<OriginDirectoryLock>>&& aLocks);
RefPtr<NormalOriginOperationBase> CreateSaveOriginAccessTimeOp(
RefPtr<ResolvableNormalOriginOp<bool>> CreateSaveOriginAccessTimeOp(
MovingNotNull<RefPtr<QuotaManager>> aQuotaManager,
const OriginMetadata& aOriginMetadata, int64_t aTimestamp);

View file

@ -510,6 +510,9 @@ class QuotaManager final : public BackgroundThreadObject {
public:
RefPtr<BoolPromise> InitializeAllTemporaryOrigins();
RefPtr<BoolPromise> SaveOriginAccessTime(
const OriginMetadata& aOriginMetadata, int64_t aTimestamp);
RefPtr<OriginUsageMetadataArrayPromise> GetUsage(
bool aGetAll, RefPtr<BoolPromise> aOnCancelPromise = nullptr);

View file

@ -17,6 +17,7 @@
#include "mozilla/dom/quota/UniversalDirectoryLock.h"
#include "mozilla/gtest/MozAssertions.h"
#include "nsFmtString.h"
#include "prtime.h"
#include "QuotaManagerDependencyFixture.h"
#include "QuotaManagerTestHelpers.h"
@ -1989,6 +1990,39 @@ TEST_F(TestQuotaManager,
ASSERT_NO_FATAL_FAILURE(ShutdownStorage());
}
// Tests the availability of SaveOriginAccessTime and verifies that calling it
// does not trigger temporary storage or origin initialization.
TEST_F(TestQuotaManager, SaveOriginAccessTime_Simple) {
auto testOriginMetadata = GetTestOriginMetadata();
ASSERT_NO_FATAL_FAILURE(ShutdownStorage());
ASSERT_NO_FATAL_FAILURE(AssertStorageNotInitialized());
ASSERT_NO_FATAL_FAILURE(AssertTemporaryStorageNotInitialized());
ASSERT_NO_FATAL_FAILURE(
AssertTemporaryOriginNotInitialized(testOriginMetadata));
PerformOnBackgroundThread([testOriginMetadata]() {
QuotaManager* quotaManager = QuotaManager::Get();
ASSERT_TRUE(quotaManager);
{
int64_t timestamp = PR_Now();
auto value = Await(
quotaManager->SaveOriginAccessTime(testOriginMetadata, timestamp));
ASSERT_TRUE(value.IsResolve());
}
});
ASSERT_NO_FATAL_FAILURE(AssertStorageInitialized());
ASSERT_NO_FATAL_FAILURE(AssertTemporaryStorageNotInitialized());
ASSERT_NO_FATAL_FAILURE(
AssertTemporaryOriginNotInitialized(testOriginMetadata));
ASSERT_NO_FATAL_FAILURE(ShutdownStorage());
}
// Test simple ClearStoragesForOrigin.
TEST_F(TestQuotaManager, ClearStoragesForOrigin_Simple) {
ASSERT_NO_FATAL_FAILURE(ShutdownStorage());

View file

@ -1959,7 +1959,6 @@ void nsContentSecurityUtils::AssertChromePageHasCSP(Document* aDocument) {
"chrome://global/content/appPicker.xhtml"_ns,
"chrome://global/content/backgroundPageThumbs.xhtml"_ns,
"chrome://global/content/megalist/megalist.html"_ns,
"chrome://global/content/selectDialog.xhtml"_ns,
// Test files
"chrome://mochikit/"_ns,
"chrome://mochitests/"_ns,

View file

@ -37,7 +37,8 @@ UniquePtr<ExternalTexture> ExternalTexture::Create(
UniquePtr<ExternalTexture> texture;
#ifdef XP_WIN
texture = ExternalTextureD3D11::Create(aWidth, aHeight, aFormat, aUsage);
texture = ExternalTextureD3D11::Create(aParent, aDeviceId, aWidth, aHeight,
aFormat, aUsage);
#elif defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)
texture = ExternalTextureDMABuf::Create(aParent, aDeviceId, aWidth, aHeight,
aFormat, aUsage);

View file

@ -43,6 +43,7 @@ class ExtTex : public ObjectBase {
void Cleanup() {}
};
class ExternalTextureD3D11;
class ExternalTextureDMABuf;
class ExternalTextureMacIOSurface;
class WebGPUParent;
@ -62,10 +63,7 @@ class ExternalTexture {
const ffi::WGPUTextureUsages aUsage);
virtual ~ExternalTexture();
virtual void* GetExternalTextureHandle() { return nullptr; }
virtual Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) = 0;
virtual Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor() = 0;
virtual void GetSnapshot(const ipc::Shmem& aDestShmem,
const gfx::IntSize& aSize) {}
@ -76,6 +74,8 @@ class ExternalTexture {
return nullptr;
}
virtual ExternalTextureD3D11* AsExternalTextureD3D11() { return nullptr; }
gfx::IntSize GetSize() { return gfx::IntSize(mWidth, mHeight); }
void SetSubmissionIndex(uint64_t aSubmissionIndex);
@ -114,8 +114,7 @@ class ExternalTextureReadBackPresent final : public ExternalTexture {
const ffi::WGPUTextureUsages aUsage);
virtual ~ExternalTextureReadBackPresent();
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) override {
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor() override {
return Nothing();
}
};

View file

@ -9,15 +9,40 @@
#include "mozilla/gfx/DeviceManagerDx.h"
#include "mozilla/gfx/Logging.h"
#include "mozilla/layers/FenceD3D11.h"
#include "mozilla/layers/GpuProcessD3D11FencesHolderMap.h"
#include "mozilla/layers/ImageDataSerializer.h"
#include "mozilla/webgpu/WebGPUParent.h"
namespace mozilla::webgpu {
// static
UniquePtr<ExternalTextureD3D11> ExternalTextureD3D11::Create(
WebGPUParent* aParent, const ffi::WGPUDeviceId aDeviceId,
const uint32_t aWidth, const uint32_t aHeight,
const struct ffi::WGPUTextureFormat aFormat,
const ffi::WGPUTextureUsages aUsage) {
auto* fencesHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
if (!fencesHolderMap) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
gfxCriticalNoteOnce << "Failed to get FencesHolderMap";
return nullptr;
}
RefPtr<gfx::FileHandleWrapper> fenceHandle =
aParent->GetDeviceFenceHandle(aDeviceId);
if (!fenceHandle) {
gfxCriticalNoteOnce << "Failed to get fenceHandle";
return nullptr;
}
RefPtr<layers::FenceD3D11> fence =
layers::FenceD3D11::CreateFromHandle(fenceHandle);
if (!fence) {
gfxCriticalNoteOnce << "Failed create FenceD3D11";
return nullptr;
}
const RefPtr<ID3D11Device> d3d11Device =
gfx::DeviceManagerDx::Get()->GetCompositorDevice();
if (!d3d11Device) {
@ -53,55 +78,74 @@ UniquePtr<ExternalTextureD3D11> ExternalTextureD3D11::Create(
texture->QueryInterface((IDXGIResource1**)getter_AddRefs(resource));
if (!resource) {
gfxCriticalNoteOnce << "Failed to get IDXGIResource";
return 0;
return nullptr;
}
HANDLE sharedHandle;
hr = resource->CreateSharedHandle(
nullptr, DXGI_SHARED_RESOURCE_READ | DXGI_SHARED_RESOURCE_WRITE, nullptr,
&sharedHandle);
if (FAILED(hr)) {
if (FAILED(hr) || !sharedHandle) {
gfxCriticalNoteOnce << "GetSharedHandle failed: " << gfx::hexa(hr);
return 0;
return nullptr;
}
RefPtr<gfx::FileHandleWrapper> handle =
new gfx::FileHandleWrapper(UniqueFileHandle(sharedHandle));
auto fencesHolderId = layers::GpuProcessFencesHolderId::GetNext();
fencesHolderMap->Register(fencesHolderId);
return MakeUnique<ExternalTextureD3D11>(aWidth, aHeight, aFormat, aUsage,
texture, std::move(handle));
texture, std::move(handle),
fencesHolderId, std::move(fence));
}
ExternalTextureD3D11::ExternalTextureD3D11(
const uint32_t aWidth, const uint32_t aHeight,
const struct ffi::WGPUTextureFormat aFormat,
const ffi::WGPUTextureUsages aUsage, const RefPtr<ID3D11Texture2D> aTexture,
RefPtr<gfx::FileHandleWrapper>&& aSharedHandle)
RefPtr<gfx::FileHandleWrapper>&& aSharedHandle,
const layers::GpuProcessFencesHolderId aFencesHolderId,
RefPtr<layers::FenceD3D11>&& aWriteFence)
: ExternalTexture(aWidth, aHeight, aFormat, aUsage),
mTexture(aTexture),
mSharedHandle(std::move(aSharedHandle)) {
mSharedHandle(std::move(aSharedHandle)),
mFencesHolderId(aFencesHolderId),
mWriteFence(std::move(aWriteFence)) {
MOZ_ASSERT(mTexture);
}
ExternalTextureD3D11::~ExternalTextureD3D11() {}
void* ExternalTextureD3D11::GetExternalTextureHandle() {
if (!mSharedHandle) {
return nullptr;
}
RefPtr<ID3D11Device> device;
mTexture->GetDevice(getter_AddRefs(device));
auto* fencesHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
MOZ_ASSERT(fencesHolderMap);
// XXX deliver fences to wgpu
fencesHolderMap->WaitAllFencesAndForget(mFencesHolderId, device);
return mSharedHandle->GetHandle();
}
Maybe<layers::SurfaceDescriptor> ExternalTextureD3D11::ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) {
Maybe<layers::SurfaceDescriptor> ExternalTextureD3D11::ToSurfaceDescriptor() {
MOZ_ASSERT(mSubmissionIndex > 0);
mWriteFence->Update(mSubmissionIndex);
auto* fencesHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
MOZ_ASSERT(fencesHolderMap);
fencesHolderMap->SetWriteFence(mFencesHolderId, mWriteFence);
const auto format = gfx::SurfaceFormat::B8G8R8A8;
return Some(layers::SurfaceDescriptorD3D10(
mSharedHandle,
/* gpuProcessTextureId */ Nothing(),
/* arrayIndex */ 0, format, gfx::IntSize(mWidth, mHeight),
gfx::ColorSpace2::SRGB, gfx::ColorRange::FULL,
/* hasKeyedMutex */ false, aFenceInfo));
/* hasKeyedMutex */ false, Some(mFencesHolderId)));
}
void ExternalTextureD3D11::GetSnapshot(const ipc::Shmem& aDestShmem,

View file

@ -13,11 +13,16 @@ struct ID3D11Texture2D;
namespace mozilla {
namespace layers {
class FenceD3D11;
} // namespace layers
namespace webgpu {
class ExternalTextureD3D11 final : public ExternalTexture {
public:
static UniquePtr<ExternalTextureD3D11> Create(
WebGPUParent* aParent, const ffi::WGPUDeviceId aDeviceId,
const uint32_t aWidth, const uint32_t aHeight,
const struct ffi::WGPUTextureFormat aFormat,
const ffi::WGPUTextureUsages aUsage);
@ -26,20 +31,25 @@ class ExternalTextureD3D11 final : public ExternalTexture {
const struct ffi::WGPUTextureFormat aFormat,
const ffi::WGPUTextureUsages aUsage,
const RefPtr<ID3D11Texture2D> aTexture,
RefPtr<gfx::FileHandleWrapper>&& aSharedHandle);
RefPtr<gfx::FileHandleWrapper>&& aSharedHandle,
const layers::GpuProcessFencesHolderId aFencesHolderId,
RefPtr<layers::FenceD3D11>&& aWriteFence);
virtual ~ExternalTextureD3D11();
void* GetExternalTextureHandle() override;
void* GetExternalTextureHandle();
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) override;
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor() override;
void GetSnapshot(const ipc::Shmem& aDestShmem,
const gfx::IntSize& aSize) override;
ExternalTextureD3D11* AsExternalTextureD3D11() override { return this; }
protected:
const RefPtr<ID3D11Texture2D> mTexture;
const RefPtr<gfx::FileHandleWrapper> mSharedHandle;
const layers::GpuProcessFencesHolderId mFencesHolderId;
const RefPtr<layers::FenceD3D11> mWriteFence;
};
} // namespace webgpu

View file

@ -97,10 +97,7 @@ ExternalTextureDMABuf::ExternalTextureDMABuf(
ExternalTextureDMABuf::~ExternalTextureDMABuf() {}
void* ExternalTextureDMABuf::GetExternalTextureHandle() { return nullptr; }
Maybe<layers::SurfaceDescriptor> ExternalTextureDMABuf::ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) {
Maybe<layers::SurfaceDescriptor> ExternalTextureDMABuf::ToSurfaceDescriptor() {
layers::SurfaceDescriptor sd;
if (!mSurface->Serialize(sd)) {
return Nothing();

View file

@ -35,10 +35,7 @@ class ExternalTextureDMABuf final : public ExternalTexture {
const layers::SurfaceDescriptorDMABuf& aSurfaceDescriptor);
virtual ~ExternalTextureDMABuf();
void* GetExternalTextureHandle() override;
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) override;
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor() override;
void GetSnapshot(const ipc::Shmem& aDestShmem,
const gfx::IntSize& aSize) override;

View file

@ -55,17 +55,12 @@ ExternalTextureMacIOSurface::ExternalTextureMacIOSurface(
ExternalTextureMacIOSurface::~ExternalTextureMacIOSurface() {}
void* ExternalTextureMacIOSurface::GetExternalTextureHandle() {
return nullptr;
}
uint32_t ExternalTextureMacIOSurface::GetIOSurfaceId() {
return mSurface->GetIOSurfaceID();
}
Maybe<layers::SurfaceDescriptor>
ExternalTextureMacIOSurface::ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) {
ExternalTextureMacIOSurface::ToSurfaceDescriptor() {
MOZ_ASSERT(mSubmissionIndex > 0);
RefPtr<layers::GpuFence> gpuFence;

View file

@ -32,10 +32,7 @@ class ExternalTextureMacIOSurface final : public ExternalTexture {
RefPtr<MacIOSurface>&& aSurface);
virtual ~ExternalTextureMacIOSurface();
void* GetExternalTextureHandle() override;
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor(
Maybe<gfx::FenceInfo>& aFenceInfo) override;
Maybe<layers::SurfaceDescriptor> ToSurfaceDescriptor() override;
void GetSnapshot(const ipc::Shmem& aDestShmem,
const gfx::IntSize& aSize) override;

View file

@ -22,6 +22,7 @@
#if defined(XP_WIN)
# include "mozilla/gfx/DeviceManagerDx.h"
# include "mozilla/webgpu/ExternalTextureD3D11.h"
#endif
#if defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID)
@ -86,7 +87,12 @@ extern void* wgpu_server_get_external_texture_handle(void* aParam,
void* sharedHandle = nullptr;
#ifdef XP_WIN
sharedHandle = texture->GetExternalTextureHandle();
auto* textureD3D11 = texture->AsExternalTextureD3D11();
if (!textureD3D11) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return nullptr;
}
sharedHandle = textureD3D11->GetExternalTextureHandle();
if (!sharedHandle) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
gfxCriticalNoteOnce << "Failed to get shared handle";
@ -1428,19 +1434,11 @@ void WebGPUParent::PostExternalTexture(
const auto surfaceFormat = gfx::SurfaceFormat::B8G8R8A8;
const auto size = aExternalTexture->GetSize();
const auto index = aExternalTexture->GetSubmissionIndex();
MOZ_ASSERT(index != 0);
RefPtr<PresentationData> data = lookup->second.get();
Maybe<gfx::FenceInfo> fenceInfo;
auto it = mDeviceFenceHandles.find(data->mDeviceId);
if (it != mDeviceFenceHandles.end()) {
fenceInfo = Some(gfx::FenceInfo(it->second, index));
}
Maybe<layers::SurfaceDescriptor> desc =
aExternalTexture->ToSurfaceDescriptor(fenceInfo);
aExternalTexture->ToSurfaceDescriptor();
if (!desc) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return;
@ -1456,6 +1454,15 @@ void WebGPUParent::PostExternalTexture(
}
}
RefPtr<gfx::FileHandleWrapper> WebGPUParent::GetDeviceFenceHandle(
const RawId aDeviceId) {
auto it = mDeviceFenceHandles.find(aDeviceId);
if (it == mDeviceFenceHandles.end()) {
return nullptr;
}
return it->second;
}
ipc::IPCResult WebGPUParent::RecvSwapChainPresent(
RawId aTextureId, RawId aCommandEncoderId,
const layers::RemoteTextureId& aRemoteTextureId,

View file

@ -190,6 +190,8 @@ class WebGPUParent final : public PWebGPUParent, public SupportsWeakPtr {
return mActiveDeviceIds.Contains(aDeviceId);
}
RefPtr<gfx::FileHandleWrapper> GetDeviceFenceHandle(const RawId aDeviceId);
private:
static void MapCallback(uint8_t* aUserData,
ffi::WGPUBufferMapAsyncStatus aStatus);

View file

@ -218,8 +218,20 @@ class WorkerGlobalScopeBase : public DOMEventTargetHelper,
mNumOfOpenWebSockets += aDelta;
}
// Increase/Decrease the number of active IndexedDB databases for the
// decision making of timeout-throttling.
void UpdateActiveIndexedDBDatabaseCount(int32_t aDelta) override {
AssertIsOnWorkerThread();
mNumOfIndexedDBDatabases += aDelta;
}
bool HasOpenWebSockets() const override { return mNumOfOpenWebSockets; }
bool HasActiveIndexedDBDatabases() const override {
AssertIsOnWorkerThread();
return mNumOfIndexedDBDatabases;
}
void TriggerUpdateCCFlag() override {
mWorkerPrivate->UpdateCCFlag(WorkerPrivate::CCFlag::EligibleForTimeout);
}
@ -247,6 +259,7 @@ class WorkerGlobalScopeBase : public DOMEventTargetHelper,
#endif
mozilla::UniquePtr<mozilla::dom::TimeoutManager> mTimeoutManager;
uint32_t mNumOfOpenWebSockets{};
uint32_t mNumOfIndexedDBDatabases{};
};
namespace workerinternals {

View file

@ -444,6 +444,7 @@ skip-if = ["os == 'android'"] # Needs interaction with the scrollbar
["test_editing_UI_in_plaintext-only.html"]
["test_execCommandPaste_noTarget.html"]
skip-if = ["display == 'wayland'"] # Bug 1935188
["test_focus_caret_navigation_between_nested_editors.html"]

View file

@ -31,13 +31,13 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=578771
ce.focus();
synthesizeMouse(elem, 5, 5, {clickCount: 2 });
ok(elem.selectionStart == 0 && elem.selectionEnd == 7,
" Double-clicking on another " + elemTag + " works correctly");
is(elem.selectionStart, 0, `${elemTag} selectionStart after double-click`);
is(elem.selectionEnd, 7, `${elemTag} selectionEnd after double-click`);
ce.focus();
synthesizeMouse(elem, 5, 5, {clickCount: 3 });
ok(elem.selectionStart == 0 && elem.selectionEnd == 14,
"Triple-clicking on another " + elemTag + " works correctly");
is(elem.selectionStart, 0, `${elemTag} selectionStart after triple-click`);
is(elem.selectionEnd, 14, `${elemTag} selectionEnd after triple-click`);
}
// Avoid platform selection differences
SimpleTest.waitForFocus(function() {

View file

@ -177,7 +177,7 @@ SharedSurface_ANGLEShareHandle::ToSurfaceDescriptor() {
mSharedHandle, /* gpuProcessTextureId */ Nothing(),
/* arrayIndex */ 0, format, mDesc.size, mDesc.colorSpace,
gfx::ColorRange::FULL, /* hasKeyedMutex */ true,
/* fenceInfo */ Nothing()));
/* fencesHolderId */ Nothing()));
}
////////////////////////////////////////////////////////////////////////////////

View file

@ -452,7 +452,7 @@ SharedSurface_D3D11Interop::ToSurfaceDescriptor() {
mData.dxgiHandle, /* gpuProcessTextureId */ Nothing(),
/* arrayIndex */ 0, format, mDesc.size, mDesc.colorSpace,
gfx::ColorRange::FULL, /* hasKeyedMutex */ true,
/* fenceInfo */ Nothing()));
/* fencesHolderId */ Nothing()));
}
//////////////////////////////////////////////////////////////////////////////////////////

View file

@ -43,20 +43,6 @@ class FileHandleWrapper {
const mozilla::UniqueFileHandle mHandle;
};
struct FenceInfo {
FenceInfo() = default;
FenceInfo(FileHandleWrapper* aFenceHandle, uint64_t aFenceValue)
: mFenceHandle(aFenceHandle), mFenceValue(aFenceValue) {}
bool operator==(const FenceInfo& aOther) const {
return mFenceHandle == aOther.mFenceHandle &&
mFenceValue == aOther.mFenceValue;
}
RefPtr<FileHandleWrapper> mFenceHandle;
uint64_t mFenceValue = 0;
};
} // namespace gfx
} // namespace mozilla

View file

@ -1203,24 +1203,6 @@ struct ParamTraits<mozilla::fontlist::Pointer> {
}
};
template <>
struct ParamTraits<mozilla::gfx::FenceInfo> {
typedef mozilla::gfx::FenceInfo paramType;
static void Write(MessageWriter* aWriter, const paramType& aParam) {
WriteParam(aWriter, aParam.mFenceHandle);
WriteParam(aWriter, aParam.mFenceValue);
}
static bool Read(MessageReader* aReader, paramType* aResult) {
if (!ReadParam(aReader, &aResult->mFenceHandle) ||
!ReadParam(aReader, &aResult->mFenceValue)) {
return false;
}
return true;
}
};
} // namespace IPC
namespace mozilla {

View file

@ -63,6 +63,11 @@ RefPtr<FenceD3D11> FenceD3D11::Create(ID3D11Device* aDevice) {
/* static */
RefPtr<FenceD3D11> FenceD3D11::CreateFromHandle(
RefPtr<gfx::FileHandleWrapper> aHandle) {
MOZ_ASSERT(aHandle);
if (!aHandle) {
return nullptr;
}
// Opening shared handle is deferred.
return new FenceD3D11(aHandle);
}
@ -125,10 +130,6 @@ RefPtr<FenceD3D11> FenceD3D11::CloneFromHandle() {
return fence;
}
gfx::FenceInfo FenceD3D11::GetFenceInfo() const {
return gfx::FenceInfo(mHandle, mFenceValue);
}
bool FenceD3D11::IncrementAndSignal() {
MOZ_ASSERT(mDevice);
MOZ_ASSERT(mSignalFence);

View file

@ -62,8 +62,6 @@ class FenceD3D11 final : public Fence {
uint64_t GetFenceValue() const { return mFenceValue; }
gfx::FenceInfo GetFenceInfo() const;
const RefPtr<gfx::FileHandleWrapper> mHandle;
protected:

View file

@ -17,13 +17,13 @@ StaticAutoPtr<GpuProcessD3D11FencesHolderMap>
/* static */
void GpuProcessD3D11FencesHolderMap::Init() {
MOZ_ASSERT(XRE_IsGPUProcess());
MOZ_ASSERT(XRE_IsGPUProcess() || XRE_IsParentProcess());
sInstance = new GpuProcessD3D11FencesHolderMap();
}
/* static */
void GpuProcessD3D11FencesHolderMap::Shutdown() {
MOZ_ASSERT(XRE_IsGPUProcess());
MOZ_ASSERT(XRE_IsGPUProcess() || XRE_IsParentProcess());
sInstance = nullptr;
}

View file

@ -425,7 +425,7 @@ bool D3D11TextureData::SerializeSpecific(
*aOutDesc = SurfaceDescriptorD3D10(
mSharedHandle, mGpuProcessTextureId, mArrayIndex, mFormat, mSize,
mColorSpace, mColorRange, /* hasKeyedMutex */ mHasKeyedMutex,
/* fenceInfo */ Nothing());
/* fencesHolderId */ Nothing());
return true;
}
@ -921,9 +921,7 @@ DXGITextureHostD3D11::DXGITextureHostD3D11(
mSize(aDescriptor.size()),
mFormat(aDescriptor.format()),
mHasKeyedMutex(aDescriptor.hasKeyedMutex()),
mAcquireFenceInfo(aDescriptor.fenceInfo().isSome()
? aDescriptor.fenceInfo().ref()
: gfx::FenceInfo()),
mFencesHolderId(aDescriptor.fencesHolderId()),
mColorSpace(aDescriptor.colorSpace()),
mColorRange(aDescriptor.colorRange()) {}
@ -1182,7 +1180,7 @@ void DXGITextureHostD3D11::CreateRenderTexture(
RefPtr<wr::RenderDXGITextureHost> texture = new wr::RenderDXGITextureHost(
mHandle, mGpuProcessTextureId, mArrayIndex, mFormat, mColorSpace,
mColorRange, mSize, mHasKeyedMutex, mAcquireFenceInfo);
mColorRange, mSize, mHasKeyedMutex, mFencesHolderId);
if (mFlags & TextureFlags::SOFTWARE_DECODED_VIDEO) {
texture->SetIsSoftwareDecodedVideo();
}

View file

@ -26,7 +26,6 @@ namespace mozilla {
namespace gfx {
class FileHandleWrapper;
struct FenceInfo;
} // namespace gfx
namespace gl {
@ -398,7 +397,7 @@ class DXGITextureHostD3D11 : public TextureHost {
const gfx::IntSize mSize;
const gfx::SurfaceFormat mFormat;
const bool mHasKeyedMutex;
const gfx::FenceInfo mAcquireFenceInfo;
const Maybe<layers::GpuProcessFencesHolderId> mFencesHolderId;
const gfx::ColorSpace2 mColorSpace;
const gfx::ColorRange mColorRange;
};

View file

@ -257,7 +257,7 @@ RefPtr<TextureHost> TextureHostWrapperD3D11::CreateFromBufferTexture(
auto descD3D10 = SurfaceDescriptorD3D10(
nullptr, Some(id),
/* arrayIndex */ 0, gfx::SurfaceFormat::NV12, size, colorSpace,
colorRange, /* hasKeyedMutex */ false, /* fenceInfo */ Nothing());
colorRange, /* hasKeyedMutex */ false, /* fencesHolderId */ Nothing());
RefPtr<DXGITextureHostD3D11> textureHostD3D11 =
new DXGITextureHostD3D11(flags, descD3D10);

View file

@ -22,7 +22,6 @@ using mozilla::gfx::SurfaceFormat from "mozilla/gfx/Types.h";
using mozilla::gfx::IntRect from "mozilla/gfx/Rect.h";
using mozilla::gfx::IntSize from "mozilla/gfx/Point.h";
using mozilla::gfx::Matrix4x4 from "mozilla/gfx/Matrix.h";
using mozilla::gfx::FenceInfo from "mozilla/gfx/FileHandleWrapper.h";
[RefCounted] using mozilla::gfx::FileHandleWrapper from "mozilla/gfx/FileHandleWrapper.h";
using gfxImageFormat from "gfxTypes.h";
using mozilla::layers::MaybeVideoBridgeSource from "mozilla/layers/VideoBridgeUtils.h";
@ -48,7 +47,7 @@ namespace layers {
ColorSpace2 colorSpace;
ColorRange colorRange;
bool hasKeyedMutex;
FenceInfo? fenceInfo;
GpuProcessFencesHolderId? fencesHolderId;
};
[Comparable] struct SurfaceDescriptorDXGIYCbCr {

View file

@ -77,6 +77,7 @@
#if defined(XP_WIN)
# include "gfxWindowsPlatform.h"
# include "mozilla/layers/GpuProcessD3D11FencesHolderMap.h"
# include "mozilla/widget/WinWindowOcclusionTracker.h"
#elif defined(XP_DARWIN)
# include "gfxPlatformMac.h"
@ -1336,6 +1337,9 @@ void gfxPlatform::InitLayersIPC() {
}
#endif
if (!gfxConfig::IsEnabled(Feature::GPU_PROCESS)) {
#if defined(XP_WIN)
GpuProcessD3D11FencesHolderMap::Init();
#endif
RemoteTextureMap::Init();
wr::RenderThread::Start(GPUProcessManager::Get()->AllocateNamespace());
image::ImageMemoryReporter::InitForWebRender();
@ -1391,6 +1395,7 @@ void gfxPlatform::ShutdownLayersIPC() {
StaticPrefs::GetPrefName_gfx_webrender_blob_tile_size()));
}
#if defined(XP_WIN)
GpuProcessD3D11FencesHolderMap::Shutdown();
widget::WinWindowOcclusionTracker::ShutDown();
#endif
} else {
@ -3974,6 +3979,9 @@ void gfxPlatform::DisableGPUProcess() {
"FEATURE_FAILURE_DISABLED_BY_GPU_PROCESS_DISABLED"_ns);
}
#if defined(XP_WIN)
GpuProcessD3D11FencesHolderMap::Init();
#endif
RemoteTextureMap::Init();
// We need to initialize the parent process to prepare for WebRender if we
// did not end up disabling it, despite losing the GPU process.

View file

@ -30,7 +30,7 @@ RenderDXGITextureHost::RenderDXGITextureHost(
const uint32_t aArrayIndex, const gfx::SurfaceFormat aFormat,
const gfx::ColorSpace2 aColorSpace, const gfx::ColorRange aColorRange,
const gfx::IntSize aSize, bool aHasKeyedMutex,
const gfx::FenceInfo& aAcquireFenceInfo)
const Maybe<layers::GpuProcessFencesHolderId>& aFencesHolderId)
: mHandle(aHandle),
mGpuProcessTextureId(aGpuProcessTextureId),
mArrayIndex(aArrayIndex),
@ -42,7 +42,7 @@ RenderDXGITextureHost::RenderDXGITextureHost(
mColorRange(aColorRange),
mSize(aSize),
mHasKeyedMutex(aHasKeyedMutex),
mAcquireFenceInfo(aAcquireFenceInfo),
mFencesHolderId(aFencesHolderId),
mLocked(false) {
MOZ_COUNT_CTOR_INHERITED(RenderDXGITextureHost, RenderTextureHost);
MOZ_ASSERT((mFormat != gfx::SurfaceFormat::NV12 &&
@ -367,19 +367,20 @@ wr::WrExternalImage RenderDXGITextureHost::Lock(uint8_t aChannelIndex,
}
bool RenderDXGITextureHost::LockInternal() {
if (!mLocked) {
if (mAcquireFenceInfo.mFenceHandle) {
if (!mAcquireFence) {
mAcquireFence = layers::FenceD3D11::CreateFromHandle(
mAcquireFenceInfo.mFenceHandle);
}
if (mAcquireFence) {
MOZ_ASSERT(mAcquireFenceInfo.mFenceHandle == mAcquireFence->mHandle);
MOZ_ASSERT(mTexture);
mAcquireFence->Update(mAcquireFenceInfo.mFenceValue);
RefPtr<ID3D11Device> d3d11Device =
gfx::DeviceManagerDx::Get()->GetCompositorDevice();
mAcquireFence->Wait(d3d11Device);
if (!mLocked) {
if (mFencesHolderId.isSome()) {
auto* fencesHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
if (!fencesHolderMap) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return false;
}
RefPtr<ID3D11Device> device;
mTexture->GetDevice(getter_AddRefs(device));
if (!fencesHolderMap->WaitWriteFence(mFencesHolderId.ref(), device)) {
return false;
}
}
if (mKeyedMutex) {
@ -468,7 +469,7 @@ gfx::IntSize RenderDXGITextureHost::GetSize(uint8_t aChannelIndex) const {
bool RenderDXGITextureHost::SyncObjectNeeded() {
return mGpuProcessTextureId.isNothing() && !mHasKeyedMutex &&
!mAcquireFenceInfo.mFenceHandle;
mFencesHolderId.isNothing();
}
RenderDXGIYCbCrTextureHost::RenderDXGIYCbCrTextureHost(
@ -641,12 +642,12 @@ bool RenderDXGIYCbCrTextureHost::EnsureD3D11Texture2D(ID3D11Device* aDevice) {
bool RenderDXGIYCbCrTextureHost::LockInternal() {
if (!mLocked) {
auto* fenceHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
if (!fenceHolderMap) {
auto* fencesHolderMap = layers::GpuProcessD3D11FencesHolderMap::Get();
if (!fencesHolderMap) {
MOZ_ASSERT_UNREACHABLE("unexpected to be called");
return false;
}
if (!fenceHolderMap->WaitWriteFence(mFencesHolderId, mDevice)) {
if (!fencesHolderMap->WaitWriteFence(mFencesHolderId, mDevice)) {
return false;
}
mLocked = true;

View file

@ -32,7 +32,7 @@ class RenderDXGITextureHost final : public RenderTextureHostSWGL {
const uint32_t aArrayIndex, const gfx::SurfaceFormat aFormat,
const gfx::ColorSpace2 aColorSpace, const gfx::ColorRange aColorRange,
const gfx::IntSize aSize, const bool aHasKeyedMutex,
const gfx::FenceInfo& aAcquireFenceInfo);
const Maybe<layers::GpuProcessFencesHolderId>& aFencesHolderId);
wr::WrExternalImage Lock(uint8_t aChannelIndex, gl::GLContext* aGL) override;
void Unlock() override;
@ -121,15 +121,13 @@ class RenderDXGITextureHost final : public RenderTextureHostSWGL {
bool mIsSoftwareDecodedVideo = false;
RefPtr<layers::FenceD3D11> mAcquireFence;
public:
const gfx::SurfaceFormat mFormat;
const gfx::ColorSpace2 mColorSpace;
const gfx::ColorRange mColorRange;
const gfx::IntSize mSize;
const bool mHasKeyedMutex;
const gfx::FenceInfo mAcquireFenceInfo;
const Maybe<layers::GpuProcessFencesHolderId> mFencesHolderId;
private:
bool mLocked;

View file

@ -393,10 +393,15 @@ impl PictureChainBuilder {
// If no picture was created for this stacking context, create a
// pass-through wrapper now. This is only needed in 1-2 edge cases
// now, and will be removed as a follow up.
// If the picture is snapshotted, it needs to have a surface rather
// than being pass-through.
let composite_mode = snapshot.map(|_| PictureCompositeMode::Blit(BlitReason::SNAPSHOT));
let pic_index = PictureIndex(prim_store.pictures
.alloc()
.init(PicturePrimitive::new_image(
None,
composite_mode,
Picture3DContext::Out,
self.flags,
prim_list,
@ -644,6 +649,10 @@ impl<'a> SceneBuilder<'a> {
&builder.interners,
);
for pic_index in &builder.snapshot_pictures {
builder.picture_graph.add_root(*pic_index);
}
// Add all the tile cache pictures as roots of the picture graph
for pic_index in &tile_cache_pictures {
builder.picture_graph.add_root(*pic_index);
@ -2618,7 +2627,10 @@ impl<'a> SceneBuilder<'a> {
// 3d render context.
for child_pic_index in &prim_list.child_pictures {
let child_pic = &mut self.prim_store.pictures[child_pic_index.0];
child_pic.composite_mode = None;
let needs_surface = child_pic.snapshot.is_some();
if !needs_surface {
child_pic.composite_mode = None;
}
child_pic.context_3d = Picture3DContext::Out;
}

View file

@ -839,11 +839,17 @@ class VsyncRefreshDriverTimer : public RefreshDriverTimer {
sMostRecentHighRate = rate;
}
#ifdef DEBUG
// On 32-bit Windows we sometimes get times where TimeStamp::Now() is not
// monotonic because the underlying system apis produce non-monontonic
// results. (bug 1306896)
#if !defined(_WIN32)
// results; see bug 1306896.
// On Wayland, vsync timestamp might not precisely match system time; see
// bug 1958043.
# if defined(_WIN32) || defined(MOZ_WAYLAND)
Unused << NS_WARN_IF(aVsyncTimestamp > tickStart);
# else
MOZ_ASSERT(aVsyncTimestamp <= tickStart);
# endif
#endif
bool shouldGiveNonVSyncTasksMoreTime = ShouldGiveNonVsyncTasksMoreTime();

View file

@ -4615,6 +4615,10 @@ nsresult nsIFrame::GetDataForTableSelection(
}
static bool IsEditingHost(const nsIFrame* aFrame) {
if (aFrame->Style()->GetPseudoType() ==
PseudoStyleType::mozTextControlEditingRoot) {
return true;
}
nsIContent* content = aFrame->GetContent();
return content && content->IsEditingHost();
}
@ -4666,8 +4670,6 @@ bool nsIFrame::ShouldHaveLineIfEmpty() const {
break;
case PseudoStyleType::scrolledContent:
return GetParent()->ShouldHaveLineIfEmpty();
case PseudoStyleType::mozTextControlEditingRoot:
return true;
case PseudoStyleType::buttonContent:
// HTML quirk.
return GetContent()->IsHTMLElement(nsGkAtoms::input);
@ -5460,6 +5462,23 @@ struct MOZ_STACK_CLASS FrameContentRange {
int32_t end;
};
static bool IsRelevantBlockFrame(const nsIFrame* aFrame) {
if (!aFrame->IsBlockOutside()) {
return false;
}
if (aFrame->GetContent()->IsInNativeAnonymousSubtree()) {
// This helps skipping things like scrollbar parts.
return false;
}
auto pseudoType = aFrame->Style()->GetPseudoType();
if (PseudoStyle::IsAnonBox(pseudoType)) {
// Table cell contents should be considered block boundaries for this
// purpose.
return pseudoType == PseudoStyleType::cellContent;
}
return true;
}
// Retrieve the content offsets of a frame
static FrameContentRange GetRangeForFrame(const nsIFrame* aFrame) {
nsIContent* content = aFrame->GetContent();
@ -5486,7 +5505,7 @@ static FrameContentRange GetRangeForFrame(const nsIFrame* aFrame) {
MOZ_ASSERT(!content->IsBeingRemoved());
nsIContent* parent = content->GetParent();
if (aFrame->IsBlockOutside() || !parent) {
if (IsRelevantBlockFrame(aFrame) || !parent) {
return FrameContentRange(content, 0, content->GetChildCount());
}
@ -9385,7 +9404,7 @@ static nsContentAndOffset FindLineBreakingFrame(nsIFrame* aFrame,
// the content of the inline frames they were created from. The
// first/last child of such frames is the real block frame we're
// looking for.
if ((aFrame->IsBlockOutside() &&
if ((IsRelevantBlockFrame(aFrame) &&
!aFrame->HasAnyStateBits(NS_FRAME_PART_OF_IBSPLIT)) ||
aFrame->IsBrFrame()) {
nsIContent* content = aFrame->GetContent();
@ -9427,7 +9446,7 @@ nsresult nsIFrame::PeekOffsetForParagraph(PeekOffsetStruct* aPos) {
nsIFrame* frame = this;
nsContentAndOffset blockFrameOrBR;
blockFrameOrBR.mContent = nullptr;
bool reachedLimit = frame->IsBlockOutside() || IsEditingHost(frame);
bool reachedLimit = IsRelevantBlockFrame(frame) || IsEditingHost(frame);
auto traverse = [&aPos](nsIFrame* current) {
return aPos->mDirection == eDirPrevious ? current->GetPrevSibling()
@ -9463,7 +9482,8 @@ nsresult nsIFrame::PeekOffsetForParagraph(PeekOffsetStruct* aPos) {
break;
}
frame = parent;
reachedLimit = frame && (frame->IsBlockOutside() || IsEditingHost(frame));
reachedLimit =
frame && (IsRelevantBlockFrame(frame) || IsEditingHost(frame));
}
if (reachedLimit) { // no "stop frame" found

View file

@ -5,6 +5,7 @@
<style>
body { margin: 0; font: 16px/1 sans-serif; }
code { display: inline-block }
#d code { overflow: auto }
</style>
<p id="a">Some <code>code</code> with <span>text</span> with <code>code</code> in it</p>
@ -15,6 +16,8 @@ some <span>more</span> code <span>with</span> pre-formatted
whitespace <span>that</span> should be selected
line <span>by</span> line</pre>
<p id="d">Some <code>code</code> with <span>text</span> with <code>code</code> in <span>it</span></p>
<script>
SimpleTest.waitForExplicitFinish();
@ -25,7 +28,7 @@ line <span>by</span> line</pre>
}
SimpleTest.waitForFocus(function () {
for (let child of document.querySelectorAll("#a span, #a code"))
for (let child of document.querySelectorAll(":is(#a, #d) :is(span, code)"))
testTripleClick(child, "Some code with text with code in it");
{

View file

@ -6,6 +6,7 @@
<script>
const NON_CONTENT_ACCESSIBLE_ENV_VARS = [
"-moz-gtk-csd-titlebar-radius",
"-moz-gtk-csd-tooltip-radius",
"-moz-gtk-csd-minimize-button-position",
"-moz-gtk-csd-maximize-button-position",
"-moz-gtk-csd-close-button-position",

View file

@ -2,18 +2,47 @@
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:moz="http://mozac.org/tools">
<!-- Name of the "notification channel" used for displaying download notification. See https://developer.android.com/training/notify-user/channels -->
<string name="mozac_feature_downloads_notification_channel">Preuzimanja</string>
<!--
Text shown on the second row of an in progress download notification.
%1$s will be replaced with the percentage of download completed so far.
-->
<string name="mozac_feature_downloads_percentage_notification_text">%1$s je završeno</string>
<!-- Text shown on the second row of a paused download notification. -->
<string name="mozac_feature_downloads_paused_notification_text">Preuzimanje pauzirano</string>
<!-- Text shown on the second row of an completed download notification. The filename is shown on the first row. -->
<string name="mozac_feature_downloads_completed_notification_text2">Preuzimanje završeno</string>
<!-- Text shown on the second row of an failed download notification. The filename is shown on the first row. -->
<string name="mozac_feature_downloads_failed_notification_text2">Neuspjelo preuzimanje</string>
<!--
Alert dialog confirmation before downloading a previously downloaded file, this is the title.
%1$s will be replaced with the size of the file.
-->
<string name="mozac_feature_downloads_again_dialog_title" tools:ignore="UnusedResources">Ponovo preuzeti fajl? (%1$s)</string>
<!--
Alert dialog confirmation before downloading a file, this is the title.
%1$s will be replaced with the size of the file.
-->
<string name="mozac_feature_downloads_dialog_title_3">Preuzeti fajl? (%1$s)</string>
<!-- Alert dialog confirmation before download a file, this is the title. %1$s will be replaced with the name of the file. -->
<string name="mozac_feature_downloads_dialog_title2" moz:removedIn="138" tools:ignore="UnusedResources">Preuzimanje (%1$s)</string>
<!-- Alert dialog confirmation before download a file, this is the positive action. -->
<string name="mozac_feature_downloads_dialog_download">Preuzmi</string>
<!-- Alert dialog confirmation before downloading a file again, this is the positive action. -->
<string name="mozac_feature_downloads_dialog_download_again" tools:ignore="UnusedResources">Preuzmi ponovo</string>
<!-- Alert dialog confirmation before download a file, this is the negative action. -->
<string name="mozac_feature_downloads_dialog_cancel">Otkaži</string>
<!--
Alert dialog confirmation before downloading a previously downloaded file, this is the description.
%1$s will be replaced with the name of the file.
-->
<string name="mozac_feature_downloads_already_exists_dialog_title" tools:ignore="UnusedResources">%1$s već postoji.</string>
<!--
Alert dialog confirmation before downloading a file without network connection, this is the description.
%1$s will be replaced with the name of the file.
-->
<string name="mozac_feature_downloads_file_failure_no_connection" tools:ignore="UnusedResources">%1$s nije preuzet.</string>
<!-- Alert dialog confirmation before downloading a file without network connection, this is the description. -->
<string name="mozac_feature_downloads_file_check_connection" tools:ignore="UnusedResources">Provjerite vezu i pokušajte ponovo.</string>
<!-- Error shown when the user is trying to download a invalid file. %1$s will be replaced with the name of the app. -->
<string name="mozac_feature_downloads_file_not_supported2">%1$s ne može preuzeti ovaj tip fajla</string>
<!-- Message that appears when the downloaded file could not be opened. -->

View file

@ -2,18 +2,47 @@
<resources xmlns:tools="http://schemas.android.com/tools" xmlns:moz="http://mozac.org/tools">
<!-- Name of the "notification channel" used for displaying download notification. See https://developer.android.com/training/notify-user/channels -->
<string name="mozac_feature_downloads_notification_channel">Descargas</string>
<!--
Text shown on the second row of an in progress download notification.
%1$s will be replaced with the percentage of download completed so far.
-->
<string name="mozac_feature_downloads_percentage_notification_text">%1$s completado</string>
<!-- Text shown on the second row of a paused download notification. -->
<string name="mozac_feature_downloads_paused_notification_text">Descarga en pausa</string>
<!-- Text shown on the second row of an completed download notification. The filename is shown on the first row. -->
<string name="mozac_feature_downloads_completed_notification_text2">Descarga completa</string>
<!-- Text shown on the second row of an failed download notification. The filename is shown on the first row. -->
<string name="mozac_feature_downloads_failed_notification_text2">Descarga fallida</string>
<!--
Alert dialog confirmation before downloading a previously downloaded file, this is the title.
%1$s will be replaced with the size of the file.
-->
<string name="mozac_feature_downloads_again_dialog_title" tools:ignore="UnusedResources">¿Descargar archivo de nuevo? (%1$s)</string>
<!--
Alert dialog confirmation before downloading a file, this is the title.
%1$s will be replaced with the size of the file.
-->
<string name="mozac_feature_downloads_dialog_title_3">¿Descargar archivo? (%1$s)</string>
<!-- Alert dialog confirmation before download a file, this is the title. %1$s will be replaced with the name of the file. -->
<string name="mozac_feature_downloads_dialog_title2" moz:removedIn="138" tools:ignore="UnusedResources">Descargar (%1$s)</string>
<!-- Alert dialog confirmation before download a file, this is the positive action. -->
<string name="mozac_feature_downloads_dialog_download">Descargar</string>
<!-- Alert dialog confirmation before downloading a file again, this is the positive action. -->
<string name="mozac_feature_downloads_dialog_download_again" tools:ignore="UnusedResources">Descargar de nuevo</string>
<!-- Alert dialog confirmation before download a file, this is the negative action. -->
<string name="mozac_feature_downloads_dialog_cancel">Cancelar</string>
<!--
Alert dialog confirmation before downloading a previously downloaded file, this is the description.
%1$s will be replaced with the name of the file.
-->
<string name="mozac_feature_downloads_already_exists_dialog_title" tools:ignore="UnusedResources">%1$s ya existe.</string>
<!--
Alert dialog confirmation before downloading a file without network connection, this is the description.
%1$s will be replaced with the name of the file.
-->
<string name="mozac_feature_downloads_file_failure_no_connection" tools:ignore="UnusedResources">%1$s no ha sido descargado.</string>
<!-- Alert dialog confirmation before downloading a file without network connection, this is the description. -->
<string name="mozac_feature_downloads_file_check_connection" tools:ignore="UnusedResources">Comprueba tu conexión y vuelve a intentarlo.</string>
<!-- Error shown when the user is trying to download a invalid file. %1$s will be replaced with the name of the app. -->
<string name="mozac_feature_downloads_file_not_supported2">%1$s no puede descargar este tipo de archivo</string>
<!-- Message that appears when the downloaded file could not be opened. -->

View file

@ -671,6 +671,8 @@
<!-- Onboarding toolbar selection card content description for the toolbar placement image. -->
<string name="onboarding_customize_toolbar_placement_bottom_content_description">Slika trake s alatima na dnu</string>
<string name="onboarding_customize_toolbar_placement_top_content_description">Slika trake s alatima na vrhu</string>
<!-- Action label for toolbar options that can be selected. Talkback will append this to say "Double tap to select". -->
<string name="onboarding_customize_toolbar_a11y_action_label_select">izaberi</string>
<!-- Onboarding header for the theme selection card, used by Nimbus experiments. -->
<string name="onboarding_customize_theme_title" tools:ignore="UnusedResources">Izaberi temu</string>
<!-- Onboarding sub header for theme selection card, used by Nimbus experiments. -->
@ -687,6 +689,8 @@
<string name="onboarding_customize_theme_main_image_content_description">Velika slika zaglavlja prikaza odabira teme koja prikazuje ilustrovane alate umjetnika i graditelja.</string>
<!-- Onboarding theme selection card content description for the theme selection image. %1$s is placeholder for either 'system', 'light' or 'dark'. -->
<string name="onboarding_customize_theme_content_description">Slika %1$s teme</string>
<!-- Action label for options that can be selected. Talkback will append this to say "Double tap to select". -->
<string name="onboarding_customize_theme_a11y_action_label_select">izaberi</string>
<!--
Widget Picker
@ -764,6 +768,10 @@
<string name="preferences_add_private_browsing_shortcut">Dodaj prečicu za privatno surfanje</string>
<!-- Preference for enabling "HTTPS-Only" mode -->
<string name="preferences_https_only_title">Način rada samo za HTTPS</string>
<!-- Preference title for using the screen lock to hide tabs in private browsing -->
<string name="preferences_pbm_lock_screen_title">Koristite zaključavanje ekrana da sakrijete tabove u privatnom pregledavanju</string>
<!-- Informs the user how to access the tabs when "Use screen lock to hide tabs in private browsing" is enabled -->
<string name="preferences_pbm_lock_screen_summary">Pregledajte tabove s otiskom prsta, otključavanjem licem ili PIN-om.</string>
<!-- Label for cookie banner section in quick settings panel. -->
<string name="cookie_banner_blocker">Blokiranje pojavljivanja dijaloga kolačića</string>
<!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. -->
@ -1437,10 +1445,31 @@
Text for the snackbar to confirm that multiple downloads items have been removed
-->
<string name="download_delete_multiple_items_snackbar_1" moz:removedIn="138" tools:ignore="UnusedResources">Preuzimanja su uklonjena</string>
<!--
Text for the snackbar to confirm that a multiple download items have been removed. %1$s is the number of removed download items.
%1$d is the number of items deleted.
-->
<string name="download_delete_multiple_items_snackbar_2">Izbrisane stavke: %1$d</string>
<!-- Text for the snackbar to confirm that a single download item has been removed. %1$s is the name of the download item. -->
<string name="download_delete_single_item_snackbar" moz:removedIn="138" tools:ignore="UnusedResources">Uklonjeno %1$s</string>
<!-- Text for the snackbar to confirm that a single download item has been removed. %1$s is the name of the download item. -->
<string name="download_delete_single_item_snackbar_2">Izbrisano “%1$s”</string>
<!-- Text for the snackbar to confirm that downloads are in progress. -->
<string name="download_in_progress_snackbar" tools:ignore="UnusedResources">Preuzimanje u toku…</string>
<!-- Text for the snackbar action button to view in progress download details. -->
<string name="download_in_progress_snackbar_action_details" tools:ignore="UnusedResources">Detalji</string>
<!-- Text for the snackbar to confirm that a download has completed. -->
<string name="download_completed_snackbar" tools:ignore="UnusedResources">Preuzimanje završeno</string>
<!-- Text for the snackbar action button to open a completed download. -->
<string name="download_completed_snackbar_action_open" tools:ignore="UnusedResources">Otvori</string>
<!-- Text for the snackbar action button to undo deleting a download. -->
<string name="download_undo_delete_snackbar_action">Poništi</string>
<!-- Text shown when no download exists -->
<string name="download_empty_message_1" moz:removedIn="138" tools:ignore="UnusedResources">Nema preuzetih fajlova</string>
<!-- Text shown when no download exists -->
<string name="download_empty_message_2">Još nema preuzimanja</string>
<!-- Text description shown when no download exists -->
<string name="download_empty_description">Fajlovi koje preuzmete će se pojaviti ovdje.</string>
<!--
History multi select title in app bar
%1$d is the number of downloads selected
@ -1448,6 +1477,20 @@
<string name="download_multi_select_title">%1$d označeno</string>
<!-- Text for the button to remove a single download item -->
<string name="download_delete_item_1" moz:removedIn="138" tools:ignore="UnusedResources">Ukloni</string>
<!-- Text for the button to delete a single downloaded file item -->
<string name="download_delete_item">Izbriši</string>
<!-- Text for the button to share the download URL -->
<string name="download_share_url">Dijeli URL</string>
<!-- Text for the button to share the download file -->
<string name="download_share_file">Dijeli fajl</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the title. -->
<string name="download_delete_multi_select_dialog_confirmation" tools:ignore="UnusedResources">Jeste li sigurni da želite izbrisati odabrane stavke?</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the positive action. -->
<string name="download_delete_multi_select_dialog_confirm" tools:ignore="UnusedResources">Izbriši</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the negative action. -->
<string name="download_delete_multi_select_dialog_cancel" tools:ignore="UnusedResources">Otkaži</string>
<!-- Text for the header of in progress downloads -->
<string name="download_header_in_progress" tools:ignore="UnusedResources">U procesu</string>
<!--
Time period headers for downloads
@ -1462,6 +1505,23 @@
<string name="download_time_period_last_30_days">Zadnjih 30 dana</string>
<!-- Text for the header that groups the downloads older than other groups -->
<string name="download_time_period_older">Starije</string>
<!--
Description of an in progress download item, displayed in the downloads list.
%1$s is the current file size that has been downloaded.
%2$s is the total size of the downloaded file.
%3$s is the amount of time remaining to complete the download.
-->
<string name="download_item_in_progress_description" tools:ignore="UnusedResources">%1$s / %2$s • Ostalo je %3$s</string>
<!-- Text to indicate that an in progress download is paused. -->
<string name="download_item_status_paused" tools:ignore="UnusedResources">pauzirano</string>
<!-- Text to indicate that the download speed of an in progress download is being calculated. -->
<string name="download_item_download_speed_pending" tools:ignore="UnusedResources">na čekanju</string>
<!-- Text to indicate that a download has failed to download. -->
<string name="download_item_status_failed" tools:ignore="UnusedResources">Neuspjelo preuzimanje</string>
<!-- Placeholder text to indicate that users can use the search bar to search for a download. -->
<string name="download_search_placeholder" tools:ignore="UnusedResources">Traži preuzimanja</string>
<!-- Text to indicate that no downloads match the search query. -->
<string name="download_search_no_results_found" tools:ignore="UnusedResources">Nema pronađenih rezultata</string>
<!--
Downloads Content Type Filters
@ -1476,6 +1536,8 @@
<string name="download_content_type_filter_document">Dokumenti</string>
<!-- Text for the filter button to show all other file types in the downloads list -->
<string name="download_content_type_filter_other" moz:removedIn="138" tools:ignore="UnusedResources">Ostalo</string>
<!-- Text for the filter button to show all other file types in the downloads list -->
<string name="download_content_type_filter_other_1">Ostalo</string>
<!--
Description of a downloaded item, displayed in the downloads list.
%1$s: The size of the downloaded file.
@ -1586,6 +1648,14 @@
<string name="bookmark_menu_delete_button">Obriši</string>
<!-- Bookmark overflow menu save button -->
<string name="bookmark_menu_save_button">Spasi</string>
<!-- Label for button to sort bookmarks by newest in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_newest">Poredaj po najnovijim</string>
<!-- Label for button to sort bookmarks by oldest in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_oldest">Poredaj po najstarijim</string>
<!-- Label for button to sort bookmarks in alphabetical order in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_a_to_z">Poredaj po A do Ž</string>
<!-- Label for button to sort bookmarks in reverse alphabetical order in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_z_to_a">Poredaj od Ž do A</string>
<!--
Bookmark multi select title in app bar
%1$d is the number of bookmarks selected
@ -3364,8 +3434,40 @@
<string name="text_field_eye_trailing_icon_default_content_description">Prikaži skriveni tekst</string>
<!-- The default content description for the cross trailing icon button in TextField -->
<string name="text_field_cross_trailing_icon_default_content_description">Obriši tekst</string>
<!--
Setup checklist feature
The title of the default browser task for the setup checklist
-->
<string name="setup_checklist_task_default_browser" tools:ignore="UnusedResources">Postavi kao zadani pretraživač</string>
<!-- The title of the sign-in task for the setup checklist -->
<string name="setup_checklist_task_account_sync" tools:ignore="UnusedResources">Prijavite se na svoj račun</string>
<!-- The title of the theme selection task for the setup checklist -->
<string name="setup_checklist_task_theme_selection" tools:ignore="UnusedResources">Odaberite temu</string>
<!-- The title of the toolbar selection task for the setup checklist -->
<string name="setup_checklist_task_toolbar_selection" tools:ignore="UnusedResources">Odaberite položaj trake sa alatima</string>
<!-- The title of the explore extensions task for the setup checklist -->
<string name="setup_checklist_task_explore_extensions" tools:ignore="UnusedResources">Istražite ekstenzije</string>
<!-- The title of the search widget task for the setup checklist -->
<string name="setup_checklist_task_search_widget" tools:ignore="UnusedResources">Instalirajte widget za pretraživanje</string>
<!-- The title of the 'essentials' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_essentials" tools:ignore="UnusedResources">%1$s osnove</string>
<!-- The title of the 'customize' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_customize" tools:ignore="UnusedResources">Prilagodite svoj %1$s</string>
<!-- The title of the 'helpful tools' group in the setup checklist -->
<string name="setup_checklist_group_helpful_tools" tools:ignore="UnusedResources">Korisni alati</string>
<!-- Accessibility description for a check mark on a completed task -->
<string name="a11y_completed_task_description">Završen zadatak</string>
<!-- Accessibility description for the task icon -->
<string name="a11y_task_icon_description">Ikona zadatka</string>
<!--
Private browsing mode authentication screen
Label for the secondary action to exit private browsing mode
-->
<string name="pbm_authentication_leave_private_tabs">Napustite privatne tabove</string>
<!-- Label for the primary action button to unlock private tabs -->
<string name="pbm_authentication_unlock">Otključaj</string>
<!-- Title text instructing the user to unlock private tabs -->
<string name="pbm_authentication_unlock_private_tabs">Otključajte privatne tabove</string>
</resources>

View file

@ -3436,6 +3436,28 @@
<string name="text_field_eye_trailing_icon_default_content_description">Show hidden text</string>
<!-- The default content description for the cross trailing icon button in TextField -->
<string name="text_field_cross_trailing_icon_default_content_description">Clear text</string>
<!--
Setup checklist feature
The title of the default browser task for the setup checklist
-->
<string name="setup_checklist_task_default_browser" tools:ignore="UnusedResources">Set as default browser</string>
<!-- The title of the sign-in task for the setup checklist -->
<string name="setup_checklist_task_account_sync" tools:ignore="UnusedResources">Sign in to your account</string>
<!-- The title of the theme selection task for the setup checklist -->
<string name="setup_checklist_task_theme_selection" tools:ignore="UnusedResources">Select a theme</string>
<!-- The title of the toolbar selection task for the setup checklist -->
<string name="setup_checklist_task_toolbar_selection" tools:ignore="UnusedResources">Choose toolbar placement</string>
<!-- The title of the explore extensions task for the setup checklist -->
<string name="setup_checklist_task_explore_extensions" tools:ignore="UnusedResources">Explore extensions</string>
<!-- The title of the search widget task for the setup checklist -->
<string name="setup_checklist_task_search_widget" tools:ignore="UnusedResources">Install search widget</string>
<!-- The title of the 'essentials' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_essentials" tools:ignore="UnusedResources">%1$s essentials</string>
<!-- The title of the 'customize' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_customize" tools:ignore="UnusedResources">Customise your %1$s</string>
<!-- The title of the 'helpful tools' group in the setup checklist -->
<string name="setup_checklist_group_helpful_tools" tools:ignore="UnusedResources">Helpful tools</string>
<!-- Accessibility description for a check mark on a completed task -->
<string name="a11y_completed_task_description">Completed task</string>
<!-- Accessibility description for the task icon -->

View file

@ -672,6 +672,8 @@
<!-- Onboarding toolbar selection card content description for the toolbar placement image. -->
<string name="onboarding_customize_toolbar_placement_bottom_content_description">Imagen de la barra de herramientas inferior</string>
<string name="onboarding_customize_toolbar_placement_top_content_description">Imagen de la barra de herramientas superior</string>
<!-- Action label for toolbar options that can be selected. Talkback will append this to say "Double tap to select". -->
<string name="onboarding_customize_toolbar_a11y_action_label_select">seleccionar</string>
<!-- Onboarding header for the theme selection card, used by Nimbus experiments. -->
<string name="onboarding_customize_theme_title" tools:ignore="UnusedResources">Elige un tema</string>
<!-- Onboarding sub header for theme selection card, used by Nimbus experiments. -->
@ -688,6 +690,8 @@
<string name="onboarding_customize_theme_main_image_content_description">Imagen de encabezado grande de la vista de selección de tema que muestra un artista y herramientas de construcción ilustrados.</string>
<!-- Onboarding theme selection card content description for the theme selection image. %1$s is placeholder for either 'system', 'light' or 'dark'. -->
<string name="onboarding_customize_theme_content_description">Imagen del tema %1$s</string>
<!-- Action label for options that can be selected. Talkback will append this to say "Double tap to select". -->
<string name="onboarding_customize_theme_a11y_action_label_select">seleccionar</string>
<!--
Widget Picker
@ -765,6 +769,10 @@
<string name="preferences_add_private_browsing_shortcut">Agregar acceso directo a navegación privada</string>
<!-- Preference for enabling "HTTPS-Only" mode -->
<string name="preferences_https_only_title">Modo solo HTTPS</string>
<!-- Preference title for using the screen lock to hide tabs in private browsing -->
<string name="preferences_pbm_lock_screen_title">Utiliza el bloqueo de pantalla para ocultar pestañas en la navegación privada</string>
<!-- Informs the user how to access the tabs when "Use screen lock to hide tabs in private browsing" is enabled -->
<string name="preferences_pbm_lock_screen_summary">Ver pestañas con huella digital, desbloqueo facial o PIN.</string>
<!-- Label for cookie banner section in quick settings panel. -->
<string name="cookie_banner_blocker">Bloqueador de avisos de cookies</string>
<!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. -->
@ -1438,10 +1446,31 @@
Text for the snackbar to confirm that multiple downloads items have been removed
-->
<string name="download_delete_multiple_items_snackbar_1" moz:removedIn="138" tools:ignore="UnusedResources">Descargas eliminadas</string>
<!--
Text for the snackbar to confirm that a multiple download items have been removed. %1$s is the number of removed download items.
%1$d is the number of items deleted.
-->
<string name="download_delete_multiple_items_snackbar_2">Elementos eliminados: %1$d</string>
<!-- Text for the snackbar to confirm that a single download item has been removed. %1$s is the name of the download item. -->
<string name="download_delete_single_item_snackbar" moz:removedIn="138" tools:ignore="UnusedResources">%1$s eliminado</string>
<!-- Text for the snackbar to confirm that a single download item has been removed. %1$s is the name of the download item. -->
<string name="download_delete_single_item_snackbar_2">“%1$s” eliminado</string>
<!-- Text for the snackbar to confirm that downloads are in progress. -->
<string name="download_in_progress_snackbar" tools:ignore="UnusedResources">Descarga en curso…</string>
<!-- Text for the snackbar action button to view in progress download details. -->
<string name="download_in_progress_snackbar_action_details" tools:ignore="UnusedResources">Detalles</string>
<!-- Text for the snackbar to confirm that a download has completed. -->
<string name="download_completed_snackbar" tools:ignore="UnusedResources">Descarga completa</string>
<!-- Text for the snackbar action button to open a completed download. -->
<string name="download_completed_snackbar_action_open" tools:ignore="UnusedResources">Abierto</string>
<!-- Text for the snackbar action button to undo deleting a download. -->
<string name="download_undo_delete_snackbar_action">Deshacer</string>
<!-- Text shown when no download exists -->
<string name="download_empty_message_1" moz:removedIn="138" tools:ignore="UnusedResources">No hay archivos descargados</string>
<!-- Text shown when no download exists -->
<string name="download_empty_message_2">Todavía no hay descargas</string>
<!-- Text description shown when no download exists -->
<string name="download_empty_description">Los archivos que descargues aparecerán aquí.</string>
<!--
History multi select title in app bar
%1$d is the number of downloads selected
@ -1449,6 +1478,20 @@
<string name="download_multi_select_title">%1$d seleccionado(s)</string>
<!-- Text for the button to remove a single download item -->
<string name="download_delete_item_1" moz:removedIn="138" tools:ignore="UnusedResources">Eliminar</string>
<!-- Text for the button to delete a single downloaded file item -->
<string name="download_delete_item">Eliminar</string>
<!-- Text for the button to share the download URL -->
<string name="download_share_url">Compartir URL</string>
<!-- Text for the button to share the download file -->
<string name="download_share_file">Compartir archivo</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the title. -->
<string name="download_delete_multi_select_dialog_confirmation" tools:ignore="UnusedResources">¿Seguro que quieres eliminar los elementos seleccionados?</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the positive action. -->
<string name="download_delete_multi_select_dialog_confirm" tools:ignore="UnusedResources">Eliminar</string>
<!-- Alert dialog confirmation before deleting multiple download items, this is the negative action. -->
<string name="download_delete_multi_select_dialog_cancel" tools:ignore="UnusedResources">Cancelar</string>
<!-- Text for the header of in progress downloads -->
<string name="download_header_in_progress" tools:ignore="UnusedResources">En curso</string>
<!--
Time period headers for downloads
@ -1463,6 +1506,23 @@
<string name="download_time_period_last_30_days">Últimos 30 días</string>
<!-- Text for the header that groups the downloads older than other groups -->
<string name="download_time_period_older">Más antiguas</string>
<!--
Description of an in progress download item, displayed in the downloads list.
%1$s is the current file size that has been downloaded.
%2$s is the total size of the downloaded file.
%3$s is the amount of time remaining to complete the download.
-->
<string name="download_item_in_progress_description" tools:ignore="UnusedResources">%1$s / %2$s • %3$s restantes</string>
<!-- Text to indicate that an in progress download is paused. -->
<string name="download_item_status_paused" tools:ignore="UnusedResources">pausado</string>
<!-- Text to indicate that the download speed of an in progress download is being calculated. -->
<string name="download_item_download_speed_pending" tools:ignore="UnusedResources">pendiente</string>
<!-- Text to indicate that a download has failed to download. -->
<string name="download_item_status_failed" tools:ignore="UnusedResources">Descarga fallida</string>
<!-- Placeholder text to indicate that users can use the search bar to search for a download. -->
<string name="download_search_placeholder" tools:ignore="UnusedResources">Buscar en descargas</string>
<!-- Text to indicate that no downloads match the search query. -->
<string name="download_search_no_results_found" tools:ignore="UnusedResources">No se han encontrado resultados</string>
<!--
Downloads Content Type Filters
@ -1477,6 +1537,8 @@
<string name="download_content_type_filter_document">Documentos</string>
<!-- Text for the filter button to show all other file types in the downloads list -->
<string name="download_content_type_filter_other" moz:removedIn="138" tools:ignore="UnusedResources">Otros</string>
<!-- Text for the filter button to show all other file types in the downloads list -->
<string name="download_content_type_filter_other_1">Otro</string>
<!--
Description of a downloaded item, displayed in the downloads list.
%1$s: The size of the downloaded file.
@ -1587,6 +1649,14 @@
<string name="bookmark_menu_delete_button">Eliminar</string>
<!-- Bookmark overflow menu save button -->
<string name="bookmark_menu_save_button">Guardar</string>
<!-- Label for button to sort bookmarks by newest in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_newest">Ordenar por más reciente</string>
<!-- Label for button to sort bookmarks by oldest in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_oldest">Ordenar por más antiguo</string>
<!-- Label for button to sort bookmarks in alphabetical order in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_a_to_z">Ordenar de la A a la Z</string>
<!-- Label for button to sort bookmarks in reverse alphabetical order in the bookmark sorting overflow menu. -->
<string name="bookmark_sort_menu_z_to_a">Ordenar de la Z a la A</string>
<!--
Bookmark multi select title in app bar
%1$d is the number of bookmarks selected
@ -3364,8 +3434,40 @@
<string name="text_field_eye_trailing_icon_default_content_description">Mostrar texto oculto</string>
<!-- The default content description for the cross trailing icon button in TextField -->
<string name="text_field_cross_trailing_icon_default_content_description">Borrar texto</string>
<!--
Setup checklist feature
The title of the default browser task for the setup checklist
-->
<string name="setup_checklist_task_default_browser" tools:ignore="UnusedResources">Establecer como navegador predeterminado</string>
<!-- The title of the sign-in task for the setup checklist -->
<string name="setup_checklist_task_account_sync" tools:ignore="UnusedResources">Conéctate a tu cuenta</string>
<!-- The title of the theme selection task for the setup checklist -->
<string name="setup_checklist_task_theme_selection" tools:ignore="UnusedResources">Seleccionar un tema</string>
<!-- The title of the toolbar selection task for the setup checklist -->
<string name="setup_checklist_task_toolbar_selection" tools:ignore="UnusedResources">Elige la ubicación de la barra de herramientas</string>
<!-- The title of the explore extensions task for the setup checklist -->
<string name="setup_checklist_task_explore_extensions" tools:ignore="UnusedResources">Explorar extensiones</string>
<!-- The title of the search widget task for the setup checklist -->
<string name="setup_checklist_task_search_widget" tools:ignore="UnusedResources">Instalar el widget de búsqueda</string>
<!-- The title of the 'essentials' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_essentials" tools:ignore="UnusedResources">Esenciales de %1$s</string>
<!-- The title of the 'customize' group in the setup checklist. %1$s is the name of the app (for example "Firefox"). -->
<string name="setup_checklist_group_customize" tools:ignore="UnusedResources">Personaliza tu %1$s</string>
<!-- The title of the 'helpful tools' group in the setup checklist -->
<string name="setup_checklist_group_helpful_tools" tools:ignore="UnusedResources">Herramientas útiles</string>
<!-- Accessibility description for a check mark on a completed task -->
<string name="a11y_completed_task_description">Tarea completada</string>
<!-- Accessibility description for the task icon -->
<string name="a11y_task_icon_description">Icono de tarea</string>
<!--
Private browsing mode authentication screen
Label for the secondary action to exit private browsing mode
-->
<string name="pbm_authentication_leave_private_tabs">Salir de pestañas privadas</string>
<!-- Label for the primary action button to unlock private tabs -->
<string name="pbm_authentication_unlock">Desbloquear</string>
<!-- Title text instructing the user to unlock private tabs -->
<string name="pbm_authentication_unlock_private_tabs">Desbloquear pestañas privadas</string>
</resources>

View file

@ -777,6 +777,8 @@
<string name="preferences_show_voice_search">Lêgerîna dengî nîşan bide</string>
<!-- Preference title for switch preference to show search suggestions also in private mode -->
<string name="preferences_show_search_suggestions_in_private">Di rûniştinên veşartî de nîşan bide</string>
<!-- Preference title for switch preference to show trending search suggestions -->
<string name="preferences_show_trending_search_suggestions">Pêşniyarên rojevî nîşan bide</string>
<!-- Preference title for switch preference to show a clipboard suggestion when searching -->
<string name="preferences_show_clipboard_suggestions">Pêşniyarên panoyê nîşan bide</string>
<!-- Preference title for switch preference to suggest browsing history when searching -->
@ -789,6 +791,8 @@
<string name="preferences_account_settings">Sazkariyên hesêb</string>
<!-- Preference for enabling url autocomplete -->
<string name="preferences_enable_autocomplete_urls">Navnîşanan bixweber dagire</string>
<!-- Preference title for switch preference to show sponsored Firefox Suggest search suggestions -->
<string name="preferences_show_sponsored_suggestions">Pêşniyarên ji sponsoran</string>
<!-- Preference for open links in third party apps -->
<string name="preferences_open_links_in_apps">Girêdanan di sepanan de veke</string>
<!-- Preference for open links in third party apps always open in apps option -->
@ -1286,6 +1290,8 @@
<string name="tab_crash_restore">Hilpekînê vegerîne</string>
<!-- Unsubmitted crash dialog negative button to dismiss the dialog -->
<string name="unsubmitted_crash_dialog_negative_button">Bigire</string>
<!-- Unsubmitted crash dialog positive button to submit crash report -->
<string name="unsubmitted_crash_dialog_positive_button">Rapora qezayê bişîne</string>
<!--
Bookmarks

View file

@ -682,6 +682,22 @@
<string name="onboarding_save_and_start_button">ᱥᱟᱸᱪᱟᱣ ᱢᱮ ᱟᱨ ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱮᱦᱚᱵ ᱢᱮ</string>
<!-- Onboarding theme selection card label for 'dark' option, used by Nimbus experiments. -->
<string name="onboarding_customize_theme_dark_option">ᱧᱩᱛ</string>
<!-- Onboarding theme selection card label for 'light' option, used by Nimbus experiments. -->
<string name="onboarding_customize_theme_light_option">ᱢᱟᱨᱥᱟᱞ</string>
<!-- Onboarding theme selection card label for 'System auto' option, used by Nimbus experiments. -->
<string name="onboarding_customize_theme_system_option">ᱥᱤᱥᱴᱚᱢ ᱟᱡ ᱛᱮ</string>
<!-- Onboarding theme selection card content description for the main image. -->
<string name="onboarding_customize_theme_main_image_content_description">ᱪᱤᱛᱟᱹᱨ ᱠᱟᱹᱨᱤᱜᱚᱞᱨ ᱟᱨ ᱵᱤᱞᱰᱟᱨ ᱥᱟᱯᱟᱵ ᱠᱚ ᱩᱫᱩᱜ ᱛᱷᱤᱢ ᱵᱟᱪᱷᱟᱣ ᱧᱮᱞ ᱨᱮᱭᱟᱜ ᱢᱟᱨᱟᱝ ᱦᱮᱰᱟᱨ ᱪᱤᱛᱟᱹᱨ ᱾</string>
<!-- Onboarding theme selection card content description for the theme selection image. %1$s is placeholder for either 'system', 'light' or 'dark'. -->
<string name="onboarding_customize_theme_content_description">%1$s ᱛᱷᱤᱢ ᱨᱮᱭᱟᱜ ᱪᱤᱛᱟᱹᱨ</string>
<!-- Action label for options that can be selected. Talkback will append this to say "Double tap to select". -->
<string name="onboarding_customize_theme_a11y_action_label_select">ᱵᱟᱪᱷᱟᱣ ᱢᱮ</string>
<!--
Widget Picker
Widget description for widget picker screen
-->
<string name="widget_picket_description">ᱩᱥᱟᱹᱨᱟ ᱥᱮᱸᱫᱽᱨᱟ ᱮᱦᱚᱵ ᱢᱮ</string>
<!--
Search Widget
@ -753,6 +769,10 @@
<string name="preferences_add_private_browsing_shortcut">ᱱᱤᱡᱮᱨᱟᱜ ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱠᱷᱟᱴᱚᱢᱟᱪᱷᱟ ᱥᱮᱞᱮᱫᱽ ᱢᱮ</string>
<!-- Preference for enabling "HTTPS-Only" mode -->
<string name="preferences_https_only_title">ᱠᱷᱟᱹᱞᱤᱼHTTPS ᱢᱳᱰ</string>
<!-- Preference title for using the screen lock to hide tabs in private browsing -->
<string name="preferences_pbm_lock_screen_title">ᱯᱨᱟᱭᱣᱮᱴ ᱵᱽᱨᱟᱣᱩᱡᱤᱝ ᱨᱮ ᱴᱮᱵᱽ ᱩᱠᱩ ᱞᱟᱹᱜᱤᱫ ᱥᱠᱨᱤᱱ ᱞᱚᱠ ᱵᱮᱵᱷᱟᱨ ᱢᱮ</string>
<!-- Informs the user how to access the tabs when "Use screen lock to hide tabs in private browsing" is enabled -->
<string name="preferences_pbm_lock_screen_summary">ᱠᱟᱹᱴᱩᱵ ᱪᱤᱛᱟᱹᱨ, ᱪᱮᱦᱨᱟ ᱠᱟᱹᱴᱷᱤ, ᱵᱟᱝᱠᱷᱟᱱ PIN ᱥᱟᱶ ᱴᱮᱵᱽ ᱧᱮᱞ ᱢᱮ ᱾</string>
<!-- Label for cookie banner section in quick settings panel. -->
<string name="cookie_banner_blocker">ᱠᱩᱠᱤ ᱵᱮᱱᱚᱨ ᱟᱠᱚᱴᱤᱭᱟᱹ</string>
<!-- Preference for removing cookie/consent banners from sites automatically in private mode. See reduce_cookie_banner_summary for additional context. -->

View file

@ -491,6 +491,8 @@
<string name="onboarding_first_screen_button_text" moz:removedIn="137" tools:ignore="UnusedResources">Započnite</string>
<!-- New Onboarding flow first screen button label -->
<string name="onboarding_first_screen_button_agree_and_continue">Slažem se, nastavi</string>
<!-- In the first screen of new onboarding flow, additional accessibility description for content that contain urls. -->
<string name="a11y_link_available">Link dostupan</string>
<!--
Onboarding second screen: Title

View file

@ -491,6 +491,8 @@
<string name="onboarding_first_screen_button_text" moz:removedIn="137" tools:ignore="UnusedResources">Comenzar</string>
<!-- New Onboarding flow first screen button label -->
<string name="onboarding_first_screen_button_agree_and_continue">Aceptar y continuar</string>
<!-- In the first screen of new onboarding flow, additional accessibility description for content that contain urls. -->
<string name="a11y_link_available">Enlace disponible</string>
<!--
Onboarding second screen: Title

View file

@ -6,7 +6,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"an": {
"pin": false,
@ -15,7 +15,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ar": {
"pin": false,
@ -24,7 +24,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ast": {
"pin": false,
@ -33,7 +33,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"az": {
"pin": false,
@ -42,7 +42,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"be": {
"pin": false,
@ -51,7 +51,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"bg": {
"pin": false,
@ -60,7 +60,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"bn": {
"pin": false,
@ -69,7 +69,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"br": {
"pin": false,
@ -78,7 +78,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"bs": {
"pin": false,
@ -87,7 +87,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ca": {
"pin": false,
@ -96,7 +96,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"cak": {
"pin": false,
@ -105,7 +105,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"cs": {
"pin": false,
@ -114,7 +114,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"cy": {
"pin": false,
@ -123,7 +123,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"da": {
"pin": false,
@ -132,7 +132,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"de": {
"pin": false,
@ -141,7 +141,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"dsb": {
"pin": false,
@ -150,7 +150,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"el": {
"pin": false,
@ -159,7 +159,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"en-CA": {
"pin": false,
@ -168,7 +168,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"en-GB": {
"pin": false,
@ -177,7 +177,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"eo": {
"pin": false,
@ -186,7 +186,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"es-AR": {
"pin": false,
@ -195,7 +195,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"es-CL": {
"pin": false,
@ -204,7 +204,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"es-ES": {
"pin": false,
@ -213,7 +213,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"es-MX": {
"pin": false,
@ -222,7 +222,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"et": {
"pin": false,
@ -231,7 +231,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"eu": {
"pin": false,
@ -240,7 +240,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"fa": {
"pin": false,
@ -249,7 +249,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ff": {
"pin": false,
@ -258,7 +258,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"fi": {
"pin": false,
@ -267,7 +267,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"fr": {
"pin": false,
@ -276,7 +276,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"fy-NL": {
"pin": false,
@ -285,7 +285,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ga-IE": {
"pin": false,
@ -294,7 +294,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"gd": {
"pin": false,
@ -303,7 +303,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"gl": {
"pin": false,
@ -312,7 +312,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"gn": {
"pin": false,
@ -321,7 +321,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"gu-IN": {
"pin": false,
@ -330,7 +330,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"he": {
"pin": false,
@ -339,7 +339,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"hi-IN": {
"pin": false,
@ -348,7 +348,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"hr": {
"pin": false,
@ -357,7 +357,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"hsb": {
"pin": false,
@ -366,7 +366,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"hu": {
"pin": false,
@ -375,7 +375,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"hy-AM": {
"pin": false,
@ -384,7 +384,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ia": {
"pin": false,
@ -393,7 +393,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"id": {
"pin": false,
@ -402,7 +402,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"is": {
"pin": false,
@ -411,7 +411,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"it": {
"pin": false,
@ -420,7 +420,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ja": {
"pin": false,
@ -429,7 +429,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ka": {
"pin": false,
@ -438,7 +438,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"kab": {
"pin": false,
@ -447,7 +447,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"kk": {
"pin": false,
@ -456,7 +456,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"km": {
"pin": false,
@ -465,7 +465,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"kn": {
"pin": false,
@ -474,7 +474,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ko": {
"pin": false,
@ -483,7 +483,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"lij": {
"pin": false,
@ -492,7 +492,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"lo": {
"pin": false,
@ -501,7 +501,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"lt": {
"pin": false,
@ -510,7 +510,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ltg": {
"pin": false,
@ -519,7 +519,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"lv": {
"pin": false,
@ -528,7 +528,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"meh": {
"pin": false,
@ -537,7 +537,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"mix": {
"pin": false,
@ -546,7 +546,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ml": {
"pin": false,
@ -555,7 +555,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"mr": {
"pin": false,
@ -564,7 +564,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ms": {
"pin": false,
@ -573,7 +573,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"my": {
"pin": false,
@ -582,7 +582,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"nb-NO": {
"pin": false,
@ -591,7 +591,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ne-NP": {
"pin": false,
@ -600,7 +600,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"nl": {
"pin": false,
@ -609,7 +609,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"nn-NO": {
"pin": false,
@ -618,7 +618,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"oc": {
"pin": false,
@ -627,7 +627,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"pa-IN": {
"pin": false,
@ -636,7 +636,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"pl": {
"pin": false,
@ -645,7 +645,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"pt-BR": {
"pin": false,
@ -654,7 +654,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"pt-PT": {
"pin": false,
@ -663,7 +663,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"rm": {
"pin": false,
@ -672,7 +672,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ro": {
"pin": false,
@ -681,7 +681,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ru": {
"pin": false,
@ -690,7 +690,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"sk": {
"pin": false,
@ -699,7 +699,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"sl": {
"pin": false,
@ -708,7 +708,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"son": {
"pin": false,
@ -717,7 +717,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"sq": {
"pin": false,
@ -726,7 +726,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"sr": {
"pin": false,
@ -735,7 +735,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"sv-SE": {
"pin": false,
@ -744,7 +744,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ta": {
"pin": false,
@ -753,7 +753,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"te": {
"pin": false,
@ -762,7 +762,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"th": {
"pin": false,
@ -771,7 +771,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"tl": {
"pin": false,
@ -780,7 +780,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"tr": {
"pin": false,
@ -789,7 +789,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"trs": {
"pin": false,
@ -798,7 +798,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"uk": {
"pin": false,
@ -807,7 +807,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"ur": {
"pin": false,
@ -816,7 +816,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"uz": {
"pin": false,
@ -825,7 +825,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"vi": {
"pin": false,
@ -834,7 +834,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"wo": {
"pin": false,
@ -843,7 +843,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"xh": {
"pin": false,
@ -852,7 +852,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"zam": {
"pin": false,
@ -861,7 +861,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"zh-CN": {
"pin": false,
@ -870,7 +870,7 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
},
"zh-TW": {
"pin": false,
@ -879,6 +879,6 @@
"android-arm",
"android-multilocale"
],
"revision": "22ddd09d5b7bf939862d445984bc2c3095dc2503"
"revision": "467538f140e3a848feafd5eba60654350dcce57f"
}
}

View file

@ -5235,11 +5235,7 @@
# Maximum value of navigator.hardwareConcurrency.
- name: dom.maxHardwareConcurrency
type: RelaxedAtomicUint32
#ifdef NIGHTLY_BUILD
value: 128
#else
value: 16
#endif
mirror: always
# W3C pointer events draft.
@ -18652,7 +18648,7 @@
# * 2: auto
- name: widget.windows.follow_shortcuts_on_file_open
type: RelaxedAtomicInt32
value: 2
value: 1
mirror: always
# The number of messages of each type to keep for display in

View file

@ -3343,7 +3343,7 @@ pref("urlclassifier.features.consentmanager.annotate.allowlistTables", "mozstd-t
pref("urlclassifier.disallow_completions", "goog-downloadwhite-digest256,base-track-digest256,mozstd-trackwhite-digest256,content-track-digest256,mozplugin-block-digest256,mozplugin2-block-digest256,ads-track-digest256,social-track-digest256,analytics-track-digest256,base-fingerprinting-track-digest256,content-fingerprinting-track-digest256,base-cryptomining-track-digest256,content-cryptomining-track-digest256,fanboyannoyance-ads-digest256,fanboysocial-ads-digest256,easylist-ads-digest256,easyprivacy-ads-digest256,adguard-ads-digest256,social-tracking-protection-digest256,social-tracking-protection-facebook-digest256,social-tracking-protection-linkedin-digest256,social-tracking-protection-twitter-digest256,base-email-track-digest256,content-email-track-digest256,consent-manager-track-digest256");
// Workaround for Google Recaptcha
pref("urlclassifier.trackingAnnotationSkipURLs", "*://google.com/recaptcha/*,*://*.google.com/recaptcha/*,*://d3vox9szr7t2nm.cloudfront.net/*");
pref("urlclassifier.trackingAnnotationSkipURLs", "");
pref("privacy.rejectForeign.allowList", "");
// The list of email webapp sites

View file

@ -8,7 +8,7 @@
# documentation and how to modify this file.
repo: mozilla-central
created_at: '2021-10-14T12:50:40.073465'
updated_at: '2025-04-02T20:26:15.852994+00:00'
updated_at: '2025-04-07T08:24:03.558859+00:00'
export:
path: ./docs/mots/index.rst
format: rst
@ -1273,6 +1273,7 @@ modules:
- *bvandersloot
- *dimi
- *emz
- *tjr
machine_name: core_antitracking
- name: 'Core: APZ (Graphics submodule)'
@ -4546,5 +4547,5 @@ modules:
- Ryan Tilder
group: dev-platform
hashes:
config: 93b411d8790c372028509fc186c01b8a34ec8cd5
export: 3823627c4a11aab9dc12d92537080eeddffceb34
config: 191cbfa5573d7c94c637045ac3ed62e662fb1b03
export: 7fb1baa3c6c64954bdaca31c752859f93cf2b78b

View file

@ -35,7 +35,7 @@ from mozbuild.base import (
MozbuildObject,
)
from mozbuild.base import MachCommandConditions as conditions
from mozbuild.util import MOZBUILD_METRICS_PATH
from mozbuild.util import MOZBUILD_METRICS_PATH, ForwardingArgumentParser
here = os.path.abspath(os.path.dirname(__file__))
@ -1476,7 +1476,7 @@ def _get_android_run_parser():
def _get_jsshell_run_parser():
parser = argparse.ArgumentParser()
parser = ForwardingArgumentParser()
group = parser.add_argument_group("Compiled Program Environment Options")
group = parser.add_argument_group("debugging")
@ -1506,22 +1506,12 @@ def _get_jsshell_run_parser():
help=argparse.SUPPRESS,
)
group = parser.add_argument_group("Compiled Program Options")
# Trick ArgumentParser into displaying an advice to access program help
group.add_argument(
"fake_help",
nargs=argparse.REMAINDER,
default=[],
metavar="-- --help",
help="Display the program help.",
)
group.add_argument(
"params",
nargs=argparse.REMAINDER,
default=[],
metavar="[--] params...",
parser.add_forwarding_group(
title="Compiled Program Options",
dest="params",
help="Command-line arguments to be passed through to the program. "
"Omitting --profile or -P results in a temporary profile being used.",
forwarding_help="Display the program help.",
)
return parser
@ -1529,7 +1519,7 @@ def _get_jsshell_run_parser():
def _get_desktop_run_parser():
parser = argparse.ArgumentParser()
parser = ForwardingArgumentParser()
group = parser.add_argument_group("Compiled Program Environment Options")
group.add_argument("--packaged", action="store_true", help="Run a packaged build.")
group.add_argument(
@ -1632,25 +1622,13 @@ def _get_desktop_run_parser():
"--show-dump-stats", action="store_true", help="Show stats when doing dumps."
)
group = parser.add_argument_group("Compiled Program Options")
# Trick ArgumentParser into displaying an advice to access program help
group.add_argument(
"fake_help",
nargs=argparse.REMAINDER,
default=[],
metavar="-- --help",
help="Display the program help.",
)
group.add_argument(
"params",
nargs=argparse.REMAINDER,
default=[],
metavar="[--] params...",
parser.add_forwarding_group(
title="Compiled Program Options",
dest="params",
help="Command-line arguments to be passed through to the program. "
"Omitting --profile or -P results in a temporary profile being used.",
forwarding_help="Display the program help.",
)
return parser
@ -1672,10 +1650,6 @@ def setup_run_parser():
)
def run(command_context, **kwargs):
"""Run the compiled program."""
# Get rid of fake_help artifact
fake_help = kwargs.pop("fake_help", None)
assert not fake_help
if conditions.is_android(command_context):
return _run_android(command_context, **kwargs)
if conditions.is_jsshell(command_context):

View file

@ -7,6 +7,7 @@ import copy
import hashlib
import itertools
import os
import re
import string
import sys
import unittest
@ -19,6 +20,7 @@ from mozunit import main
from mozbuild.util import (
EnumString,
EnumStringComparisonError,
ForwardingArgumentParser,
HierarchicalStringList,
MozbuildDeletionError,
ReadOnlyDict,
@ -886,5 +888,38 @@ def test_read_only_dict():
assert isinstance(d_copy, ReadOnlyDict)
def test_forwarding_argument_parser():
# init
parser = ForwardingArgumentParser()
parser.add_forwarding_group(
title="my forwarding group",
dest="fwd",
help="some program",
forwarding_help="some help",
)
# test help format
formatted_help = parser.format_help()
ref_help = """\
usage: test_util.py \\[-h\\] ...
option.*:
-h, --help show this help message and exit
my forwarding group:
-- --help some help
\\[--\\] fwd... some program
"""
assert re.match(ref_help, formatted_help)
# test argument parsing
forwarded_args = parser.parse_args(["1", "2"])
assert forwarded_args.fwd == ["1", "2"]
forwarded_help = parser.parse_args(["--", "--help"])
assert forwarded_help.fwd == ["--", "--help"]
if __name__ == "__main__":
main()

View file

@ -1132,6 +1132,33 @@ def expand_variables(s, variables):
return result
class ForwardingArgumentParser(argparse.ArgumentParser):
"""
An argument parser with customized help generation when forwarding
arguments.
"""
def add_forwarding_group(
self, title, dest, help, forwarding_help, default_type=list, **kwargs
):
"""
Add a group that captures all remaining arguments in order to pass them
down to another program.
"""
group = self.add_argument_group(
title, description=f"-- --help {forwarding_help}", **kwargs
)
group.add_argument(
dest,
nargs=argparse.REMAINDER,
default=default_type(),
metavar=f"[--] {dest}...",
help=help,
)
return group
class DefinesAction(argparse.Action):
"""An ArgumentParser action to handle -Dvar[=value] type of arguments."""

View file

@ -142,7 +142,7 @@ macro_rules! lnf_int_variable {
}};
}
static CHROME_ENVIRONMENT_VARIABLES: [EnvironmentVariable; 9] = [
static CHROME_ENVIRONMENT_VARIABLES: [EnvironmentVariable; 10] = [
lnf_int_variable!(
atom!("-moz-mac-titlebar-height"),
MacTitlebarHeight,
@ -158,6 +158,11 @@ static CHROME_ENVIRONMENT_VARIABLES: [EnvironmentVariable; 9] = [
TitlebarRadius,
int_pixels
),
lnf_int_variable!(
atom!("-moz-gtk-csd-tooltip-radius"),
TooltipRadius,
int_pixels
),
lnf_int_variable!(
atom!("-moz-gtk-csd-close-button-position"),
GTKCSDCloseButtonPosition,

View file

@ -76,7 +76,7 @@ tasks:
fedora42:
image: fedora:42
pre-commands:
- dnf install -y mercurial python3-pip
- dnf install -y mercurial python3-pip awk
rockylinux8:
image: rockylinux:8
pre-commands:

View file

@ -1,3 +0,0 @@
[key-conversion-exceptions.htm]
expected:
if (os == "android") and fission: [OK, TIMEOUT]

View file

@ -1,3 +0,0 @@
[key_invalid.htm]
expected:
if (os == "android") and fission: [TIMEOUT, OK]

View file

@ -1,3 +0,0 @@
[key_valid.html]
expected:
if (os == "android") and fission: [OK, TIMEOUT]

View file

@ -1,52 +0,0 @@
[keyorder.htm]
expected:
if (os == "win") and not debug and (processor == "x86"): [OK, TIMEOUT]
if (os == "linux") and asan and fission: CRASH
if (os == "mac") and not debug: [OK, CRASH]
[Database readback sort - String < Array]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - float < String]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - float < Date]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - float < Date < String < Array]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - Date(1 sec ago) < Date(now) < Date(1 minute in future)]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - -1.1 < 1 < 1.01337 < 1.013373 < 2]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - -Infinity < -0.01 < 0 < Infinity]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - "" < "a" < "ab" < "b" < "ba"]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - Arrays]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - Array.length: 10,000 < Array.length: 10,001]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - Infinity inside arrays]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]
[Database readback sort - Test different stuff at once]
expected:
if (processor == "x86") and not debug: [PASS, NOTRUN]

View file

@ -14,12 +14,6 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[LanguageDetector.create() call with an aborted signal.]
expected: FAIL
@ -47,15 +41,18 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[Creating LanguageDetector with expectedInputLanguages]
expected: FAIL
[LanguageDetector.create() notifies its monitor on downloadprogress]
expected: FAIL
[LanguageDetector.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting LanguageDetector.measureInputUsage().]
expected: FAIL
[detector.https.tentative.any.html]
[Simple LanguageDetector.availability() call]
@ -73,12 +70,6 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[LanguageDetector.create() call with an aborted signal.]
expected: FAIL
@ -106,15 +97,18 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[Creating LanguageDetector with expectedInputLanguages]
expected: FAIL
[LanguageDetector.create() notifies its monitor on downloadprogress]
expected: FAIL
[LanguageDetector.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting LanguageDetector.measureInputUsage().]
expected: FAIL
[detector.https.tentative.any.serviceworker.html]
[Simple LanguageDetector.availability() call]
@ -132,12 +126,6 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[LanguageDetector.create() call with an aborted signal.]
expected: FAIL
@ -165,15 +153,18 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[Creating LanguageDetector with expectedInputLanguages]
expected: FAIL
[LanguageDetector.create() notifies its monitor on downloadprogress]
expected: FAIL
[LanguageDetector.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting LanguageDetector.measureInputUsage().]
expected: FAIL
[detector.https.tentative.any.sharedworker.html]
[Simple LanguageDetector.availability() call]
@ -191,12 +182,6 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[LanguageDetector.create() call with an aborted signal.]
expected: FAIL
@ -224,11 +209,14 @@
[LanguageDetector.measureInputUsage() and inputQuota basic usage.]
expected: FAIL
[Translator.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting Translator.measureInputUsage().]
expected: FAIL
[Creating LanguageDetector with expectedInputLanguages]
expected: FAIL
[LanguageDetector.create() notifies its monitor on downloadprogress]
expected: FAIL
[LanguageDetector.measureInputUsage() call with an aborted signal.]
expected: FAIL
[Aborting LanguageDetector.measureInputUsage().]
expected: FAIL

View file

@ -26,9 +26,6 @@
[Aborting Translator.translate().]
expected: FAIL
[Translator.create() monitor option is called correctly.]
expected: FAIL
[Translator.translate() echos non-translatable content]
expected: FAIL
@ -40,3 +37,6 @@
[Aborting Translator.measureInputUsage().]
expected: FAIL
[Translator.create() notifies its monitor on downloadprogress]
expected: FAIL

View file

@ -0,0 +1,6 @@
[clear-cache-bfcache.sub.https.html]
[BfCached document shouldn't be cached after receiving clear-cache header from the same origin.]
expected: FAIL
[BfCached document shouldn't be cached after receiving clear-cache header from another window.]
expected: FAIL

View file

@ -1,3 +0,0 @@
[partitioned-cookies-same-site-subresource-to-cross-site-redirect.tentative.https.html]
[Partitioned cookies are not sent in embedded same-site to cross-site redirects]
expected: FAIL

View file

@ -45,3 +45,36 @@
[corner-shape-render-fuzzy.html?corner-shape=squircle&border-radius=50%]
expected: FAIL
[corner-shape-render-fuzzy.html?border-radius=30%&corner-shape=superellipse(0.4)&box-shadow=10px%2010px%200%2010px%20black]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(8)&border-radius=40px&box-shadow=10px 10px 0 10px black]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(-2)&border-radius=20%&border-width=20px]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(3)&border-radius=40px&box-shadow=10px 10px 0 10px black]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(5)&border-radius=20%&border-width=20px]
expected: FAIL
[corner-shape-render-fuzzy.html?border-radius=40%&corner-shape=notch&box-shadow=10px%2010px%200%2010px%20yellow]
expected: FAIL
[corner-shape-render-fuzzy.html?border-radius=30%&corner-shape=superellipse(-1.5)&box-shadow=10px%2010px%200%2010px%20black]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(2.5)&border-radius=20%&border-width=10px]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(-7)&border-radius=20%&border-width=20px]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-top-left-shape=superellipse(-4)&border-radius=40%]
expected: FAIL
[corner-shape-render-fuzzy.html?corner-shape=superellipse(0.8)&border-radius=40px&border-width=10px&border-left-color=purple]
expected: FAIL

View file

@ -48,3 +48,36 @@
[corner-shape-render-precise.html?corner-shape=squircle&border-top-right-radius=30px]
expected: FAIL
[corner-shape-render-precise.html?border-top-left-radius=50%&corner-shape=superellipse(1.4)&border-left-width=30px&border-top-width=30px]
expected: FAIL
[corner-shape-render-precise.html?corner-bottom-right-shape=superellipse(0.8)&border-bottom-right-radius=50%]
expected: FAIL
[corner-shape-render-precise.html?corner-shape=superellipse(3)&border-top-right-radius=33px]
expected: FAIL
[corner-shape-render-precise.html?corner-shape=superellipse(2.3)&border-radius=40%]
expected: FAIL
[corner-shape-render-precise.html?border-top-left-radius=50%&corner-shape=superellipse(0.7)&border-left-width=30px&border-top-width=30px]
expected: FAIL
[corner-shape-render-precise.html?border-radius=50%&corner-shape=bevel&box-shadow=10px%2010px%200%2010px%20black]
expected: FAIL
[corner-shape-render-precise.html?corner-shape=square&border-bottom-left-radius=5px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-left-shape=superellipse(0.5)&border-radius=40px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-left-shape=superellipse(-4)&border-radius=40px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-left-shape=superellipse(-0.5)&border-radius=40px]
expected: FAIL
[corner-shape-render-precise.html?corner-top-right-shape=superellipse(-4)&border-top-right-radius=50px]
expected: FAIL

View file

@ -0,0 +1,2 @@
[corner-shape-square.html]
expected: FAIL

View file

@ -1,2 +0,0 @@
[corner-shape-straight.html]
expected: FAIL

View file

@ -20,9 +20,6 @@
[Property corner-top-left-shape value 'superellipse(2)']
expected: FAIL
[Property corner-top-left-shape value 'superellipse( .5)']
expected: FAIL
[Property corner-top-right-shape value 'round']
expected: FAIL
@ -59,12 +56,6 @@
[Property corner-top-left-shape value 'superellipse(1)']
expected: FAIL
[Property corner-top-left-shape value 'superellipse(4)']
expected: FAIL
[Property corner-top-left-shape value 'superellipse( .5)']
expected: FAIL
[Property corner-top-right-shape value 'round']
expected: FAIL
@ -86,9 +77,6 @@
[Property corner-shape value 'bevel superellipse(0.1) round squircle']
expected: FAIL
[Property corner-shape value 'superellipse(0.1) superellipse(3) superellipse(7) superellipse(0.1)']
expected: FAIL
[Property corner-shape value 'round round round round']
expected: FAIL
@ -98,17 +86,26 @@
[Property corner-shape value 'round scoop round scoop']
expected: FAIL
[Property corner-shape value 'bevel superellipse(2)']
[Property corner-top-left-shape value 'superellipse(-infinity)']
expected: FAIL
[Property corner-shape value 'superellipse(0.5) superellipse(3) straight']
[Property corner-top-left-shape value 'superellipse( -1)']
expected: FAIL
[Property corner-shape value 'superellipse(0.5) superellipse(3) superellipse(1)']
[Property corner-shape value 'superellipse(-5) superellipse(3) superellipse(7) superellipse(-5.5)']
expected: FAIL
[Property corner-shape value 'bevel superellipse(2) squircle round']
[Property corner-shape value 'bevel superellipse(1)']
expected: FAIL
[Property corner-shape value 'superellipse(0.5) superellipse(3) superellipse(1) superellipse(infinity)']
[Property corner-shape value 'superellipse(-1) superellipse(3) square']
expected: FAIL
[Property corner-shape value 'superellipse(-1) superellipse(3) superellipse(0)']
expected: FAIL
[Property corner-shape value 'bevel superellipse(1) squircle round']
expected: FAIL
[Property corner-shape value 'superellipse(-1) superellipse(3) superellipse(0) superellipse(infinity)']
expected: FAIL

View file

@ -14,9 +14,6 @@
[e.style['corner-top-left-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -56,9 +53,6 @@
[e.style['corner-top-right-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -98,9 +92,6 @@
[e.style['corner-bottom-left-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -140,9 +131,6 @@
[e.style['corner-bottom-right-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -182,9 +170,6 @@
[e.style['corner-start-start-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -224,9 +209,6 @@
[e.style['corner-start-end-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -266,9 +248,6 @@
[e.style['corner-end-start-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -308,9 +287,6 @@
[e.style['corner-end-end-shape'\] = "squircle" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "straight" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "superellipse(2)" should set the property value]
expected: FAIL
@ -347,9 +323,6 @@
[e.style['corner-shape'\] = "bevel superellipse(2)" should set the property value]
expected: FAIL
[e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) straight" should set the property value]
expected: FAIL
[e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) superellipse(1)" should set the property value]
expected: FAIL
@ -358,3 +331,105 @@
[e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) superellipse(1) superellipse(infinity)" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-top-left-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-top-right-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-bottom-left-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-bottom-right-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-start-start-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-start-end-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-end-start-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "square" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "superellipse(-infinity)" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "superellipse(-0.5)" should set the property value]
expected: FAIL
[e.style['corner-end-end-shape'\] = "superellipse(-4)" should set the property value]
expected: FAIL
[e.style['corner-shape'\] = "superellipse(0.5) superellipse(3) square" should set the property value]
expected: FAIL
[e.style['corner-shape'\] = "superellipse(-0.5) superellipse(3) square superellipse(-30)" should set the property value]
expected: FAIL

View file

@ -1,2 +1,3 @@
[block-001-wm-vlr-print.html]
fuzzy: maxDifference=0-76;totalPixels=0-120
max-asserts: 2

View file

@ -1,5 +0,0 @@
[font-stretch-computed.html]
expected:
if (os == "android") and fission: [OK, TIMEOUT]
[Property font-stretch value 'calc(100% + (sign(20cqw - 10px) * 5%))']
expected: FAIL

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