diff --git a/accessible/base/nsAccessibilityService.cpp b/accessible/base/nsAccessibilityService.cpp index 8e0a973ba04..79797feae9e 100644 --- a/accessible/base/nsAccessibilityService.cpp +++ b/accessible/base/nsAccessibilityService.cpp @@ -456,7 +456,7 @@ nsAccessibilityService::ListenersChanged(nsIArray* aEventChanges) { } // A click listener change might mean losing or gaining an action. - acc->SendCache(CacheDomain::Actions, CacheUpdateType::Update); + document->QueueCacheUpdate(acc, CacheDomain::Actions); } } } diff --git a/accessible/generic/ImageAccessible.cpp b/accessible/generic/ImageAccessible.cpp index 3592503836b..8f1991e6cd6 100644 --- a/accessible/generic/ImageAccessible.cpp +++ b/accessible/generic/ImageAccessible.cpp @@ -110,7 +110,7 @@ void ImageAccessible::DOMAttributeChanged(int32_t aNameSpaceID, if (aAttribute == nsGkAtoms::longdesc && (aModType == dom::MutationEvent_Binding::ADDITION || aModType == dom::MutationEvent_Binding::REMOVAL)) { - SendCache(CacheDomain::Actions, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Actions); } } diff --git a/accessible/generic/LocalAccessible.cpp b/accessible/generic/LocalAccessible.cpp index 20a3827d21d..0e6b1e0a70b 100644 --- a/accessible/generic/LocalAccessible.cpp +++ b/accessible/generic/LocalAccessible.cpp @@ -1389,7 +1389,7 @@ void LocalAccessible::DOMAttributeChanged(int32_t aNameSpaceID, (aAttribute == nsGkAtoms::aria_valuemax || aAttribute == nsGkAtoms::aria_valuemin || aAttribute == nsGkAtoms::min || aAttribute == nsGkAtoms::max || aAttribute == nsGkAtoms::step)) { - SendCache(CacheDomain::Value, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Value); return; } @@ -1409,7 +1409,7 @@ void LocalAccessible::DOMAttributeChanged(int32_t aNameSpaceID, } else { // We need to update the cache here since we won't get an event if // aria-valuenow is shadowed by aria-valuetext. - SendCache(CacheDomain::Value, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Value); } return; } @@ -1480,7 +1480,7 @@ void LocalAccessible::DOMAttributeChanged(int32_t aNameSpaceID, (aModType == dom::MutationEvent_Binding::ADDITION || aModType == dom::MutationEvent_Binding::REMOVAL)) { // The presence of aria-expanded adds an expand/collapse action. - SendCache(CacheDomain::Actions, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Actions); } if (aAttribute == nsGkAtoms::href || aAttribute == nsGkAtoms::src) { @@ -1550,7 +1550,7 @@ void LocalAccessible::DOMAttributeChanged(int32_t aNameSpaceID, if (aAttribute == nsGkAtoms::aria_level || aAttribute == nsGkAtoms::aria_setsize || aAttribute == nsGkAtoms::aria_posinset) { - SendCache(CacheDomain::GroupInfo, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::GroupInfo); return; } diff --git a/accessible/html/HTMLElementAccessibles.cpp b/accessible/html/HTMLElementAccessibles.cpp index 78556a8bea1..f3218c92bf2 100644 --- a/accessible/html/HTMLElementAccessibles.cpp +++ b/accessible/html/HTMLElementAccessibles.cpp @@ -65,8 +65,7 @@ void HTMLLabelAccessible::DOMAttributeChanged(int32_t aNameSpaceID, aModType, aOldValue, aOldState); if (aAttribute == nsGkAtoms::_for) { - mDoc->QueueCacheUpdate(this, CacheDomain::Relations); - SendCache(CacheDomain::Actions, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Relations | CacheDomain::Actions); } } diff --git a/accessible/html/HTMLLinkAccessible.cpp b/accessible/html/HTMLLinkAccessible.cpp index c90b63083b2..eba138a5699 100644 --- a/accessible/html/HTMLLinkAccessible.cpp +++ b/accessible/html/HTMLLinkAccessible.cpp @@ -11,6 +11,7 @@ #include "States.h" #include "nsContentUtils.h" +#include "mozilla/a11y/DocAccessible.h" #include "mozilla/dom/Element.h" #include "mozilla/dom/MutationEventBinding.h" @@ -107,7 +108,7 @@ void HTMLLinkAccessible::DOMAttributeChanged(int32_t aNameSpaceID, if (aAttribute == nsGkAtoms::href && (aModType == dom::MutationEvent_Binding::ADDITION || aModType == dom::MutationEvent_Binding::REMOVAL)) { - SendCache(CacheDomain::Actions, CacheUpdateType::Update); + mDoc->QueueCacheUpdate(this, CacheDomain::Actions); } } diff --git a/accessible/html/HTMLTableAccessible.cpp b/accessible/html/HTMLTableAccessible.cpp index 421eba1135b..b1a8bc430c5 100644 --- a/accessible/html/HTMLTableAccessible.cpp +++ b/accessible/html/HTMLTableAccessible.cpp @@ -28,7 +28,6 @@ #include "nsCoreUtils.h" #include "nsDebug.h" #include "nsIHTMLCollection.h" -#include "nsITableCellLayout.h" #include "nsError.h" #include "nsGkAtoms.h" #include "nsLiteralString.h" @@ -184,54 +183,27 @@ HTMLTableAccessible* HTMLTableCellAccessible::Table() const { } uint32_t HTMLTableCellAccessible::ColExtent() const { - int32_t rowIdx = -1, colIdx = -1; - if (NS_FAILED(GetCellIndexes(rowIdx, colIdx))) { + nsTableCellFrame* cell = do_QueryFrame(GetFrame()); + if (!cell) { // This probably isn't a table according to the layout engine; e.g. it has // display: block. return 1; } - - HTMLTableAccessible* table = Table(); - if (NS_WARN_IF(!table)) { - // This can happen where there is a inside a
such as - // in Monorail. - return 1; - } - - return table->ColExtentAt(rowIdx, colIdx); + nsTableFrame* table = cell->GetTableFrame(); + MOZ_ASSERT(table); + return table->GetEffectiveColSpan(*cell); } uint32_t HTMLTableCellAccessible::RowExtent() const { - int32_t rowIdx = -1, colIdx = -1; - if (NS_FAILED(GetCellIndexes(rowIdx, colIdx))) { + nsTableCellFrame* cell = do_QueryFrame(GetFrame()); + if (!cell) { // This probably isn't a table according to the layout engine; e.g. it has // display: block. return 1; } - - HTMLTableAccessible* table = Table(); - if (NS_WARN_IF(!table)) { - // This can happen where there is a inside a
such as - // in Monorail. - return 1; - } - - return table->RowExtentAt(rowIdx, colIdx); -} - -//////////////////////////////////////////////////////////////////////////////// -// HTMLTableCellAccessible: protected implementation - -nsITableCellLayout* HTMLTableCellAccessible::GetCellLayout() const { - return do_QueryFrame(mContent->GetPrimaryFrame()); -} - -nsresult HTMLTableCellAccessible::GetCellIndexes(int32_t& aRowIdx, - int32_t& aColIdx) const { - nsITableCellLayout* cellLayout = GetCellLayout(); - NS_ENSURE_STATE(cellLayout); - - return cellLayout->GetCellIndexes(aRowIdx, aColIdx); + nsTableFrame* table = cell->GetTableFrame(); + MOZ_ASSERT(table); + return table->GetEffectiveRowSpan(*cell); } //////////////////////////////////////////////////////////////////////////////// @@ -447,24 +419,6 @@ uint32_t HTMLTableAccessible::RowCount() { return tableFrame ? tableFrame->GetRowCount() : 0; } -uint32_t HTMLTableAccessible::ColExtentAt(uint32_t aRowIdx, uint32_t aColIdx) { - nsTableWrapperFrame* tableFrame = GetTableWrapperFrame(); - if (!tableFrame) { - return 1; - } - - return tableFrame->GetEffectiveColSpanAt(aRowIdx, aColIdx); -} - -uint32_t HTMLTableAccessible::RowExtentAt(uint32_t aRowIdx, uint32_t aColIdx) { - nsTableWrapperFrame* tableFrame = GetTableWrapperFrame(); - if (!tableFrame) { - return 1; - } - - return tableFrame->GetEffectiveRowSpanAt(aRowIdx, aColIdx); -} - bool HTMLTableAccessible::IsProbablyLayoutTable() { // Implement a heuristic to determine if table is most likely used for layout. diff --git a/accessible/html/HTMLTableAccessible.h b/accessible/html/HTMLTableAccessible.h index d738f64aa1f..d9ee264fc4e 100644 --- a/accessible/html/HTMLTableAccessible.h +++ b/accessible/html/HTMLTableAccessible.h @@ -55,16 +55,6 @@ class HTMLTableCellAccessible : public HyperTextAccessibleWrap { protected: virtual ~HTMLTableCellAccessible() {} - - /** - * Return nsITableCellLayout of the table cell frame. - */ - nsITableCellLayout* GetCellLayout() const; - - /** - * Return row and column indices of the cell. - */ - nsresult GetCellIndexes(int32_t& aRowIdx, int32_t& aColIdx) const; }; /** @@ -123,8 +113,6 @@ class HTMLTableAccessible : public HyperTextAccessibleWrap { LocalAccessible* Caption() const; uint32_t ColCount() const; uint32_t RowCount(); - uint32_t ColExtentAt(uint32_t aRowIdx, uint32_t aColIdx); - uint32_t RowExtentAt(uint32_t aRowIdx, uint32_t aColIdx); bool IsProbablyLayoutTable(); static HTMLTableAccessible* GetFrom(LocalAccessible* aAcc) { diff --git a/accessible/tests/browser/e10s/browser_caching_value.js b/accessible/tests/browser/e10s/browser_caching_value.js index 0e3cda93afa..03a2b6078e1 100644 --- a/accessible/tests/browser/e10s/browser_caching_value.js +++ b/accessible/tests/browser/e10s/browser_caching_value.js @@ -5,11 +5,7 @@ "use strict"; /* import-globals-from ../../mochitest/states.js */ -/* import-globals-from ../../mochitest/value.js */ -loadScripts( - { name: "states.js", dir: MOCHITESTS_DIR }, - { name: "value.js", dir: MOCHITESTS_DIR } -); +loadScripts({ name: "states.js", dir: MOCHITESTS_DIR }); /** * Test data has the format of: @@ -202,6 +198,36 @@ const valueTests = [ }, ]; +/** + * Like testValue in accessible/tests/mochitest/value.js, but waits for cache + * updates. + */ +async function testValue(acc, value, currValue, minValue, maxValue, minIncr) { + const pretty = prettyName(acc); + await untilCacheIs(() => acc.value, value, `Wrong value of ${pretty}`); + + await untilCacheIs( + () => acc.currentValue, + currValue, + `Wrong current value of ${pretty}` + ); + await untilCacheIs( + () => acc.minimumValue, + minValue, + `Wrong minimum value of ${pretty}` + ); + await untilCacheIs( + () => acc.maximumValue, + maxValue, + `Wrong maximum value of ${pretty}` + ); + await untilCacheIs( + () => acc.minimumIncrement, + minIncr, + `Wrong minimum increment value of ${pretty}` + ); +} + /** * Test caching of accessible object values */ @@ -239,7 +265,7 @@ addAccessibleTask( await onUpdate; if (Array.isArray(expected)) { acc.QueryInterface(nsIAccessibleValue); - testValue(acc, ...expected); + await testValue(acc, ...expected); } else { is(acc.value, expected, `Correct value for ${prettyName(acc)}`); } diff --git a/accessible/tests/crashtests/crashtests.list b/accessible/tests/crashtests/crashtests.list index 8d1ecc7e014..d66a11cdfa2 100644 --- a/accessible/tests/crashtests/crashtests.list +++ b/accessible/tests/crashtests/crashtests.list @@ -8,7 +8,7 @@ load 1072792.xhtml load 1380199.html load 1402999.html load 1463962.html -# load 1472024-1.html - This can still fail. See bug 1843389. +load 1472024-1.html load 1472024-2.html load 1484778.html load 1494707.html diff --git a/browser/app/moz.build b/browser/app/moz.build index fcf98d6d48b..a933a3cb9bd 100644 --- a/browser/app/moz.build +++ b/browser/app/moz.build @@ -32,12 +32,16 @@ with Files("profile/firefox.js"): if CONFIG["MOZ_MACBUNDLE_NAME"]: DIRS += ["macbuild/Contents"] +browser_linkage = "standalone" +if CONFIG["FUZZING_SNAPSHOT"] or CONFIG["AFLFUZZ"]: + browser_linkage = "dependent" + if CONFIG["MOZ_NO_PIE_COMPAT"]: - GeckoProgram(CONFIG["MOZ_APP_NAME"] + "-bin") + GeckoProgram(CONFIG["MOZ_APP_NAME"] + "-bin", linkage=browser_linkage) DIRS += ["no-pie"] else: - GeckoProgram(CONFIG["MOZ_APP_NAME"]) + GeckoProgram(CONFIG["MOZ_APP_NAME"], linkage=browser_linkage) SOURCES += [ "nsBrowserApp.cpp", diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index aba5a9700b6..249117f9f79 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -1549,36 +1549,6 @@ var gBrowserInit = { new LightweightThemeConsumer(document); - if (AppConstants.platform == "win") { - if ( - window.matchMedia("(-moz-platform: windows-win8)").matches && - window.matchMedia("(-moz-windows-default-theme)").matches - ) { - let windowFrameColor = new Color( - ...ChromeUtils.importESModule( - "resource:///modules/Windows8WindowFrameColor.sys.mjs" - ).Windows8WindowFrameColor.get() - ); - // Default to black for foreground text. - if (!windowFrameColor.isContrastRatioAcceptable(new Color(0, 0, 0))) { - document.documentElement.setAttribute("darkwindowframe", "true"); - } - } else if (AppConstants.isPlatformAndVersionAtLeast("win", "10")) { - TelemetryEnvironment.onInitialized().then(() => { - // 17763 is the build number of Windows 10 version 1809 - if ( - TelemetryEnvironment.currentEnvironment.system.os - .windowsBuildNumber < 17763 - ) { - document.documentElement.setAttribute( - "always-use-accent-color-for-window-border", - "" - ); - } - }); - } - } - if ( Services.prefs.getBoolPref( "toolkit.legacyUserProfileCustomizations.windowIcon", @@ -2973,7 +2943,8 @@ function BrowserOpenFileWindow() { nsIFilePicker.filterText | nsIFilePicker.filterImages | nsIFilePicker.filterXML | - nsIFilePicker.filterHTML + nsIFilePicker.filterHTML | + nsIFilePicker.filterPDF ); fp.displayDirectory = gLastOpenDirectory.path; fp.open(fpCallback); @@ -5872,6 +5843,15 @@ var TabsProgressListener = { }, onLocationChange(aBrowser, aWebProgress, aRequest, aLocationURI, aFlags) { + // Filter out location changes in sub documents. + if (!aWebProgress.isTopLevel) { + return; + } + + // Some shops use pushState to move between individual products, so + // the shopping code needs to be told about all of these. + ShoppingSidebarManager.onLocationChange(aBrowser, aLocationURI); + // Filter out location changes caused by anchor navigation // or history.push/pop/replaceState. if (aFlags & Ci.nsIWebProgressListener.LOCATION_CHANGE_SAME_DOCUMENT) { @@ -5887,11 +5867,6 @@ var TabsProgressListener = { return; } - // Filter out location changes in sub documents. - if (!aWebProgress.isTopLevel) { - return; - } - // Only need to call locationChange if the PopupNotifications object // for this window has already been initialized (i.e. its getter no // longer exists) @@ -5908,7 +5883,6 @@ var TabsProgressListener = { FullZoom.onLocationChange(aLocationURI, false, aBrowser); CaptivePortalWatcher.onLocationChange(aBrowser); - ShoppingSidebarManager.onLocationChange(aBrowser, aLocationURI); }, onLinkIconAvailable(browser, dataURI, iconURI) { @@ -9987,6 +9961,12 @@ var ShoppingSidebarManager = { return isProductURL(locationURI); }, + /** + * Called by TabsProgressListener whenever any browser navigates from one + * URL to another. + * Note that this includes hash changes / pushState navigations, because + * those can be significant for us. + */ onLocationChange(aBrowser, aLocationURI) { if (!this._enabled) { return; diff --git a/browser/components/firefoxview/card-container.css b/browser/components/firefoxview/card-container.css index 4d3b28bed88..f1562c9c66c 100644 --- a/browser/components/firefoxview/card-container.css +++ b/browser/components/firefoxview/card-container.css @@ -129,3 +129,9 @@ width: 20%; } } + +.card-container.inner { + border: 1px solid var(--fxview-border); + box-shadow: none; + margin-block: 8px 0; +} diff --git a/browser/components/firefoxview/card-container.mjs b/browser/components/firefoxview/card-container.mjs index 232826cf69e..a51995728ca 100644 --- a/browser/components/firefoxview/card-container.mjs +++ b/browser/components/firefoxview/card-container.mjs @@ -2,7 +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/. */ -import { html, ifDefined } from "chrome://global/content/vendor/lit.all.mjs"; +import { + classMap, + html, + ifDefined, +} from "chrome://global/content/vendor/lit.all.mjs"; import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; /** @@ -10,6 +14,7 @@ import { MozLitElement } from "chrome://global/content/lit-utils.mjs"; * * @property {string} sectionLabel - The aria-label used for the section landmark if the header is hidden with hideHeader * @property {boolean} hideHeader - Optional property given if the card container should not display a header + * @property {boolean} isInnerCard - Optional property given if the card a nested card within another card and given a border rather than box-shadow * @property {boolean} preserveCollapseState - Whether or not the expanded/collapsed state should persist * @property {string} viewAllPage - The location hash for the 'View all' header link to navigate to */ @@ -22,6 +27,7 @@ class CardContainer extends MozLitElement { static properties = { sectionLabel: { type: String }, hideHeader: { type: Boolean }, + isInnerCard: { type: Boolean }, preserveCollapseState: { type: Boolean }, viewAllPage: { type: String }, }; @@ -65,7 +71,7 @@ class CardContainer extends MozLitElement { aria-label=${ifDefined(this.sectionLabel)} >
diff --git a/browser/components/firefoxview/content/recentlyclosed-empty.svg b/browser/components/firefoxview/content/recentlyclosed-empty.svg new file mode 100644 index 00000000000..e8bd265df0f --- /dev/null +++ b/browser/components/firefoxview/content/recentlyclosed-empty.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/browser/components/firefoxview/firefoxview-next.css b/browser/components/firefoxview/firefoxview-next.css index 0c596bb82a2..aebd38033c5 100644 --- a/browser/components/firefoxview/firefoxview-next.css +++ b/browser/components/firefoxview/firefoxview-next.css @@ -29,6 +29,7 @@ :root { --fxview-element-background-hover: color-mix(in srgb, var(--fxview-background-color) 80%, white); --fxview-element-background-active: color-mix(in srgb, var(--fxview-background-color) 60%, white); + --fxview-border: #8F8F9D; --newtab-background-color-secondary: #42414d; --newtab-primary-action-background: #00ddff; } @@ -39,6 +40,7 @@ --fxview-element-background-hover: ButtonText; --fxview-element-background-active: ButtonText; --fxview-text-color-hover: ButtonFace; + --fxview-border: var(--fc-border-hcm, -moz-dialogtext); --newtab-primary-action-background: LinkText; --newtab-background-color-secondary: Canvas; } diff --git a/browser/components/firefoxview/firefoxview-next.html b/browser/components/firefoxview/firefoxview-next.html index 6d29177c67f..bd2cdfe3bfa 100644 --- a/browser/components/firefoxview/firefoxview-next.html +++ b/browser/components/firefoxview/firefoxview-next.html @@ -15,6 +15,8 @@ + + - +
@@ -69,7 +73,9 @@ class FxviewEmptyState extends MozLitElement { ?hidden=${!this.descriptionLink} data-l10n-name=${ifDefined(this.descriptionLink?.name)} href=${ifDefined(this.descriptionLink?.url)} - target="_blank" + target=${this.descriptionLink?.sameTarget + ? "_self" + : "_blank"} />

` )} diff --git a/browser/components/firefoxview/history.mjs b/browser/components/firefoxview/history.mjs index 34eb19d4a17..30e227b252b 100644 --- a/browser/components/firefoxview/history.mjs +++ b/browser/components/firefoxview/history.mjs @@ -7,15 +7,16 @@ import { ViewPage } from "./viewpage.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://browser/content/migration/migration-wizard.mjs"; -const { FirefoxViewPlacesQuery } = ChromeUtils.importESModule( - "resource:///modules/firefox-view-places-query.sys.mjs" -); -const { BrowserUtils } = ChromeUtils.importESModule( - "resource://gre/modules/BrowserUtils.sys.mjs" -); -const { ProfileAge } = ChromeUtils.importESModule( - "resource://gre/modules/ProfileAge.sys.mjs" -); +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + BrowserUtils: "resource://gre/modules/BrowserUtils.sys.mjs", + FirefoxViewPlacesQuery: + "resource:///modules/firefox-view-places-query.sys.mjs", + PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", + ProfileAge: "resource://gre/modules/ProfileAge.sys.mjs", +}); + let XPCOMUtils = ChromeUtils.importESModule( "resource://gre/modules/XPCOMUtils.sys.mjs" ).XPCOMUtils; @@ -33,7 +34,7 @@ class HistoryInView extends ViewPage { this.historyMapBySite = []; // Setting maxTabsLength to -1 for no max this.maxTabsLength = -1; - this.placesQuery = new FirefoxViewPlacesQuery(); + this.placesQuery = new lazy.FirefoxViewPlacesQuery(); this.sortOption = "date"; this.profileAge = 8; this.fullyUpdated = false; @@ -66,7 +67,7 @@ class HistoryInView extends ViewPage { } ); if (!this.importHistoryDismissedPref && !this.hasImportedHistoryPrefs) { - let profileAccessor = await ProfileAge(); + let profileAccessor = await lazy.ProfileAge(); let profileCreateTime = await profileAccessor.created; let timeNow = new Date().getTime(); let profileAge = timeNow - profileCreateTime; @@ -175,7 +176,7 @@ class HistoryInView extends ViewPage { onPrimaryAction(e) { let currentWindow = this.getWindow(); if (currentWindow.openTrustedLinkIn) { - let where = BrowserUtils.whereToOpenLink( + let where = lazy.BrowserUtils.whereToOpenLink( e.detail.originalEvent, false, true @@ -188,10 +189,15 @@ class HistoryInView extends ViewPage { } onSecondaryAction(e) { + this.triggerNode = e.originalTarget; e.target.querySelector("panel-list").toggle(e.detail.originalEvent); } - onChangeSortOption(e) { + deleteFromHistory(e) { + lazy.PlacesUtils.history.remove(this.triggerNode.url); + } + + async onChangeSortOption(e) { this.sortOption = e.target.value; this.updateHistoryData(); } @@ -248,19 +254,28 @@ class HistoryInView extends ViewPage { panelListTemplate() { return html` -
- +
- - - +
`; } diff --git a/browser/components/firefoxview/jar.mn b/browser/components/firefoxview/jar.mn index 14ae3a42b84..1a67159f6dd 100644 --- a/browser/components/firefoxview/jar.mn +++ b/browser/components/firefoxview/jar.mn @@ -39,6 +39,7 @@ browser.jar: content/browser/firefoxview/category-overview.svg (content/category-overview.svg) content/browser/firefoxview/category-recentlyclosed.svg (content/category-recentlyclosed.svg) content/browser/firefoxview/category-syncedtabs.svg (content/category-syncedtabs.svg) + content/browser/firefoxview/recentlyclosed-empty.svg (content/recentlyclosed-empty.svg) content/browser/firefoxview/tab-pickup-empty.svg (content/tab-pickup-empty.svg) content/browser/firefoxview/synced-tabs-error.svg (content/synced-tabs-error.svg) content/browser/callout-tab-pickup.svg (content/callout-tab-pickup.svg) diff --git a/browser/components/firefoxview/recentlyclosed.mjs b/browser/components/firefoxview/recentlyclosed.mjs index b7156885d9a..f35e7e97ef3 100644 --- a/browser/components/firefoxview/recentlyclosed.mjs +++ b/browser/components/firefoxview/recentlyclosed.mjs @@ -2,7 +2,7 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -import { html } from "chrome://global/content/vendor/lit.all.mjs"; +import { classMap, html } from "chrome://global/content/vendor/lit.all.mjs"; import { ViewPage } from "./viewpage.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://browser/content/firefoxview/card-container.mjs"; @@ -16,6 +16,7 @@ ChromeUtils.defineESModuleGetters(lazy, { const SS_NOTIFY_CLOSED_OBJECTS_CHANGED = "sessionstore-closed-objects-changed"; const SS_NOTIFY_BROWSER_SHUTDOWN_FLUSH = "sessionstore-browser-shutdown-flush"; +const NEVER_REMEMBER_HISTORY_PREF = "browser.privatebrowsing.autostart"; function getWindow() { return window.browsingContext.embedderWindowGlobal.browsingContext.window; @@ -25,12 +26,14 @@ class RecentlyClosedTabsInView extends ViewPage { constructor() { super(); this.boundObserve = (...args) => this.observe(...args); + this.fullyUpdated = false; this.maxTabsLength = this.overview ? 5 : 25; this.recentlyClosedTabs = []; } static queries = { cardEl: "card-container", + emptyState: "fxview-empty-state", }; observe(subject, topic, data) { @@ -164,6 +167,55 @@ class RecentlyClosedTabsInView extends ViewPage { lazy.SessionStore.forgetClosedTab(getWindow(), closedTabIndex); } + willUpdate() { + this.fullyUpdated = false; + } + + updated() { + this.fullyUpdated = true; + } + + emptyMessageTemplate() { + let descriptionHeader; + let descriptionLabels; + let descriptionLink; + if (Services.prefs.getBoolPref(NEVER_REMEMBER_HISTORY_PREF, false)) { + // History pref set to never remember history + descriptionHeader = "firefoxview-dont-remember-history-empty-header"; + descriptionLabels = [ + "firefoxview-dont-remember-history-empty-description", + "firefoxview-dont-remember-history-empty-description-two", + ]; + descriptionLink = { + url: "about:preferences#privacy", + name: "history-settings-url-two", + }; + } else { + descriptionHeader = "firefoxview-recentlyclosed-empty-header"; + descriptionLabels = [ + "firefoxview-recentlyclosed-empty-description", + "firefoxview-recentlyclosed-empty-description-two", + ]; + descriptionLink = { + url: "about:firefoxview-next#history", + name: "history-url", + sameTarget: "true", + }; + } + return html` + + + `; + } + render() { if (!this.selectedTab && !this.overview) { return null; @@ -179,13 +231,14 @@ class RecentlyClosedTabsInView extends ViewPage { data-l10n-id="firefoxview-recently-closed-header" >
-
+

-
- -
+ ${this.overview + ? html` +
+ ${this.emptyMessageTemplate()} +
+ ` + : ""}
+ ${this.selectedTab + ? html` +
+ ${this.emptyMessageTemplate()} +
+ ` + : ""}

`; } diff --git a/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview_next.js b/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview_next.js index 94a70d6528a..35bb5d1f2e5 100644 --- a/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview_next.js +++ b/browser/components/firefoxview/tests/browser/browser_recentlyclosed_firefoxview_next.js @@ -6,6 +6,7 @@ ChromeUtils.defineESModuleGetters(globalThis, { }); const FXVIEW_NEXT_ENABLED_PREF = "browser.tabs.firefox-view-next"; +const NEVER_REMEMBER_HISTORY_PREF = "browser.privatebrowsing.autostart"; function isElInViewport(element) { const boundingRect = element.getBoundingClientRect(); @@ -241,3 +242,57 @@ add_task(async function test_dismiss_tab() { } }); }); + +add_task(async function test_emoty_states() { + Services.obs.notifyObservers(null, "browser:purge-session-history"); + is( + SessionStore.getClosedTabCountForWindow(window), + 0, + "Closed tab count after purging session history" + ); + await withFirefoxView({}, async browser => { + const { document } = browser.contentWindow; + is(document.location.href, "about:firefoxview-next"); + + navigateToRecentlyClosed(document); + let recentlyClosedComponent = document.querySelector( + "view-recentlyclosed:not([slot=recentlyclosed])" + ); + + await TestUtils.waitForCondition(() => recentlyClosedComponent.emptyState); + let emptyStateCard = recentlyClosedComponent.emptyState; + ok( + emptyStateCard.headerEl.textContent.includes("Closed a tab too soon"), + "Initial empty state header has the expected text." + ); + ok( + emptyStateCard.descriptionEls[0].textContent.includes( + "Here you’ll find the tabs you recently closed" + ), + "Initial empty state description has the expected text." + ); + + // Test empty state when History mode is set to never remember + Services.prefs.setBoolPref(NEVER_REMEMBER_HISTORY_PREF, true); + // Manually update the recentlyclosed component from the test, since changing this setting + // in about:preferences will require a browser reload + recentlyClosedComponent.requestUpdate(); + await TestUtils.waitForCondition( + () => recentlyClosedComponent.fullyUpdated + ); + emptyStateCard = recentlyClosedComponent.emptyState; + ok( + emptyStateCard.headerEl.textContent.includes("Nothing to show"), + "Empty state with never remember history header has the expected text." + ); + ok( + emptyStateCard.descriptionEls[1].textContent.includes( + "remember your activity as you browse. To change that" + ), + "Empty state with never remember history description has the expected text." + ); + // Reset History mode to Remember + Services.prefs.setBoolPref(NEVER_REMEMBER_HISTORY_PREF, false); + gBrowser.removeTab(gBrowser.selectedTab); + }); +}); diff --git a/browser/components/firefoxview/viewpage.mjs b/browser/components/firefoxview/viewpage.mjs index 607c64020e5..5c5830f5bac 100644 --- a/browser/components/firefoxview/viewpage.mjs +++ b/browser/components/firefoxview/viewpage.mjs @@ -11,6 +11,12 @@ import "chrome://browser/content/firefoxview/fxview-empty-state.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://browser/content/firefoxview/fxview-tab-list.mjs"; +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", +}); + export class ViewPage extends MozLitElement { static get properties() { return { @@ -42,4 +48,64 @@ export class ViewPage extends MozLitElement { getWindow() { return window.browsingContext.embedderWindowGlobal.browsingContext.window; } + + /** + * This function doesn't just copy the link to the clipboard, it creates a + * URL object on the clipboard, so when it's pasted into an application that + * supports it, it displays the title as a link. + */ + copyLink(e) { + // Copied from doCommand/placesCmd_copy in PlacesUIUtils.sys.mjs + + // This is a little hacky, but there is a lot of code in Places that handles + // clipboard stuff, so it's easier to reuse. + let node = {}; + node.type = 0; + node.title = this.triggerNode.title; + node.uri = this.triggerNode.url; + + // This order is _important_! It controls how this and other applications + // select data to be inserted based on type. + let contents = [ + { type: lazy.PlacesUtils.TYPE_X_MOZ_URL, entries: [] }, + { type: lazy.PlacesUtils.TYPE_HTML, entries: [] }, + { type: lazy.PlacesUtils.TYPE_PLAINTEXT, entries: [] }, + ]; + + contents.forEach(function (content) { + content.entries.push(lazy.PlacesUtils.wrapNode(node, content.type)); + }); + + let xferable = Cc["@mozilla.org/widget/transferable;1"].createInstance( + Ci.nsITransferable + ); + xferable.init(null); + + function addData(type, data) { + xferable.addDataFlavor(type); + xferable.setTransferData(type, lazy.PlacesUtils.toISupportsString(data)); + } + + contents.forEach(function (content) { + addData(content.type, content.entries.join(lazy.PlacesUtils.endl)); + }); + + Services.clipboard.setData( + xferable, + null, + Ci.nsIClipboard.kGlobalClipboard + ); + } + + openInNewWindow(e) { + this.getWindow().openTrustedLinkIn(this.triggerNode.url, "window", { + private: false, + }); + } + + openInNewPrivateWindow(e) { + this.getWindow().openTrustedLinkIn(this.triggerNode.url, "window", { + private: true, + }); + } } diff --git a/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js b/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js index 28f0155ecc9..2fd6161d434 100644 --- a/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js +++ b/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js @@ -925,14 +925,18 @@ class ProtonScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCom }) : null, reducedMotionImageURL ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("source", { srcSet: reducedMotionImageURL, media: "(prefers-reduced-motion: reduce)" - }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { + }) : null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MSLocalized__WEBPACK_IMPORTED_MODULE_1__.Localized, { + text: alt + }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { + className: "sr-only logo-alt" + })), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("img", { className: "brand-logo", style: { height }, src: imageURL, + alt: "", loading: getLoadingStrategy(), - alt: alt, role: alt ? null : "presentation" })); } diff --git a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css index fb40910dc3d..54cd1189566 100644 --- a/browser/components/newtab/aboutwelcome/content/aboutwelcome.css +++ b/browser/components/newtab/aboutwelcome/content/aboutwelcome.css @@ -716,6 +716,10 @@ html { height: 25px; margin-block: 0; } +.onboardingContainer .screen[pos=split] .section-main .main-content .logo-alt { + width: inherit; + height: inherit; +} .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text { margin-inline: 0 10px; margin-block: 10px 35px; @@ -910,6 +914,10 @@ html { .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .brand-logo, .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .brand-logo:dir(rtl) { background-position: center; } + .onboardingContainer .screen[pos=split] .section-main .main-content .logo-container .logo-alt { + width: inherit; + height: inherit; + } .onboardingContainer .screen[pos=split] .section-main .main-content .welcome-text { align-items: center; text-align: center; @@ -985,6 +993,10 @@ html { padding: unset; margin-top: 50px; } +.onboardingContainer .logo-alt { + width: inherit; + height: inherit; +} .onboardingContainer .rtamo-theme-icon { max-height: 30px; border-radius: 2px; diff --git a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss index 4631e03c865..514e791aa3d 100644 --- a/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss +++ b/browser/components/newtab/content-src/aboutwelcome/aboutwelcome.scss @@ -523,6 +523,11 @@ html { margin-block: 0; } + .logo-alt { + width: inherit; + height: inherit; + } + .welcome-text { margin-inline: 0 10px; margin-block: 10px 35px; @@ -751,6 +756,11 @@ html { background-position: center; } } + + .logo-alt { + width: inherit; + height: inherit; + } } .welcome-text { @@ -861,6 +871,11 @@ html { } } + .logo-alt { + width: inherit; + height: inherit; + } + .rtamo-theme-icon { max-height: 30px; border-radius: 2px; diff --git a/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx b/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx index 02613710f72..15bbeb08b11 100644 --- a/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx +++ b/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx @@ -193,12 +193,15 @@ export class ProtonScreen extends React.PureComponent { media="(prefers-reduced-motion: reduce)" /> ) : null} + +
+ diff --git a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm index d507e6d6f34..d1312ef6341 100644 --- a/browser/components/newtab/lib/ASRouterTriggerListeners.jsm +++ b/browser/components/newtab/lib/ASRouterTriggerListeners.jsm @@ -862,7 +862,7 @@ const ASRouterTriggerListeners = new Map([ }, get _soundPlaying() { return [...Services.wm.getEnumerator("navigator:browser")].some(win => - win.gBrowser?.tabs.some(tab => tab.soundPlaying) + win.gBrowser?.tabs.some(tab => !tab.closing && tab.soundPlaying) ); }, init(triggerHandler) { @@ -996,9 +996,10 @@ const ASRouterTriggerListeners = new Map([ if (this._idleSince && this._quietSince) { const win = Services.wm.getMostRecentBrowserWindow(); if (win && !isPrivateWindow(win) && !this._triggerTimeout) { - // Number of ms since the last user interaction/audio playback + // Time since the most recent user interaction/audio playback, + // reported as the number of milliseconds the user has been idle. const idleForMilliseconds = - Date.now() - Math.min(this._idleSince, this._quietSince); + Date.now() - Math.max(this._idleSince, this._quietSince); this._triggerTimeout = lazy.setTimeout(() => { this._triggerHandler(win.gBrowser.selectedBrowser, { id: this.id, diff --git a/browser/components/newtab/test/browser/browser_aboutwelcome_configurable_ui.js b/browser/components/newtab/test/browser/browser_aboutwelcome_configurable_ui.js index 5376c8bf609..3ee8918ab4f 100644 --- a/browser/components/newtab/test/browser/browser_aboutwelcome_configurable_ui.js +++ b/browser/components/newtab/test/browser/browser_aboutwelcome_configurable_ui.js @@ -59,7 +59,7 @@ async function testAboutWelcomeLogoFor(logo = {}) { let expected = [ `.brand-logo[src="${ logo.imageURL ?? "chrome://branding/content/about-logo.svg" - }"][alt="${logo.alt ?? ""}"]${logo.height ? `[style*="height"]` : ""}${ + }"][alt=""]${logo.height ? `[style*="height"]` : ""}${ logo.alt ? "" : `[role="presentation"]` }`, ]; @@ -316,7 +316,7 @@ add_task(async function test_aboutwelcome_split_position() { // Expected styles: { // Override default text-link styles - "background-color": "rgba(21, 20, 26, 0.07)", + "background-color": "color(srgb 0.0823529 0.0784314 0.101961 / 0.07)", color: "rgb(21, 20, 26)", } ); @@ -491,7 +491,7 @@ add_task(async function test_aboutwelcome_with_progress_bar() { // Progress bar should have a gray background. is( content.window.getComputedStyle(progressBar)["background-color"], - "rgba(21, 20, 26, 0.25)", + "color(srgb 0.0823529 0.0784314 0.101961 / 0.25)", "Correct progress bar background" ); diff --git a/browser/components/search/test/browser/browser_rich_suggestions.js b/browser/components/search/test/browser/browser_rich_suggestions.js index 72c39424946..cad5b9e2a4b 100644 --- a/browser/components/search/test/browser/browser_rich_suggestions.js +++ b/browser/components/search/test/browser/browser_rich_suggestions.js @@ -108,3 +108,37 @@ async function check_results({ featureEnabled = false }) { await SpecialPowers.popPrefEnv(); } + +add_task(async function test_richsuggestion_deduplication() { + await SpecialPowers.pushPrefEnv({ + set: [["browser.urlbar.richSuggestions.featureGate", true]], + }); + + await UrlbarTestUtils.promiseAutocompleteResultPopup({ + window, + value: "test0", + waitForFocus: SimpleTest.waitForFocus, + }); + + let { result: heuristicResult } = await UrlbarTestUtils.getDetailsOfResultAt( + window, + 0 + ); + let { result: richResult } = await UrlbarTestUtils.getDetailsOfResultAt( + window, + 1 + ); + + // The Rich Suggestion that points to the same query as the Hueristic result + // should not be deduplicated. + Assert.equal(heuristicResult.type, UrlbarUtils.RESULT_TYPE.SEARCH); + Assert.equal(heuristicResult.providerName, "HeuristicFallback"); + Assert.equal(richResult.type, UrlbarUtils.RESULT_TYPE.SEARCH); + Assert.equal(richResult.providerName, "SearchSuggestions"); + Assert.equal( + heuristicResult.payload.query, + richResult.payload.lowerCaseSuggestion + ); + + await UrlbarTestUtils.promisePopupClose(window); +}); diff --git a/browser/components/search/test/browser/search-engines/basic/manifest.json b/browser/components/search/test/browser/search-engines/basic/manifest.json index 3bdb68fea1a..63ec838bee6 100644 --- a/browser/components/search/test/browser/search-engines/basic/manifest.json +++ b/browser/components/search/test/browser/search-engines/basic/manifest.json @@ -14,7 +14,7 @@ "name": "basic", "keyword": "@basic", "search_url": "https://mochi.test:8888/browser/browser/components/search/test/browser/?search={searchTerms}&foo=1", - "suggest_url": "https://mochi.test:8888/browser/browser/modules/test/browser/usageTelemetrySearchSuggestions.sjs?{searchTerms}" + "suggest_url": "https://example.com/browser/browser/components/search/test/browser/trendingSuggestionEngine.sjs?richsuggestions=true&query={searchTerms}" } } } diff --git a/browser/components/search/test/browser/trendingSuggestionEngine.sjs b/browser/components/search/test/browser/trendingSuggestionEngine.sjs index c568cc223bf..20488f52b61 100644 --- a/browser/components/search/test/browser/trendingSuggestionEngine.sjs +++ b/browser/components/search/test/browser/trendingSuggestionEngine.sjs @@ -24,14 +24,19 @@ function handleRequest(req, resp) { } function writeResponse(params, resp) { - // Echoes back 15 results, query0, query1, query2 etc. - let suffixes = [...Array(15).keys()]; + // Echoes back 15 results, query, query0, query1, query2 etc. let query = params.query || ""; - let data = [query, suffixes.map(s => query + s)]; + let suffixes = [...Array(15).keys()].map(s => query + s); + // If we have a query, echo it back (to help test deduplication) + if (query) { + suffixes.unshift(query); + } + let data = [query, suffixes]; + if (params?.richsuggestions) { data.push([]); data.push({ - "google:suggestdetail": suffixes.map(s => ({ + "google:suggestdetail": data[1].map(s => ({ a: "Extended title", dc: "#FFFFFF", i: "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", diff --git a/browser/components/shopping/content/ShoppingUtils.sys.mjs b/browser/components/shopping/content/ShoppingUtils.sys.mjs deleted file mode 100644 index a8027adbc19..00000000000 --- a/browser/components/shopping/content/ShoppingUtils.sys.mjs +++ /dev/null @@ -1,49 +0,0 @@ -/* -*- 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/. */ - -export const ShoppingUtils = { - getHighlights() { - return mockHighlights; - }, -}; - -// TODO: replace highlights fetching with API calls. For now, return mock data. -const mockHighlights = { - price: { - positive: ["This watch is great and the price was even better."], - negative: [], - neutral: [], - }, - quality: { - positive: [ - "Other than that, I am very impressed with the watch and it’s capabilities.", - "This watch performs above expectations in every way with the exception of the heart rate monitor.", - ], - negative: [ - "Battery life is no better than the 3 even with the solar gimmick, probably worse.", - ], - neutral: [ - "I have small wrists and still went with the 6X and glad I did.", - "I can deal with the looks, as Im now retired.", - ], - }, - competitiveness: { - positive: [ - "Bought this to replace my vivoactive 3.", - "I like that this watch has so many features, especially those that monitor health like SP02, respiration, sleep, HRV status, stress, and heart rate.", - ], - negative: [ - "I do not use it for sleep or heartrate monitoring so not sure how accurate they are.", - ], - neutral: [ - "I've avoided getting a smartwatch for so long due to short battery life on most of them.", - ], - }, - shipping: { - positive: [], - negative: [], - neutral: [], - }, -}; diff --git a/browser/components/shopping/content/highlights.mjs b/browser/components/shopping/content/highlights.mjs index 31d3b9e0988..eb21115b586 100644 --- a/browser/components/shopping/content/highlights.mjs +++ b/browser/components/shopping/content/highlights.mjs @@ -12,10 +12,6 @@ import "chrome://browser/content/shopping/highlight-item.mjs"; // eslint-disable-next-line import/no-unassigned-import import "chrome://browser/content/shopping/shopping-card.mjs"; -const { ShoppingUtils } = ChromeUtils.importESModule( - "chrome://browser/content/shopping/ShoppingUtils.sys.mjs" -); - const VALID_HIGHLIGHT_L10N_IDs = new Map([ ["price", "shopping-highlight-price"], ["quality", "shopping-highlight-quality"], @@ -35,6 +31,10 @@ class ReviewHighlights extends MozLitElement { */ #highlightsMap; + static properties = { + highlights: { type: Object }, + }; + static get queries() { return { reviewHighlightsListEl: "#review-highlights-list", @@ -44,23 +44,17 @@ class ReviewHighlights extends MozLitElement { connectedCallback() { super.connectedCallback(); - let highlights; let availableKeys; try { - highlights = ShoppingUtils.getHighlights(); - if (!highlights) { + if (!this.highlights) { return; - } else if (highlights.error) { - throw new Error( - "Unable to fetch highlights due to error: " + highlights.error - ); } // Filter highlights that have data. - let keys = Object.keys(highlights); + let keys = Object.keys(this.highlights); availableKeys = keys.filter( - key => Object.values(highlights[key]).flat().length !== 0 + key => Object.values(this.highlights[key]).flat().length !== 0 ); // Filter valid highlight category types. Valid types are guaranteed to have data-l10n-ids. @@ -81,7 +75,7 @@ class ReviewHighlights extends MozLitElement { for (let key of availableKeys) { // Ignore negative,neutral,positive sentiments and simply append review strings into one array. - let reviews = Object.values(highlights[key]).flat(); + let reviews = Object.values(this.highlights[key]).flat(); this.#highlightsMap.set(key, reviews); } } diff --git a/browser/components/shopping/content/shopping-container.mjs b/browser/components/shopping/content/shopping-container.mjs index 57568ffd9ce..114ab5b8328 100644 --- a/browser/components/shopping/content/shopping-container.mjs +++ b/browser/components/shopping/content/shopping-container.mjs @@ -43,6 +43,7 @@ export class ShoppingContainer extends MozLitElement { if (!this.data) { return html`

loading...

`; } + return html` - +
`; diff --git a/browser/components/shopping/jar.mn b/browser/components/shopping/jar.mn index c528d12575f..22437dd0460 100644 --- a/browser/components/shopping/jar.mn +++ b/browser/components/shopping/jar.mn @@ -6,7 +6,6 @@ browser.jar: content/browser/shopping/shopping.html (content/shopping.html) content/browser/shopping/shopping-container.css (content/shopping-container.css) content/browser/shopping/shopping-sidebar.js (content/shopping-sidebar.js) - content/browser/shopping/ShoppingUtils.sys.mjs (content/ShoppingUtils.sys.mjs) content/browser/shopping/highlights.mjs (content/highlights.mjs) content/browser/shopping/highlight-item.css (content/highlight-item.css) content/browser/shopping/highlight-item.mjs (content/highlight-item.mjs) diff --git a/browser/components/shopping/tests/browser/browser.ini b/browser/components/shopping/tests/browser/browser.ini index af1d7b49117..f146db42ad6 100644 --- a/browser/components/shopping/tests/browser/browser.ini +++ b/browser/components/shopping/tests/browser/browser.ini @@ -7,4 +7,6 @@ prefs = [browser_adjusted_rating.js] [browser_private_mode.js] [browser_review_highlights.js] +skip-if = true # Bug 1844112 [browser_shopping_settings.js] +skip-if = true # Bug 1844112 diff --git a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs index 7e9baf2aa88..2409edebd48 100644 --- a/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs +++ b/browser/components/urlbar/UrlbarMuxerUnifiedComplete.sys.mjs @@ -806,10 +806,13 @@ class MuxerUnifiedComplete extends UrlbarMuxer { } // Discard form history and remote suggestions that dupe previously added - // suggestions or the heuristic. + // suggestions or the heuristic. We do not deduplicate rich suggestions so + // they do not visually disapear as the suggestion is completed and + // becomes the same url as the heuristic result. if ( result.type == UrlbarUtils.RESULT_TYPE.SEARCH && - result.payload.lowerCaseSuggestion + result.payload.lowerCaseSuggestion && + !result.isRichSuggestion ) { let suggestion = result.payload.lowerCaseSuggestion.trim(); if (!suggestion || state.suggestions.has(suggestion)) { diff --git a/browser/locales/en-US/browser/firefoxView.ftl b/browser/locales/en-US/browser/firefoxView.ftl index 0a71f608ca9..72bc629cdbf 100644 --- a/browser/locales/en-US/browser/firefoxView.ftl +++ b/browser/locales/en-US/browser/firefoxView.ftl @@ -130,6 +130,8 @@ firefoxview-overview-header = Recent browsing firefoxview-history-nav = History .title = History firefoxview-history-header = History +firefoxview-history-context-delete = Delete from History + .accesskey = D ## Open Tabs in this context refers to all open tabs in the browser @@ -222,4 +224,10 @@ firefoxview-import-history-close-button = firefoxview-import-history-header = Import history from another browser firefoxview-import-history-description = Make { -brand-short-name } your go-to browser. Import browsing history, bookmarks, and more. +## Message displayed in Firefox View when the user has no recently closed tabs data + +firefoxview-recentlyclosed-empty-header = Closed a tab too soon? +firefoxview-recentlyclosed-empty-description = Here you’ll find the tabs you recently closed, so you can reopen any of them quickly. +firefoxview-recentlyclosed-empty-description-two = To find tabs from longer ago, view your browsing history. + ## diff --git a/browser/locales/l10n-changesets.json b/browser/locales/l10n-changesets.json index a423c4981ff..84f3b797a6d 100644 --- a/browser/locales/l10n-changesets.json +++ b/browser/locales/l10n-changesets.json @@ -645,7 +645,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "977cff404dcf76ed4a09fb853cdc3c2e06b8ffb7" + "revision": "5aad5abd06ded116740616ea9516b9e42b5034b9" }, "fur": { "pin": false, @@ -825,7 +825,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "068c00ca7cae5fdd8ce07e89f59d44912ae1589c" + "revision": "93f17842107607bb5cbff98b921d330778b79eb4" }, "hsb": { "pin": false, @@ -969,7 +969,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "faad008eff92f054910799e97fb117b6e7e50623" + "revision": "63d5f9c7750ebe66875385114a2b7c2527350111" }, "ja": { "pin": false, @@ -1587,7 +1587,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "6849f377cda389b684bec8c5ba9cde48c0b327d5" + "revision": "6ca49b79f8d6968dc5227dadd485bb1edb4085d7" }, "sk": { "pin": false, @@ -1713,7 +1713,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "c5754f9325a116a44078c1f3213f03ef1ae9b6c6" + "revision": "3dc961efa27fdcf9c3506e3af3aca06b307a539b" }, "szl": { "pin": false, @@ -1785,7 +1785,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "24c3a61f463c2a34a8bce30284042f1d5238160c" + "revision": "21831b5f6f572d6ee72d3fa9462d1e8444ea53db" }, "th": { "pin": false, @@ -1983,7 +1983,7 @@ "win64-aarch64-devedition", "win64-devedition" ], - "revision": "3336f0a4fe937ff46e702e5d2e1166fb7bbfacb1" + "revision": "3161a006cd9f5749fced57d8b8a11e6cf6aa7313" }, "zh-TW": { "pin": false, diff --git a/browser/themes/Windows8WindowFrameColor.sys.mjs b/browser/themes/Windows8WindowFrameColor.sys.mjs deleted file mode 100644 index dfca020255f..00000000000 --- a/browser/themes/Windows8WindowFrameColor.sys.mjs +++ /dev/null @@ -1,55 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -import { WindowsRegistry as Registry } from "resource://gre/modules/WindowsRegistry.sys.mjs"; - -export var Windows8WindowFrameColor = { - _windowFrameColor: null, - - get() { - if (this._windowFrameColor) { - return this._windowFrameColor; - } - - const HKCU = Ci.nsIWindowsRegKey.ROOT_KEY_CURRENT_USER; - const dwmKey = "Software\\Microsoft\\Windows\\DWM"; - let customizationColor = Registry.readRegKey( - HKCU, - dwmKey, - "ColorizationColor" - ); - if (customizationColor == undefined) { - // Seems to be the default color (hardcoded because of bug 1065998) - return [158, 158, 158]; - } - - // The color returned from the Registry is in decimal form. - let customizationColorHex = customizationColor.toString(16); - - // Zero-pad the number just to make sure that it is 8 digits. - customizationColorHex = ("00000000" + customizationColorHex).substr(-8); - let customizationColorArray = customizationColorHex.match(/../g); - let [, fgR, fgG, fgB] = customizationColorArray.map(val => - parseInt(val, 16) - ); - let colorizationColorBalance = Registry.readRegKey( - HKCU, - dwmKey, - "ColorizationColorBalance" - ); - if (colorizationColorBalance == undefined) { - colorizationColorBalance = 78; - } - - // Window frame base color when Color Intensity is at 0, see bug 1004576. - let frameBaseColor = 217; - let alpha = colorizationColorBalance / 100; - - // Alpha-blend the foreground color with the frame base color. - let r = Math.round(fgR * alpha + frameBaseColor * (1 - alpha)); - let g = Math.round(fgG * alpha + frameBaseColor * (1 - alpha)); - let b = Math.round(fgB * alpha + frameBaseColor * (1 - alpha)); - return (this._windowFrameColor = [r, g, b]); - }, -}; diff --git a/browser/themes/moz.build b/browser/themes/moz.build index ea51211f904..8940bd199f3 100644 --- a/browser/themes/moz.build +++ b/browser/themes/moz.build @@ -22,11 +22,6 @@ BROWSER_CHROME_MANIFESTS += [ toolkit = CONFIG["MOZ_WIDGET_TOOLKIT"] -if toolkit == "windows": - EXTRA_JS_MODULES += [ - "Windows8WindowFrameColor.sys.mjs", - ] - if toolkit == "cocoa": DIRS += ["osx"] elif toolkit == "gtk": diff --git a/browser/themes/windows/browser-aero.css b/browser/themes/windows/browser-aero.css index ff578478b53..f6123829313 100644 --- a/browser/themes/windows/browser-aero.css +++ b/browser/themes/windows/browser-aero.css @@ -35,165 +35,6 @@ background-color: InactiveCaption; color: InactiveCaptionText; } -} - -.titlebar-button { - appearance: none !important; - border: none; - margin: 0 !important; - padding: 8px 17px; - -moz-context-properties: stroke; - stroke: currentColor; -} - -.titlebar-button > .toolbarbutton-icon { - width: 12px; - height: 12px; -} - -.titlebar-min { - list-style-image: url(chrome://browser/skin/window-controls/minimize.svg); -} - -.titlebar-max { - list-style-image: url(chrome://browser/skin/window-controls/maximize.svg); -} - -.titlebar-restore { - list-style-image: url(chrome://browser/skin/window-controls/restore.svg); -} - -.titlebar-restore > .toolbarbutton-icon:-moz-locale-dir(rtl) { - transform: scaleX(-1); -} - -.titlebar-close { - list-style-image: url(chrome://browser/skin/window-controls/close.svg); -} - -:root[lwtheme-image] .titlebar-button { - -moz-context-properties: unset; -} -:root[lwtheme-image] .titlebar-min { - list-style-image: url(chrome://browser/skin/window-controls/minimize-themes.svg); -} -:root[lwtheme-image] .titlebar-max { - list-style-image: url(chrome://browser/skin/window-controls/maximize-themes.svg); -} -:root[lwtheme-image] .titlebar-restore { - list-style-image: url(chrome://browser/skin/window-controls/restore-themes.svg); -} -:root[lwtheme-image] .titlebar-close { - list-style-image: url(chrome://browser/skin/window-controls/close-themes.svg); -} - -/* the 12px image renders a 10px icon, and the 10px upscaled gets rounded to 12.5, which - * rounds up to 13px, which makes the icon one pixel too big on 1.25dppx. Fix: */ -@media (min-resolution: 1.20dppx) and (max-resolution: 1.45dppx) { - .titlebar-button > .toolbarbutton-icon { - width: 11.5px; - height: 11.5px; - } -} - -/* 175% dpi should result in the same device pixel sizes as 150% dpi. */ -@media (min-resolution: 1.70dppx) and (max-resolution: 1.95dppx) { - .titlebar-button { - padding-inline: 14.1px; - } - - .titlebar-button > .toolbarbutton-icon { - width: 10.8px; - height: 10.8px; - } -} - -/* 225% dpi should result in the same device pixel sizes as 200% dpi. */ -@media (min-resolution: 2.20dppx) and (max-resolution: 2.45dppx) { - .titlebar-button { - padding-inline: 15.3333px; - } - - .titlebar-button > .toolbarbutton-icon { - width: 10.8px; - height: 10.8px; - } -} - -/* 275% dpi should result in the same device pixel sizes as 250% dpi. */ -@media (min-resolution: 2.70dppx) and (max-resolution: 2.95dppx) { - /* NB: todo: this should also change padding on the buttons - * themselves, but without a device to test this on, it's - * impossible to know by how much. */ - .titlebar-button > .toolbarbutton-icon { - width: 10.8px; - height: 10.8px; - } -} - -@media (-moz-windows-default-theme) { - #main-menubar > menu[_moz-menuactive="true"] { - color: inherit; - } - - #main-menubar > menu[_moz-menuactive="true"], - .titlebar-button:hover { - background-color: hsla(0,0%,0%,.12); - } - .titlebar-button:hover:active { - background-color: hsla(0,0%,0%,.22); - } - - #toolbar-menubar[brighttext] > #menubar-items > #main-menubar > menu[_moz-menuactive="true"], - toolbar[brighttext] .titlebar-button:not(.titlebar-close):hover { - background-color: hsla(0,0%,100%,.22); - } - toolbar[brighttext] .titlebar-button:not(.titlebar-close):hover:active { - background-color: hsla(0,0%,100%,.32); - } - - .titlebar-close:hover { - stroke: white; - background-color: hsl(355,86%,49%); - } - .titlebar-close:hover:active { - background-color: hsl(355,82%,69%); - } - - .titlebar-button:not(:hover) > .toolbarbutton-icon:-moz-window-inactive { - opacity: 0.5; - } -} - -@media (-moz-windows-default-theme: 0) { - .titlebar-button { - background-color: -moz-field; - stroke: ButtonText; - } - .titlebar-button:hover { - background-color: SelectedItem; - stroke: SelectedItemText; - } - - .titlebar-min { - list-style-image: url(chrome://browser/skin/window-controls/minimize-highcontrast.svg); - } - - .titlebar-max { - list-style-image: url(chrome://browser/skin/window-controls/maximize-highcontrast.svg); - } - - .titlebar-restore { - list-style-image: url(chrome://browser/skin/window-controls/restore-highcontrast.svg); - } - - .titlebar-close { - list-style-image: url(chrome://browser/skin/window-controls/close-highcontrast.svg); - } - - :root[darkwindowframe="true"]:not(:-moz-window-inactive, :-moz-lwtheme) { - color: white; - } #appcontent:not(:-moz-lwtheme) { background-color: -moz-dialog; diff --git a/browser/themes/windows/browser.css b/browser/themes/windows/browser.css index cf2c519d67f..7fc0b2c92e3 100644 --- a/browser/themes/windows/browser.css +++ b/browser/themes/windows/browser.css @@ -38,6 +38,20 @@ color: -moz-menuhovertext; } +@media (-moz-windows-default-theme) { + #main-menubar > menu[_moz-menuactive="true"] { + color: inherit; + } + + #main-menubar > menu[_moz-menuactive="true"] { + background-color: hsla(0,0%,0%,.12); + } + + #toolbar-menubar[brighttext] > #menubar-items > #main-menubar > menu[_moz-menuactive="true"] { + background-color: hsla(0,0%,100%,.22); + } +} + /* Use a different color in inactive windows. */ @media (-moz-windows-default-theme) { #toolbar-menubar:not(:-moz-lwtheme):-moz-window-inactive { @@ -100,16 +114,6 @@ /* Titlebar */ -:root[tabsintitlebar][sizemode="normal"] #titlebar { - appearance: auto; - -moz-default-appearance: -moz-window-titlebar; -} - -:root[tabsintitlebar][sizemode="maximized"] #titlebar { - appearance: auto; - -moz-default-appearance: -moz-window-titlebar-maximized; -} - .titlebar-buttonbox { appearance: none; /* The button box must appear on top of the navigator-toolbox in order for @@ -127,33 +131,167 @@ /* Window control buttons */ +.titlebar-button { + appearance: none; + border: none; + margin: 0; + padding: 8px 17px; + -moz-context-properties: stroke; + stroke: currentColor; +} + + .titlebar-min { - appearance: auto; + /* Even though we use appearance: none, -moz-default-appearance is necessary + * for Windows 11's "snap layouts" feature, see + * DealWithWindowsAppearanceHacks */ -moz-default-appearance: -moz-window-button-minimize; - margin-inline-end: 2px; + list-style-image: url(chrome://browser/skin/window-controls/minimize.svg); } .titlebar-max { - appearance: auto; -moz-default-appearance: -moz-window-button-maximize; + list-style-image: url(chrome://browser/skin/window-controls/maximize.svg); } .titlebar-restore { - appearance: auto; -moz-default-appearance: -moz-window-button-restore; + list-style-image: url(chrome://browser/skin/window-controls/restore.svg); } .titlebar-close { - appearance: auto; -moz-default-appearance: -moz-window-button-close; + list-style-image: url(chrome://browser/skin/window-controls/close.svg); } -:root[tabletmode] .titlebar-min, -:root[tabletmode] .titlebar-restore, -:root[tabletmode] .titlebar-max { +:root[tabletmode] .titlebar-button { display: none; } +.titlebar-button > .toolbarbutton-icon { + width: 12px; + height: 12px; +} + +.titlebar-restore > .toolbarbutton-icon:-moz-locale-dir(rtl) { + transform: scaleX(-1); +} + +:root[lwtheme-image] .titlebar-button { + -moz-context-properties: unset; +} +:root[lwtheme-image] .titlebar-min { + list-style-image: url(chrome://browser/skin/window-controls/minimize-themes.svg); +} +:root[lwtheme-image] .titlebar-max { + list-style-image: url(chrome://browser/skin/window-controls/maximize-themes.svg); +} +:root[lwtheme-image] .titlebar-restore { + list-style-image: url(chrome://browser/skin/window-controls/restore-themes.svg); +} +:root[lwtheme-image] .titlebar-close { + list-style-image: url(chrome://browser/skin/window-controls/close-themes.svg); +} + +@media (-moz-windows-default-theme) { + .titlebar-button:hover { + background-color: hsla(0,0%,0%,.12); + } + .titlebar-button:hover:active { + background-color: hsla(0,0%,0%,.22); + } + toolbar[brighttext] .titlebar-button:not(.titlebar-close):hover { + background-color: hsla(0,0%,100%,.22); + } + toolbar[brighttext] .titlebar-button:not(.titlebar-close):hover:active { + background-color: hsla(0,0%,100%,.32); + } + + .titlebar-close:hover { + stroke: white; + background-color: hsl(355,86%,49%); + } + + .titlebar-close:hover:active { + background-color: hsl(355,82%,69%); + } + + .titlebar-button:not(:hover) > .toolbarbutton-icon:-moz-window-inactive { + opacity: 0.5; + } +} + +@media not (-moz-windows-default-theme) { + .titlebar-button { + background-color: -moz-field; + stroke: ButtonText; + } + .titlebar-button:hover { + background-color: SelectedItem; + stroke: SelectedItemText; + } + + .titlebar-min { + list-style-image: url(chrome://browser/skin/window-controls/minimize-highcontrast.svg); + } + + .titlebar-max { + list-style-image: url(chrome://browser/skin/window-controls/maximize-highcontrast.svg); + } + + .titlebar-restore { + list-style-image: url(chrome://browser/skin/window-controls/restore-highcontrast.svg); + } + + .titlebar-close { + list-style-image: url(chrome://browser/skin/window-controls/close-highcontrast.svg); + } +} + +/* the 12px image renders a 10px icon, and the 10px upscaled gets rounded to 12.5, which + * rounds up to 13px, which makes the icon one pixel too big on 1.25dppx. Fix: */ +@media (1.20dppx <= resolution <= 1.45dppx) { + .titlebar-button > .toolbarbutton-icon { + width: 11.5px; + height: 11.5px; + } +} + +/* 175% dpi should result in the same device pixel sizes as 150% dpi. */ +@media (1.70dppx <= resolution <= 1.95dppx) { + .titlebar-button { + padding-inline: 14.1px; + } + + .titlebar-button > .toolbarbutton-icon { + width: 10.8px; + height: 10.8px; + } +} + +/* 225% dpi should result in the same device pixel sizes as 200% dpi. */ +@media (2.20dppx <= resolution <= 2.45dppx) { + .titlebar-button { + padding-inline: 15.3333px; + } + + .titlebar-button > .toolbarbutton-icon { + width: 10.8px; + height: 10.8px; + } +} + +/* 275% dpi should result in the same device pixel sizes as 250% dpi. */ +@media (2.70dppx <= resolution <= 2.95dppx) { + /* NB: todo: this should also change padding on the buttons + * themselves, but without a device to test this on, it's + * impossible to know by how much. */ + .titlebar-button > .toolbarbutton-icon { + width: 10.8px; + height: 10.8px; + } +} + /* Bookmark menus */ menu.bookmark-item, @@ -176,7 +314,6 @@ menuitem.bookmark-item { opacity: 0.7; } - /* Address bar */ @media not (prefers-contrast) { diff --git a/build/cargo-linker b/build/cargo-linker index 94b05f82139..898e21d482f 100755 --- a/build/cargo-linker +++ b/build/cargo-linker @@ -27,6 +27,13 @@ import os import sys +# This is not necessarily run with a virtualenv python, so add +# the necessary directory for the shellutil module. +base_dir = os.path.abspath(os.path.dirname(os.path.dirname(__file__))) +sys.path.insert(0, os.path.join(base_dir, "python", "mozbuild")) +from mozbuild.shellutil import split + + SANITIZERS = { "asan": "address", "hwasan": "hwaddress", @@ -37,7 +44,7 @@ SANITIZERS = { use_clang_sanitizer = os.environ.get("MOZ_CLANG_NEWER_THAN_RUSTC_LLVM") wrap_ld = os.environ["MOZ_CARGO_WRAP_LD"] -args = os.environ["MOZ_CARGO_WRAP_LDFLAGS"].split() +args = split(os.environ["MOZ_CARGO_WRAP_LDFLAGS"]) for arg in sys.argv[1:]: if arg in ["-lc++", "-lstdc++"]: wrap_ld = os.environ["MOZ_CARGO_WRAP_LD_CXX"] @@ -54,5 +61,5 @@ for arg in sys.argv[1:]: continue args.append(arg) -wrap_ld = wrap_ld.split() +wrap_ld = split(wrap_ld) os.execvp(wrap_ld[0], wrap_ld + args) diff --git a/build/moz.configure/lto-pgo.configure b/build/moz.configure/lto-pgo.configure index 24860305a1e..1ed2db9569b 100644 --- a/build/moz.configure/lto-pgo.configure +++ b/build/moz.configure/lto-pgo.configure @@ -10,14 +10,6 @@ llvm_profdata = check_prog( "LLVM_PROFDATA", ["llvm-profdata"], allow_missing=True, paths=clang_search_path ) - -@depends_if(llvm_profdata) -@checking("whether llvm-profdata supports 'order' subcommand") -def llvm_profdata_order(profdata): - retcode, _, _ = get_cmd_output(profdata, "order", "--help") - return retcode == 0 - - option( "--enable-profile-generate", env="MOZ_PROFILE_GENERATE", @@ -50,8 +42,7 @@ option( option( "--with-pgo-profile-path", - help="Path to the directory with unmerged profile data to use during the build" - ", or to a merged profdata file", + help="Path to the directory with unmerged profile data to use during the build", nargs=1, ) @@ -88,27 +79,6 @@ def pgo_profile_path(path, pgo_use, profdata, build_env): set_config("PGO_PROFILE_PATH", pgo_profile_path) -@depends( - "--enable-profile-use", - pgo_profile_path, - llvm_profdata, - llvm_profdata_order, - build_environment, -) -def orderfile_path(profile_use, path, profdata, profdata_order, build_env): - if not profile_use: - return None - - if not profdata_order: - return None - - topobjdir = build_env.topobjdir - - orderfile = os.path.join(topobjdir, "orderfile.txt") - check_cmd_output(profdata, "order", path, "-o", orderfile) - return orderfile - - pgo_temporal = c_compiler.try_compile( flags=["-fprofile-generate", "-mllvm", "-pgo-temporal-instrumentation"], check_msg="whether the C compiler supports temporal instrumentation", @@ -116,16 +86,9 @@ pgo_temporal = c_compiler.try_compile( ) -@depends( - c_compiler, - select_linker, - pgo_profile_path, - orderfile_path, - target_is_windows, - pgo_temporal, -) +@depends(c_compiler, pgo_profile_path, target_is_windows, pgo_temporal) @imports("multiprocessing") -def pgo_flags(compiler, linker, profdata, orderfile, target_is_windows, pgo_temporal): +def pgo_flags(compiler, profdata, target_is_windows, pgo_temporal): if compiler.type == "gcc": return namespace( gen_cflags=["-fprofile-generate"], @@ -142,16 +105,6 @@ def pgo_flags(compiler, linker, profdata, orderfile, target_is_windows, pgo_temp else: gen_ldflags = ["-fprofile-generate"] - use_ldflags = [] - if orderfile: - if compiler.type == "clang-cl": - use_ldflags += ["-ORDERFILE:@" + orderfile] - elif linker.KIND == "lld": - use_ldflags += ["-Wl,--symbol-ordering-file", orderfile] - - if use_ldflags: - log.info("Activating PGO-based orderfile") - gen_cflags = [prefix + "-fprofile-generate"] if pgo_temporal: gen_cflags += ["-mllvm", "-pgo-temporal-instrumentation"] @@ -171,7 +124,7 @@ def pgo_flags(compiler, linker, profdata, orderfile, target_is_windows, pgo_temp # come in via -Wbackend-plugin, so disable those too. "-Wno-error=backend-plugin", ], - use_ldflags=use_ldflags, + use_ldflags=[], ) diff --git a/build/moz.configure/nss.configure b/build/moz.configure/nss.configure index 2d0a2065c1b..6dd1dd9da03 100644 --- a/build/moz.configure/nss.configure +++ b/build/moz.configure/nss.configure @@ -9,7 +9,7 @@ system_lib_option("--with-system-nss", help="Use system NSS") imply_option("--with-system-nspr", True, when="--with-system-nss") nss_pkg = pkg_check_modules( - "NSS", "nss >= 3.91", when="--with-system-nss", config=False + "NSS", "nss >= 3.92", when="--with-system-nss", config=False ) set_config("MOZ_SYSTEM_NSS", True, when="--with-system-nss") diff --git a/devtools/client/locales/en-US/webconsole.properties b/devtools/client/locales/en-US/webconsole.properties index bf00073228a..a254300ac3a 100644 --- a/devtools/client/locales/en-US/webconsole.properties +++ b/devtools/client/locales/en-US/webconsole.properties @@ -57,6 +57,12 @@ console.timeEnd=%1$S: %2$Sms - timer ended # console have been removed programmatically. consoleCleared=Console was cleared. +# LOCALIZATION NOTE (preventedConsoleClear): this string is displayed when receiving a +# call to console.clear() when the user has the "Persist logs" option enabled, to let the +# user know the console method call was ignored. +# "Persist Logs" should be kept in sync with webconsole.console.settings.menu.item.enablePersistentLogs.label +preventedConsoleClear=console.clear() was prevented due to “Persist Logs” + # LOCALIZATION NOTE (noCounterLabel): this string is used to display # count-messages with no label provided. noCounterLabel= diff --git a/devtools/client/webconsole/actions/messages.js b/devtools/client/webconsole/actions/messages.js index 635062efb6d..407cfa01219 100644 --- a/devtools/client/webconsole/actions/messages.js +++ b/devtools/client/webconsole/actions/messages.js @@ -32,22 +32,27 @@ const { const defaultIdGenerator = new IdGenerator(); -function messagesAdd(packets, idGenerator = null) { +function messagesAdd(packets, idGenerator = null, persistLogs = false) { if (idGenerator == null) { idGenerator = defaultIdGenerator; } - const messages = packets.map(packet => prepareMessage(packet, idGenerator)); + const messages = packets.map(packet => + prepareMessage(packet, idGenerator, persistLogs) + ); // Sort the messages by their timestamps. messages.sort(getNaturalOrder); - for (let i = messages.length - 1; i >= 0; i--) { - if (messages[i].type === MESSAGE_TYPE.CLEAR) { - return batchActions([ - messagesClear(), - { - type: MESSAGES_ADD, - messages: messages.slice(i), - }, - ]); + + if (!persistLogs) { + for (let i = messages.length - 1; i >= 0; i--) { + if (messages[i].type === MESSAGE_TYPE.CLEAR) { + return batchActions([ + messagesClear(), + { + type: MESSAGES_ADD, + messages: messages.slice(i), + }, + ]); + } } } diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_clear_cache.js b/devtools/client/webconsole/test/browser/browser_webconsole_clear_cache.js index 114c82923be..5b0ccda4d61 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_clear_cache.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_clear_cache.js @@ -77,6 +77,42 @@ add_task(async function () { ); }); +add_task(async function consoleClearPersist() { + // persist logs + await pushPref("devtools.webconsole.persistlog", true); + const tab = await addTab(TEST_URI); + let hud = await openConsole(tab); + + // Test that we also clear the cache when calling console.clear(). + const CACHED_MESSAGE = "CACHED_MESSAGE_PERSIST"; + await logTextToConsole(hud, CACHED_MESSAGE); + + info("Send a console.clear() from the content page"); + + const onConsoleClearPrevented = waitForMessageByType( + hud, + "console.clear() was prevented", + ".console-api" + ); + SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + content.wrappedJSObject.console.clear(); + }); + + await onConsoleClearPrevented; + + info("Close and re-open the console"); + await closeToolbox(); + hud = await openConsole(tab); + + info("Log a smoke message in order to know that the console is ready"); + await logTextToConsole(hud, "smoke message for persist"); + is( + findConsoleAPIMessage(hud, CACHED_MESSAGE), + undefined, + "The cached message is not visible anymore" + ); +}); + function logTextToConsole(hud, text) { const onMessage = waitForMessageByType(hud, text, ".console-api"); SpecialPowers.spawn(gBrowser.selectedBrowser, [text], function (str) { diff --git a/devtools/client/webconsole/test/browser/browser_webconsole_persist.js b/devtools/client/webconsole/test/browser/browser_webconsole_persist.js index 044a13be054..39ae76fdc86 100644 --- a/devtools/client/webconsole/test/browser/browser_webconsole_persist.js +++ b/devtools/client/webconsole/test/browser/browser_webconsole_persist.js @@ -263,6 +263,37 @@ add_task(async function () { await closeToolbox(); }); +add_task(async function consoleClearPersist() { + info("Testing that messages persist on console.clear if logs are persisted"); + + await pushPref("devtools.webconsole.persistlog", true); + const hud = await openNewTabAndConsole(TEST_COM_URI); + + await logAndAssertInitialMessages(hud); + + info("Send a console.clear() and another log from the content page"); + const onConsoleClearPrevented = waitForMessageByType( + hud, + "console.clear() was prevented", + ".console-api" + ); + SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => { + content.wrappedJSObject.console.clear(); + content.wrappedJSObject.console.log("after clear"); + }); + + await waitForMessageByType(hud, "after clear", ".log"); + await onConsoleClearPrevented; + ok(true, "console.clear was handled by the client"); + + ok( + findAllMessages(hud).length === INITIAL_LOGS_NUMBER + 2, + "All initial messages are still displayed, with the 2 new ones" + ); + + await closeToolbox(); +}); + function assertLastMessageIsNavigationMessage(hud, timeBeforeNavigation, url) { const { visibleMessages, mutableMessagesById } = hud.ui.wrapper .getStore() diff --git a/devtools/client/webconsole/utils/messages.js b/devtools/client/webconsole/utils/messages.js index aa3682bc377..0f881910be9 100644 --- a/devtools/client/webconsole/utils/messages.js +++ b/devtools/client/webconsole/utils/messages.js @@ -77,9 +77,9 @@ const { NetworkEventMessage, } = require("resource://devtools/client/webconsole/types.js"); -function prepareMessage(resource, idGenerator) { +function prepareMessage(resource, idGenerator, persistLogs) { if (!resource.source) { - resource = transformResource(resource); + resource = transformResource(resource, persistLogs); } resource.id = idGenerator.getNextId(resource); @@ -91,11 +91,12 @@ function prepareMessage(resource, idGenerator) { * * @param {Object} resource: This can be either a simple RDP packet or an object emitted * by the Resource API. + * @param {Boolean} persistLogs: Value of the "Persist logs" setting */ -function transformResource(resource) { +function transformResource(resource, persistLogs) { switch (resource.resourceType || resource.type) { case ResourceCommand.TYPES.CONSOLE_MESSAGE: { - return transformConsoleAPICallResource(resource); + return transformConsoleAPICallResource(resource, persistLogs); } case ResourceCommand.TYPES.PLATFORM_MESSAGE: { @@ -126,7 +127,7 @@ function transformResource(resource) { } // eslint-disable-next-line complexity -function transformConsoleAPICallResource(consoleMessageResource) { +function transformConsoleAPICallResource(consoleMessageResource, persistLogs) { const { message, targetFront } = consoleMessageResource; let parameters = message.arguments; @@ -139,7 +140,9 @@ function transformConsoleAPICallResource(consoleMessageResource) { switch (type) { case "clear": // We show a message to users when calls console.clear() is called. - parameters = [l10n.getStr("consoleCleared")]; + parameters = [ + l10n.getStr(persistLogs ? "preventedConsoleClear" : "consoleCleared"), + ]; break; case "count": case "countReset": diff --git a/devtools/client/webconsole/webconsole-wrapper.js b/devtools/client/webconsole/webconsole-wrapper.js index f1768f8dd35..82613583486 100644 --- a/devtools/client/webconsole/webconsole-wrapper.js +++ b/devtools/client/webconsole/webconsole-wrapper.js @@ -389,7 +389,10 @@ class WebConsoleWrapper { return; } - store.dispatch(actions.messagesAdd(this.queuedMessageAdds)); + const { ui } = store.getState(); + store.dispatch( + actions.messagesAdd(this.queuedMessageAdds, null, ui.persistLogs) + ); const { length } = this.queuedMessageAdds; diff --git a/devtools/server/actors/errordocs.js b/devtools/server/actors/errordocs.js index 0b6c35ad597..03363915def 100644 --- a/devtools/server/actors/errordocs.js +++ b/devtools/server/actors/errordocs.js @@ -113,6 +113,7 @@ const ErrorDocs = { JSMSG_PROPERTY_FAIL: "cant_access_property", JSMSG_PROPERTY_FAIL_EXPR: "cant_access_property", JSMSG_REDECLARED_VAR: "Redeclared_parameter", + JSMSG_MISMATCHED_PLACEMENT: "Mismatched placement", JSMSG_SET_NON_OBJECT_RECEIVER: "Cant_assign_to_property", }; diff --git a/devtools/shared/css/generated/properties-db.js b/devtools/shared/css/generated/properties-db.js index d5acf189838..d76ebdf4d37 100644 --- a/devtools/shared/css/generated/properties-db.js +++ b/devtools/shared/css/generated/properties-db.js @@ -239,17 +239,11 @@ exports.CSS_PROPERTIES = { "initial", "listbox", "menuarrow", - "menubar", - "menucheckbox", - "menuimage", "menuitem", - "menuitemtext", "menulist", "menulist-button", "menulist-text", "menupopup", - "menuradio", - "menuseparator", "meter", "meterchunk", "none", @@ -259,7 +253,6 @@ exports.CSS_PROPERTIES = { "radio", "radio-container", "radio-label", - "radiomenuitem", "range", "range-thumb", "revert", @@ -1506,17 +1499,11 @@ exports.CSS_PROPERTIES = { "initial", "listbox", "menuarrow", - "menubar", - "menucheckbox", - "menuimage", "menuitem", - "menuitemtext", "menulist", "menulist-button", "menulist-text", "menupopup", - "menuradio", - "menuseparator", "meter", "meterchunk", "none", @@ -1526,7 +1513,6 @@ exports.CSS_PROPERTIES = { "radio", "radio-container", "radio-label", - "radiomenuitem", "range", "range-thumb", "revert", @@ -3555,17 +3541,11 @@ exports.CSS_PROPERTIES = { "initial", "listbox", "menuarrow", - "menubar", - "menucheckbox", - "menuimage", "menuitem", - "menuitemtext", "menulist", "menulist-button", "menulist-text", "menupopup", - "menuradio", - "menuseparator", "meter", "meterchunk", "none", @@ -3575,7 +3555,6 @@ exports.CSS_PROPERTIES = { "radio", "radio-container", "radio-label", - "radiomenuitem", "range", "range-thumb", "revert", diff --git a/dom/base/StructuredCloneHolder.cpp b/dom/base/StructuredCloneHolder.cpp index 66d368ac42a..aa6af050b47 100644 --- a/dom/base/StructuredCloneHolder.cpp +++ b/dom/base/StructuredCloneHolder.cpp @@ -34,6 +34,8 @@ #include "mozilla/dom/DOMTypes.h" #include "mozilla/dom/Directory.h" #include "mozilla/dom/DocGroup.h" +#include "mozilla/dom/EncodedVideoChunk.h" +#include "mozilla/dom/EncodedVideoChunkBinding.h" #include "mozilla/dom/File.h" #include "mozilla/dom/FileList.h" #include "mozilla/dom/FileListBinding.h" @@ -397,6 +399,7 @@ void StructuredCloneHolder::Read(nsIGlobalObject* aGlobal, JSContext* aCx, mClonedSurfaces.Clear(); mInputStreamArray.Clear(); mVideoFrames.Clear(); + mEncodedVideoChunks.Clear(); Clear(); } } @@ -1113,6 +1116,17 @@ JSObject* StructuredCloneHolder::CustomReadHandler( } } + if (StaticPrefs::dom_media_webcodecs_enabled() && + aTag == SCTAG_DOM_ENCODEDVIDEOCHUNK && + CloneScope() == StructuredCloneScope::SameProcess && + aCloneDataPolicy.areIntraClusterClonableSharedObjectsAllowed()) { + JS::Rooted global(aCx, mGlobal->GetGlobalJSObject()); + if (EncodedVideoChunk_Binding::ConstructorEnabled(aCx, global)) { + return EncodedVideoChunk::ReadStructuredClone( + aCx, mGlobal, aReader, EncodedVideoChunks()[aIndex]); + } + } + return ReadFullySerializableObjects(aCx, aReader, aTag, false); } @@ -1220,6 +1234,18 @@ bool StructuredCloneHolder::CustomWriteHandler( } } + // See if this is a EncodedVideoChunk object. + if (StaticPrefs::dom_media_webcodecs_enabled()) { + EncodedVideoChunk* encodedVideoChunk = nullptr; + if (NS_SUCCEEDED( + UNWRAP_OBJECT(EncodedVideoChunk, &obj, encodedVideoChunk))) { + SameProcessScopeRequired(aSameProcessScopeRequired); + return CloneScope() == StructuredCloneScope::SameProcess + ? encodedVideoChunk->WriteStructuredClone(aWriter, this) + : false; + } + } + { // We only care about streams, so ReflectorToISupportsStatic is fine. nsCOMPtr base = xpc::ReflectorToISupportsStatic(aObj); diff --git a/dom/base/StructuredCloneHolder.h b/dom/base/StructuredCloneHolder.h index 2560c2c1fcd..206c3d3a259 100644 --- a/dom/base/StructuredCloneHolder.h +++ b/dom/base/StructuredCloneHolder.h @@ -165,6 +165,7 @@ class StructuredCloneHolderBase { }; class BlobImpl; +class EncodedVideoChunkData; class MessagePort; class MessagePortIdentifier; struct VideoFrameSerializedData; @@ -211,7 +212,7 @@ class StructuredCloneHolder : public StructuredCloneHolderBase { bool HasClonedDOMObjects() const { return !mBlobImplArray.IsEmpty() || !mWasmModuleArray.IsEmpty() || !mClonedSurfaces.IsEmpty() || !mInputStreamArray.IsEmpty() || - !mVideoFrames.IsEmpty(); + !mVideoFrames.IsEmpty() || !mEncodedVideoChunks.IsEmpty(); } nsTArray>& BlobImpls() { @@ -269,6 +270,10 @@ class StructuredCloneHolder : public StructuredCloneHolderBase { nsTArray& VideoFrames() { return mVideoFrames; } + nsTArray& EncodedVideoChunks() { + return mEncodedVideoChunks; + } + // Implementations of the virtual methods to allow cloning of objects which // JS engine itself doesn't clone. @@ -374,6 +379,9 @@ class StructuredCloneHolder : public StructuredCloneHolderBase { // Used for cloning VideoFrame in the structured cloning algorithm. nsTArray mVideoFrames; + // Used for cloning EncodedVideoChunk in the structured cloning algorithm. + nsTArray mEncodedVideoChunks; + // This raw pointer is only set within ::Read() and is unset by the end. nsIGlobalObject* MOZ_NON_OWNING_REF mGlobal; diff --git a/dom/base/StructuredCloneTags.h b/dom/base/StructuredCloneTags.h index 19007c29436..95233c62d7d 100644 --- a/dom/base/StructuredCloneTags.h +++ b/dom/base/StructuredCloneTags.h @@ -155,6 +155,8 @@ enum StructuredCloneTags : uint32_t { SCTAG_DOM_VIDEOFRAME, + SCTAG_DOM_ENCODEDVIDEOCHUNK, + // IMPORTANT: If you plan to add an new IDB tag, it _must_ be add before the // "less stable" tags! }; diff --git a/dom/base/test/unit/test_error_codes.js b/dom/base/test/unit/test_error_codes.js index 72b9e371d19..73c893c512e 100644 --- a/dom/base/test/unit/test_error_codes.js +++ b/dom/base/test/unit/test_error_codes.js @@ -3,28 +3,24 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -var gExpectedStatus = null; -var gNextTestFunc = null; - var prefs = Services.prefs; -var asyncXHR = { - load() { - var request = new XMLHttpRequest(); - request.open("GET", "http://localhost:4444/test_error_code.xml", true); +function asyncXHR(expectedStatus, nextTestFunc) { + var xhr = new XMLHttpRequest(); + xhr.open("GET", "http://localhost:4444/test_error_code.xml", true); - var self = this; - request.addEventListener("error", function (event) { - self.onError(event); - }); - request.send(null); - }, - onError: function doAsyncRequest_onError(event) { + var sawError = false; + xhr.addEventListener("loadend", function doAsyncRequest_onLoad(event) { + Assert.ok(sawError, "Should have received an error"); + nextTestFunc(); + }); + xhr.addEventListener("error", function doAsyncRequest_onError(event) { var request = event.target.channel.QueryInterface(Ci.nsIRequest); - Assert.equal(request.status, gExpectedStatus); - gNextTestFunc(); - }, -}; + Assert.equal(request.status, expectedStatus); + sawError = true; + }); + xhr.send(null); +} function run_test() { do_test_pending(); @@ -41,10 +37,8 @@ function run_test_pt1() { // We always resolve localhost as it's hardcoded without the following pref: prefs.setBoolPref("network.proxy.allow_hijacking_localhost", true); - gExpectedStatus = Cr.NS_ERROR_OFFLINE; - gNextTestFunc = run_test_pt2; dump("Testing error returned by async XHR when the network is offline\n"); - asyncXHR.load(); + asyncXHR(Cr.NS_ERROR_OFFLINE, run_test_pt2); } // connection refused @@ -53,10 +47,8 @@ function run_test_pt2() { prefs.clearUserPref("network.dns.offline-localhost"); prefs.clearUserPref("network.proxy.allow_hijacking_localhost"); - gExpectedStatus = Cr.NS_ERROR_CONNECTION_REFUSED; - gNextTestFunc = end_test; dump("Testing error returned by aync XHR when the connection is refused\n"); - asyncXHR.load(); + asyncXHR(Cr.NS_ERROR_CONNECTION_REFUSED, end_test); } function end_test() { diff --git a/dom/events/EventNameList.h b/dom/events/EventNameList.h index 3cc34a68069..680d520496c 100644 --- a/dom/events/EventNameList.h +++ b/dom/events/EventNameList.h @@ -295,6 +295,7 @@ WINDOW_EVENT(languagechange, eLanguageChange, // need a different macro to flag things like that (IDL, but not content // attributes on body/frameset), or is just using EventNameType_None enough? WINDOW_EVENT(message, eMessage, EventNameType_None, eBasicEventClass) +WINDOW_EVENT(rtctransform, eRTCTransform, EventNameType_None, eBasicEventClass) WINDOW_EVENT(messageerror, eMessageError, EventNameType_HTMLBodyOrFramesetOnly, eBasicEventClass) WINDOW_EVENT(offline, eOffline, diff --git a/dom/media/MediaData.h b/dom/media/MediaData.h index 4040f368ba5..0ecfaa79042 100644 --- a/dom/media/MediaData.h +++ b/dom/media/MediaData.h @@ -707,6 +707,18 @@ class MediaByteBuffer : public nsTArray { ~MediaByteBuffer() = default; }; +// MediaAlignedByteBuffer is a ref counted AlignedByteBuffer whose memory +// allocations are fallible. +class MediaAlignedByteBuffer final : public AlignedByteBuffer { + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaAlignedByteBuffer); + MediaAlignedByteBuffer() = default; + MediaAlignedByteBuffer(const uint8_t* aData, size_t aLength) + : AlignedByteBuffer(aData, aLength) {} + + private: + ~MediaAlignedByteBuffer() = default; +}; + } // namespace mozilla #endif // MediaData_h diff --git a/dom/media/VideoUtils.cpp b/dom/media/VideoUtils.cpp index cacda403278..485f426fcaf 100644 --- a/dom/media/VideoUtils.cpp +++ b/dom/media/VideoUtils.cpp @@ -483,6 +483,176 @@ bool ExtractH264CodecDetails(const nsAString& aCodec, uint8_t& aProfile, return true; } +bool IsH265ProfileRecognizable(uint8_t aProfile, + int32_t aProfileCompabilityFlags) { + enum Profile { + eUnknown, + eHighThroughputScreenExtended, + eScalableRangeExtension, + eScreenExtended, + e3DMain, + eScalableMain, + eMultiviewMain, + eHighThroughput, + eRangeExtension, + eMain10, + eMain, + eMainStillPicture + }; + Profile p = eUnknown; + + // Spec A.3.8 + if (aProfile == 11 || (aProfileCompabilityFlags & 0x800)) { + p = eHighThroughputScreenExtended; + } + // Spec H.11.1.2 + if (aProfile == 10 || (aProfileCompabilityFlags & 0x400)) { + p = eScalableRangeExtension; + } + // Spec A.3.7 + if (aProfile == 9 || (aProfileCompabilityFlags & 0x200)) { + p = eScreenExtended; + } + // Spec I.11.1.1 + if (aProfile == 8 || (aProfileCompabilityFlags & 0x100)) { + p = e3DMain; + } + // Spec H.11.1.1 + if (aProfile == 7 || (aProfileCompabilityFlags & 0x80)) { + p = eScalableMain; + } + // Spec G.11.1.1 + if (aProfile == 6 || (aProfileCompabilityFlags & 0x40)) { + p = eMultiviewMain; + } + // Spec A.3.6 + if (aProfile == 5 || (aProfileCompabilityFlags & 0x20)) { + p = eHighThroughput; + } + // Spec A.3.5 + if (aProfile == 4 || (aProfileCompabilityFlags & 0x10)) { + p = eRangeExtension; + } + // Spec A.3.3 + // NOTICE: Do not change the order of below sections + if (aProfile == 2 || (aProfileCompabilityFlags & 0x4)) { + p = eMain10; + } + // Spec A.3.2 + // When aProfileCompabilityFlags[1] is equal to 1, + // aProfileCompabilityFlags[2] should be equal to 1 as well. + if (aProfile == 1 || (aProfileCompabilityFlags & 0x2)) { + p = eMain; + } + // Spec A.3.4 + // When aProfileCompabilityFlags[3] is equal to 1, + // aProfileCompabilityFlags[1] and + // aProfileCompabilityFlags[2] should be equal to 1 as well. + if (aProfile == 3 || (aProfileCompabilityFlags & 0x8)) { + p = eMainStillPicture; + } + + return p != eUnknown; +} + +bool ExtractH265CodecDetails(const nsAString& aCodec, uint8_t& aProfile, + uint8_t& aLevel, nsTArray& aConstraints) { + // HEVC codec id consists of: + const size_t maxHevcCodecIdLength = + 5 + // 'hev1.' or 'hvc1.' prefix (5 chars) + 4 + // profile, e.g. '.A12' (max 4 chars) + 9 + // profile_compatibility, dot + 32-bit hex number (max 9 chars) + 5 + // tier and level, e.g. '.H120' (max 5 chars) + 18; // up to 6 constraint bytes, bytes are dot-separated and hex-encoded. + + if (aCodec.Length() > maxHevcCodecIdLength) { + return false; + } + + // Verify the codec starts with "hev1." or "hvc1.". + const nsAString& sample = Substring(aCodec, 0, 5); + if (!sample.EqualsASCII("hev1.") && !sample.EqualsASCII("hvc1.")) { + return false; + } + + nsresult rv; + CheckedUint8 profile; + int32_t compabilityFlags = 0; + CheckedUint8 level = 0; + nsTArray constraints; + + auto splitter = aCodec.Split(u'.'); + size_t count = 0; + for (auto iter = splitter.begin(); iter != splitter.end(); ++iter, ++count) { + const auto& fieldStr = *iter; + if (fieldStr.IsEmpty()) { + return false; + } + + if (count == 0) { + MOZ_RELEASE_ASSERT(fieldStr.EqualsASCII("hev1") || + fieldStr.EqualsASCII("hvc1")); + continue; + } + + if (count == 1) { // profile + Maybe validProfileSpace; + if (fieldStr.First() == u'A' || fieldStr.First() == u'B' || + fieldStr.First() == u'C') { + validProfileSpace.emplace(1 + (fieldStr.First() - 'A')); + } + // If fieldStr.First() is not A, B, C or a digit, ToInteger() should fail. + profile = validProfileSpace ? Substring(fieldStr, 1).ToInteger(&rv) + : fieldStr.ToInteger(&rv); + if (NS_FAILED(rv) || !profile.isValid() || profile.value() > 0x1F) { + return false; + } + continue; + } + + if (count == 2) { // profile compatibility flags + compabilityFlags = fieldStr.ToInteger(&rv, 16); + NS_ENSURE_SUCCESS(rv, false); + continue; + } + + if (count == 3) { // tier and level + Maybe validProfileTier; + if (fieldStr.First() == u'L' || fieldStr.First() == u'H') { + validProfileTier.emplace(fieldStr.First() == u'L' ? 0 : 1); + } + // If fieldStr.First() is not L, H, or a digit, ToInteger() should fail. + level = validProfileTier ? Substring(fieldStr, 1).ToInteger(&rv) + : fieldStr.ToInteger(&rv); + if (NS_FAILED(rv) || !level.isValid()) { + return false; + } + continue; + } + + // The rest is constraint bytes. + if (count > 10) { + return false; + } + + CheckedUint8 byte(fieldStr.ToInteger(&rv, 16)); + if (NS_FAILED(rv) || !byte.isValid()) { + return false; + } + constraints.AppendElement(byte.value()); + } + + if (count < 4 /* Parse til level at least */ || constraints.Length() > 6 || + !IsH265ProfileRecognizable(profile.value(), compabilityFlags)) { + return false; + } + + aProfile = profile.value(); + aLevel = level.value(); + aConstraints = std::move(constraints); + return true; +} + bool ExtractAV1CodecDetails(const nsAString& aCodec, uint8_t& aProfile, uint8_t& aLevel, uint8_t& aTier, uint8_t& aBitDepth, bool& aMonochrome, bool& aSubsamplingX, @@ -916,6 +1086,13 @@ bool IsH264CodecString(const nsAString& aCodec) { return ExtractH264CodecDetails(aCodec, profile, constraint, level); } +bool IsH265CodecString(const nsAString& aCodec) { + uint8_t profile = 0; + uint8_t level = 0; + nsTArray constraints; + return ExtractH265CodecDetails(aCodec, profile, level, constraints); +} + bool IsAACCodecString(const nsAString& aCodec) { return aCodec.EqualsLiteral("mp4a.40.2") || // MPEG4 AAC-LC aCodec.EqualsLiteral( diff --git a/dom/media/VideoUtils.h b/dom/media/VideoUtils.h index 98410286c83..cd7251525d1 100644 --- a/dom/media/VideoUtils.h +++ b/dom/media/VideoUtils.h @@ -347,6 +347,8 @@ bool ParseCodecsString(const nsAString& aCodecs, bool IsH264CodecString(const nsAString& aCodec); +bool IsH265CodecString(const nsAString& aCodec); + bool IsAACCodecString(const nsAString& aCodec); bool IsVP8CodecString(const nsAString& aCodec); diff --git a/dom/media/mediasource/MediaSourceDemuxer.cpp b/dom/media/mediasource/MediaSourceDemuxer.cpp index 945218da136..c0612132a9c 100644 --- a/dom/media/mediasource/MediaSourceDemuxer.cpp +++ b/dom/media/mediasource/MediaSourceDemuxer.cpp @@ -396,7 +396,9 @@ RefPtr MediaSourceTrackDemuxer::DoSeek( RefPtr sample = mManager->GetSample(mType, TimeUnit::Zero(), result); MOZ_ASSERT(NS_SUCCEEDED(result) && sample); - mNextSample = Some(sample); + if (sample) { + mNextSample = Some(sample); + } mReset = false; { MonitorAutoLock mon(mMonitor); @@ -456,6 +458,7 @@ MediaSourceTrackDemuxer::DoGetSamples(int32_t aNumSamples) { return SamplesPromise::CreateAndReject(result, __func__); } } + MOZ_DIAGNOSTIC_ASSERT(sample); RefPtr samples = new SamplesHolder; samples->AppendSample(sample); { diff --git a/dom/media/mp3/MP3Demuxer.cpp b/dom/media/mp3/MP3Demuxer.cpp index 2ccdd6f4b3a..7d1578edfe5 100644 --- a/dom/media/mp3/MP3Demuxer.cpp +++ b/dom/media/mp3/MP3Demuxer.cpp @@ -665,6 +665,8 @@ already_AddRefed MP3TrackDemuxer::GetNextFrame( mParser.VBRInfo().EncoderDelay()); mEncoderDelay = mParser.VBRInfo().EncoderDelay(); mEncoderPadding = mParser.VBRInfo().EncoderPadding(); + // Padding is encoded as a 12-bit unsigned number so this is fine. + mRemainingEncoderPadding = AssertedCast(mEncoderPadding); if (mEncoderDelay == 0) { // Skip the VBR frame + the decoder delay, that is always 529 frames // in practice for the decoder we're using. @@ -707,7 +709,7 @@ already_AddRefed MP3TrackDemuxer::GetNextFrame( // packets that aren't the last one. // For most files, the padding is less than a packet, it's simply substracted. if (mParser.VBRInfo().Type() == FrameParser::VBRHeader::XING && - Padding().IsPositive() && + mRemainingEncoderPadding > 0 && frame->GetEndTime() > Duration().valueOr(TimeUnit::FromInfinity())) { TimeUnit duration = Duration().value(); TimeUnit inPaddingZone = frame->GetEndTime() - duration; @@ -719,13 +721,20 @@ already_AddRefed MP3TrackDemuxer::GetNextFrame( if (frame->mDuration.IsNegative()) { frame->mDuration = TimeUnit::Zero(mSamplesPerSecond); } - MP3LOG( - "Found padding spanning multiple packets -- trimming [%s, %s] to " - "[%s,%s] (stream duration: %s)", - originalPts.ToString().get(), originalEnd.ToString().get(), - frame->mTime.ToString().get(), frame->GetEndTime().ToString().get(), - duration.ToString().get()); - } else if (frame->mEOS && Padding() <= frame->mDuration) { + int32_t paddingFrames = + AssertedCast(inPaddingZone.ToTicksAtRate(mSamplesPerSecond)); + if (mRemainingEncoderPadding >= paddingFrames) { + mRemainingEncoderPadding -= paddingFrames; + } else { + mRemainingEncoderPadding = 0; + } + MP3LOG("Trimming [%s, %s] to [%s,%s] (padding) (stream duration: %s)", + originalPts.ToString().get(), originalEnd.ToString().get(), + frame->mTime.ToString().get(), frame->GetEndTime().ToString().get(), + duration.ToString().get()); + } else if (frame->mEOS && + mRemainingEncoderPadding <= + frame->mDuration.ToTicksAtRate(mSamplesPerSecond)) { frame->mDuration -= Padding(); MOZ_ASSERT(frame->mDuration.IsPositiveOrZero()); MP3LOG("Trimming last packet %s to [%s,%s]", Padding().ToString().get(), diff --git a/dom/media/mp3/MP3Demuxer.h b/dom/media/mp3/MP3Demuxer.h index a38392e611e..5189e82acf8 100644 --- a/dom/media/mp3/MP3Demuxer.h +++ b/dom/media/mp3/MP3Demuxer.h @@ -177,6 +177,7 @@ class MP3TrackDemuxer : public MediaTrackDemuxer, uint32_t mEncoderDelay = 0; // Number of frames to skip at the end uint32_t mEncoderPadding = 0; + int32_t mRemainingEncoderPadding = 0; // End of stream has been found bool mEOS = false; }; diff --git a/dom/media/test/crashtests/1830206.html b/dom/media/test/crashtests/1830206.html new file mode 100644 index 00000000000..9b95c85c038 --- /dev/null +++ b/dom/media/test/crashtests/1830206.html @@ -0,0 +1,11 @@ + + + diff --git a/dom/media/test/crashtests/1830206.mp4 b/dom/media/test/crashtests/1830206.mp4 new file mode 100644 index 00000000000..5a95a4dffab Binary files /dev/null and b/dom/media/test/crashtests/1830206.mp4 differ diff --git a/dom/media/test/crashtests/crashtests.list b/dom/media/test/crashtests/crashtests.list index 042b3059614..8ab50dd194b 100644 --- a/dom/media/test/crashtests/crashtests.list +++ b/dom/media/test/crashtests/crashtests.list @@ -161,7 +161,6 @@ load adts.aac # Bug 1770073 load 1787281.html load 1798778.html load 1830206.html -load 1830206.html load 1833896.mp4 load 1833894.mp4 load 1835164.html diff --git a/dom/media/test/mochitest.ini b/dom/media/test/mochitest.ini index 1aea316fa4d..1b6ab2a06eb 100644 --- a/dom/media/test/mochitest.ini +++ b/dom/media/test/mochitest.ini @@ -783,6 +783,10 @@ support-files = hls/960x720_seg0.ts hls/960x720_seg1.ts sync.webm + two-xing-header-no-content-length.mp3 + two-xing-header-no-content-length.mp3^headers^ + single-xing-header-no-content-length.mp3 + single-xing-header-no-content-length.mp3^headers^ [test_capture_stream_av_sync.html] skip-if = @@ -885,3 +889,4 @@ tags = cloneelementvisually tags = cloneelementvisually [test_cloneElementVisually_ended_video.html] tags = cloneelementvisually +[test_mp3_broadcast.html] diff --git a/dom/media/test/single-xing-header-no-content-length.mp3 b/dom/media/test/single-xing-header-no-content-length.mp3 new file mode 100644 index 00000000000..aef54e220ac Binary files /dev/null and b/dom/media/test/single-xing-header-no-content-length.mp3 differ diff --git a/dom/media/test/single-xing-header-no-content-length.mp3^headers^ b/dom/media/test/single-xing-header-no-content-length.mp3^headers^ new file mode 100644 index 00000000000..abfeb4ce28a --- /dev/null +++ b/dom/media/test/single-xing-header-no-content-length.mp3^headers^ @@ -0,0 +1,3 @@ +HTTP 200 OK +Content-Length: invalid +Cache-Control: no-store diff --git a/dom/media/test/test_mp3_broadcast.html b/dom/media/test/test_mp3_broadcast.html new file mode 100644 index 00000000000..50a3a4b7d5b --- /dev/null +++ b/dom/media/test/test_mp3_broadcast.html @@ -0,0 +1,52 @@ + + + + + Test playback of broadcast-like streams + + + + + + + + + + + + diff --git a/dom/media/test/two-xing-header-no-content-length.mp3 b/dom/media/test/two-xing-header-no-content-length.mp3 new file mode 100644 index 00000000000..4d139e28861 Binary files /dev/null and b/dom/media/test/two-xing-header-no-content-length.mp3 differ diff --git a/dom/media/test/two-xing-header-no-content-length.mp3^headers^ b/dom/media/test/two-xing-header-no-content-length.mp3^headers^ new file mode 100644 index 00000000000..abfeb4ce28a --- /dev/null +++ b/dom/media/test/two-xing-header-no-content-length.mp3^headers^ @@ -0,0 +1,3 @@ +HTTP 200 OK +Content-Length: invalid +Cache-Control: no-store diff --git a/dom/media/webcodecs/EncodedVideoChunk.cpp b/dom/media/webcodecs/EncodedVideoChunk.cpp index 4c250a25d89..10c6c3fe73c 100644 --- a/dom/media/webcodecs/EncodedVideoChunk.cpp +++ b/dom/media/webcodecs/EncodedVideoChunk.cpp @@ -7,12 +7,29 @@ #include "mozilla/dom/EncodedVideoChunk.h" #include "mozilla/dom/EncodedVideoChunkBinding.h" +#include "MediaData.h" #include "mozilla/CheckedInt.h" +#include "mozilla/Logging.h" #include "mozilla/PodOperations.h" +#include "mozilla/dom/StructuredCloneHolder.h" +#include "mozilla/dom/StructuredCloneTags.h" #include "mozilla/dom/WebCodecsUtils.h" +extern mozilla::LazyLogModule gWebCodecsLog; + namespace mozilla::dom { +#ifdef LOG_INTERNAL +# undef LOG_INTERNAL +#endif // LOG_INTERNAL +#define LOG_INTERNAL(level, msg, ...) \ + MOZ_LOG(gWebCodecsLog, LogLevel::level, (msg, ##__VA_ARGS__)) + +#ifdef LOGW +# undef LOGW +#endif // LOGW +#define LOGW(msg, ...) LOG_INTERNAL(Warning, msg, ##__VA_ARGS__) + // Only needed for refcounted objects. NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(EncodedVideoChunk, mParent) NS_IMPL_CYCLE_COLLECTING_ADDREF(EncodedVideoChunk) @@ -22,22 +39,32 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(EncodedVideoChunk) NS_INTERFACE_MAP_ENTRY(nsISupports) NS_INTERFACE_MAP_END -EncodedVideoChunk::EncodedVideoChunk(nsIGlobalObject* aParent, - UniquePtr&& aBuffer, - size_t aByteLength, - const EncodedVideoChunkType& aType, - int64_t aTimestamp, - Maybe&& aDuration) - : mParent(aParent), - mBuffer(std::move(aBuffer)), - mByteLength(aByteLength), +EncodedVideoChunkData::EncodedVideoChunkData( + already_AddRefed aBuffer, + const EncodedVideoChunkType& aType, int64_t aTimestamp, + Maybe&& aDuration) + : mBuffer(aBuffer), mType(aType), mTimestamp(aTimestamp), - mDuration(std::move(aDuration)) { - MOZ_ASSERT(mByteLength <= + mDuration(aDuration) { + MOZ_ASSERT(mBuffer); + MOZ_ASSERT(mBuffer->Length() == mBuffer->Size()); + MOZ_ASSERT(mBuffer->Length() <= static_cast(std::numeric_limits::max())); } +EncodedVideoChunk::EncodedVideoChunk( + nsIGlobalObject* aParent, already_AddRefed aBuffer, + const EncodedVideoChunkType& aType, int64_t aTimestamp, + Maybe&& aDuration) + : EncodedVideoChunkData(std::move(aBuffer), aType, aTimestamp, + std::move(aDuration)), + mParent(aParent) {} + +EncodedVideoChunk::EncodedVideoChunk(nsIGlobalObject* aParent, + const EncodedVideoChunkData& aData) + : EncodedVideoChunkData(aData), mParent(aParent) {} + nsIGlobalObject* EncodedVideoChunk::GetParentObject() const { AssertIsOnOwningThread(); @@ -76,17 +103,22 @@ already_AddRefed EncodedVideoChunk::Constructor( return nullptr; } - UniquePtr buffer(new (fallible) uint8_t[buf.size_bytes()]); - if (!buffer) { + if (buf.size_bytes() == 0) { + LOGW("Buffer for constructing EncodedVideoChunk is empty!"); + } + + auto buffer = + MakeRefPtr(buf.data(), buf.size_bytes()); + // Instead of checking *buffer, size comparision is used to allow constructing + // a zero-sized EncodedVideoChunk. + if (!buffer || buffer->Size() != buf.size_bytes()) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); return nullptr; } - PodCopy(buffer.get(), buf.data(), buf.size_bytes()); - RefPtr chunk(new EncodedVideoChunk( - global, std::move(buffer), buf.size_bytes(), aInit.mType, - aInit.mTimestamp, OptionalToMaybe(aInit.mDuration))); + global, buffer.forget(), aInit.mType, aInit.mTimestamp, + OptionalToMaybe(aInit.mDuration))); return aRv.Failed() ? nullptr : chunk.forget(); } @@ -109,8 +141,9 @@ Nullable EncodedVideoChunk::GetDuration() const { uint32_t EncodedVideoChunk::ByteLength() const { AssertIsOnOwningThread(); + MOZ_ASSERT(mBuffer); - return static_cast(mByteLength); + return static_cast(mBuffer->Length()); } // https://w3c.github.io/webcodecs/#dom-encodedvideochunk-copyto @@ -126,13 +159,57 @@ void EncodedVideoChunk::CopyTo( } Span buf = r.unwrap(); - if (mByteLength > buf.size_bytes()) { + if (mBuffer->Size() > buf.size_bytes()) { aRv.ThrowTypeError( "Destination ArrayBuffer smaller than source EncodedVideoChunk"); return; } - PodCopy(buf.data(), mBuffer.get(), mByteLength); + PodCopy(buf.data(), mBuffer->Data(), mBuffer->Size()); } +uint8_t* EncodedVideoChunk::Data() { + MOZ_ASSERT(mBuffer); + return mBuffer->Data(); +} + +// https://w3c.github.io/webcodecs/#ref-for-deserialization-steps%E2%91%A0 +/* static */ +JSObject* EncodedVideoChunk::ReadStructuredClone( + JSContext* aCx, nsIGlobalObject* aGlobal, JSStructuredCloneReader* aReader, + const EncodedVideoChunkData& aData) { + JS::Rooted value(aCx, JS::NullValue()); + // To avoid a rooting hazard error from returning a raw JSObject* before + // running the RefPtr destructor, RefPtr needs to be destructed before + // returning the raw JSObject*, which is why the RefPtr is + // created in the scope below. Otherwise, the static analysis infers the + // RefPtr cannot be safely destructed while the unrooted return JSObject* is + // on the stack. + { + auto frame = MakeRefPtr(aGlobal, aData); + if (!GetOrCreateDOMReflector(aCx, frame, &value) || !value.isObject()) { + return nullptr; + } + } + return value.toObjectOrNull(); +} + +// https://w3c.github.io/webcodecs/#ref-for-serialization-steps%E2%91%A0 +bool EncodedVideoChunk::WriteStructuredClone( + JSStructuredCloneWriter* aWriter, StructuredCloneHolder* aHolder) const { + AssertIsOnOwningThread(); + + // Indexing the chunk and send the index to the receiver. + const uint32_t index = + static_cast(aHolder->EncodedVideoChunks().Length()); + // The serialization is limited to the same process scope so it's ok to + // serialize a reference instead of a copy. + aHolder->EncodedVideoChunks().AppendElement(EncodedVideoChunkData(*this)); + return !NS_WARN_IF( + !JS_WriteUint32Pair(aWriter, SCTAG_DOM_ENCODEDVIDEOCHUNK, index)); +} + +#undef LOGW +#undef LOG_INTERNAL + } // namespace mozilla::dom diff --git a/dom/media/webcodecs/EncodedVideoChunk.h b/dom/media/webcodecs/EncodedVideoChunk.h index a5864bacadf..3490d8f8f11 100644 --- a/dom/media/webcodecs/EncodedVideoChunk.h +++ b/dom/media/webcodecs/EncodedVideoChunk.h @@ -11,7 +11,6 @@ #include "mozilla/Attributes.h" #include "mozilla/ErrorResult.h" #include "mozilla/Maybe.h" -#include "mozilla/UniquePtr.h" #include "mozilla/dom/BindingDeclarations.h" #include "nsCycleCollectionParticipant.h" #include "nsWrapperCache.h" @@ -19,10 +18,14 @@ class nsIGlobalObject; namespace mozilla { + +class MediaAlignedByteBuffer; + namespace dom { class MaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer; class OwningMaybeSharedArrayBufferViewOrMaybeSharedArrayBuffer; +class StructuredCloneHolder; enum class EncodedVideoChunkType : uint8_t; struct EncodedVideoChunkInit; @@ -32,15 +35,37 @@ struct EncodedVideoChunkInit; namespace mozilla::dom { -class EncodedVideoChunk final : public nsISupports, public nsWrapperCache { +class EncodedVideoChunkData { + public: + EncodedVideoChunkData(already_AddRefed aBuffer, + const EncodedVideoChunkType& aType, int64_t aTimestamp, + Maybe&& aDuration); + EncodedVideoChunkData(const EncodedVideoChunkData& aData) = default; + ~EncodedVideoChunkData() = default; + + protected: + // mBuffer's byte length is guaranteed to be smaller than UINT32_MAX. + RefPtr mBuffer; + EncodedVideoChunkType mType; + int64_t mTimestamp; + Maybe mDuration; +}; + +class EncodedVideoChunk final : public EncodedVideoChunkData, + public nsISupports, + public nsWrapperCache { public: NS_DECL_CYCLE_COLLECTING_ISUPPORTS NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(EncodedVideoChunk) public: - EncodedVideoChunk(nsIGlobalObject* aParent, UniquePtr&& aBuffer, - size_t aByteLength, const EncodedVideoChunkType& aType, - int64_t aTimestamp, Maybe&& aDuration); + EncodedVideoChunk(nsIGlobalObject* aParent, + already_AddRefed aBuffer, + const EncodedVideoChunkType& aType, int64_t aTimestamp, + Maybe&& aDuration); + + EncodedVideoChunk(nsIGlobalObject* aParent, + const EncodedVideoChunkData& aData); protected: ~EncodedVideoChunk() = default; @@ -68,7 +93,15 @@ class EncodedVideoChunk final : public nsISupports, public nsWrapperCache { ErrorResult& aRv); // Non-webidl method. - uint8_t* Data() { return mBuffer.get(); } + uint8_t* Data(); + + // [Serializable] implementations: {Read, Write}StructuredClone + static JSObject* ReadStructuredClone(JSContext* aCx, nsIGlobalObject* aGlobal, + JSStructuredCloneReader* aReader, + const EncodedVideoChunkData& aData); + + bool WriteStructuredClone(JSStructuredCloneWriter* aWriter, + StructuredCloneHolder* aHolder) const; private: // EncodedVideoChunk can run on either main thread or worker thread. @@ -77,11 +110,6 @@ class EncodedVideoChunk final : public nsISupports, public nsWrapperCache { } nsCOMPtr mParent; - UniquePtr mBuffer; - size_t mByteLength; // guaranteed to be smaller than UINT32_MAX. - EncodedVideoChunkType mType; - int64_t mTimestamp; - Maybe mDuration; }; } // namespace mozilla::dom diff --git a/dom/media/webcodecs/VideoDecoder.cpp b/dom/media/webcodecs/VideoDecoder.cpp index bcfb2bfea97..43b90617f89 100644 --- a/dom/media/webcodecs/VideoDecoder.cpp +++ b/dom/media/webcodecs/VideoDecoder.cpp @@ -90,17 +90,18 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper) */ // https://w3c.github.io/webcodecs/#valid-videodecoderconfig -static bool IsValid(const VideoDecoderConfig& aConfig) { +static Result Validate(const VideoDecoderConfig& aConfig) { nsTArray codecs; if (!ParseCodecsString(aConfig.mCodec, codecs) || codecs.Length() != 1 || codecs[0] != aConfig.mCodec) { - return false; + return Err("invalid codec string"_ns); } // WebCodecs doesn't support theora if (!IsAV1CodecString(codecs[0]) && !IsVP9CodecString(codecs[0]) && - !IsVP8CodecString(codecs[0]) && !IsH264CodecString(codecs[0])) { - return false; + !IsVP8CodecString(codecs[0]) && !IsH264CodecString(codecs[0]) && + !IsH265CodecString(codecs[0])) { + return Err("unsupported codec"_ns); } // Gecko allows codec string starts with vp9 or av1 but Webcodecs requires to @@ -108,28 +109,31 @@ static bool IsValid(const VideoDecoderConfig& aConfig) { // https://www.w3.org/TR/webcodecs-codec-registry/#video-codec-registry if (StringBeginsWith(aConfig.mCodec, u"vp9"_ns) || StringBeginsWith(aConfig.mCodec, u"av1"_ns)) { - return false; + return Err("invalid codec string"_ns); } if (aConfig.mCodedWidth.WasPassed() != aConfig.mCodedHeight.WasPassed()) { - return false; + return aConfig.mCodedWidth.WasPassed() + ? Err("Invalid VideoDecoderConfig: codedWidth passed without codedHeight"_ns) + : Err("Invalid VideoDecoderConfig: codedHeight passed without codedWidth"_ns); } if (aConfig.mCodedWidth.WasPassed() && (aConfig.mCodedWidth.Value() == 0 || aConfig.mCodedHeight.Value() == 0)) { - return false; + return Err("codedWidth and/or codedHeight can't be zero"_ns); } if (aConfig.mDisplayAspectWidth.WasPassed() != aConfig.mDisplayAspectHeight.WasPassed()) { - return false; + return Err( + "display aspect width or height cannot be set without the other"_ns); } if (aConfig.mDisplayAspectWidth.WasPassed() && (aConfig.mDisplayAspectWidth.Value() == 0 || aConfig.mDisplayAspectHeight.Value() == 0)) { - return false; + return Err("display aspect width and height cannot be zero"_ns); } - return true; + return Ok(); } static nsTArray GuessMIMETypes(const nsAString& aCodec, @@ -368,7 +372,7 @@ static Result, nsresult> CreateVideoInfo( static Result CloneConfiguration( RootedDictionary& aDest, JSContext* aCx, const VideoDecoderConfig& aConfig) { - MOZ_ASSERT(IsValid(aConfig)); + MOZ_ASSERT(Validate(aConfig).isOk()); aDest.mCodec = aConfig.mCodec; if (aConfig.mCodedHeight.WasPassed()) { @@ -639,7 +643,9 @@ VideoColorSpaceInit VideoColorSpaceInternal::ToColorSpaceInit() const { /* static */ UniquePtr VideoDecoderConfigInternal::Create( const VideoDecoderConfig& aConfig) { - if (!IsValid(aConfig)) { + if (auto r = Validate(aConfig); r.isErr()) { + nsCString e = r.unwrapErr(); + LOGE("Failed to create VideoDecoderConfigInternal: %s", e.get()); return nullptr; } @@ -647,6 +653,10 @@ UniquePtr VideoDecoderConfigInternal::Create( if (aConfig.mDescription.WasPassed()) { auto rv = GetExtraData(aConfig.mDescription.Value()); if (rv.isErr()) { // Invalid description data. + LOGE( + "Failed to create VideoDecoderConfigInternal due to invalid " + "description data. Error: 0x%08" PRIx32, + static_cast(rv.unwrapErr())); return nullptr; } description.emplace(rv.unwrap()); @@ -918,8 +928,10 @@ void VideoDecoder::Configure(const VideoDecoderConfig& aConfig, LOG("VideoDecoder %p, Configure: codec %s", this, NS_ConvertUTF16toUTF8(aConfig.mCodec).get()); - if (!IsValid(aConfig)) { - aRv.ThrowTypeError("Invalid VideoDecoderConfig"); + if (auto r = Validate(aConfig); r.isErr()) { + nsCString e = r.unwrapErr(); + LOGE("config is invalid: %s", e.get()); + aRv.ThrowTypeError(e); return; } @@ -1045,8 +1057,10 @@ already_AddRefed VideoDecoder::IsConfigSupported( return p.forget(); } - if (!IsValid(aConfig)) { - p->MaybeRejectWithTypeError("Invalid VideoDecoderConfig"); + if (auto r = Validate(aConfig); r.isErr()) { + nsCString e = r.unwrapErr(); + LOGE("config is invalid: %s", e.get()); + p->MaybeRejectWithTypeError(e); return p.forget(); } diff --git a/dom/media/webcodecs/WebCodecsUtils.h b/dom/media/webcodecs/WebCodecsUtils.h index eb3d67aab56..b9df4e7f81d 100644 --- a/dom/media/webcodecs/WebCodecsUtils.h +++ b/dom/media/webcodecs/WebCodecsUtils.h @@ -31,7 +31,7 @@ enum class YUVColorSpace : uint8_t; namespace dom { /* - * The followings are helpers for VideoDecoder methods + * The followings are helpers for WebCodecs methods */ nsTArray GuessContainers(const nsAString& aCodec); diff --git a/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp b/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp new file mode 100644 index 00000000000..3a339593442 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.cpp @@ -0,0 +1,94 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "jsapi/RTCEncodedAudioFrame.h" + +#include + +#include +#include + +#include "api/frame_transformer_interface.h" + +#include "jsapi/RTCEncodedFrameBase.h" +#include "jsapi/RTCRtpScriptTransform.h" +#include "mozilla/dom/RTCRtpScriptTransformer.h" +#include "mozilla/dom/RTCEncodedAudioFrameBinding.h" +#include "nsWrapperCache.h" +#include "nsISupports.h" +#include "nsCycleCollectionParticipant.h" +#include "nsIGlobalObject.h" +#include "nsContentUtils.h" +#include "mozilla/HoldDropJSObjects.h" +#include "mozilla/RefPtr.h" +#include "mozilla/Unused.h" +#include "mozilla/fallible.h" +#include "js/RootingAPI.h" + +namespace mozilla::dom { + +NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase, + mOwner) +NS_IMPL_ADDREF_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) +NS_IMPL_RELEASE_INHERITED(RTCEncodedAudioFrame, RTCEncodedFrameBase) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedAudioFrame) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY +NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) + +RTCEncodedAudioFrame::RTCEncodedAudioFrame( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter, RTCRtpScriptTransformer* aOwner) + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), + mOwner(aOwner) { + mMetadata.mSynchronizationSource.Construct(mFrame->GetSsrc()); + mMetadata.mPayloadType.Construct(mFrame->GetPayloadType()); + // send frames are derived directly from TransformableFrameInterface, not + // TransformableAudioFrameInterface! Right now, send frames have no csrcs + // or sequence number + // TODO(bug 1835076): Fix this + if (mFrame->GetDirection() == + webrtc::TransformableFrameInterface::Direction::kReceiver) { + const auto& audioFrame( + static_cast(*mFrame)); + mMetadata.mContributingSources.Construct(); + for (const auto csrc : audioFrame.GetContributingSources()) { + Unused << mMetadata.mContributingSources.Value().AppendElement(csrc, + fallible); + } + mMetadata.mSequenceNumber.Construct(audioFrame.GetHeader().sequenceNumber); + } + + // Base class needs this, but can't do it itself because of an assertion in + // the cycle-collector. + mozilla::HoldJSObjects(this); +} + +RTCEncodedAudioFrame::~RTCEncodedAudioFrame() { + // Base class needs this, but can't do it itself because of an assertion in + // the cycle-collector. + mozilla::DropJSObjects(this); +} + +JSObject* RTCEncodedAudioFrame::WrapObject(JSContext* aCx, + JS::Handle aGivenProto) { + return RTCEncodedAudioFrame_Binding::Wrap(aCx, this, aGivenProto); +} + +nsIGlobalObject* RTCEncodedAudioFrame::GetParentObject() const { + return mGlobal; +} + +void RTCEncodedAudioFrame::GetMetadata( + RTCEncodedAudioFrameMetadata& aMetadata) const { + aMetadata = mMetadata; +} + +bool RTCEncodedAudioFrame::CheckOwner(RTCRtpScriptTransformer* aOwner) const { + return aOwner == mOwner; +} +} // namespace mozilla::dom diff --git a/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h b/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h new file mode 100644 index 00000000000..339231ccc27 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedAudioFrame.h @@ -0,0 +1,52 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_ + +#include "mozilla/RefPtr.h" +#include "nsIGlobalObject.h" +#include "jsapi/RTCEncodedFrameBase.h" +#include "mozilla/dom/RTCEncodedAudioFrameBinding.h" + +namespace mozilla::dom { + +// Wraps a libwebrtc frame, allowing the frame buffer to be modified, and +// providing read-only access to various metadata. After the libwebrtc frame is +// extracted (with RTCEncodedFrameBase::TakeFrame), the frame buffer is +// detached, but the metadata remains accessible. +class RTCEncodedAudioFrame final : public RTCEncodedFrameBase { + public: + explicit RTCEncodedAudioFrame( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter, RTCRtpScriptTransformer* aOwner); + + // nsISupports + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedAudioFrame, + RTCEncodedFrameBase) + + // webidl (timestamp and data accessors live in base class) + JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; + + nsIGlobalObject* GetParentObject() const; + + void GetMetadata(RTCEncodedAudioFrameMetadata& aMetadata) const; + + bool CheckOwner(RTCRtpScriptTransformer* aOwner) const override; + + bool IsVideo() const override { return false; } + + private: + virtual ~RTCEncodedAudioFrame(); + RefPtr mOwner; + RTCEncodedAudioFrameMetadata mMetadata; +}; + +} // namespace mozilla::dom +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDAUDIOFRAME_H_ diff --git a/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp new file mode 100644 index 00000000000..8abd0fbc450 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.cpp @@ -0,0 +1,71 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "jsapi/RTCEncodedFrameBase.h" + +#include "nsIGlobalObject.h" +#include "mozilla/dom/ScriptSettings.h" +#include "js/ArrayBuffer.h" + +namespace mozilla::dom { +NS_IMPL_CYCLE_COLLECTION_WITH_JS_MEMBERS(RTCEncodedFrameBase, (mGlobal), + (mData)) +NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCEncodedFrameBase) +NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCEncodedFrameBase) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedFrameBase) + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +RTCEncodedFrameBase::RTCEncodedFrameBase( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter) + : mGlobal(aGlobal), + mFrame(std::move(aFrame)), + mCounter(aCounter), + mTimestamp(mFrame->GetTimestamp()) { + AutoJSAPI jsapi; + if (NS_WARN_IF(!jsapi.Init(mGlobal))) { + return; + } + + // Avoid a copy + mData = JS::NewArrayBufferWithUserOwnedContents( + jsapi.cx(), mFrame->GetData().size(), (void*)(mFrame->GetData().data())); +} + +RTCEncodedFrameBase::~RTCEncodedFrameBase() = default; + +unsigned long RTCEncodedFrameBase::Timestamp() const { return mTimestamp; } + +void RTCEncodedFrameBase::SetData(const ArrayBuffer& aData) { + mData.set(aData.Obj()); + if (mFrame) { + aData.ComputeState(); + mFrame->SetData(rtc::ArrayView( + static_cast(aData.Data()), aData.Length())); + } +} + +void RTCEncodedFrameBase::GetData(JSContext* aCx, JS::Rooted* aObj) { + aObj->set(mData); +} + +uint64_t RTCEncodedFrameBase::GetCounter() const { return mCounter; } + +std::unique_ptr +RTCEncodedFrameBase::TakeFrame() { + AutoJSAPI jsapi; + if (!jsapi.Init(mGlobal)) { + MOZ_CRASH("Could not init JSAPI!"); + } + JS::Rooted rootedData(jsapi.cx(), mData); + JS::DetachArrayBuffer(jsapi.cx(), rootedData); + return std::move(mFrame); +} + +} // namespace mozilla::dom diff --git a/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h new file mode 100644 index 00000000000..25546257be9 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedFrameBase.h @@ -0,0 +1,58 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDFRAMEBASE_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDFRAMEBASE_H_ + +#include "js/TypeDecls.h" +#include "mozilla/dom/TypedArray.h" // ArrayBuffer +#include "mozilla/Assertions.h" +#include "api/frame_transformer_interface.h" +#include + +class nsIGlobalObject; + +namespace mozilla::dom { + +class RTCRtpScriptTransformer; + +class RTCEncodedFrameBase : public nsISupports, public nsWrapperCache { + public: + explicit RTCEncodedFrameBase( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter); + + // nsISupports + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCEncodedFrameBase) + + // Common webidl for RTCEncodedVideoFrame/RTCEncodedAudioFrame + unsigned long Timestamp() const; + + void SetData(const ArrayBuffer& aData); + + void GetData(JSContext* aCx, JS::Rooted* aObj); + + uint64_t GetCounter() const; + + virtual bool CheckOwner(RTCRtpScriptTransformer* aOwner) const = 0; + + std::unique_ptr TakeFrame(); + + virtual bool IsVideo() const = 0; + + protected: + virtual ~RTCEncodedFrameBase(); + RefPtr mGlobal; + std::unique_ptr mFrame; + const uint64_t mCounter = 0; + const unsigned long mTimestamp = 0; + JS::Heap mData; +}; + +} // namespace mozilla::dom +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDFRAMEBASE_H_ diff --git a/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp b/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp new file mode 100644 index 00000000000..f3f8eb4a154 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.cpp @@ -0,0 +1,117 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "jsapi/RTCEncodedVideoFrame.h" + +#include +#include +#include +#include + +#include "api/frame_transformer_interface.h" + +#include "jsapi/RTCEncodedFrameBase.h" +#include "mozilla/dom/RTCEncodedVideoFrameBinding.h" +#include "mozilla/dom/RTCRtpScriptTransformer.h" +#include "nsWrapperCache.h" +#include "nsISupports.h" +#include "nsCycleCollectionParticipant.h" +#include "nsIGlobalObject.h" +#include "nsContentUtils.h" +#include "mozilla/RefPtr.h" +#include "mozilla/Unused.h" +#include "mozilla/fallible.h" +#include "mozilla/Maybe.h" +#include "js/RootingAPI.h" + +namespace mozilla::dom { + +NS_IMPL_CYCLE_COLLECTION_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase, + mOwner) +NS_IMPL_ADDREF_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) +NS_IMPL_RELEASE_INHERITED(RTCEncodedVideoFrame, RTCEncodedFrameBase) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCEncodedVideoFrame) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY +NS_INTERFACE_MAP_END_INHERITING(RTCEncodedFrameBase) + +RTCEncodedVideoFrame::RTCEncodedVideoFrame( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter, RTCRtpScriptTransformer* aOwner) + : RTCEncodedFrameBase(aGlobal, std::move(aFrame), aCounter), + mOwner(aOwner) { + const auto& videoFrame( + static_cast(*mFrame)); + mType = videoFrame.IsKeyFrame() ? RTCEncodedVideoFrameType::Key + : RTCEncodedVideoFrameType::Delta; + + if (videoFrame.GetMetadata().GetFrameId().has_value()) { + mMetadata.mFrameId.Construct(*videoFrame.GetMetadata().GetFrameId()); + } + mMetadata.mDependencies.Construct(); + for (const auto dep : videoFrame.GetMetadata().GetFrameDependencies()) { + Unused << mMetadata.mDependencies.Value().AppendElement( + static_cast(dep), fallible); + } + mMetadata.mWidth.Construct(videoFrame.GetMetadata().GetWidth()); + mMetadata.mHeight.Construct(videoFrame.GetMetadata().GetHeight()); + if (videoFrame.GetMetadata().GetSpatialIndex() >= 0) { + mMetadata.mSpatialIndex.Construct( + videoFrame.GetMetadata().GetSpatialIndex()); + } + if (videoFrame.GetMetadata().GetTemporalIndex() >= 0) { + mMetadata.mTemporalIndex.Construct( + videoFrame.GetMetadata().GetTemporalIndex()); + } + mMetadata.mSynchronizationSource.Construct(videoFrame.GetSsrc()); + mMetadata.mPayloadType.Construct(videoFrame.GetPayloadType()); + mMetadata.mContributingSources.Construct(); + for (const auto csrc : videoFrame.GetMetadata().GetCsrcs()) { + Unused << mMetadata.mContributingSources.Value().AppendElement(csrc, + fallible); + } + + // The metadata timestamp is different, and not presently present in the + // libwebrtc types + if (!videoFrame.GetRid().empty()) { + mRid = Some(videoFrame.GetRid()); + } + + // Base class needs this, but can't do it itself because of an assertion in + // the cycle-collector. + mozilla::HoldJSObjects(this); +} + +RTCEncodedVideoFrame::~RTCEncodedVideoFrame() { + // Base class needs this, but can't do it itself because of an assertion in + // the cycle-collector. + mozilla::DropJSObjects(this); +} + +JSObject* RTCEncodedVideoFrame::WrapObject(JSContext* aCx, + JS::Handle aGivenProto) { + return RTCEncodedVideoFrame_Binding::Wrap(aCx, this, aGivenProto); +} + +nsIGlobalObject* RTCEncodedVideoFrame::GetParentObject() const { + return mGlobal; +} + +RTCEncodedVideoFrameType RTCEncodedVideoFrame::Type() const { return mType; } + +void RTCEncodedVideoFrame::GetMetadata( + RTCEncodedVideoFrameMetadata& aMetadata) { + aMetadata = mMetadata; +} + +bool RTCEncodedVideoFrame::CheckOwner(RTCRtpScriptTransformer* aOwner) const { + return aOwner == mOwner; +} + +Maybe RTCEncodedVideoFrame::Rid() const { return mRid; } + +} // namespace mozilla::dom diff --git a/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h b/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h new file mode 100644 index 00000000000..7f1e04db96a --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCEncodedVideoFrame.h @@ -0,0 +1,61 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ + +#include "mozilla/RefPtr.h" +#include "nsIGlobalObject.h" +#include "jsapi/RTCEncodedFrameBase.h" +#include "mozilla/dom/RTCEncodedVideoFrameBinding.h" + +namespace mozilla::dom { +class RTCRtpScriptTransformer; + +// Wraps a libwebrtc frame, allowing the frame buffer to be modified, and +// providing read-only access to various metadata. After the libwebrtc frame is +// extracted (with RTCEncodedFrameBase::TakeFrame), the frame buffer is +// detached, but the metadata remains accessible. +class RTCEncodedVideoFrame final : public RTCEncodedFrameBase { + public: + explicit RTCEncodedVideoFrame( + nsIGlobalObject* aGlobal, + std::unique_ptr aFrame, + uint64_t aCounter, RTCRtpScriptTransformer* aOwner); + + // nsISupports + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(RTCEncodedVideoFrame, + RTCEncodedFrameBase) + + // webidl (timestamp and data accessors live in base class) + JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; + + nsIGlobalObject* GetParentObject() const; + + RTCEncodedVideoFrameType Type() const; + + void GetMetadata(RTCEncodedVideoFrameMetadata& aMetadata); + + bool CheckOwner(RTCRtpScriptTransformer* aOwner) const override; + + bool IsVideo() const override { return true; } + + // Not in webidl right now. Might change. + // https://github.com/w3c/webrtc-encoded-transform/issues/147 + Maybe Rid() const; + + private: + virtual ~RTCEncodedVideoFrame(); + RefPtr mOwner; + RTCEncodedVideoFrameType mType; + RTCEncodedVideoFrameMetadata mMetadata; + Maybe mRid; +}; + +} // namespace mozilla::dom +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCENCODEDVIDEOFRAME_H_ diff --git a/dom/media/webrtc/jsapi/RTCRtpReceiver.cpp b/dom/media/webrtc/jsapi/RTCRtpReceiver.cpp index 136aa5142f2..7f4d6340d19 100644 --- a/dom/media/webrtc/jsapi/RTCRtpReceiver.cpp +++ b/dom/media/webrtc/jsapi/RTCRtpReceiver.cpp @@ -3,32 +3,82 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "RTCRtpReceiver.h" + +#include + +#include +#include +#include + +#include "call/call.h" +#include "call/audio_receive_stream.h" +#include "call/video_receive_stream.h" +#include "api/rtp_parameters.h" +#include "api/units/timestamp.h" +#include "api/units/time_delta.h" +#include "system_wrappers/include/clock.h" +#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" + +#include "RTCRtpTransceiver.h" #include "PeerConnectionImpl.h" +#include "RTCStatsReport.h" +#include "mozilla/dom/RTCRtpReceiverBinding.h" +#include "mozilla/dom/RTCRtpSourcesBinding.h" +#include "mozilla/dom/RTCStatsReportBinding.h" +#include "jsep/JsepTransceiver.h" +#include "libwebrtcglue/MediaConduitControl.h" +#include "libwebrtcglue/MediaConduitInterface.h" +#include "transportbridge/MediaPipeline.h" +#include "sdp/SdpEnum.h" +#include "sdp/SdpAttribute.h" +#include "MediaTransportHandler.h" +#include "RemoteTrackSource.h" + #include "mozilla/dom/RTCRtpCapabilitiesBinding.h" -#include "transport/logging.h" #include "mozilla/dom/MediaStreamTrack.h" #include "mozilla/dom/Promise.h" +#include "mozilla/dom/Nullable.h" +#include "mozilla/dom/Document.h" +#include "mozilla/dom/AudioStreamTrack.h" +#include "mozilla/dom/VideoStreamTrack.h" +#include "mozilla/dom/RTCRtpScriptTransform.h" + #include "nsPIDOMWindow.h" #include "PrincipalHandle.h" #include "nsIPrincipal.h" -#include "mozilla/dom/Document.h" -#include "mozilla/NullPrincipal.h" #include "MediaTrackGraph.h" -#include "RemoteTrackSource.h" -#include "libwebrtcglue/RtpRtcpConfig.h" -#include "nsString.h" -#include "mozilla/dom/AudioStreamTrack.h" -#include "mozilla/dom/VideoStreamTrack.h" -#include "MediaTransportHandler.h" -#include "jsep/JsepTransceiver.h" -#include "mozilla/dom/RTCRtpReceiverBinding.h" -#include "mozilla/dom/RTCRtpSourcesBinding.h" -#include "RTCStatsReport.h" +#include "nsStringFwd.h" +#include "MediaSegment.h" +#include "nsLiteralString.h" +#include "nsTArray.h" +#include "nsDOMNavigationTiming.h" +#include "MainThreadUtils.h" +#include "ErrorList.h" +#include "nsWrapperCache.h" +#include "nsISupports.h" +#include "nsCOMPtr.h" +#include "nsIScriptObjectPrincipal.h" +#include "nsCycleCollectionParticipant.h" +#include "nsDebug.h" +#include "nsThreadUtils.h" +#include "PerformanceRecorder.h" + +#include "mozilla/NullPrincipal.h" #include "mozilla/Preferences.h" -#include "PeerConnectionCtx.h" -#include "RTCRtpTransceiver.h" -#include "libwebrtcglue/AudioConduit.h" -#include "call/call.h" +#include "mozilla/StateMirroring.h" +#include "mozilla/Logging.h" +#include "mozilla/RefPtr.h" +#include "mozilla/AbstractThread.h" +#include "mozilla/StateWatching.h" +#include "mozilla/Maybe.h" +#include "mozilla/Assertions.h" +#include "mozilla/AlreadyAddRefed.h" +#include "mozilla/MozPromise.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/fallible.h" +#include "mozilla/mozalloc_oom.h" +#include "mozilla/ErrorResult.h" +#include "js/RootingAPI.h" namespace mozilla::dom { @@ -40,8 +90,8 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCRtpReceiver) NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCRtpReceiver) - NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow, mPc, mTransceiver, mTrack, - mTrackSource) + NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow, mPc, mTransceiver, mTransform, + mTrack, mTrackSource) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCRtpReceiver) @@ -89,7 +139,8 @@ RTCRtpReceiver::RTCRtpReceiver( INIT_CANONICAL(mAudioCodecs, std::vector()), INIT_CANONICAL(mVideoCodecs, std::vector()), INIT_CANONICAL(mVideoRtpRtcpConfig, Nothing()), - INIT_CANONICAL(mReceiving, false) { + INIT_CANONICAL(mReceiving, false), + INIT_CANONICAL(mFrameTransformerProxy, nullptr) { PrincipalHandle principalHandle = GetPrincipalHandle(aWindow, aPrivacy); const bool isAudio = aConduit->type() == MediaSessionConduit::AUDIO; @@ -605,6 +656,9 @@ void RTCRtpReceiver::Shutdown() { mRtcpByeListener.DisconnectIfExists(); mRtcpTimeoutListener.DisconnectIfExists(); mUnmuteListener.DisconnectIfExists(); + if (mTransform) { + mTransform->GetProxy().SetReceiver(nullptr); + } } void RTCRtpReceiver::BreakCycles() { @@ -937,6 +991,48 @@ const JsepTransceiver& RTCRtpReceiver::GetJsepTransceiver() const { return mTransceiver->GetJsepTransceiver(); } +void RTCRtpReceiver::SetTransform(RTCRtpScriptTransform* aTransform, + ErrorResult& aError) { + if (aTransform == mTransform.get()) { + // Ok... smile and nod + // TODO: Depending on spec, this might throw + // https://github.com/w3c/webrtc-encoded-transform/issues/189 + return; + } + + if (aTransform && aTransform->IsClaimed()) { + aError.ThrowInvalidStateError("transform has already been used elsewhere"); + return; + } + + if (aTransform) { + mFrameTransformerProxy = &aTransform->GetProxy(); + } else { + mFrameTransformerProxy = nullptr; + } + + if (mTransform) { + mTransform->GetProxy().SetReceiver(nullptr); + } + + mTransform = const_cast(aTransform); + + if (mTransform) { + mTransform->GetProxy().SetReceiver(this); + mTransform->SetClaimed(); + } +} + +void RTCRtpReceiver::RequestKeyFrame() { + if (!mTransform || !mPipeline) { + return; + } + + mPipeline->mConduit->AsVideoSessionConduit().apply([&](const auto& conduit) { + conduit->RequestKeyFrame(&mTransform->GetProxy()); + }); +} + } // namespace mozilla::dom #undef LOGTAG diff --git a/dom/media/webrtc/jsapi/RTCRtpReceiver.h b/dom/media/webrtc/jsapi/RTCRtpReceiver.h index dc1ded11f85..cc11a060539 100644 --- a/dom/media/webrtc/jsapi/RTCRtpReceiver.h +++ b/dom/media/webrtc/jsapi/RTCRtpReceiver.h @@ -38,6 +38,7 @@ struct RTCRtpCapabilities; struct RTCRtpContributingSource; struct RTCRtpSynchronizationSource; class RTCRtpTransceiver; +class RTCRtpScriptTransform; class RTCRtpReceiver : public nsISupports, public nsWrapperCache, @@ -72,6 +73,10 @@ class RTCRtpReceiver : public nsISupports, const uint32_t aSource, const DOMHighResTimeStamp aTimestamp, const uint32_t aRtpTimestamp, const bool aHasLevel, const uint8_t aLevel); + RTCRtpScriptTransform* GetTransform() const { return mTransform; } + + void SetTransform(RTCRtpScriptTransform* aTransform, ErrorResult& aError); + nsPIDOMWindowInner* GetParentObject() const; nsTArray> GetStatsInternal( bool aSkipIceStats = false); @@ -120,6 +125,9 @@ class RTCRtpReceiver : public nsISupports, // ALPN negotiation. void UpdatePrincipalPrivacy(PrincipalPrivacy aPrivacy); + // Called by FrameTransformerProxy + void RequestKeyFrame(); + void OnRtcpBye(); void OnRtcpTimeout(); @@ -141,11 +149,17 @@ class RTCRtpReceiver : public nsISupports, Canonical>& CanonicalVideoCodecs() { return mVideoCodecs; } + Canonical>& CanonicalVideoRtpRtcpConfig() { return mVideoRtpRtcpConfig; } + Canonical& CanonicalReceiving() override { return mReceiving; } + Canonical>& CanonicalFrameTransformerProxy() { + return mFrameTransformerProxy; + } + private: virtual ~RTCRtpReceiver(); @@ -168,6 +182,7 @@ class RTCRtpReceiver : public nsISupports, RefPtr mPipeline; RefPtr mTransportHandler; RefPtr mTransceiver; + RefPtr mTransform; // This is [[AssociatedRemoteMediaStreams]], basically. We do not keep the // streams themselves here, because that would require this object to know // where the stream list for the whole RTCPeerConnection lives.. @@ -191,6 +206,7 @@ class RTCRtpReceiver : public nsISupports, Canonical> mVideoCodecs; Canonical> mVideoRtpRtcpConfig; Canonical mReceiving; + Canonical> mFrameTransformerProxy; }; } // namespace dom diff --git a/dom/media/webrtc/jsapi/RTCRtpScriptTransform.cpp b/dom/media/webrtc/jsapi/RTCRtpScriptTransform.cpp new file mode 100644 index 00000000000..43f34c456fe --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCRtpScriptTransform.cpp @@ -0,0 +1,84 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "RTCRtpScriptTransform.h" + +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "jsapi/RTCTransformEventRunnable.h" +#include "mozilla/dom/Promise.h" +#include "mozilla/dom/Worker.h" +#include "mozilla/dom/RTCRtpScriptTransformBinding.h" +#include "mozilla/dom/MessagePortBinding.h" +#include "mozilla/Logging.h" +#include "mozilla/AlreadyAddRefed.h" +#include "mozilla/RefPtr.h" +#include "nsPIDOMWindow.h" +#include "nsContentUtils.h" +#include "nsCOMPtr.h" +#include "nsDebug.h" +#include "ErrorList.h" +#include "nsWrapperCache.h" +#include "nsISupports.h" +#include "nsCycleCollectionParticipant.h" +#include "js/RootingAPI.h" + +namespace mozilla::dom { + +LazyLogModule gScriptTransformLog("RTCRtpScriptTransform"); + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(RTCRtpScriptTransform, mWindow) +NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCRtpScriptTransform) +NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCRtpScriptTransform) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCRtpScriptTransform) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +already_AddRefed RTCRtpScriptTransform::Constructor( + const GlobalObject& aGlobal, Worker& aWorker, + JS::Handle aOptions, + const Optional>& aTransfer, ErrorResult& aRv) { + nsCOMPtr ownerWindow = + do_QueryInterface(aGlobal.GetAsSupports()); + if (NS_WARN_IF(!ownerWindow)) { + aRv.Throw(NS_ERROR_FAILURE); + return nullptr; + } + auto newTransform = MakeRefPtr(ownerWindow); + RefPtr runnable = + new RTCTransformEventRunnable(aWorker, &newTransform->GetProxy()); + + if (aTransfer.WasPassed()) { + aWorker.PostEventWithOptions(aGlobal.Context(), aOptions, aTransfer.Value(), + runnable, aRv); + } else { + StructuredSerializeOptions transferOptions; + aWorker.PostEventWithOptions(aGlobal.Context(), aOptions, + transferOptions.mTransfer, runnable, aRv); + } + + if (NS_WARN_IF(aRv.Failed())) { + return nullptr; + } + + return newTransform.forget(); +} + +RTCRtpScriptTransform::RTCRtpScriptTransform(nsPIDOMWindowInner* aWindow) + : mWindow(aWindow), mProxy(new FrameTransformerProxy) {} + +RTCRtpScriptTransform::~RTCRtpScriptTransform() { + mProxy->ReleaseScriptTransformer(); +} + +JSObject* RTCRtpScriptTransform::WrapObject(JSContext* aCx, + JS::Handle aGivenProto) { + return RTCRtpScriptTransform_Binding::Wrap(aCx, this, aGivenProto); +} + +} // namespace mozilla::dom + +#undef LOGTAG diff --git a/dom/media/webrtc/jsapi/RTCRtpScriptTransform.h b/dom/media/webrtc/jsapi/RTCRtpScriptTransform.h new file mode 100644 index 00000000000..362c59b7616 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCRtpScriptTransform.h @@ -0,0 +1,63 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORM_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORM_H_ + +#include "nsISupports.h" +#include "nsWrapperCache.h" +#include "mozilla/RefPtr.h" +#include "mozilla/Maybe.h" +#include "js/RootingAPI.h" +#include "nsTArray.h" + +class nsPIDOMWindowInner; + +namespace mozilla { +class FrameTransformerProxy; +class ErrorResult; + +namespace dom { +class Worker; +class GlobalObject; +template +class Sequence; +template +class Optional; + +class RTCRtpScriptTransform : public nsISupports, public nsWrapperCache { + public: + static already_AddRefed Constructor( + const GlobalObject& aGlobal, Worker& aWorker, + JS::Handle aOptions, + const Optional>& aTransfer, ErrorResult& aRv); + + explicit RTCRtpScriptTransform(nsPIDOMWindowInner* aWindow); + + // nsISupports + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_WRAPPERCACHE_CLASS(RTCRtpScriptTransform) + + JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; + + nsPIDOMWindowInner* GetParentObject() const { return mWindow; } + + FrameTransformerProxy& GetProxy() { return *mProxy; } + + bool IsClaimed() const { return mClaimed; } + void SetClaimed() { mClaimed = true; } + + private: + virtual ~RTCRtpScriptTransform(); + RefPtr mWindow; + RefPtr mProxy; + bool mClaimed = false; +}; + +} // namespace dom +} // namespace mozilla +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORM_H_ diff --git a/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.cpp b/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.cpp new file mode 100644 index 00000000000..f02ef74e6bf --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.cpp @@ -0,0 +1,449 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "RTCRtpScriptTransformer.h" + +#include + +#include +#include +#include + +#include "api/frame_transformer_interface.h" + +#include "nsString.h" +#include "nsCycleCollectionParticipant.h" +#include "nsISupports.h" +#include "ErrorList.h" +#include "nsDebug.h" +#include "nsCycleCollectionTraversalCallback.h" +#include "nsTArray.h" +#include "nsWrapperCache.h" +#include "nsIGlobalObject.h" +#include "nsCOMPtr.h" +#include "nsStringFwd.h" +#include "nsLiteralString.h" +#include "nsContentUtils.h" +#include "mozilla/RefPtr.h" +#include "mozilla/AlreadyAddRefed.h" +#include "mozilla/ErrorResult.h" +#include "mozilla/Result.h" +#include "mozilla/HoldDropJSObjects.h" +#include "mozilla/Maybe.h" +#include "mozilla/Assertions.h" +#include "mozilla/Logging.h" +#include "mozilla/ErrorResult.h" +#include "mozilla/Likely.h" +#include "mozilla/dom/RTCRtpScriptTransformerBinding.h" +#include "mozilla/dom/BindingUtils.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/dom/PrototypeList.h" +#include "mozilla/dom/WorkerRef.h" +#include "mozilla/dom/RTCEncodedAudioFrame.h" +#include "mozilla/dom/RTCEncodedVideoFrame.h" +#include "mozilla/dom/UnderlyingSourceCallbackHelpers.h" +#include "mozilla/dom/ToJSValue.h" +#include "mozilla/dom/ReadableStream.h" +#include "mozilla/dom/WritableStream.h" +#include "mozilla/dom/UnderlyingSinkCallbackHelpers.h" +#include "mozilla/dom/WritableStreamDefaultController.h" +#include "mozilla/dom/ReadableStreamController.h" +#include "mozilla/dom/Promise.h" +#include "mozilla/dom/Promise-inl.h" +#include "js/RootingAPI.h" +#include "js/Value.h" +#include "js/CallArgs.h" +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "sdp/SdpAttribute.h" // CheckRidValidity + +namespace mozilla::dom { + +LazyLogModule gScriptTransformerLog("RTCRtpScriptTransformer"); + +NS_IMPL_CYCLE_COLLECTION_INHERITED(nsISupportsStreamSource, + UnderlyingSourceAlgorithmsWrapper, mStream, + mThingQueuedPromise, mQueue) +NS_IMPL_ADDREF_INHERITED(nsISupportsStreamSource, + UnderlyingSourceAlgorithmsWrapper) +NS_IMPL_RELEASE_INHERITED(nsISupportsStreamSource, + UnderlyingSourceAlgorithmsWrapper) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsISupportsStreamSource) +NS_INTERFACE_MAP_END_INHERITING(UnderlyingSourceAlgorithmsWrapper) + +nsISupportsStreamSource::nsISupportsStreamSource() = default; + +nsISupportsStreamSource::~nsISupportsStreamSource() = default; + +void nsISupportsStreamSource::Init(ReadableStream* aStream) { + mStream = aStream; +} + +void nsISupportsStreamSource::Enqueue(nsISupports* aThing) { + if (!mThingQueuedPromise) { + mQueue.AppendElement(aThing); + return; + } + + // Maybe put a limit here? Or at least some sort of logging if this gets + // unreasonably long? + AutoJSAPI jsapi; + if (NS_WARN_IF(!jsapi.Init(mStream->GetParentObject()))) { + return; + } + + EnqueueToStream(jsapi.cx(), aThing); + mThingQueuedPromise->MaybeResolveWithUndefined(); + mThingQueuedPromise = nullptr; +} + +already_AddRefed nsISupportsStreamSource::PullCallbackImpl( + JSContext* aCx, ReadableStreamController& aController, ErrorResult& aRv) { + if (!mQueue.IsEmpty()) { + EnqueueOneThingFromQueue(aCx); + return nullptr; + } + + RefPtr self(this); + mThingQueuedPromise = Promise::CreateInfallible(mStream->GetParentObject()); + return do_AddRef(mThingQueuedPromise); +} + +void nsISupportsStreamSource::EnqueueToStream(JSContext* aCx, + nsISupports* aThing) { + JS::Rooted jsThing(aCx); + if (NS_WARN_IF(MOZ_UNLIKELY(!ToJSValue(aCx, *aThing, &jsThing)))) { + // Do we want to add error handling for this? + return; + } + IgnoredErrorResult rv; + // EnqueueNative is CAN_RUN_SCRIPT. Need a strong-ref temporary. + auto stream = mStream; + stream->EnqueueNative(aCx, jsThing, rv); +} + +void nsISupportsStreamSource::EnqueueOneThingFromQueue(JSContext* aCx) { + if (!mQueue.IsEmpty()) { + RefPtr thing = mQueue[0]; + mQueue.RemoveElementAt(0); + EnqueueToStream(aCx, thing); + } +} + +NS_IMPL_CYCLE_COLLECTION_INHERITED(WritableStreamRTCFrameSink, + UnderlyingSinkAlgorithmsWrapper, + mTransformer) +NS_IMPL_ADDREF_INHERITED(WritableStreamRTCFrameSink, + UnderlyingSinkAlgorithmsWrapper) +NS_IMPL_RELEASE_INHERITED(WritableStreamRTCFrameSink, + UnderlyingSinkAlgorithmsWrapper) +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WritableStreamRTCFrameSink) +NS_INTERFACE_MAP_END_INHERITING(UnderlyingSinkAlgorithmsWrapper) + +WritableStreamRTCFrameSink::WritableStreamRTCFrameSink( + RTCRtpScriptTransformer* aTransformer) + : mTransformer(aTransformer) {} + +WritableStreamRTCFrameSink::~WritableStreamRTCFrameSink() = default; + +already_AddRefed WritableStreamRTCFrameSink::WriteCallback( + JSContext* aCx, JS::Handle aChunk, + WritableStreamDefaultController& aController, ErrorResult& aError) { + // Spec does not say to do this right now. Might be a spec bug, needs + // clarification. + // https://github.com/w3c/webrtc-encoded-transform/issues/191 + if (NS_WARN_IF(!aChunk.isObject())) { + aError.ThrowTypeError( + "Wrong type for RTCRtpScriptTransformer.[[writeable]]: Not an object"); + return nullptr; + } + + // Lame. But, without a webidl base class, this is the only way. + RefPtr video; + UNWRAP_OBJECT(RTCEncodedVideoFrame, &aChunk.toObject(), video); + RefPtr audio; + UNWRAP_OBJECT(RTCEncodedAudioFrame, &aChunk.toObject(), audio); + + RefPtr frame; + if (video) { + frame = video; + } else if (audio) { + frame = audio; + } + + if (NS_WARN_IF(!frame)) { + aError.ThrowTypeError( + "Wrong type for RTCRtpScriptTransformer.[[writeable]]: Not an " + "RTCEncodedAudioFrame or RTCEncodedVideoFrame"); + return nullptr; + } + + return mTransformer->OnTransformedFrame(frame, aError); +} + +// There is not presently an implementation of these for nsTHashMap :( +inline void ImplCycleCollectionUnlink( + RTCRtpScriptTransformer::GenerateKeyFramePromises& aMap) { + for (auto& tableEntry : aMap) { + ImplCycleCollectionUnlink(*tableEntry.GetModifiableData()); + } + aMap.Clear(); +} + +inline void ImplCycleCollectionTraverse( + nsCycleCollectionTraversalCallback& aCallback, + RTCRtpScriptTransformer::GenerateKeyFramePromises& aMap, const char* aName, + uint32_t aFlags = 0) { + for (auto& tableEntry : aMap) { + ImplCycleCollectionTraverse(aCallback, *tableEntry.GetModifiableData(), + aName, aFlags); + } +} + +NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_WITH_JS_MEMBERS( + RTCRtpScriptTransformer, + (mGlobal, mReadableSource, mReadable, mWritable, mWritableSink, + mKeyFrameRequestPromises, mGenerateKeyFramePromises), + (mOptions)) + +NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCRtpScriptTransformer) +NS_IMPL_CYCLE_COLLECTING_RELEASE(RTCRtpScriptTransformer) + +NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(RTCRtpScriptTransformer) + NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY + NS_INTERFACE_MAP_ENTRY(nsISupports) +NS_INTERFACE_MAP_END + +RTCRtpScriptTransformer::RTCRtpScriptTransformer(nsIGlobalObject* aGlobal) + : mGlobal(aGlobal), + mReadableSource(new nsISupportsStreamSource), + mWritableSink(new WritableStreamRTCFrameSink(this)), + mOptions(JS::UndefinedHandleValue) { + mozilla::HoldJSObjects(this); +} + +RTCRtpScriptTransformer::~RTCRtpScriptTransformer() { + mozilla::DropJSObjects(this); +} + +nsresult RTCRtpScriptTransformer::Init(JSContext* aCx, + JS::Handle aOptions, + WorkerPrivate* aWorkerPrivate, + FrameTransformerProxy* aProxy) { + ErrorResult rv; + RefPtr global(mGlobal); + auto source = mReadableSource; + auto sink = mWritableSink; + + // NOTE: We do not transfer these streams from mainthread, as the spec says, + // because there's no JS observable reason to. The spec is likely to change + // here, because it is overspecifying implementation details. + mReadable = ReadableStream::CreateNative(aCx, global, *source, Some(1.0), + nullptr, rv); + if (rv.Failed()) { + return rv.StealNSResult(); + } + mReadableSource->Init(mReadable); + + // WritableStream::CreateNative takes a nsIGlobalObject&, but + // ReadableStream::CreateNative takes a nsIGlobalObject*? + mWritable = + WritableStream::CreateNative(aCx, *global, *sink, Nothing(), nullptr, rv); + if (rv.Failed()) { + return rv.StealNSResult(); + } + + mOptions = aOptions; + mProxy = aProxy; + // This will return null if the worker is already shutting down. + // A call to ReleaseScriptTransformer will eventually result in a call to + // NotifyReleased. + mWorkerRef = StrongWorkerRef::Create( + aWorkerPrivate, "RTCRtpScriptTransformer", + [this, self = RefPtr(this)]() { mProxy->ReleaseScriptTransformer(); }); + if (mWorkerRef) { + mProxy->SetScriptTransformer(*this); + } + return NS_OK; +} + +void RTCRtpScriptTransformer::NotifyReleased() { + RejectPendingPromises(); + mWorkerRef = nullptr; + mProxy = nullptr; +} + +void RTCRtpScriptTransformer::RejectPendingPromises() { + for (const auto& promise : mKeyFrameRequestPromises) { + ErrorResult rv; + rv.ThrowInvalidStateError( + "RTCRtpScriptTransformer is not associated with a receiver"); + promise->MaybeReject(std::move(rv)); + } + mKeyFrameRequestPromises.Clear(); + + // GenerateKeyFrame promises are indexed by rid + for (auto& ridAndPromises : mGenerateKeyFramePromises) { + for (const auto& promise : ridAndPromises.GetData()) { + ErrorResult rv; + rv.ThrowInvalidStateError( + "RTCRtpScriptTransformer is not associated with a sender"); + promise->MaybeReject(std::move(rv)); + } + } + mGenerateKeyFramePromises.Clear(); +} + +void RTCRtpScriptTransformer::TransformFrame( + std::unique_ptr aFrame) { + if (!mVideo.isSome()) { + // First frame. mProxy will know whether it's video or not by now. + mVideo = mProxy->IsVideo(); + MOZ_ASSERT(mVideo.isSome()); + } + + RefPtr domFrame; + if (*mVideo) { + // If this is a send video keyframe, resolve any pending GenerateKeyFrame + // promises for its rid. + if (aFrame->GetDirection() == + webrtc::TransformableFrameInterface::Direction::kSender) { + auto* videoFrame = + static_cast(aFrame.get()); + if (videoFrame->IsKeyFrame()) { + ResolveGenerateKeyFramePromises(videoFrame->GetRid(), + videoFrame->GetTimestamp()); + if (!videoFrame->GetRid().empty() && + videoFrame->GetMetadata().GetSimulcastIdx() == 0) { + ResolveGenerateKeyFramePromises("", videoFrame->GetTimestamp()); + } + } + } + domFrame = new RTCEncodedVideoFrame(mGlobal, std::move(aFrame), + ++mLastEnqueuedFrameCounter, this); + } else { + domFrame = new RTCEncodedAudioFrame(mGlobal, std::move(aFrame), + ++mLastEnqueuedFrameCounter, this); + } + mReadableSource->Enqueue(domFrame); +} + +void RTCRtpScriptTransformer::GetOptions(JSContext* aCx, + JS::MutableHandle aVal, + ErrorResult& aError) { + if (!ToJSValue(aCx, mOptions, aVal)) { + aError.NoteJSContextException(aCx); + } +} + +already_AddRefed RTCRtpScriptTransformer::GenerateKeyFrame( + const Optional& aRid) { + Maybe utf8Rid; + if (aRid.WasPassed()) { + utf8Rid = Some(NS_ConvertUTF16toUTF8(aRid.Value()).get()); + std::string error; + if (!SdpRidAttributeList::CheckRidValidity(*utf8Rid, &error)) { + ErrorResult rv; + nsCString nsError(error.c_str()); + rv.ThrowNotAllowedError(nsError); + return Promise::CreateRejectedWithErrorResult(GetParentObject(), rv); + } + } + + nsCString key; + if (utf8Rid.isSome()) { + key.Assign(utf8Rid->data(), utf8Rid->size()); + } + + nsTArray>& promises = + mGenerateKeyFramePromises.LookupOrInsert(key); + if (!promises.Length()) { + // No pending keyframe generation request for this rid. Make one. + if (!mProxy || !mProxy->GenerateKeyFrame(utf8Rid)) { + ErrorResult rv; + rv.ThrowInvalidStateError( + "RTCRtpScriptTransformer is not associated with a video sender"); + return Promise::CreateRejectedWithErrorResult(GetParentObject(), rv); + } + } + RefPtr promise = Promise::CreateInfallible(GetParentObject()); + promises.AppendElement(promise); + return promise.forget(); +} + +void RTCRtpScriptTransformer::ResolveGenerateKeyFramePromises( + const std::string& aRid, uint64_t aTimestamp) { + nsCString key(aRid.data(), aRid.size()); + nsTArray> promises; + mGenerateKeyFramePromises.Remove(key, &promises); + for (auto& promise : promises) { + promise->MaybeResolve(aTimestamp); + } +} + +void RTCRtpScriptTransformer::GenerateKeyFrameError( + const Maybe& aRid, const CopyableErrorResult& aResult) { + nsCString key; + if (aRid.isSome()) { + key.Assign(aRid->data(), aRid->size()); + } + nsTArray> promises; + mGenerateKeyFramePromises.Remove(key, &promises); + for (auto& promise : promises) { + CopyableErrorResult rv(aResult); + promise->MaybeReject(std::move(rv)); + } +} + +already_AddRefed RTCRtpScriptTransformer::SendKeyFrameRequest() { + if (!mKeyFrameRequestPromises.Length()) { + if (!mProxy || !mProxy->RequestKeyFrame()) { + ErrorResult rv; + rv.ThrowInvalidStateError( + "RTCRtpScriptTransformer is not associated with a video receiver"); + return Promise::CreateRejectedWithErrorResult(GetParentObject(), rv); + } + } + RefPtr promise = Promise::CreateInfallible(GetParentObject()); + mKeyFrameRequestPromises.AppendElement(promise); + return promise.forget(); +} + +void RTCRtpScriptTransformer::KeyFrameRequestDone(bool aSuccess) { + auto promises = std::move(mKeyFrameRequestPromises); + if (aSuccess) { + for (const auto& promise : promises) { + promise->MaybeResolveWithUndefined(); + } + } else { + for (const auto& promise : promises) { + ErrorResult rv; + rv.ThrowInvalidStateError( + "Depacketizer is not defined, or not processing"); + promise->MaybeReject(std::move(rv)); + } + } +} + +JSObject* RTCRtpScriptTransformer::WrapObject( + JSContext* aCx, JS::Handle aGivenProto) { + return RTCRtpScriptTransformer_Binding::Wrap(aCx, this, aGivenProto); +} + +already_AddRefed RTCRtpScriptTransformer::OnTransformedFrame( + RTCEncodedFrameBase* aFrame, ErrorResult& aError) { + // Spec says to skip frames that are out of order or have wrong owner + if (aFrame->GetCounter() > mLastReceivedFrameCounter && + aFrame->CheckOwner(this) && mProxy) { + mLastReceivedFrameCounter = aFrame->GetCounter(); + mProxy->OnTransformedFrame(aFrame->TakeFrame()); + } + + return Promise::CreateResolvedWithUndefined(GetParentObject(), aError); +} + +} // namespace mozilla::dom + +#undef LOGTAG diff --git a/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.h b/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.h new file mode 100644 index 00000000000..6d61ac3cd57 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCRtpScriptTransformer.h @@ -0,0 +1,197 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORMER_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORMER_H_ + +#include "nsISupports.h" +#include "nsWrapperCache.h" +#include "mozilla/RefPtr.h" +#include "mozilla/dom/ReadableStream.h" +#include "mozilla/dom/WritableStream.h" +#include "mozilla/Maybe.h" +#include "js/RootingAPI.h" +#include "nsTArray.h" +#include "nsCOMArray.h" +#include +#include "nsTHashSet.h" +#include "nsCycleCollectionParticipant.h" + +class nsPIDOMWindowInner; + +namespace webrtc { +class TransformableFrameInterface; +} + +namespace mozilla { +class FrameTransformerProxy; + +namespace dom { +class Worker; +class WorkerPrivate; + +// Dirt simple source for ReadableStream that accepts nsISupports +// Might be suitable to move someplace else, with some polish. +class nsISupportsStreamSource final : public UnderlyingSourceAlgorithmsWrapper { + public: + nsISupportsStreamSource(); + nsISupportsStreamSource(const nsISupportsStreamSource&) = delete; + nsISupportsStreamSource(nsISupportsStreamSource&&) = delete; + nsISupportsStreamSource& operator=(const nsISupportsStreamSource&) = delete; + nsISupportsStreamSource& operator=(nsISupportsStreamSource&&) = delete; + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsISupportsStreamSource, + UnderlyingSourceAlgorithmsWrapper) + + void Init(ReadableStream* aStream); + + void Enqueue(nsISupports* aThing); + + // From UnderlyingSourceAlgorithmsWrapper + already_AddRefed PullCallbackImpl( + JSContext* aCx, ReadableStreamController& aController, + ErrorResult& aRv) override; + + void EnqueueOneThingFromQueue(JSContext* aCx); + + private: + virtual ~nsISupportsStreamSource(); + + // Calls ReadableStream::EnqueueNative, which is MOZ_CAN_RUN_SCRIPT. + MOZ_CAN_RUN_SCRIPT_BOUNDARY void EnqueueToStream(JSContext* aCx, + nsISupports* aThing); + + RefPtr mStream; + RefPtr mThingQueuedPromise; + // mozilla::Queue is not cycle-collector friendly :( + nsCOMArray mQueue; +}; + +class RTCRtpScriptTransformer; + +class WritableStreamRTCFrameSink final + : public UnderlyingSinkAlgorithmsWrapper { + public: + explicit WritableStreamRTCFrameSink(RTCRtpScriptTransformer* aTransformer); + WritableStreamRTCFrameSink(const WritableStreamRTCFrameSink&) = delete; + WritableStreamRTCFrameSink(WritableStreamRTCFrameSink&&) = delete; + WritableStreamRTCFrameSink& operator=(const WritableStreamRTCFrameSink&) = + delete; + WritableStreamRTCFrameSink& operator=(WritableStreamRTCFrameSink&&) = delete; + + NS_DECL_ISUPPORTS_INHERITED + NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(WritableStreamRTCFrameSink, + UnderlyingSinkAlgorithmsWrapper) + + already_AddRefed WriteCallback( + JSContext* aCx, JS::Handle aChunk, + WritableStreamDefaultController& aController, + ErrorResult& aError) override; + + private: + virtual ~WritableStreamRTCFrameSink(); + RefPtr mTransformer; +}; + +class RTCEncodedFrameBase; + +// Here's the basic flow. All of this happens on the worker thread. +// 0. We register with a FrameTransformerProxy. +// 1. That FrameTransformerProxy dispatches webrtc::TransformableFrameInterface +// to us (from either the encoder/depacketizer thread), via our +// TransformFrame method. +// 2. We wrap these frames in RTCEncodedAudio/VideoFrame, and feed them to +// mReadableSource, which queues them. +// 3. mReadableSource.PullCallbackImpl consumes that queue, and feeds the +// frames to mReadable. +// 4. JS worker code consumes from mReadable, does whatever transformation it +// wants, then writes the frames to mWritable. +// 5. mWritableSink.WriteCallback passes those frames to us. +// 6. We unwrap the webrtc::TransformableFrameInterface from these frames. +// 7. We pass these unwrapped frames back to the FrameTransformerProxy. +// (FrameTransformerProxy handles any dispatching/synchronization necessary) +// 8. Eventually, that FrameTransformerProxy calls NotifyReleased (possibly at +// our prompting). +class RTCRtpScriptTransformer final : public nsISupports, + public nsWrapperCache { + public: + explicit RTCRtpScriptTransformer(nsIGlobalObject* aGlobal); + + MOZ_CAN_RUN_SCRIPT_BOUNDARY nsresult Init(JSContext* aCx, + JS::Handle aOptions, + WorkerPrivate* aWorkerPrivate, + FrameTransformerProxy* aProxy); + + void NotifyReleased(); + + void TransformFrame( + std::unique_ptr aFrame); + already_AddRefed OnTransformedFrame(RTCEncodedFrameBase* aFrame, + ErrorResult& aError); + + // nsISupports + NS_DECL_CYCLE_COLLECTING_ISUPPORTS + NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(RTCRtpScriptTransformer) + + JSObject* WrapObject(JSContext* aCx, + JS::Handle aGivenProto) override; + + nsIGlobalObject* GetParentObject() const { return mGlobal; } + + // WebIDL Interface + already_AddRefed Readable() const { + return do_AddRef(mReadable); + } + already_AddRefed Writable() const { + return do_AddRef(mWritable); + } + + void GetOptions(JSContext* aCx, JS::MutableHandle aVal, + ErrorResult& aError); + + already_AddRefed GenerateKeyFrame(const Optional& aRid); + void GenerateKeyFrameError(const Maybe& aRid, + const CopyableErrorResult& aResult); + already_AddRefed SendKeyFrameRequest(); + void KeyFrameRequestDone(bool aSuccess); + + // Public to ease implementation of cycle collection functions + using GenerateKeyFramePromises = + nsTHashMap>>; + + private: + virtual ~RTCRtpScriptTransformer(); + void RejectPendingPromises(); + // empty string means no rid + void ResolveGenerateKeyFramePromises(const std::string& aRid, + uint64_t aTimestamp); + + nsCOMPtr mGlobal; + + RefPtr mProxy; + RefPtr mReadableSource; + RefPtr mReadable; + RefPtr mWritable; + RefPtr mWritableSink; + + JS::Heap mOptions; + uint64_t mLastEnqueuedFrameCounter = 0; + uint64_t mLastReceivedFrameCounter = 0; + nsTArray> mKeyFrameRequestPromises; + // Contains the promise returned for each call to GenerateKeyFrame(rid), in + // the order in which it was called, keyed by the rid (empty string if not + // passed). If there is already a promise in here for a given rid, we do not + // ask the FrameTransformerProxy again, and just bulk resolve/reject. + GenerateKeyFramePromises mGenerateKeyFramePromises; + Maybe mVideo; + RefPtr mWorkerRef; +}; + +} // namespace dom +} // namespace mozilla + +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCRTPSCRIPTTRANSFORMER_H_ diff --git a/dom/media/webrtc/jsapi/RTCRtpSender.cpp b/dom/media/webrtc/jsapi/RTCRtpSender.cpp index 3d8e3e60534..e7c651c4fa5 100644 --- a/dom/media/webrtc/jsapi/RTCRtpSender.cpp +++ b/dom/media/webrtc/jsapi/RTCRtpSender.cpp @@ -3,22 +3,77 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "RTCRtpSender.h" -#include "transport/logging.h" -#include "mozilla/dom/MediaStreamTrack.h" -#include "mozilla/dom/Promise.h" -#include "mozilla/glean/GleanMetrics.h" + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "system_wrappers/include/clock.h" +#include "call/call.h" +#include "api/rtp_parameters.h" +#include "api/units/time_delta.h" +#include "api/units/timestamp.h" +#include "api/video_codecs/video_codec.h" +#include "api/video/video_codec_constants.h" +#include "call/audio_send_stream.h" +#include "call/video_send_stream.h" +#include "modules/rtp_rtcp/include/report_block_data.h" +#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" + #include "nsPIDOMWindow.h" #include "nsString.h" +#include "MainThreadUtils.h" +#include "nsCOMPtr.h" +#include "nsContentUtils.h" +#include "nsCycleCollectionParticipant.h" +#include "nsDebug.h" +#include "nsISupports.h" +#include "nsLiteralString.h" +#include "nsStringFwd.h" +#include "nsTArray.h" +#include "nsThreadUtils.h" +#include "nsWrapperCache.h" +#include "mozilla/AbstractThread.h" +#include "mozilla/AlreadyAddRefed.h" +#include "mozilla/Assertions.h" +#include "mozilla/Attributes.h" +#include "mozilla/fallible.h" +#include "mozilla/Logging.h" +#include "mozilla/mozalloc_oom.h" +#include "mozilla/MozPromise.h" +#include "mozilla/OwningNonNull.h" +#include "mozilla/RefPtr.h" +#include "mozilla/StateWatching.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/Unused.h" +#include "mozilla/StateMirroring.h" +#include "mozilla/Maybe.h" +#include "mozilla/dom/MediaStreamTrack.h" +#include "mozilla/dom/Promise.h" +#include "mozilla/dom/RTCRtpScriptTransform.h" #include "mozilla/dom/VideoStreamTrack.h" -#include "jsep/JsepTransceiver.h" #include "mozilla/dom/RTCRtpSenderBinding.h" +#include "mozilla/dom/MediaStreamTrackBinding.h" +#include "mozilla/dom/Nullable.h" +#include "mozilla/dom/RTCRtpParametersBinding.h" +#include "mozilla/dom/RTCStatsReportBinding.h" +#include "mozilla/glean/GleanMetrics.h" +#include "js/RootingAPI.h" +#include "jsep/JsepTransceiver.h" #include "RTCStatsReport.h" -#include "mozilla/Preferences.h" #include "RTCRtpTransceiver.h" #include "PeerConnectionImpl.h" -#include "libwebrtcglue/AudioConduit.h" -#include -#include "call/call.h" +#include "libwebrtcglue/CodecConfig.h" +#include "libwebrtcglue/MediaConduitControl.h" +#include "libwebrtcglue/MediaConduitInterface.h" +#include "sdp/SdpAttribute.h" +#include "sdp/SdpEnum.h" namespace mozilla::dom { @@ -31,7 +86,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(RTCRtpSender) NS_IMPL_CYCLE_COLLECTION_UNLINK_END NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(RTCRtpSender) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mWindow, mPc, mSenderTrack, mTransceiver, - mStreams, mDtmf) + mStreams, mTransform, mDtmf) NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END NS_IMPL_CYCLE_COLLECTING_ADDREF(RTCRtpSender) @@ -66,7 +121,8 @@ RTCRtpSender::RTCRtpSender(nsPIDOMWindowInner* aWindow, PeerConnectionImpl* aPc, INIT_CANONICAL(mVideoRtpRtcpConfig, Nothing()), INIT_CANONICAL(mVideoCodecMode, webrtc::VideoCodecMode::kRealtimeVideo), INIT_CANONICAL(mCname, std::string()), - INIT_CANONICAL(mTransmitting, false) { + INIT_CANONICAL(mTransmitting, false), + INIT_CANONICAL(mFrameTransformerProxy, nullptr) { mPipeline = MediaPipelineTransmit::Create( mPc->GetHandle(), aTransportHandler, aCallThread, aStsThread, aConduit->type() == MediaSessionConduit::VIDEO, aConduit); @@ -1260,6 +1316,9 @@ void RTCRtpSender::Shutdown() { mWatchManager.Shutdown(); mPipeline->Shutdown(); mPipeline = nullptr; + if (mTransform) { + mTransform->GetProxy().SetSender(nullptr); + } } void RTCRtpSender::BreakCycles() { @@ -1671,6 +1730,50 @@ void RTCRtpSender::UpdateDtmfSender() { mDtmf->StopPlayout(); } +void RTCRtpSender::SetTransform(RTCRtpScriptTransform* aTransform, + ErrorResult& aError) { + if (aTransform == mTransform.get()) { + // Ok... smile and nod + // TODO: Depending on spec, this might throw + // https://github.com/w3c/webrtc-encoded-transform/issues/189 + return; + } + + if (aTransform && aTransform->IsClaimed()) { + aError.ThrowInvalidStateError("transform has already been used elsewhere"); + return; + } + + // Seamless switch for frames + if (aTransform) { + mFrameTransformerProxy = &aTransform->GetProxy(); + } else { + mFrameTransformerProxy = nullptr; + } + + if (mTransform) { + mTransform->GetProxy().SetSender(nullptr); + } + + mTransform = const_cast(aTransform); + + if (mTransform) { + mTransform->GetProxy().SetSender(this); + mTransform->SetClaimed(); + } +} + +bool RTCRtpSender::GenerateKeyFrame(const Maybe& aRid) { + if (!mTransform || !mPipeline || !mSenderTrack) { + return false; + } + + mPipeline->mConduit->AsVideoSessionConduit().apply([&](const auto& conduit) { + conduit->GenerateKeyFrame(aRid, &mTransform->GetProxy()); + }); + return true; +} + } // namespace mozilla::dom #undef LOGTAG diff --git a/dom/media/webrtc/jsapi/RTCRtpSender.h b/dom/media/webrtc/jsapi/RTCRtpSender.h index 3cef3ff9a80..04411019b11 100644 --- a/dom/media/webrtc/jsapi/RTCRtpSender.h +++ b/dom/media/webrtc/jsapi/RTCRtpSender.h @@ -36,6 +36,7 @@ class RTCDtlsTransport; class RTCDTMFSender; struct RTCRtpCapabilities; class RTCRtpTransceiver; +class RTCRtpScriptTransform; class RTCRtpSender : public nsISupports, public nsWrapperCache, @@ -75,6 +76,11 @@ class RTCRtpSender : public nsISupports, Sequence& aEncodings, bool aVideo, ErrorResult& aRv); + RTCRtpScriptTransform* GetTransform() const { return mTransform; } + + void SetTransform(RTCRtpScriptTransform* aTransform, ErrorResult& aError); + bool GenerateKeyFrame(const Maybe& aRid); + nsPIDOMWindowInner* GetParentObject() const; nsTArray> GetStatsInternal( bool aSkipIceStats = false); @@ -126,6 +132,10 @@ class RTCRtpSender : public nsISupports, Canonical& CanonicalCname() { return mCname; } Canonical& CanonicalTransmitting() override { return mTransmitting; } + Canonical>& CanonicalFrameTransformerProxy() { + return mFrameTransformerProxy; + } + bool HasPendingSetParameters() const { return mPendingParameters.isSome(); } void InvalidateLastReturnedParameters() { mLastReturnedParameters = Nothing(); @@ -171,6 +181,7 @@ class RTCRtpSender : public nsISupports, RefPtr mTransportHandler; RefPtr mTransceiver; nsTArray> mStreams; + RefPtr mTransform; bool mHaveSetupTransport = false; // TODO(bug 1803388): Remove this stuff once it is no longer needed. bool mAllowOldSetParameters = false; @@ -251,6 +262,7 @@ class RTCRtpSender : public nsISupports, Canonical mVideoCodecMode; Canonical mCname; Canonical mTransmitting; + Canonical> mFrameTransformerProxy; }; } // namespace dom diff --git a/dom/media/webrtc/jsapi/RTCRtpTransceiver.cpp b/dom/media/webrtc/jsapi/RTCRtpTransceiver.cpp index 9edfcfd8245..a8973d1fa11 100644 --- a/dom/media/webrtc/jsapi/RTCRtpTransceiver.cpp +++ b/dom/media/webrtc/jsapi/RTCRtpTransceiver.cpp @@ -3,37 +3,84 @@ * You can obtain one at http://mozilla.org/MPL/2.0/. */ #include "jsapi/RTCRtpTransceiver.h" -#include "mozilla/UniquePtr.h" + +#include + #include #include #include -#include "libwebrtcglue/AudioConduit.h" -#include "libwebrtcglue/VideoConduit.h" -#include "MediaTrackGraph.h" -#include "transportbridge/MediaPipeline.h" -#include "transportbridge/MediaPipelineFilter.h" -#include "jsep/JsepTrack.h" -#include "sdp/SdpHelper.h" -#include "MediaTrackGraphImpl.h" -#include "transport/logging.h" -#include "MediaEngine.h" -#include "nsIPrincipal.h" -#include "MediaSegment.h" -#include "RemoteTrackSource.h" -#include "libwebrtcglue/RtpRtcpConfig.h" -#include "MediaTransportHandler.h" +#include +#include +#include +#include + +#include "api/video_codecs/video_codec.h" + +#include "nsCOMPtr.h" +#include "nsContentUtils.h" +#include "nsCycleCollectionParticipant.h" +#include "nsDebug.h" +#include "nsISerialEventTarget.h" +#include "nsISupports.h" +#include "nsProxyRelease.h" +#include "nsStringFwd.h" +#include "nsString.h" +#include "nsTArray.h" +#include "nsThreadUtils.h" +#include "nsWrapperCache.h" +#include "PrincipalHandle.h" +#include "ErrorList.h" +#include "MainThreadUtils.h" +#include "MediaEventSource.h" +#include "mozilla/AbstractThread.h" +#include "mozilla/Assertions.h" +#include "mozilla/ErrorResult.h" +#include "mozilla/fallible.h" +#include "mozilla/Maybe.h" +#include "mozilla/mozalloc_oom.h" +#include "mozilla/MozPromise.h" +#include "mozilla/Preferences.h" +#include "mozilla/UniquePtr.h" +#include "mozilla/StateMirroring.h" +#include "mozilla/RefPtr.h" +#include "mozilla/dom/Nullable.h" +#include "mozilla/dom/RTCStatsReportBinding.h" #include "mozilla/dom/RTCRtpReceiverBinding.h" #include "mozilla/dom/RTCRtpSenderBinding.h" #include "mozilla/dom/RTCRtpTransceiverBinding.h" #include "mozilla/dom/Promise.h" +#include "utils/PerformanceRecorder.h" +#include "systemservices/MediaUtils.h" +#include "MediaTrackGraph.h" +#include "js/RootingAPI.h" +#include "libwebrtcglue/AudioConduit.h" +#include "libwebrtcglue/VideoConduit.h" +#include "transportbridge/MediaPipeline.h" +#include "jsep/JsepTrack.h" +#include "sdp/SdpHelper.h" +#include "transport/logging.h" +#include "RemoteTrackSource.h" +#include "libwebrtcglue/RtpRtcpConfig.h" +#include "MediaTransportHandler.h" #include "RTCDtlsTransport.h" #include "RTCRtpReceiver.h" #include "RTCRtpSender.h" #include "RTCDTMFSender.h" -#include "systemservices/MediaUtils.h" +#include "PeerConnectionImpl.h" +#include "RTCStatsIdGenerator.h" #include "libwebrtcglue/WebrtcCallWrapper.h" -#include "libwebrtcglue/WebrtcGmpVideoCodec.h" -#include "utils/PerformanceRecorder.h" +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "jsep/JsepCodecDescription.h" +#include "jsep/JsepSession.h" +#include "jsep/JsepTrackEncoding.h" +#include "libwebrtcglue/CodecConfig.h" +#include "libwebrtcglue/MediaConduitControl.h" +#include "libwebrtcglue/MediaConduitInterface.h" +#include "RTCStatsReport.h" +#include "sdp/SdpAttribute.h" +#include "sdp/SdpEnum.h" +#include "sdp/SdpMediaSection.h" +#include "transport/transportlayer.h" namespace mozilla { @@ -119,6 +166,15 @@ struct ConduitControlState : public AudioConduitControlInterface, Canonical& CanonicalVideoCodecMode() override { return mSender->CanonicalVideoCodecMode(); } + Canonical>& CanonicalFrameTransformerProxySend() + override { + return mSender->CanonicalFrameTransformerProxy(); + } + + Canonical>& CanonicalFrameTransformerProxyRecv() + override { + return mReceiver->CanonicalFrameTransformerProxy(); + } }; } // namespace diff --git a/dom/media/webrtc/jsapi/RTCTransformEventRunnable.cpp b/dom/media/webrtc/jsapi/RTCTransformEventRunnable.cpp new file mode 100644 index 00000000000..2a96801f91e --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCTransformEventRunnable.cpp @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "RTCTransformEventRunnable.h" + +#include "nsIGlobalObject.h" +#include "ErrorList.h" +#include "nsError.h" +#include "nsDebug.h" +#include "nsLiteralString.h" +#include "mozilla/RefPtr.h" +#include "mozilla/AlreadyAddRefed.h" +// This needs to come before RTCTransformEvent.h, since webidl codegen doesn't +// include-what-you-use or forward declare. +#include "mozilla/dom/RTCRtpScriptTransformer.h" +#include "mozilla/dom/RTCTransformEvent.h" +#include "mozilla/dom/RTCTransformEventBinding.h" +#include "mozilla/dom/EventWithOptionsRunnable.h" +#include "mozilla/dom/Event.h" +#include "mozilla/dom/EventTarget.h" +#include "mozilla/dom/RootedDictionary.h" +#include "js/RootingAPI.h" +#include "js/Value.h" +#include "libwebrtcglue/FrameTransformerProxy.h" + +namespace mozilla::dom { + +RTCTransformEventRunnable::RTCTransformEventRunnable( + Worker& aWorker, FrameTransformerProxy* aProxy) + : EventWithOptionsRunnable(aWorker), mProxy(aProxy) {} + +RTCTransformEventRunnable::~RTCTransformEventRunnable() = default; + +already_AddRefed RTCTransformEventRunnable::BuildEvent( + JSContext* aCx, nsIGlobalObject* aGlobal, EventTarget* aTarget, + JS::Handle aTransformerOptions) { + // Let transformerOptions be the result of + // StructuredDeserialize(serializedOptions, the current Realm). + + // NOTE: We do not do this streams stuff. Spec will likely change here. + // The gist here is that we hook [[readable]] and [[writable]] up to the frame + // source/sink, which in out case is FrameTransformerProxy. + // Let readable be the result of StructuredDeserialize(serializedReadable, the + // current Realm). Let writable be the result of + // StructuredDeserialize(serializedWritable, the current Realm). + + // Let transformer be a new RTCRtpScriptTransformer. + + // Set transformer.[[options]] to transformerOptions. + + // Set transformer.[[readable]] to readable. + + // Set transformer.[[writable]] to writable. + RefPtr transformer = + new RTCRtpScriptTransformer(aGlobal); + nsresult nrv = + transformer->Init(aCx, aTransformerOptions, mWorkerPrivate, mProxy); + if (NS_WARN_IF(NS_FAILED(nrv))) { + // TODO: Error handling. Currently unspecified. + return nullptr; + } + + // Fire an event named rtctransform using RTCTransformEvent with transformer + // set to transformer on worker’s global scope. + RootedDictionary init(aCx); + init.mBubbles = false; + init.mCancelable = false; + init.mTransformer = transformer; + + RefPtr event = + RTCTransformEvent::Constructor(aTarget, u"rtctransform"_ns, init); + event->SetTrusted(true); + return event.forget(); +} + +} // namespace mozilla::dom diff --git a/dom/media/webrtc/jsapi/RTCTransformEventRunnable.h b/dom/media/webrtc/jsapi/RTCTransformEventRunnable.h new file mode 100644 index 00000000000..763d7c92377 --- /dev/null +++ b/dom/media/webrtc/jsapi/RTCTransformEventRunnable.h @@ -0,0 +1,38 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCTRANSFORMEVENTRUNNABLE_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCTRANSFORMEVENTRUNNABLE_H_ + +#include "mozilla/dom/EventWithOptionsRunnable.h" + +namespace mozilla { + +class FrameTransformerProxy; + +namespace dom { + +// Cargo-culted from MesssageEventRunnable. +// TODO: Maybe could subclass WorkerRunnable instead? Comments on +// WorkerDebuggeeRunnable indicate that firing an event at JS means we need that +// class. +class RTCTransformEventRunnable final : public EventWithOptionsRunnable { + public: + RTCTransformEventRunnable(Worker& aWorker, FrameTransformerProxy* aProxy); + + already_AddRefed BuildEvent( + JSContext* aCx, nsIGlobalObject* aGlobal, EventTarget* aTarget, + JS::Handle aTransformerOptions) override; + + private: + virtual ~RTCTransformEventRunnable(); + RefPtr mProxy; +}; + +} // namespace dom +} // namespace mozilla + +#endif // MOZILLA_DOM_MEDIA_WEBRTC_JSAPI_RTCTRANSFORMEVENTRUNNABLE_H_ diff --git a/dom/media/webrtc/jsapi/moz.build b/dom/media/webrtc/jsapi/moz.build index 2c1dbe79f19..78a6241cd65 100644 --- a/dom/media/webrtc/jsapi/moz.build +++ b/dom/media/webrtc/jsapi/moz.build @@ -28,12 +28,18 @@ UNIFIED_SOURCES += [ "RemoteTrackSource.cpp", "RTCDtlsTransport.cpp", "RTCDTMFSender.cpp", + "RTCEncodedAudioFrame.cpp", + "RTCEncodedFrameBase.cpp", + "RTCEncodedVideoFrame.cpp", "RTCRtpReceiver.cpp", + "RTCRtpScriptTransform.cpp", + "RTCRtpScriptTransformer.cpp", "RTCRtpSender.cpp", "RTCRtpTransceiver.cpp", "RTCSctpTransport.cpp", "RTCStatsIdGenerator.cpp", "RTCStatsReport.cpp", + "RTCTransformEventRunnable.cpp", "WebrtcGlobalInformation.cpp", "WebrtcGlobalStatsHistory.cpp", ] @@ -41,7 +47,12 @@ UNIFIED_SOURCES += [ EXPORTS.mozilla.dom += [ "RTCDtlsTransport.h", "RTCDTMFSender.h", + "RTCEncodedAudioFrame.h", + "RTCEncodedFrameBase.h", + "RTCEncodedVideoFrame.h", "RTCRtpReceiver.h", + "RTCRtpScriptTransform.h", + "RTCRtpScriptTransformer.h", "RTCRtpSender.h", "RTCRtpTransceiver.h", "RTCSctpTransport.h", diff --git a/dom/media/webrtc/libwebrtcglue/AudioConduit.cpp b/dom/media/webrtc/libwebrtcglue/AudioConduit.cpp index 57c3108ce24..e127f231584 100644 --- a/dom/media/webrtc/libwebrtcglue/AudioConduit.cpp +++ b/dom/media/webrtc/libwebrtcglue/AudioConduit.cpp @@ -6,16 +6,57 @@ #include "common/browser_logging/CSFLog.h" #include "MediaConduitControl.h" -#include "mozilla/media/MediaUtils.h" -#include "mozilla/Telemetry.h" -#include "transport/runnable_utils.h" #include "transport/SrtpFlow.h" // For SRTP_MAX_EXPANSION #include "WebrtcCallWrapper.h" +#include "libwebrtcglue/FrameTransformer.h" +#include +#include "CodecConfig.h" +#include "mozilla/StateMirroring.h" +#include +#include "mozilla/MozPromise.h" +#include "mozilla/RefPtr.h" +#include "mozilla/RWLock.h" // libwebrtc includes #include "api/audio_codecs/builtin_audio_encoder_factory.h" #include "audio/audio_receive_stream.h" #include "media/base/media_constants.h" +#include "rtc_base/ref_counted_object.h" + +#include "api/audio/audio_frame.h" +#include "api/audio/audio_mixer.h" +#include "api/audio_codecs/audio_format.h" +#include "api/call/transport.h" +#include "api/media_types.h" +#include "api/rtp_headers.h" +#include "api/rtp_parameters.h" +#include "api/transport/rtp/rtp_source.h" +#include +#include "call/audio_receive_stream.h" +#include "call/audio_send_stream.h" +#include "call/call_basic_stats.h" +#include "domstubs.h" +#include "jsapi/RTCStatsReport.h" +#include +#include "MainThreadUtils.h" +#include +#include "MediaConduitErrors.h" +#include "MediaConduitInterface.h" +#include +#include "modules/rtp_rtcp/source/rtp_packet_received.h" +#include "mozilla/Assertions.h" +#include "mozilla/Atomics.h" +#include "mozilla/Maybe.h" +#include "mozilla/StateWatching.h" +#include "nsCOMPtr.h" +#include "nsError.h" +#include "nsISerialEventTarget.h" +#include "nsThreadUtils.h" +#include "rtc_base/copy_on_write_buffer.h" +#include "rtc_base/network/sent_packet.h" +#include +#include +#include "transport/mediapacket.h" // for ntohs #ifdef HAVE_NETINET_IN_H @@ -71,7 +112,9 @@ WebrtcAudioConduit::Control::Control(const RefPtr& aCallThread) INIT_MIRROR(mLocalRecvRtpExtensions, RtpExtList()), INIT_MIRROR(mLocalSendRtpExtensions, RtpExtList()), INIT_MIRROR(mSendCodec, Nothing()), - INIT_MIRROR(mRecvCodecs, std::vector()) {} + INIT_MIRROR(mRecvCodecs, std::vector()), + INIT_MIRROR(mFrameTransformerProxySend, nullptr), + INIT_MIRROR(mFrameTransformerProxyRecv, nullptr) {} #undef INIT_MIRROR RefPtr WebrtcAudioConduit::Shutdown() { @@ -79,30 +122,33 @@ RefPtr WebrtcAudioConduit::Shutdown() { mControl.mOnDtmfEventListener.DisconnectIfExists(); - return InvokeAsync(mCallThread, "WebrtcAudioConduit::Shutdown (main thread)", - [this, self = RefPtr(this)] { - mControl.mReceiving.DisconnectIfConnected(); - mControl.mTransmitting.DisconnectIfConnected(); - mControl.mLocalSsrcs.DisconnectIfConnected(); - mControl.mLocalCname.DisconnectIfConnected(); - mControl.mMid.DisconnectIfConnected(); - mControl.mRemoteSsrc.DisconnectIfConnected(); - mControl.mSyncGroup.DisconnectIfConnected(); - mControl.mLocalRecvRtpExtensions.DisconnectIfConnected(); - mControl.mLocalSendRtpExtensions.DisconnectIfConnected(); - mControl.mSendCodec.DisconnectIfConnected(); - mControl.mRecvCodecs.DisconnectIfConnected(); - mWatchManager.Shutdown(); + return InvokeAsync( + mCallThread, "WebrtcAudioConduit::Shutdown (main thread)", + [this, self = RefPtr(this)] { + mControl.mReceiving.DisconnectIfConnected(); + mControl.mTransmitting.DisconnectIfConnected(); + mControl.mLocalSsrcs.DisconnectIfConnected(); + mControl.mLocalCname.DisconnectIfConnected(); + mControl.mMid.DisconnectIfConnected(); + mControl.mRemoteSsrc.DisconnectIfConnected(); + mControl.mSyncGroup.DisconnectIfConnected(); + mControl.mLocalRecvRtpExtensions.DisconnectIfConnected(); + mControl.mLocalSendRtpExtensions.DisconnectIfConnected(); + mControl.mSendCodec.DisconnectIfConnected(); + mControl.mRecvCodecs.DisconnectIfConnected(); + mControl.mFrameTransformerProxySend.DisconnectIfConnected(); + mControl.mFrameTransformerProxyRecv.DisconnectIfConnected(); + mWatchManager.Shutdown(); - { - AutoWriteLock lock(mLock); - DeleteSendStream(); - DeleteRecvStream(); - } + { + AutoWriteLock lock(mLock); + DeleteSendStream(); + DeleteRecvStream(); + } - return GenericPromise::CreateAndResolve( - true, "WebrtcAudioConduit::Shutdown (call thread)"); - }); + return GenericPromise::CreateAndResolve( + true, "WebrtcAudioConduit::Shutdown (call thread)"); + }); } WebrtcAudioConduit::WebrtcAudioConduit( @@ -163,6 +209,10 @@ void WebrtcAudioConduit::InitControl(AudioConduitControlInterface* aControl) { mControl.mLocalSendRtpExtensions); CONNECT(aControl->CanonicalAudioSendCodec(), mControl.mSendCodec); CONNECT(aControl->CanonicalAudioRecvCodecs(), mControl.mRecvCodecs); + CONNECT(aControl->CanonicalFrameTransformerProxySend(), + mControl.mFrameTransformerProxySend); + CONNECT(aControl->CanonicalFrameTransformerProxyRecv(), + mControl.mFrameTransformerProxyRecv); mControl.mOnDtmfEventListener = aControl->OnDtmfEvent().Connect( mCall->mCallThread, this, &WebrtcAudioConduit::OnDtmfEvent); } @@ -288,6 +338,32 @@ void WebrtcAudioConduit::OnControlConfigChange() { recvStreamReconfigureNeeded = true; } + if (mControl.mConfiguredFrameTransformerProxySend.get() != + mControl.mFrameTransformerProxySend.Ref().get()) { + mControl.mConfiguredFrameTransformerProxySend = + mControl.mFrameTransformerProxySend.Ref(); + if (!mSendStreamConfig.frame_transformer) { + mSendStreamConfig.frame_transformer = + new rtc::RefCountedObject(false); + sendStreamRecreationNeeded = true; + } + static_cast(mSendStreamConfig.frame_transformer.get()) + ->SetProxy(mControl.mConfiguredFrameTransformerProxySend); + } + + if (mControl.mConfiguredFrameTransformerProxyRecv.get() != + mControl.mFrameTransformerProxyRecv.Ref().get()) { + mControl.mConfiguredFrameTransformerProxyRecv = + mControl.mFrameTransformerProxyRecv.Ref(); + if (!mRecvStreamConfig.frame_transformer) { + mRecvStreamConfig.frame_transformer = + new rtc::RefCountedObject(false); + recvStreamRecreationNeeded = true; + } + static_cast(mRecvStreamConfig.frame_transformer.get()) + ->SetProxy(mControl.mConfiguredFrameTransformerProxyRecv); + } + if (!recvStreamReconfigureNeeded && !sendStreamReconfigureNeeded && !recvStreamRecreationNeeded && !sendStreamRecreationNeeded && mControl.mReceiving == mRecvStreamRunning && diff --git a/dom/media/webrtc/libwebrtcglue/AudioConduit.h b/dom/media/webrtc/libwebrtcglue/AudioConduit.h index e8de331e12b..807f6c8b405 100644 --- a/dom/media/webrtc/libwebrtcglue/AudioConduit.h +++ b/dom/media/webrtc/libwebrtcglue/AudioConduit.h @@ -256,6 +256,8 @@ class WebrtcAudioConduit : public AudioSessionConduit, Mirror mLocalSendRtpExtensions; Mirror> mSendCodec; Mirror> mRecvCodecs; + Mirror> mFrameTransformerProxySend; + Mirror> mFrameTransformerProxyRecv; MediaEventListener mOnDtmfEventListener; // For caching mRemoteSsrc, since another caller may change the remote ssrc @@ -266,6 +268,10 @@ class WebrtcAudioConduit : public AudioSessionConduit, // For tracking changes to mRecvCodecs. std::vector mConfiguredRecvCodecs; + // For change tracking. Callthread only. + RefPtr mConfiguredFrameTransformerProxySend; + RefPtr mConfiguredFrameTransformerProxyRecv; + Control() = delete; explicit Control(const RefPtr& aCallThread); } mControl; diff --git a/dom/media/webrtc/libwebrtcglue/FrameTransformer.cpp b/dom/media/webrtc/libwebrtcglue/FrameTransformer.cpp new file mode 100644 index 00000000000..23688a7d88f --- /dev/null +++ b/dom/media/webrtc/libwebrtcglue/FrameTransformer.cpp @@ -0,0 +1,87 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "libwebrtcglue/FrameTransformer.h" +#include "api/frame_transformer_interface.h" +#include "mozilla/Mutex.h" +#include +#include +#include "api/scoped_refptr.h" +#include +#include "libwebrtcglue/FrameTransformerProxy.h" + +namespace mozilla { + +FrameTransformer::FrameTransformer(bool aVideo) + : webrtc::FrameTransformerInterface(), + mVideo(aVideo), + mCallbacksMutex("FrameTransformer::mCallbacksMutex"), + mProxyMutex("FrameTransformer::mProxyMutex") {} + +FrameTransformer::~FrameTransformer() { + if (mProxy) { + mProxy->SetLibwebrtcTransformer(nullptr); + } +} + +void FrameTransformer::Transform( + std::unique_ptr aFrame) { + MutexAutoLock lock(mProxyMutex); + if (mProxy) { + mProxy->Transform(std::move(aFrame)); + return; + } + + // No transformer, just passthrough + OnTransformedFrame(std::move(aFrame)); +} + +void FrameTransformer::RegisterTransformedFrameCallback( + rtc::scoped_refptr aCallback) { + MutexAutoLock lock(mCallbacksMutex); + mCallback = aCallback; +} + +void FrameTransformer::UnregisterTransformedFrameCallback() { + MutexAutoLock lock(mCallbacksMutex); + mCallback = nullptr; +} + +void FrameTransformer::RegisterTransformedFrameSinkCallback( + rtc::scoped_refptr aCallback, + uint32_t aSsrc) { + MutexAutoLock lock(mCallbacksMutex); + mCallbacksBySsrc[aSsrc] = aCallback; +} + +void FrameTransformer::UnregisterTransformedFrameSinkCallback(uint32_t aSsrc) { + MutexAutoLock lock(mCallbacksMutex); + mCallbacksBySsrc.erase(aSsrc); +} + +void FrameTransformer::OnTransformedFrame( + std::unique_ptr aFrame) { + MutexAutoLock lock(mCallbacksMutex); + if (mCallback) { + mCallback->OnTransformedFrame(std::move(aFrame)); + } else if (auto it = mCallbacksBySsrc.find(aFrame->GetSsrc()); + it != mCallbacksBySsrc.end()) { + it->second->OnTransformedFrame(std::move(aFrame)); + } +} + +void FrameTransformer::SetProxy(FrameTransformerProxy* aProxy) { + MutexAutoLock lock(mProxyMutex); + if (mProxy) { + mProxy->SetLibwebrtcTransformer(nullptr); + } + mProxy = aProxy; + if (mProxy) { + mProxy->SetLibwebrtcTransformer(this); + } +} + +} // namespace mozilla diff --git a/dom/media/webrtc/libwebrtcglue/FrameTransformer.h b/dom/media/webrtc/libwebrtcglue/FrameTransformer.h new file mode 100644 index 00000000000..0c93d0f77f9 --- /dev/null +++ b/dom/media/webrtc/libwebrtcglue/FrameTransformer.h @@ -0,0 +1,79 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMER_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMER_H_ + +#include "api/frame_transformer_interface.h" +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "nsISupportsImpl.h" +#include "mozilla/Mutex.h" +#include "jsapi/RTCRtpScriptTransformer.h" + +namespace mozilla { + +// There is one of these per RTCRtpSender and RTCRtpReceiver, for its entire +// lifetime. SetProxy is used to activate/deactivate it. In the inactive state +// (the default), this is just a synchronous passthrough. +class FrameTransformer : public webrtc::FrameTransformerInterface { + public: + explicit FrameTransformer(bool aVideo); + virtual ~FrameTransformer(); + + // This is set when RTCRtpSender/Receiver.transform is set, and unset when + // RTCRtpSender/Receiver.transform is unset. + void SetProxy(FrameTransformerProxy* aProxy); + + // If no proxy is set (ie; RTCRtpSender/Receiver.transform is not set), this + // synchronously calls OnTransformedFrame with no modifcation. If a proxy is + // set, we send the frame to it, and eventually that frame should come back + // to OnTransformedFrame. + void Transform( + std::unique_ptr aFrame) override; + void OnTransformedFrame( + std::unique_ptr aFrame); + + // When libwebrtc uses the same callback for all ssrcs + // (right now, this is used for audio, but we do not care in this class) + void RegisterTransformedFrameCallback( + rtc::scoped_refptr aCallback) override; + void UnregisterTransformedFrameCallback() override; + + // When libwebrtc uses a different callback for each ssrc + // (right now, this is used for video, but we do not care in this class) + void RegisterTransformedFrameSinkCallback( + rtc::scoped_refptr aCallback, + uint32_t aSsrc) override; + void UnregisterTransformedFrameSinkCallback(uint32_t aSsrc) override; + + bool IsVideo() const { return mVideo; } + + private: + const bool mVideo; + Mutex mCallbacksMutex; + // Written on a libwebrtc thread, read on the worker thread. + rtc::scoped_refptr mCallback + MOZ_GUARDED_BY(mCallbacksMutex); + std::map> + mCallbacksBySsrc MOZ_GUARDED_BY(mCallbacksMutex); + + Mutex mProxyMutex; + // Written on the call thread, read on a libwebrtc/gmp/mediadataencoder/call + // thread (which one depends on the media type and direction). Right now, + // these are: + // Send video: VideoStreamEncoder::encoder_queue_, + // WebrtcMediaDataEncoder::mTaskQueue, or GMP encoder thread. + // Recv video: Call::worker_thread_ + // Send audio: ChannelSend::encoder_queue_ + // Recv audio: ChannelReceive::worker_thread_ + // This should have little to no lock contention + // This corresponds to the RTCRtpScriptTransform/RTCRtpScriptTransformer. + RefPtr mProxy MOZ_GUARDED_BY(mProxyMutex); +}; // FrameTransformer + +} // namespace mozilla + +#endif // MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMER_H_ diff --git a/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.cpp b/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.cpp new file mode 100644 index 00000000000..f374cda6998 --- /dev/null +++ b/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.cpp @@ -0,0 +1,258 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "libwebrtcglue/FrameTransformer.h" +#include "mozilla/dom/RTCRtpSender.h" +#include "mozilla/dom/RTCRtpReceiver.h" +#include "mozilla/Logging.h" +#include "mozilla/Mutex.h" +#include "jsapi/RTCRtpScriptTransformer.h" +#include "nsThreadUtils.h" +#include "mozilla/Assertions.h" +#include +#include "mozilla/Maybe.h" +#include "mozilla/RefPtr.h" +#include "nscore.h" +#include "ErrorList.h" +#include "nsIRunnable.h" +#include "nsIEventTarget.h" +#include "api/frame_transformer_interface.h" +#include +#include "nsDebug.h" +#include "nsISupports.h" +#include + +namespace mozilla { + +LazyLogModule gFrameTransformerProxyLog("FrameTransformerProxy"); + +FrameTransformerProxy::FrameTransformerProxy() + : mMutex("FrameTransformerProxy::mMutex") {} + +FrameTransformerProxy::~FrameTransformerProxy() = default; + +void FrameTransformerProxy::SetScriptTransformer( + dom::RTCRtpScriptTransformer& aTransformer) { + MutexAutoLock lock(mMutex); + if (mReleaseScriptTransformerCalled) { + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Warning, + ("RTCRtpScriptTransformer is ready, but ReleaseScriptTransformer " + "has already been called.")); + // The mainthread side has torn down while the worker init was pending. + // Don't grab a reference to the worker thread, or the script transformer. + // Also, let the script transformer know that we do not need it after all. + aTransformer.NotifyReleased(); + return; + } + + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Info, + ("RTCRtpScriptTransformer is ready!")); + mWorkerThread = GetCurrentSerialEventTarget(); + MOZ_ASSERT(mWorkerThread); + + MOZ_ASSERT(!mScriptTransformer); + mScriptTransformer = &aTransformer; + while (!mQueue.empty()) { + mScriptTransformer->TransformFrame(std::move(mQueue.front())); + mQueue.pop_front(); + } +} + +Maybe FrameTransformerProxy::IsVideo() const { + MutexAutoLock lock(mMutex); + return mVideo; +} + +void FrameTransformerProxy::ReleaseScriptTransformer() { + MutexAutoLock lock(mMutex); + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Debug, ("In %s", __FUNCTION__)); + if (mReleaseScriptTransformerCalled) { + return; + } + mReleaseScriptTransformerCalled = true; + + if (mWorkerThread) { + mWorkerThread->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this)] { + if (mScriptTransformer) { + mScriptTransformer->NotifyReleased(); + mScriptTransformer = nullptr; + } + + // Make sure cycles are broken; this unset might have been caused by + // something other than the sender/receiver being unset. + GetMainThreadSerialEventTarget()->Dispatch( + NS_NewRunnableFunction(__func__, [this, self] { + MutexAutoLock lock(mMutex); + mSender = nullptr; + mReceiver = nullptr; + })); + })); + mWorkerThread = nullptr; + } +} + +void FrameTransformerProxy::SetLibwebrtcTransformer( + FrameTransformer* aLibwebrtcTransformer) { + MutexAutoLock lock(mMutex); + mLibwebrtcTransformer = aLibwebrtcTransformer; + if (mLibwebrtcTransformer) { + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Info, + ("mLibwebrtcTransformer is now set!")); + mVideo = Some(mLibwebrtcTransformer->IsVideo()); + } +} + +void FrameTransformerProxy::Transform( + std::unique_ptr aFrame) { + MutexAutoLock lock(mMutex); + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Debug, ("In %s", __FUNCTION__)); + if (!mWorkerThread && !mReleaseScriptTransformerCalled) { + MOZ_LOG( + gFrameTransformerProxyLog, LogLevel::Info, + ("In %s, queueing frame because RTCRtpScriptTransformer is not ready", + __FUNCTION__)); + // We are still waiting for the script transformer to be created on the + // worker thread. + mQueue.push_back(std::move(aFrame)); + return; + } + + if (mWorkerThread) { + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Debug, + ("Queueing call to RTCRtpScriptTransformer::TransformFrame")); + mWorkerThread->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this), + frame = std::move(aFrame)]() mutable { + if (NS_WARN_IF(!mScriptTransformer)) { + // Could happen due to errors. Is there some + // other processing we ought to do? + return; + } + mScriptTransformer->TransformFrame(std::move(frame)); + })); + } +} + +void FrameTransformerProxy::OnTransformedFrame( + std::unique_ptr aFrame) { + MutexAutoLock lock(mMutex); + // If the worker thread has changed, we drop the frame, to avoid frames + // arriving out of order. + if (mLibwebrtcTransformer) { + // This will lock, lock order is mMutex, FrameTransformer::mLibwebrtcMutex + mLibwebrtcTransformer->OnTransformedFrame(std::move(aFrame)); + } +} + +void FrameTransformerProxy::SetSender(dom::RTCRtpSender* aSender) { + { + MutexAutoLock lock(mMutex); + MOZ_ASSERT(!mReceiver); + mSender = aSender; + } + if (!aSender) { + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Info, ("Sender set to null")); + ReleaseScriptTransformer(); + } +} + +void FrameTransformerProxy::SetReceiver(dom::RTCRtpReceiver* aReceiver) { + { + MutexAutoLock lock(mMutex); + MOZ_ASSERT(!mSender); + mReceiver = aReceiver; + } + if (!aReceiver) { + MOZ_LOG(gFrameTransformerProxyLog, LogLevel::Info, + ("Receiver set to null")); + ReleaseScriptTransformer(); + } +} + +bool FrameTransformerProxy::RequestKeyFrame() { + { + // Spec wants this to reject synchronously if the RTCRtpScriptTransformer + // is not associated with a video receiver. This may change to an async + // check? + MutexAutoLock lock(mMutex); + if (!mReceiver || !mVideo.isSome() || !*mVideo) { + return false; + } + } + + // Thread hop to main, and then the conduit thread-hops to the call thread. + GetMainThreadSerialEventTarget()->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this)] { + MutexAutoLock lock(mMutex); + if (mReceiver && mVideo.isSome() && *mVideo) { + mReceiver->RequestKeyFrame(); + } + })); + return true; +} + +void FrameTransformerProxy::KeyFrameRequestDone(bool aSuccess) { + MutexAutoLock lock(mMutex); + if (mWorkerThread) { + mWorkerThread->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this), aSuccess] { + if (mScriptTransformer) { + mScriptTransformer->KeyFrameRequestDone(aSuccess); + } + })); + } +} + +bool FrameTransformerProxy::GenerateKeyFrame(const Maybe& aRid) { + { + // Spec wants this to reject synchronously if the RTCRtpScriptTransformer + // is not associated with a video sender. This may change to an async + // check? + MutexAutoLock lock(mMutex); + if (!mSender || !mVideo.isSome() || !*mVideo) { + return false; + } + } + + // Thread hop to main, and then the conduit thread-hops to the call thread. + GetMainThreadSerialEventTarget()->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this), aRid] { + MutexAutoLock lock(mMutex); + if (!mSender || !mVideo.isSome() || !*mVideo || + !mSender->GenerateKeyFrame(aRid)) { + CopyableErrorResult rv; + rv.ThrowInvalidStateError("Not sending video"); + if (mWorkerThread) { + mWorkerThread->Dispatch(NS_NewRunnableFunction( + __func__, + [this, self = RefPtr(this), aRid, rv] { + if (mScriptTransformer) { + mScriptTransformer->GenerateKeyFrameError(aRid, rv); + } + })); + } + } + })); + return true; +} + +void FrameTransformerProxy::GenerateKeyFrameError( + const Maybe& aRid, const CopyableErrorResult& aResult) { + MutexAutoLock lock(mMutex); + if (mWorkerThread) { + mWorkerThread->Dispatch(NS_NewRunnableFunction( + __func__, + [this, self = RefPtr(this), aRid, aResult] { + if (mScriptTransformer) { + mScriptTransformer->GenerateKeyFrameError(aRid, aResult); + } + })); + } +} + +} // namespace mozilla diff --git a/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.h b/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.h new file mode 100644 index 00000000000..72617fcde9f --- /dev/null +++ b/dom/media/webrtc/libwebrtcglue/FrameTransformerProxy.h @@ -0,0 +1,124 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMERPROXY_H_ +#define MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMERPROXY_H_ + +#include "nsISupportsImpl.h" +#include "mozilla/Mutex.h" +#include "mozilla/Maybe.h" +#include +#include + +class nsIEventTarget; + +namespace webrtc { +class TransformableFrameInterface; +class VideoReceiveStreamInterface; +} // namespace webrtc + +namespace mozilla { + +class FrameTransformer; +class WebrtcVideoConduit; +class CopyableErrorResult; + +namespace dom { +class RTCRtpScriptTransformer; +class RTCRtpSender; +class RTCRtpReceiver; +} // namespace dom + +// This corresponds to a single RTCRtpScriptTransform (and its +// RTCRtpScriptTransformer, once that is created on the worker thread). This +// is intended to decouple threading/lifecycle/include-dependencies between +// FrameTransformer (on the libwebrtc side of things), RTCRtpScriptTransformer +// (on the worker side of things), RTCRtpScriptTransform and +// RTCRtpSender/Receiver (on the main thread), and prevents frames from being +// lost while we're setting things up on the worker. In other words, this +// handles the inconvenient stuff. +class FrameTransformerProxy { + public: + NS_INLINE_DECL_THREADSAFE_REFCOUNTING(FrameTransformerProxy); + + FrameTransformerProxy(); + FrameTransformerProxy(const FrameTransformerProxy& aRhs) = delete; + FrameTransformerProxy(FrameTransformerProxy&& aRhs) = delete; + FrameTransformerProxy& operator=(const FrameTransformerProxy& aRhs) = delete; + FrameTransformerProxy& operator=(FrameTransformerProxy&& aRhs) = delete; + + // Called at most once (might not be called if the worker is shutting down), + // on the worker thread. + void SetScriptTransformer(dom::RTCRtpScriptTransformer& aTransformer); + + // Can be called from the worker thread (if the worker is shutting down), or + // main (if RTCRtpSender/RTCRtpReceiver is done with us). + void ReleaseScriptTransformer(); + + // RTCRtpScriptTransformer calls this when it is done transforming a frame. + void OnTransformedFrame( + std::unique_ptr aFrame); + + Maybe IsVideo() const; + + // Called by FrameTransformer, on main. Only one FrameTransformer will ever + // be registered over the lifetime of this object. This is where we route + // transformed frames. If this is set, we can also expect to receive calls to + // Transform. + void SetLibwebrtcTransformer(FrameTransformer* aLibwebrtcTransformer); + + // FrameTransformer calls this while we're registered with it (by + // SetLibwebrtcTransformer) + void Transform(std::unique_ptr aFrame); + + void SetSender(dom::RTCRtpSender* aSender); + void SetReceiver(dom::RTCRtpReceiver* aReceiver); + + // Called on worker thread + bool RequestKeyFrame(); + // Called on call thread + void KeyFrameRequestDone(bool aSuccess); + + bool GenerateKeyFrame(const Maybe& aRid); + void GenerateKeyFrameError(const Maybe& aRid, + const CopyableErrorResult& aResult); + + private: + virtual ~FrameTransformerProxy(); + + // Worker thread only. Set at most once. + // Does not need any mutex protection. + RefPtr mScriptTransformer; + + mutable Mutex mMutex; + // Written on the worker thread. Read on libwebrtc threads, mainthread, and + // the worker thread. + RefPtr mWorkerThread MOZ_GUARDED_BY(mMutex); + // We need a flag for this in case the ReleaseScriptTransformer call comes + // _before_ the script transformer is set, to disable SetScriptTransformer. + // Could be written on main or the worker thread. Read on main, worker, and + // libwebrtc threads. + bool mReleaseScriptTransformerCalled MOZ_GUARDED_BY(mMutex) = false; + // Used when frames arrive before the script transformer is created, which + // should be pretty rare. Accessed on worker and libwebrtc threads. + std::list> mQueue + MOZ_GUARDED_BY(mMutex); + // Written on main, read on the worker thread. + FrameTransformer* mLibwebrtcTransformer MOZ_GUARDED_BY(mMutex) = nullptr; + + // TODO: Will be used to route GenerateKeyFrame. Details TBD. + RefPtr mSender MOZ_GUARDED_BY(mMutex); + // Set on mainthread. This is where we route RequestKeyFrame calls from the + // worker thread. Mutex protected because spec wants sync errors if the + // receiver is not set (or the right type). If spec drops this requirement, + // this could be mainthread only and non-mutex-protected. + RefPtr mReceiver MOZ_GUARDED_BY(mMutex); + Maybe mVideo MOZ_GUARDED_BY(mMutex); +}; + +} // namespace mozilla + +#endif // MOZILLA_DOM_MEDIA_WEBRTC_LIBWEBRTCGLUE_FRAMETRANSFORMERPROXY_H_ diff --git a/dom/media/webrtc/libwebrtcglue/MediaConduitControl.h b/dom/media/webrtc/libwebrtcglue/MediaConduitControl.h index 5df3f87bc16..ab38d8d623a 100644 --- a/dom/media/webrtc/libwebrtcglue/MediaConduitControl.h +++ b/dom/media/webrtc/libwebrtcglue/MediaConduitControl.h @@ -16,6 +16,7 @@ #include "CodecConfig.h" // For Audio/VideoCodecConfig #include "api/rtp_parameters.h" // For webrtc::RtpExtension #include "api/video_codecs/video_codec.h" // For webrtc::VideoCodecMode +#include "FrameTransformerProxy.h" namespace mozilla { @@ -45,6 +46,10 @@ class MediaConduitControlInterface { virtual Canonical& CanonicalSyncGroup() = 0; virtual Canonical& CanonicalLocalRecvRtpExtensions() = 0; virtual Canonical& CanonicalLocalSendRtpExtensions() = 0; + virtual Canonical>& + CanonicalFrameTransformerProxySend() = 0; + virtual Canonical>& + CanonicalFrameTransformerProxyRecv() = 0; }; class AudioConduitControlInterface : public MediaConduitControlInterface { diff --git a/dom/media/webrtc/libwebrtcglue/MediaConduitInterface.h b/dom/media/webrtc/libwebrtcglue/MediaConduitInterface.h index dc78efb8d8b..4d73e82c91c 100644 --- a/dom/media/webrtc/libwebrtcglue/MediaConduitInterface.h +++ b/dom/media/webrtc/libwebrtcglue/MediaConduitInterface.h @@ -55,6 +55,7 @@ enum class MediaSessionConduitLocalDirection : int { kSend, kRecv }; class VideoSessionConduit; class AudioSessionConduit; class WebrtcCallWrapper; +class FrameTransformerProxy; /** * 1. Abstract renderer for video data @@ -413,6 +414,10 @@ class VideoSessionConduit : public MediaSessionConduit { }; virtual Maybe GetLastResolution() const = 0; + virtual void RequestKeyFrame(FrameTransformerProxy* aProxy) = 0; + virtual void GenerateKeyFrame(const Maybe& aRid, + FrameTransformerProxy* aProxy) = 0; + protected: /* RTCP feedback settings, for unit testing purposes */ FrameRequestType mFrameRequestMethod; diff --git a/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp b/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp index fc51a9e5186..1f7ebf81262 100644 --- a/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp +++ b/dom/media/webrtc/libwebrtcglue/VideoConduit.cpp @@ -5,28 +5,28 @@ #include "VideoConduit.h" #include -#include #include #include "common/browser_logging/CSFLog.h" #include "common/YuvStamper.h" -#include "GmpVideoCodec.h" #include "MediaConduitControl.h" -#include "MediaDataCodec.h" -#include "mozilla/dom/RTCRtpSourcesBinding.h" -#include "mozilla/media/MediaUtils.h" -#include "mozilla/StaticPrefs_media.h" -#include "mozilla/TemplateLib.h" #include "nsIGfxInfo.h" -#include "nsIPrefBranch.h" -#include "nsIPrefService.h" #include "nsServiceManagerUtils.h" #include "RtpRtcpConfig.h" #include "transport/SrtpFlow.h" // For SRTP_MAX_EXPANSION #include "Tracing.h" #include "VideoStreamFactory.h" #include "WebrtcCallWrapper.h" -#include "WebrtcGmpVideoCodec.h" +#include "libwebrtcglue/FrameTransformer.h" +#include "libwebrtcglue/FrameTransformerProxy.h" +#include "mozilla/StateMirroring.h" +#include "mozilla/RefPtr.h" +#include "nsThreadUtils.h" +#include "mozilla/Maybe.h" +#include "mozilla/ErrorResult.h" +#include +#include +#include // libwebrtc includes #include "api/transport/bitrate_settings.h" @@ -36,8 +36,70 @@ #include "media/base/media_constants.h" #include "media/engine/simulcast_encoder_adapter.h" #include "modules/rtp_rtcp/include/rtp_rtcp_defines.h" -#include "modules/video_coding/codecs/vp8/include/vp8.h" -#include "modules/video_coding/codecs/vp9/include/vp9.h" +#include "rtc_base/ref_counted_object.h" + +#include "api/call/transport.h" +#include "api/media_types.h" +#include "api/rtp_headers.h" +#include "api/rtp_parameters.h" +#include "api/scoped_refptr.h" +#include "api/transport/rtp/rtp_source.h" +#include "api/video_codecs/video_encoder.h" +#include "api/video/video_codec_constants.h" +#include "api/video/video_codec_type.h" +#include "api/video/video_frame_buffer.h" +#include "api/video/video_sink_interface.h" +#include "api/video/video_source_interface.h" +#include +#include "call/call.h" +#include "call/rtp_config.h" +#include "call/video_receive_stream.h" +#include "call/video_send_stream.h" +#include "CodecConfig.h" +#include "common_video/include/video_frame_buffer_pool.h" +#include "domstubs.h" +#include +#include +#include "jsapi/RTCStatsReport.h" +#include +#include "MainThreadUtils.h" +#include +#include "MediaConduitErrors.h" +#include "MediaConduitInterface.h" +#include "MediaEventSource.h" +#include "modules/rtp_rtcp/source/rtp_packet_received.h" +#include "mozilla/Assertions.h" +#include "mozilla/Atomics.h" +#include "mozilla/DataMutex.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "mozilla/dom/RTCStatsReportBinding.h" +#include "mozilla/fallible.h" +#include "mozilla/mozalloc_oom.h" +#include "mozilla/MozPromise.h" +#include "mozilla/Mutex.h" +#include "mozilla/ProfilerState.h" +#include "mozilla/ReentrantMonitor.h" +#include "mozilla/ReverseIterator.h" +#include "mozilla/StateWatching.h" +#include "mozilla/Telemetry.h" +#include "mozilla/TelemetryHistogramEnums.h" +#include "mozilla/TelemetryScalarEnums.h" +#include "mozilla/Types.h" +#include "mozilla/UniquePtr.h" +#include "nsCOMPtr.h" +#include "nsDebug.h" +#include "nsError.h" +#include "nsIDirectTaskDispatcher.h" +#include "nsISerialEventTarget.h" +#include "nsStringFwd.h" +#include "PerformanceRecorder.h" +#include "rtc_base/copy_on_write_buffer.h" +#include "rtc_base/network/sent_packet.h" +#include +#include +#include "transport/mediapacket.h" +#include "video/config/video_encoder_config.h" +#include "WebrtcVideoCodecFactory.h" #ifdef MOZ_WIDGET_ANDROID # include "VideoEngine.h" @@ -329,7 +391,9 @@ WebrtcVideoConduit::Control::Control(const RefPtr& aCallThread) INIT_MIRROR(mSendRtpRtcpConfig, Nothing()), INIT_MIRROR(mRecvCodecs, std::vector()), INIT_MIRROR(mRecvRtpRtcpConfig, Nothing()), - INIT_MIRROR(mCodecMode, webrtc::VideoCodecMode::kRealtimeVideo) {} + INIT_MIRROR(mCodecMode, webrtc::VideoCodecMode::kRealtimeVideo), + INIT_MIRROR(mFrameTransformerProxySend, nullptr), + INIT_MIRROR(mFrameTransformerProxyRecv, nullptr) {} #undef INIT_MIRROR WebrtcVideoConduit::WebrtcVideoConduit( @@ -368,7 +432,6 @@ WebrtcVideoConduit::WebrtcVideoConduit( WebrtcVideoConduit::~WebrtcVideoConduit() { CSFLogDebug(LOGTAG, "%s ", __FUNCTION__); - MOZ_ASSERT(!mSendStream && !mRecvStream, "Call DeleteStreams prior to ~WebrtcVideoConduit."); } @@ -408,6 +471,10 @@ void WebrtcVideoConduit::InitControl(VideoConduitControlInterface* aControl) { CONNECT(aControl->CanonicalVideoRecvRtpRtcpConfig(), mControl.mRecvRtpRtcpConfig); CONNECT(aControl->CanonicalVideoCodecMode(), mControl.mCodecMode); + CONNECT(aControl->CanonicalFrameTransformerProxySend(), + mControl.mFrameTransformerProxySend); + CONNECT(aControl->CanonicalFrameTransformerProxyRecv(), + mControl.mFrameTransformerProxyRecv); } #undef CONNECT @@ -614,14 +681,6 @@ void WebrtcVideoConduit::OnControlConfigChange() { size_t streamCount = std::min(codecConfig->mEncodings.size(), (size_t)webrtc::kMaxSimulcastStreams); - size_t highestResolutionIndex = 0; - for (size_t i = 1; i < streamCount; ++i) { - if (codecConfig->mEncodings[i].constraints.scaleDownBy < - codecConfig->mEncodings[highestResolutionIndex] - .constraints.scaleDownBy) { - highestResolutionIndex = i; - } - } MOZ_RELEASE_ASSERT(streamCount >= 1, "streamCount should be at least one"); @@ -723,23 +782,14 @@ void WebrtcVideoConduit::OnControlConfigChange() { newRtp.nack.rtp_history_ms = codecConfig->RtcpFbNackIsSet(kParamValueEmpty) ? 1000 : 0; - { - newRtp.rids.clear(); - bool has_rid = false; - for (size_t idx = 0; idx < streamCount; idx++) { - const auto& encoding = codecConfig->mEncodings[idx]; - if (encoding.rid[0]) { - has_rid = true; - break; - } - } - if (has_rid) { - for (size_t idx = streamCount; idx > 0; idx--) { - const auto& encoding = codecConfig->mEncodings[idx - 1]; - newRtp.rids.push_back(encoding.rid); - } + newRtp.rids.clear(); + if (!codecConfig->mEncodings.empty() && + !codecConfig->mEncodings[0].rid.empty()) { + for (const auto& encoding : codecConfig->mEncodings) { + newRtp.rids.push_back(encoding.rid); } } + if (mSendStreamConfig.rtp != newRtp) { mSendStreamConfig.rtp = newRtp; sendStreamRecreationNeeded = true; @@ -765,6 +815,32 @@ void WebrtcVideoConduit::OnControlConfigChange() { } } + if (mControl.mConfiguredFrameTransformerProxySend.get() != + mControl.mFrameTransformerProxySend.Ref().get()) { + mControl.mConfiguredFrameTransformerProxySend = + mControl.mFrameTransformerProxySend.Ref(); + if (!mSendStreamConfig.frame_transformer) { + mSendStreamConfig.frame_transformer = + new rtc::RefCountedObject(true); + sendStreamRecreationNeeded = true; + } + static_cast(mSendStreamConfig.frame_transformer.get()) + ->SetProxy(mControl.mConfiguredFrameTransformerProxySend); + } + + if (mControl.mConfiguredFrameTransformerProxyRecv.get() != + mControl.mFrameTransformerProxyRecv.Ref().get()) { + mControl.mConfiguredFrameTransformerProxyRecv = + mControl.mFrameTransformerProxyRecv.Ref(); + if (!mRecvStreamConfig.frame_transformer) { + mRecvStreamConfig.frame_transformer = + new rtc::RefCountedObject(true); + } + static_cast(mRecvStreamConfig.frame_transformer.get()) + ->SetProxy(mControl.mConfiguredFrameTransformerProxyRecv); + // No flag to set, we always recreate recv streams + } + if (remoteSsrcUpdateNeeded) { SetRemoteSSRCConfig(mControl.mConfiguredRemoteSsrc, mControl.mConfiguredRemoteRtxSsrc); @@ -1219,6 +1295,8 @@ RefPtr WebrtcVideoConduit::Shutdown() { mControl.mRecvCodecs.DisconnectIfConnected(); mControl.mRecvRtpRtcpConfig.DisconnectIfConnected(); mControl.mCodecMode.DisconnectIfConnected(); + mControl.mFrameTransformerProxySend.DisconnectIfConnected(); + mControl.mFrameTransformerProxyRecv.DisconnectIfConnected(); mWatchManager.Shutdown(); mCall->UnregisterConduit(this); @@ -1860,6 +1938,92 @@ std::vector WebrtcVideoConduit::GetUpstreamRtpSources() return sources; } +void WebrtcVideoConduit::RequestKeyFrame(FrameTransformerProxy* aProxy) { + mCallThread->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this), + proxy = RefPtr(aProxy)] { + bool success = false; + if (mRecvStream && mEngineReceiving) { + // This is a misnomer. This requests a keyframe from the other side. + mRecvStream->GenerateKeyFrame(); + success = true; + } + proxy->KeyFrameRequestDone(success); + })); +} + +void WebrtcVideoConduit::GenerateKeyFrame(const Maybe& aRid, + FrameTransformerProxy* aProxy) { + // libwebrtc does not implement error handling in the way that + // webrtc-encoded-transform specifies. So, we'll need to do that here. + // Also, spec wants us to synchronously check whether there's an encoder, but + // that's not something that can be checked synchronously. + + mCallThread->Dispatch(NS_NewRunnableFunction( + __func__, [this, self = RefPtr(this), + proxy = RefPtr(aProxy), aRid] { + // If encoder is undefined, reject promise with InvalidStateError, + // abort these steps. + + // If encoder is not processing video frames, reject promise with + // InvalidStateError, abort these steps. + if (!mSendStream || !mCurSendCodecConfig || !mEngineTransmitting) { + CopyableErrorResult result; + result.ThrowInvalidStateError("No encoders"); + proxy->GenerateKeyFrameError(aRid, result); + return; + } + + // Gather a list of video encoders, named videoEncoders from encoder, + // ordered according negotiated RIDs if any. + // NOTE: This is represented by mCurSendCodecConfig->mEncodings + + // If rid is defined, remove from videoEncoders any video encoder that + // does not match rid. + + // If rid is undefined, remove from videoEncoders all video encoders + // except the first one. + bool found = false; + std::vector rids; + if (!aRid.isSome()) { + // If rid is undefined, set rid to the RID value corresponding to + // videoEncoder. + if (!mCurSendCodecConfig->mEncodings.empty()) { + if (!mCurSendCodecConfig->mEncodings[0].rid.empty()) { + rids.push_back(mCurSendCodecConfig->mEncodings[0].rid); + } + found = true; + } + } else { + for (const auto& encoding : mCurSendCodecConfig->mEncodings) { + if (encoding.rid == *aRid) { + found = true; + rids.push_back(encoding.rid); + break; + } + } + } + + // If videoEncoders is empty, reject promise with NotFoundError and + // abort these steps. videoEncoders is expected to be empty if the + // corresponding RTCRtpSender is not active, or the corresponding + // RTCRtpSender track is ended. + if (!found) { + CopyableErrorResult result; + result.ThrowNotFoundError("Rid not in use"); + proxy->GenerateKeyFrameError(aRid, result); + } + + // NOTE: We don't do this stuff, because libwebrtc's interface is + // rid-based. + // Let videoEncoder be the first encoder in videoEncoders. + // If rid is undefined, set rid to the RID value corresponding to + // videoEncoder. + + mSendStream->GenerateKeyFrame(rids); + })); +} + bool WebrtcVideoConduit::HasCodecPluginID(uint64_t aPluginID) const { MOZ_ASSERT(NS_IsMainThread()); diff --git a/dom/media/webrtc/libwebrtcglue/VideoConduit.h b/dom/media/webrtc/libwebrtcglue/VideoConduit.h index 11a07a1f944..f4e6583a21b 100644 --- a/dom/media/webrtc/libwebrtcglue/VideoConduit.h +++ b/dom/media/webrtc/libwebrtcglue/VideoConduit.h @@ -231,6 +231,10 @@ class WebrtcVideoConduit std::vector GetUpstreamRtpSources() const override; + void RequestKeyFrame(FrameTransformerProxy* aProxy) override; + void GenerateKeyFrame(const Maybe& aRid, + FrameTransformerProxy* aProxy) override; + private: // Don't allow copying/assigning. WebrtcVideoConduit(const WebrtcVideoConduit&) = delete; @@ -298,6 +302,8 @@ class WebrtcVideoConduit Mirror> mRecvCodecs; Mirror> mRecvRtpRtcpConfig; Mirror mCodecMode; + Mirror> mFrameTransformerProxySend; + Mirror> mFrameTransformerProxyRecv; // For caching mRemoteSsrc and mRemoteRtxSsrc, since another caller may // change the remote ssrc in the stream config directly. @@ -310,6 +316,10 @@ class WebrtcVideoConduit std::vector mConfiguredRecvCodecs; Maybe mConfiguredRecvRtpRtcpConfig; + // For change tracking. Callthread only. + RefPtr mConfiguredFrameTransformerProxySend; + RefPtr mConfiguredFrameTransformerProxyRecv; + Control() = delete; explicit Control(const RefPtr& aCallThread); } mControl; diff --git a/dom/media/webrtc/libwebrtcglue/VideoStreamFactory.cpp b/dom/media/webrtc/libwebrtcglue/VideoStreamFactory.cpp index 9782f8760bd..0ead26a4538 100644 --- a/dom/media/webrtc/libwebrtcglue/VideoStreamFactory.cpp +++ b/dom/media/webrtc/libwebrtcglue/VideoStreamFactory.cpp @@ -7,9 +7,21 @@ #include "VideoStreamFactory.h" #include "common/browser_logging/CSFLog.h" -#include "nsThreadUtils.h" #include "VideoConduit.h" +#include +#include "api/video_codecs/video_codec.h" +#include +#include +#include "mozilla/Assertions.h" +#include "mozilla/gfx/Point.h" +#include "mozilla/TemplateLib.h" +#include "rtc_base/time_utils.h" +#include +#include +#include +#include "video/config/video_encoder_config.h" + template void ConstrainPreservingAspectRatio(uint16_t aMaxWidth, uint16_t aMaxHeight, t* aWidth, t* aHeight) { @@ -147,7 +159,7 @@ std::vector VideoStreamFactory::CreateEncoderStreams( frameRateController->Reset(); } - for (int idx = streamCount - 1; idx >= 0; --idx) { + for (size_t idx = 0; idx < streamCount; ++idx) { webrtc::VideoStream video_stream; auto& encoding = mCodecConfig.mEncodings[idx]; video_stream.active = encoding.active; diff --git a/dom/media/webrtc/libwebrtcglue/moz.build b/dom/media/webrtc/libwebrtcglue/moz.build index 62bac2ffe61..6f650e8da9f 100644 --- a/dom/media/webrtc/libwebrtcglue/moz.build +++ b/dom/media/webrtc/libwebrtcglue/moz.build @@ -19,6 +19,8 @@ LOCAL_INCLUDES += [ UNIFIED_SOURCES += [ "AudioConduit.cpp", + "FrameTransformer.cpp", + "FrameTransformerProxy.cpp", "GmpVideoCodec.cpp", "MediaConduitInterface.cpp", "MediaDataCodec.cpp", diff --git a/dom/svg/DOMSVGLength.cpp b/dom/svg/DOMSVGLength.cpp index 01b8dc24782..2eb45230e69 100644 --- a/dom/svg/DOMSVGLength.cpp +++ b/dom/svg/DOMSVGLength.cpp @@ -448,7 +448,7 @@ SVGLength& DOMSVGLength::InternalItem() { void DOMSVGLength::FlushStyleIfNeeded() { auto MaybeFlush = [](uint16_t aUnitType, SVGElement* aSVGElement) { - if (SVGLength::IsAbsoluteUnit(aUnitType)) { + if (!SVGLength::IsFontRelativeUnit(aUnitType)) { return; } if (auto* currentDoc = aSVGElement->GetComposedDoc()) { diff --git a/dom/svg/SVGLength.cpp b/dom/svg/SVGLength.cpp index 77ce3b74816..44cd05f44dd 100644 --- a/dom/svg/SVGLength.cpp +++ b/dom/svg/SVGLength.cpp @@ -63,6 +63,11 @@ bool SVGLength::IsAbsoluteUnit(uint8_t aUnit) { (aUnit >= SVG_LENGTHTYPE_PX && aUnit <= SVG_LENGTHTYPE_Q); } +/*static*/ +bool SVGLength::IsFontRelativeUnit(uint8_t aUnit) { + return aUnit == SVG_LENGTHTYPE_EMS || aUnit == SVG_LENGTHTYPE_EXS; +} + /** * Helper to convert between different CSS absolute units without the need for * an element, which provides more flexibility at the DOM level (and without diff --git a/dom/svg/SVGLength.h b/dom/svg/SVGLength.h index a16a43d2d67..5bb0ead16b0 100644 --- a/dom/svg/SVGLength.h +++ b/dom/svg/SVGLength.h @@ -109,6 +109,8 @@ class SVGLength { static bool IsAbsoluteUnit(uint8_t aUnit); + static bool IsFontRelativeUnit(uint8_t aUnit); + static float GetAbsUnitsPerAbsUnit(uint8_t aUnits, uint8_t aPerUnit); static nsCSSUnit SpecifiedUnitTypeToCSSUnit(uint8_t aSpecifiedUnit); diff --git a/dom/tests/mochitest/general/test_interfaces.js b/dom/tests/mochitest/general/test_interfaces.js index 422fc54c46c..6834d81be07 100644 --- a/dom/tests/mochitest/general/test_interfaces.js +++ b/dom/tests/mochitest/general/test_interfaces.js @@ -1064,6 +1064,10 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCDTMFToneChangeEvent", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCEncodedAudioFrame", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCEncodedVideoFrame", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCIceCandidate", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCPeerConnection", insecureContext: true }, @@ -1072,6 +1076,8 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCRtpReceiver", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCRtpScriptTransform", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCRtpSender", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "RTCRtpTransceiver", insecureContext: true }, diff --git a/dom/webgpu/Adapter.cpp b/dom/webgpu/Adapter.cpp index d58b55ff3d0..7954d974853 100644 --- a/dom/webgpu/Adapter.cpp +++ b/dom/webgpu/Adapter.cpp @@ -7,6 +7,7 @@ #include "mozilla/dom/WebGPUBinding.h" #include "Adapter.h" +#include #include "Device.h" #include "Instance.h" #include "SupportedFeatures.h" @@ -407,7 +408,7 @@ already_AddRefed Adapter::RequestDevice( } const auto& limit = itr->second; - const auto& requestedValue = entry.mValue; + uint64_t requestedValue = entry.mValue; const auto supportedValueF64 = GetLimit(*mLimits->mFfi, limit); const auto supportedValue = static_cast(supportedValueF64); if (StringBeginsWith(keyU8, "max"_ns)) { @@ -420,6 +421,10 @@ already_AddRefed Adapter::RequestDevice( promise->MaybeRejectWithOperationError(msg); return; } + // Clamp to default if lower than default + requestedValue = + std::max(requestedValue, + static_cast(GetLimit(deviceLimits, limit))); } else { MOZ_ASSERT(StringBeginsWith(keyU8, "min"_ns)); if (requestedValue < supportedValue) { @@ -431,16 +436,21 @@ already_AddRefed Adapter::RequestDevice( promise->MaybeRejectWithOperationError(msg); return; } - } - if (StringEndsWith(keyU8, "Alignment"_ns)) { - if (!IsPowerOfTwo(requestedValue)) { - nsPrintfCString msg( - "requestDevice: Request for limit '%s' must be a power of two, " - "was %s.", - keyU8.get(), std::to_string(requestedValue).c_str()); - promise->MaybeRejectWithOperationError(msg); - return; + if (StringEndsWith(keyU8, "Alignment"_ns)) { + if (!IsPowerOfTwo(requestedValue)) { + nsPrintfCString msg( + "requestDevice: Request for limit '%s' must be a power of " + "two, " + "was %s.", + keyU8.get(), std::to_string(requestedValue).c_str()); + promise->MaybeRejectWithOperationError(msg); + return; + } } + /// Clamp to default if higher than default + requestedValue = + std::min(requestedValue, + static_cast(GetLimit(deviceLimits, limit))); } SetLimit(&deviceLimits, limit, requestedValue); diff --git a/dom/webidl/DedicatedWorkerGlobalScope.webidl b/dom/webidl/DedicatedWorkerGlobalScope.webidl index e32e23c0cd0..68c2c0fc640 100644 --- a/dom/webidl/DedicatedWorkerGlobalScope.webidl +++ b/dom/webidl/DedicatedWorkerGlobalScope.webidl @@ -37,3 +37,9 @@ interface DedicatedWorkerGlobalScope : WorkerGlobalScope { [Pref="dom.workers.requestAnimationFrame", Throws] undefined cancelAnimationFrame(long handle); }; + +// https://w3c.github.io/webrtc-encoded-transform/#RTCEncodedAudioFrame-methods +partial interface DedicatedWorkerGlobalScope { + [Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled"] attribute EventHandler onrtctransform; +}; diff --git a/dom/webidl/EncodedVideoChunk.webidl b/dom/webidl/EncodedVideoChunk.webidl index d664cad1202..fa1c5599ab2 100644 --- a/dom/webidl/EncodedVideoChunk.webidl +++ b/dom/webidl/EncodedVideoChunk.webidl @@ -7,6 +7,7 @@ * https://w3c.github.io/webcodecs/#encodedvideochunk */ +// [Serializable] is implemented without adding attribute here. [Exposed=(Window,DedicatedWorker), Pref="dom.media.webcodecs.enabled"] interface EncodedVideoChunk { [Throws] diff --git a/dom/webidl/RTCEncodedAudioFrame.webidl b/dom/webidl/RTCEncodedAudioFrame.webidl new file mode 100644 index 00000000000..a2a25f0f284 --- /dev/null +++ b/dom/webidl/RTCEncodedAudioFrame.webidl @@ -0,0 +1,24 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * The origin of this IDL file is + * https://w3c.github.io/webrtc-encoded-transform + */ + +dictionary RTCEncodedAudioFrameMetadata { + unsigned long synchronizationSource; + octet payloadType; + sequence contributingSources; + short sequenceNumber; +}; + +[Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled", + Exposed=(Window,DedicatedWorker)] +interface RTCEncodedAudioFrame { + readonly attribute unsigned long timestamp; + attribute ArrayBuffer data; + RTCEncodedAudioFrameMetadata getMetadata(); +}; diff --git a/dom/webidl/RTCEncodedVideoFrame.webidl b/dom/webidl/RTCEncodedVideoFrame.webidl new file mode 100644 index 00000000000..564252fd6ed --- /dev/null +++ b/dom/webidl/RTCEncodedVideoFrame.webidl @@ -0,0 +1,41 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * The origin of this IDL file is + * https://www.w3.org/TR/webrtc-encoded-transform + */ + +// New enum for video frame types. Will eventually re-use the equivalent defined +// by WebCodecs. +enum RTCEncodedVideoFrameType { + "empty", + "key", + "delta", +}; + +dictionary RTCEncodedVideoFrameMetadata { + unsigned long long frameId; + sequence dependencies; + unsigned short width; + unsigned short height; + unsigned long spatialIndex; + unsigned long temporalIndex; + unsigned long synchronizationSource; + octet payloadType; + sequence contributingSources; + long long timestamp; // microseconds +}; + +// New interfaces to define encoded video and audio frames. Will eventually +// re-use or extend the equivalent defined in WebCodecs. +[Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled", + Exposed=(Window,DedicatedWorker)] +interface RTCEncodedVideoFrame { + readonly attribute RTCEncodedVideoFrameType type; + readonly attribute unsigned long timestamp; + attribute ArrayBuffer data; + RTCEncodedVideoFrameMetadata getMetadata(); +}; diff --git a/dom/webidl/RTCRtpReceiver.webidl b/dom/webidl/RTCRtpReceiver.webidl index 59a4f1340fd..d8002e6511a 100644 --- a/dom/webidl/RTCRtpReceiver.webidl +++ b/dom/webidl/RTCRtpReceiver.webidl @@ -32,3 +32,9 @@ partial interface RTCRtpReceiver { [Throws] attribute DOMHighResTimeStamp? jitterBufferTarget; }; + +// https://w3c.github.io/webrtc-encoded-transform/#specification +partial interface RTCRtpReceiver { + [SetterThrows, + Pref="media.peerconnection.scripttransform.enabled"] attribute RTCRtpTransform? transform; +}; diff --git a/dom/webidl/RTCRtpScriptTransform.webidl b/dom/webidl/RTCRtpScriptTransform.webidl new file mode 100644 index 00000000000..91fe7b39edb --- /dev/null +++ b/dom/webidl/RTCRtpScriptTransform.webidl @@ -0,0 +1,20 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * The origin of this IDL file is + * https://www.w3.org/TR/webrtc-encoded-transform + */ + +// Spec version is commented out (uncomment if SFrameTransform is implemented) +// typedef (SFrameTransform or RTCRtpScriptTransform) RTCRtpTransform; +typedef RTCRtpScriptTransform RTCRtpTransform; + +[Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled", + Exposed=Window] +interface RTCRtpScriptTransform { + [Throws] + constructor(Worker worker, optional any options, optional sequence transfer); +}; diff --git a/dom/webidl/RTCRtpScriptTransformer.webidl b/dom/webidl/RTCRtpScriptTransformer.webidl new file mode 100644 index 00000000000..3a047ac9a01 --- /dev/null +++ b/dom/webidl/RTCRtpScriptTransformer.webidl @@ -0,0 +1,19 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * The origin of this IDL file is + * https://www.w3.org/TR/webrtc-encoded-transform + */ + +[Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled", + Exposed=DedicatedWorker] +interface RTCRtpScriptTransformer { + readonly attribute ReadableStream readable; + readonly attribute WritableStream writable; + [Throws] readonly attribute any options; + Promise generateKeyFrame(optional DOMString rid); + Promise sendKeyFrameRequest(); +}; diff --git a/dom/webidl/RTCRtpSender.webidl b/dom/webidl/RTCRtpSender.webidl index 7867d019e50..c6e70a376f1 100644 --- a/dom/webidl/RTCRtpSender.webidl +++ b/dom/webidl/RTCRtpSender.webidl @@ -30,3 +30,9 @@ interface RTCRtpSender { [ChromeOnly] undefined setTrack(MediaStreamTrack? track); }; + +// https://w3c.github.io/webrtc-encoded-transform/#specification +partial interface RTCRtpSender { + [SetterThrows, + Pref="media.peerconnection.scripttransform.enabled"] attribute RTCRtpTransform? transform; +}; diff --git a/dom/webidl/RTCTransformEvent.webidl b/dom/webidl/RTCTransformEvent.webidl new file mode 100644 index 00000000000..b8f48faab62 --- /dev/null +++ b/dom/webidl/RTCTransformEvent.webidl @@ -0,0 +1,20 @@ +/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 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/. + * + * The origin of this IDL file is + * https://www.w3.org/TR/webrtc-encoded-transform + */ + +[Pref="media.peerconnection.enabled", + Pref="media.peerconnection.scripttransform.enabled", + Exposed=DedicatedWorker] +interface RTCTransformEvent : Event { + constructor(DOMString type, RTCTransformEventInit eventInitDict); + readonly attribute RTCRtpScriptTransformer transformer; +}; + +dictionary RTCTransformEventInit : EventInit { + required RTCRtpScriptTransformer transformer; +}; diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build index 401e72096e9..a5222e7b240 100644 --- a/dom/webidl/moz.build +++ b/dom/webidl/moz.build @@ -1060,6 +1060,8 @@ if CONFIG["MOZ_WEBRTC"]: "RTCDataChannel.webidl", "RTCDtlsTransport.webidl", "RTCDTMFSender.webidl", + "RTCEncodedAudioFrame.webidl", + "RTCEncodedVideoFrame.webidl", "RTCIceCandidate.webidl", "RTCIdentityAssertion.webidl", "RTCIdentityProvider.webidl", @@ -1068,12 +1070,15 @@ if CONFIG["MOZ_WEBRTC"]: "RTCRtpCapabilities.webidl", "RTCRtpParameters.webidl", "RTCRtpReceiver.webidl", + "RTCRtpScriptTransform.webidl", + "RTCRtpScriptTransformer.webidl", "RTCRtpSender.webidl", "RTCRtpSources.webidl", "RTCRtpTransceiver.webidl", "RTCSctpTransport.webidl", "RTCSessionDescription.webidl", "RTCStatsReport.webidl", + "RTCTransformEvent.webidl", "WebrtcGlobalInformation.webidl", ] @@ -1181,6 +1186,7 @@ GENERATED_EVENTS_WEBIDL_FILES = [ "PositionStateEvent.webidl", "ProgressEvent.webidl", "PromiseRejectionEvent.webidl", + "RTCTransformEvent.webidl", "ScrollViewChangeEvent.webidl", "SecurityPolicyViolationEvent.webidl", "StyleSheetApplicableStateChangeEvent.webidl", diff --git a/dom/workers/EventWithOptionsRunnable.cpp b/dom/workers/EventWithOptionsRunnable.cpp new file mode 100644 index 00000000000..c3d81491abc --- /dev/null +++ b/dom/workers/EventWithOptionsRunnable.cpp @@ -0,0 +1,164 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#include "EventWithOptionsRunnable.h" +#include "WorkerScope.h" +#include "mozilla/dom/WorkerRunnable.h" +#include "mozilla/dom/StructuredCloneHolder.h" +#include "js/StructuredClone.h" +#include "js/RootingAPI.h" +#include "js/Value.h" +#include "nsJSPrincipals.h" +#include "nsContentUtils.h" +#include "nsDebug.h" +#include "MainThreadUtils.h" +#include "mozilla/Assertions.h" +#include "nsGlobalWindowInner.h" +#include "mozilla/DOMEventTargetHelper.h" +#include "mozilla/ErrorResult.h" +#include "nsIGlobalObject.h" +#include "nsCOMPtr.h" +#include "js/GlobalObject.h" +#include "xpcpublic.h" +#include "mozilla/dom/MessagePortBinding.h" +#include "mozilla/dom/MessagePort.h" +#include "mozilla/OwningNonNull.h" +#include "mozilla/RefPtr.h" +#include "mozilla/dom/Event.h" +#include "mozilla/dom/WorkerCommon.h" + +namespace mozilla::dom { +EventWithOptionsRunnable::EventWithOptionsRunnable(Worker& aWorker) + : WorkerDebuggeeRunnable(aWorker.mWorkerPrivate, + WorkerRunnable::WorkerThreadModifyBusyCount), + StructuredCloneHolder(CloningSupported, TransferringSupported, + StructuredCloneScope::SameProcess) {} + +EventWithOptionsRunnable::~EventWithOptionsRunnable() = default; + +void EventWithOptionsRunnable::InitOptions( + JSContext* aCx, JS::Handle aOptions, + const Sequence& aTransferable, ErrorResult& aRv) { + JS::Rooted transferable(aCx, JS::UndefinedValue()); + + aRv = nsContentUtils::CreateJSValueFromSequenceOfObject(aCx, aTransferable, + &transferable); + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + JS::CloneDataPolicy clonePolicy; + // DedicatedWorkers are always part of the same agent cluster. + clonePolicy.allowIntraClusterClonableSharedObjects(); + + MOZ_ASSERT(NS_IsMainThread()); + nsGlobalWindowInner* win = nsContentUtils::IncumbentInnerWindow(); + if (win && win->IsSharedMemoryAllowed()) { + clonePolicy.allowSharedMemoryObjects(); + } + + Write(aCx, aOptions, transferable, clonePolicy, aRv); +} + +// Cargo-culted from MesssageEventRunnable. +bool EventWithOptionsRunnable::BuildAndFireEvent( + JSContext* aCx, WorkerPrivate* aWorkerPrivate, + DOMEventTargetHelper* aTarget) { + IgnoredErrorResult rv; + nsCOMPtr parent = aTarget->GetParentObject(); + + // For some workers without window, parent is null and we try to find it + // from the JS Context. + if (!parent) { + JS::Rooted globalObject(aCx, JS::CurrentGlobalOrNull(aCx)); + if (NS_WARN_IF(!globalObject)) { + rv.ThrowDataCloneError("failed to get global object"); + OptionsDeserializeFailed(rv); + return false; + } + + parent = xpc::NativeGlobal(globalObject); + if (NS_WARN_IF(!parent)) { + rv.ThrowDataCloneError("failed to get parent"); + OptionsDeserializeFailed(rv); + return false; + } + } + + MOZ_ASSERT(parent); + + JS::Rooted options(aCx); + + JS::CloneDataPolicy cloneDataPolicy; + if (parent->GetClientInfo().isSome() && + parent->GetClientInfo()->AgentClusterId().isSome() && + parent->GetClientInfo()->AgentClusterId()->Equals( + aWorkerPrivate->AgentClusterId())) { + cloneDataPolicy.allowIntraClusterClonableSharedObjects(); + } + + if (aWorkerPrivate->IsSharedMemoryAllowed()) { + cloneDataPolicy.allowSharedMemoryObjects(); + } + + Read(parent, aCx, &options, cloneDataPolicy, rv); + + if (NS_WARN_IF(rv.Failed())) { + OptionsDeserializeFailed(rv); + return false; + } + + Sequence> ports; + if (NS_WARN_IF(!TakeTransferredPortsAsSequence(ports))) { + // TODO: Is this an appropriate type? What does this actually do? + rv.ThrowDataCloneError("TakeTransferredPortsAsSequence failed"); + OptionsDeserializeFailed(rv); + return false; + } + + RefPtr event = BuildEvent(aCx, parent, aTarget, options); + + if (NS_WARN_IF(!event)) { + return false; + } + + aTarget->DispatchEvent(*event); + return true; +} + +bool EventWithOptionsRunnable::WorkerRun(JSContext* aCx, + WorkerPrivate* aWorkerPrivate) { + if (mBehavior == ParentThreadUnchangedBusyCount) { + // Don't fire this event if the JS object has been disconnected from the + // private object. + if (!aWorkerPrivate->IsAcceptingEvents()) { + return true; + } + + // Once a window has frozen its workers, their + // mMainThreadDebuggeeEventTargets should be paused, and their + // WorkerDebuggeeRunnables should not be being executed. The same goes for + // WorkerDebuggeeRunnables sent from child to parent workers, but since a + // frozen parent worker runs only control runnables anyway, that is taken + // care of naturally. + MOZ_ASSERT(!aWorkerPrivate->IsFrozen()); + + // Similarly for paused windows; all its workers should have been informed. + // (Subworkers are unaffected by paused windows.) + MOZ_ASSERT(!aWorkerPrivate->IsParentWindowPaused()); + + aWorkerPrivate->AssertInnerWindowIsCorrect(); + + return BuildAndFireEvent(aCx, aWorkerPrivate, + aWorkerPrivate->ParentEventTargetRef()); + } + + MOZ_ASSERT(aWorkerPrivate == GetWorkerPrivateFromContext(aCx)); + + return BuildAndFireEvent(aCx, aWorkerPrivate, aWorkerPrivate->GlobalScope()); +} + +} // namespace mozilla::dom diff --git a/dom/workers/EventWithOptionsRunnable.h b/dom/workers/EventWithOptionsRunnable.h new file mode 100644 index 00000000000..424a4e15792 --- /dev/null +++ b/dom/workers/EventWithOptionsRunnable.h @@ -0,0 +1,55 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set ts=2 et sw=2 tw=80: */ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. */ + +#ifndef MOZILLA_DOM_WORKERS_EVENTWITHOPTIONSRUNNABLE_H_ +#define MOZILLA_DOM_WORKERS_EVENTWITHOPTIONSRUNNABLE_H_ + +#include "WorkerCommon.h" +#include "WorkerRunnable.h" +#include "mozilla/dom/StructuredCloneHolder.h" + +namespace mozilla { +class DOMEventTargetHelper; + +namespace dom { +class Event; +class EventTarget; +class Worker; +class WorkerPrivate; + +// Cargo-culted from MesssageEventRunnable. +// Intended to be used for the idiom where arbitrary options are transferred to +// the worker thread (with optional transfer functions), which are then used to +// build an event, which is then fired on the global worker scope. +class EventWithOptionsRunnable : public WorkerDebuggeeRunnable, + public StructuredCloneHolder { + public: + explicit EventWithOptionsRunnable(Worker& aWorker); + void InitOptions(JSContext* aCx, JS::Handle aOptions, + const Sequence& aTransferable, ErrorResult& aRv); + + // Called on the worker thread. The event returned will be fired on the + // worker's global scope. If a StrongWorkerRef needs to be retained, the + // implementation can do so with the WorkerPrivate. + virtual already_AddRefed BuildEvent( + JSContext* aCx, nsIGlobalObject* aGlobal, EventTarget* aTarget, + JS::Handle aOptions) = 0; + + // Called on the worker thread + virtual void OptionsDeserializeFailed(ErrorResult& aRv) {} + + protected: + virtual ~EventWithOptionsRunnable(); + + private: + bool WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) override; + bool BuildAndFireEvent(JSContext* aCx, WorkerPrivate* aWorkerPrivate, + DOMEventTargetHelper* aTarget); +}; +} // namespace dom +} // namespace mozilla + +#endif // MOZILLA_DOM_WORKERS_EVENTWITHOPTIONSRUNNABLE_H_ diff --git a/dom/workers/Worker.cpp b/dom/workers/Worker.cpp index 3452859c4c6..2dea04bf558 100644 --- a/dom/workers/Worker.cpp +++ b/dom/workers/Worker.cpp @@ -16,6 +16,13 @@ #include "nsContentUtils.h" #include "nsGlobalWindowOuter.h" #include "WorkerPrivate.h" +#include "EventWithOptionsRunnable.h" +#include "js/RootingAPI.h" +#include "mozilla/dom/BindingDeclarations.h" +#include "nsISupports.h" +#include "nsDebug.h" +#include "mozilla/dom/WorkerStatus.h" +#include "mozilla/RefPtr.h" #ifdef XP_WIN # undef PostMessage @@ -177,6 +184,34 @@ void Worker::PostMessage(JSContext* aCx, JS::Handle aMessage, PostMessage(aCx, aMessage, aOptions.mTransfer, aRv); } +void Worker::PostEventWithOptions(JSContext* aCx, + JS::Handle aOptions, + const Sequence& aTransferable, + EventWithOptionsRunnable* aRunnable, + ErrorResult& aRv) { + NS_ASSERT_OWNINGTHREAD(Worker); + + if (NS_WARN_IF(!mWorkerPrivate || + mWorkerPrivate->ParentStatusProtected() > Running)) { + return; + } + RefPtr workerPrivate = mWorkerPrivate; + Unused << workerPrivate; + + aRunnable->InitOptions(aCx, aOptions, aTransferable, aRv); + + if (NS_WARN_IF(!mWorkerPrivate || + mWorkerPrivate->ParentStatusProtected() > Running)) { + return; + } + + if (NS_WARN_IF(aRv.Failed())) { + return; + } + + Unused << NS_WARN_IF(!aRunnable->Dispatch()); +} + void Worker::Terminate() { NS_ASSERT_OWNINGTHREAD(Worker); diff --git a/dom/workers/Worker.h b/dom/workers/Worker.h index b1b06866886..14d0630f284 100644 --- a/dom/workers/Worker.h +++ b/dom/workers/Worker.h @@ -19,6 +19,7 @@ namespace mozilla::dom { +class EventWithOptionsRunnable; struct StructuredSerializeOptions; struct WorkerOptions; class WorkerPrivate; @@ -48,6 +49,11 @@ class Worker : public DOMEventTargetHelper, public SupportsWeakPtr { const StructuredSerializeOptions& aOptions, ErrorResult& aRv); + void PostEventWithOptions(JSContext* aCx, JS::Handle aOptions, + const Sequence& aTransferable, + EventWithOptionsRunnable* aRunnable, + ErrorResult& aRv); + void Terminate(); IMPL_EVENT_HANDLER(error) @@ -59,6 +65,7 @@ class Worker : public DOMEventTargetHelper, public SupportsWeakPtr { already_AddRefed aWorkerPrivate); ~Worker(); + friend class EventWithOptionsRunnable; RefPtr mWorkerPrivate; }; diff --git a/dom/workers/WorkerScope.h b/dom/workers/WorkerScope.h index e29413f503e..6d4ea76ef1f 100644 --- a/dom/workers/WorkerScope.h +++ b/dom/workers/WorkerScope.h @@ -424,6 +424,7 @@ class DedicatedWorkerGlobalScope final IMPL_EVENT_HANDLER(message) IMPL_EVENT_HANDLER(messageerror) + IMPL_EVENT_HANDLER(rtctransform) private: ~DedicatedWorkerGlobalScope() = default; diff --git a/dom/workers/moz.build b/dom/workers/moz.build index ed6950bd701..4568e63ea43 100644 --- a/dom/workers/moz.build +++ b/dom/workers/moz.build @@ -12,6 +12,7 @@ DIRS += ["remoteworkers", "sharedworkers", "loader"] # Public stuff. EXPORTS.mozilla.dom += [ "ChromeWorker.h", + "EventWithOptionsRunnable.h", "JSExecutionManager.h", "Worker.h", "WorkerChannelInfo.h", @@ -51,6 +52,7 @@ XPIDL_SOURCES += [ UNIFIED_SOURCES += [ "ChromeWorker.cpp", "ChromeWorkerScope.cpp", + "EventWithOptionsRunnable.cpp", "JSExecutionManager.cpp", "MessageEventRunnable.cpp", "RegisterBindings.cpp", diff --git a/dom/workers/test/test_worker_interfaces.js b/dom/workers/test/test_worker_interfaces.js index 87c0cda696c..8743f3c4a29 100644 --- a/dom/workers/test/test_worker_interfaces.js +++ b/dom/workers/test/test_worker_interfaces.js @@ -307,6 +307,14 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Response", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCEncodedAudioFrame", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCEncodedVideoFrame", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCRtpScriptTransformer", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "RTCTransformEvent", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! { name: "Scheduler", insecureContext: true, nightly: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "StorageManager", fennec: false }, @@ -426,6 +434,8 @@ let interfaceNamesInGlobalScope = [ // IMPORTANT: Do not change this list without review from a DOM peer! { name: "onmessageerror", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! + { name: "onrtctransform", insecureContext: true }, + // IMPORTANT: Do not change this list without review from a DOM peer! { name: "postMessage", insecureContext: true }, // IMPORTANT: Do not change this list without review from a DOM peer! { name: "requestAnimationFrame", insecureContext: true }, diff --git a/dom/xhr/XMLHttpRequest.cpp b/dom/xhr/XMLHttpRequest.cpp index a331de6ffe0..f6bd1e18c7d 100644 --- a/dom/xhr/XMLHttpRequest.cpp +++ b/dom/xhr/XMLHttpRequest.cpp @@ -7,9 +7,12 @@ #include "XMLHttpRequest.h" #include "XMLHttpRequestMainThread.h" #include "XMLHttpRequestWorker.h" +#include "mozilla/Logging.h" #include "mozilla/net/CookieJarSettings.h" #include "nsGlobalWindowInner.h" +mozilla::LazyLogModule gXMLHttpRequestLog("XMLHttpRequest"); + namespace mozilla::dom { /* static */ diff --git a/dom/xhr/XMLHttpRequestMainThread.cpp b/dom/xhr/XMLHttpRequestMainThread.cpp index c4197c5b5d9..c34a9a788a6 100644 --- a/dom/xhr/XMLHttpRequestMainThread.cpp +++ b/dom/xhr/XMLHttpRequestMainThread.cpp @@ -111,6 +111,8 @@ # undef CreateFile #endif +extern mozilla::LazyLogModule gXMLHttpRequestLog; + using namespace mozilla::net; namespace mozilla::dom { @@ -206,6 +208,7 @@ XMLHttpRequestMainThread::XMLHttpRequestMainThread( mRequestSentTime(0), mTimeoutMilliseconds(0), mErrorLoad(ErrorType::eOK), + mErrorLoadDetail(NS_OK), mErrorParsingXML(false), mWaitingForOnStopRequest(false), mProgressTimerIsActive(false), @@ -909,29 +912,43 @@ void XMLHttpRequestMainThread::GetStatusText(nsACString& aStatusText, } } -void XMLHttpRequestMainThread::TerminateOngoingFetch() { +void XMLHttpRequestMainThread::TerminateOngoingFetch(nsresult detail) { if ((mState == XMLHttpRequest_Binding::OPENED && mFlagSend) || mState == XMLHttpRequest_Binding::HEADERS_RECEIVED || mState == XMLHttpRequest_Binding::LOADING) { - CloseRequest(); + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Info, + ("%p TerminateOngoingFetch(0x%" PRIx32 ")", this, + static_cast(detail))); + CloseRequest(detail); } } -void XMLHttpRequestMainThread::CloseRequest() { +void XMLHttpRequestMainThread::CloseRequest(nsresult detail) { mWaitingForOnStopRequest = false; mErrorLoad = ErrorType::eTerminated; + mErrorLoadDetail = detail; if (mChannel) { mChannel->CancelWithReason(NS_BINDING_ABORTED, "XMLHttpRequestMainThread::CloseRequest"_ns); } - if (mTimeoutTimer) { - mTimeoutTimer->Cancel(); - } + CancelTimeoutTimer(); } void XMLHttpRequestMainThread::CloseRequestWithError( const ProgressEventType aType) { - CloseRequest(); + MOZ_LOG( + gXMLHttpRequestLog, LogLevel::Debug, + ("%p CloseRequestWithError(%hhu)", this, static_cast(aType))); + nsresult detail = NS_ERROR_DOM_UNKNOWN_ERR; + if (aType == ProgressEventType::abort) { + detail = NS_ERROR_DOM_ABORT_ERR; + } else if (aType == ProgressEventType::error) { + detail = NS_ERROR_DOM_NETWORK_ERR; + } else if (aType == ProgressEventType::timeout) { + detail = NS_ERROR_DOM_TIMEOUT_ERR; + } + + CloseRequest(detail); ResetResponse(); @@ -968,11 +985,20 @@ void XMLHttpRequestMainThread::CloseRequestWithError( void XMLHttpRequestMainThread::RequestErrorSteps( const ProgressEventType aEventType, const nsresult aOptionalException, ErrorResult& aRv) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p RequestErrorSteps(%hhu,0x%" PRIx32 ")", this, + static_cast(aEventType), + static_cast(aOptionalException))); + + // Cancel our timers first before setting our state to done, so we don't + // trip any assertions if one fires and asserts that state != done. + CancelTimeoutTimer(); + CancelSyncTimeoutTimer(); + StopProgressEventTimer(); + // Step 1 mState = XMLHttpRequest_Binding::DONE; - StopProgressEventTimer(); - // Step 2 mFlagSend = false; @@ -1012,21 +1038,23 @@ void XMLHttpRequestMainThread::RequestErrorSteps( void XMLHttpRequestMainThread::Abort(ErrorResult& aRv) { NOT_CALLABLE_IN_SYNC_SEND_RV + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, ("%p Abort()", this)); AbortInternal(aRv); } void XMLHttpRequestMainThread::AbortInternal(ErrorResult& aRv) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, ("%p AbortInternal()", this)); mFlagAborted = true; DisconnectDoneNotifier(); // Step 1 - TerminateOngoingFetch(); + TerminateOngoingFetch(NS_ERROR_DOM_ABORT_ERR); // Step 2 if ((mState == XMLHttpRequest_Binding::OPENED && mFlagSend) || mState == XMLHttpRequest_Binding::HEADERS_RECEIVED || mState == XMLHttpRequest_Binding::LOADING) { - RequestErrorSteps(ProgressEventType::abort, NS_OK, aRv); + RequestErrorSteps(ProgressEventType::abort, NS_ERROR_DOM_ABORT_ERR, aRv); } // Step 3 @@ -1278,6 +1306,15 @@ void XMLHttpRequestMainThread::DispatchProgressEvent( ProgressEvent::Constructor(aTarget, typeString, init); event->SetTrusted(true); + if (MOZ_LOG_TEST(gXMLHttpRequestLog, LogLevel::Debug)) { + nsAutoString type; + event->GetType(type); + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("firing %s event (%u,%u,%" PRIu64 ",%" PRIu64 ")", + NS_ConvertUTF16toUTF8(type).get(), aTarget == mUpload, + aTotal != -1, aLoaded, (aTotal == -1) ? 0 : aTotal)); + } + DispatchOrStoreEvent(aTarget, event); // If we're sending a load, error, timeout or abort event, then @@ -1487,7 +1524,7 @@ void XMLHttpRequestMainThread::Open(const nsACString& aMethod, } // Step 10 - TerminateOngoingFetch(); + TerminateOngoingFetch(NS_OK); // Step 11 // timeouts are handled without a flag @@ -1835,6 +1872,7 @@ XMLHttpRequestMainThread::OnStartRequest(nsIRequest* request) { request->GetStatus(&status); if (mErrorLoad == ErrorType::eOK && NS_FAILED(status)) { mErrorLoad = ErrorType::eRequest; + mErrorLoadDetail = status; } // Upload phase is now over. If we were uploading anything, @@ -2105,7 +2143,7 @@ XMLHttpRequestMainThread::OnStopRequest(nsIRequest* request, nsresult status) { if (status == NS_BINDING_ABORTED) { mFlagParseBody = false; IgnoredErrorResult rv; - RequestErrorSteps(ProgressEventType::abort, NS_OK, rv); + RequestErrorSteps(ProgressEventType::abort, NS_ERROR_DOM_ABORT_ERR, rv); ChangeState(XMLHttpRequest_Binding::UNSENT, false); return NS_OK; } @@ -2208,7 +2246,28 @@ XMLHttpRequestMainThread::OnStopRequest(nsIRequest* request, nsresult status) { // reasons are that the user leaves the page or hits the ESC key. mErrorLoad = ErrorType::eUnreachable; + mErrorLoadDetail = status; mResponseXML = nullptr; + + // Handle network errors specifically per spec. + if (NS_ERROR_GET_MODULE(status) == NS_ERROR_MODULE_NETWORK) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p detected networking error 0x%" PRIx32 "\n", this, + static_cast(status))); + IgnoredErrorResult rv; + mFlagParseBody = false; + RequestErrorSteps(ProgressEventType::error, NS_ERROR_DOM_NETWORK_ERR, rv); + // RequestErrorSteps will not call ChangeStateToDone for sync XHRs, so we + // do so here to ensure progress events are sent and our state is sane. + if (mFlagSynchronous) { + ChangeStateToDone(wasSync); + } + return NS_OK; + } + + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p detected unreachable error 0x%" PRIx32 "\n", this, + static_cast(status))); } // If we're uninitialized at this point, we encountered an error @@ -2316,9 +2375,7 @@ void XMLHttpRequestMainThread::ChangeStateToDoneInternal() { mFlagSend = false; - if (mTimeoutTimer) { - mTimeoutTimer->Cancel(); - } + CancelTimeoutTimer(); // Per spec, fire the last download progress event, if any, // before readystatechange=4/done. (Note that 0-sized responses @@ -2706,6 +2763,7 @@ nsresult XMLHttpRequestMainThread::InitiateFetch( mChannel = nullptr; mErrorLoad = ErrorType::eChannelOpen; + mErrorLoadDetail = rv; // Per spec, we throw on sync errors, but not async. if (mFlagSynchronous) { @@ -2897,16 +2955,18 @@ void XMLHttpRequestMainThread::SendInternal(const BodyExtractorBase* aBody, // we have internal code relying on the channel being created in open(). if (!mChannel) { mErrorLoad = ErrorType::eChannelOpen; + mErrorLoadDetail = NS_ERROR_DOM_NETWORK_ERR; mFlagSend = true; // so CloseRequestWithError sets us to DONE. - aRv = MaybeSilentSendFailure(NS_ERROR_DOM_NETWORK_ERR); + aRv = MaybeSilentSendFailure(mErrorLoadDetail); return; } // non-GET requests aren't allowed for blob. if (IsBlobURI(mRequestURL) && !mRequestMethod.EqualsLiteral("GET")) { mErrorLoad = ErrorType::eChannelOpen; + mErrorLoadDetail = NS_ERROR_DOM_NETWORK_ERR; mFlagSend = true; // so CloseRequestWithError sets us to DONE. - aRv = MaybeSilentSendFailure(NS_ERROR_DOM_NETWORK_ERR); + aRv = MaybeSilentSendFailure(mErrorLoadDetail); return; } @@ -2919,6 +2979,7 @@ void XMLHttpRequestMainThread::SendInternal(const BodyExtractorBase* aBody, // By default we don't have any upload, so mark upload complete. mUploadComplete = true; mErrorLoad = ErrorType::eOK; + mErrorLoadDetail = NS_OK; mLoadTotal = -1; nsCOMPtr uploadStream; nsAutoCString uploadContentType; @@ -3181,9 +3242,7 @@ void XMLHttpRequestMainThread::StartTimeoutTimer() { return; } - if (mTimeoutTimer) { - mTimeoutTimer->Cancel(); - } + CancelTimeoutTimer(); if (!mTimeoutMilliseconds) { return; @@ -3364,6 +3423,7 @@ nsresult XMLHttpRequestMainThread::OnRedirectVerifyCallback(nsresult result, } } else { mErrorLoad = ErrorType::eRedirect; + mErrorLoadDetail = result; } mNewRedirectChannel = nullptr; @@ -3522,6 +3582,13 @@ void XMLHttpRequestMainThread::HandleTimeoutCallback() { CloseRequestWithError(ProgressEventType::timeout); } +void XMLHttpRequestMainThread::CancelTimeoutTimer() { + if (mTimeoutTimer) { + mTimeoutTimer->Cancel(); + mTimeoutTimer = nullptr; + } +} + NS_IMETHODIMP XMLHttpRequestMainThread::Notify(nsITimer* aTimer) { if (mProgressNotifier == aTimer) { @@ -3625,6 +3692,7 @@ void XMLHttpRequestMainThread::HandleSyncTimeoutTimer() { CancelSyncTimeoutTimer(); Abort(); + mErrorLoadDetail = NS_ERROR_DOM_TIMEOUT_ERR; } void XMLHttpRequestMainThread::CancelSyncTimeoutTimer() { diff --git a/dom/xhr/XMLHttpRequestMainThread.h b/dom/xhr/XMLHttpRequestMainThread.h index b248e036640..b0cf3ced6ba 100644 --- a/dom/xhr/XMLHttpRequestMainThread.h +++ b/dom/xhr/XMLHttpRequestMainThread.h @@ -333,7 +333,7 @@ class XMLHttpRequestMainThread final : public XMLHttpRequest, void Abort() { IgnoredErrorResult rv; AbortInternal(rv); - MOZ_ASSERT(!rv.Failed()); + MOZ_ASSERT(!rv.Failed() || rv.ErrorCodeIs(NS_ERROR_DOM_ABORT_ERR)); } virtual void Abort(ErrorResult& aRv) override; @@ -409,6 +409,8 @@ class XMLHttpRequestMainThread final : public XMLHttpRequest, void SetSource(UniquePtr aSource); + nsresult ErrorDetail() const { return mErrorLoadDetail; } + virtual uint16_t ErrorCode() const override { return static_cast(mErrorLoad); } @@ -680,6 +682,7 @@ class XMLHttpRequestMainThread final : public XMLHttpRequest, nsCOMPtr mTimeoutTimer; void StartTimeoutTimer(); void HandleTimeoutCallback(); + void CancelTimeoutTimer(); nsCOMPtr mResumeTimeoutRunnable; @@ -692,6 +695,7 @@ class XMLHttpRequestMainThread final : public XMLHttpRequest, void CancelSyncTimeoutTimer(); ErrorType mErrorLoad; + nsresult mErrorLoadDetail; bool mErrorParsingXML; bool mWaitingForOnStopRequest; bool mProgressTimerIsActive; @@ -715,9 +719,9 @@ class XMLHttpRequestMainThread final : public XMLHttpRequest, /** * Close the XMLHttpRequest's channels. */ - void CloseRequest(); + void CloseRequest(nsresult detail); - void TerminateOngoingFetch(); + void TerminateOngoingFetch(nsresult detail); /** * Close the XMLHttpRequest's channels and dispatch appropriate progress diff --git a/dom/xhr/XMLHttpRequestWorker.cpp b/dom/xhr/XMLHttpRequestWorker.cpp index 5ad96c5f27b..7443da31d9c 100644 --- a/dom/xhr/XMLHttpRequestWorker.cpp +++ b/dom/xhr/XMLHttpRequestWorker.cpp @@ -43,6 +43,8 @@ #include "mozilla/UniquePtr.h" +extern mozilla::LazyLogModule gXMLHttpRequestLog; + namespace mozilla::dom { /** @@ -117,6 +119,7 @@ class Proxy final : public nsIDOMEventListener { uint64_t mLastTotal; uint64_t mLastUploadLoaded; uint64_t mLastUploadTotal; + nsresult mLastErrorDetailAtLoadend; bool mIsSyncXHR; bool mLastLengthComputable; bool mLastUploadLengthComputable; @@ -150,6 +153,7 @@ class Proxy final : public nsIDOMEventListener { mLastTotal(0), mLastUploadLoaded(0), mLastUploadTotal(0), + mLastErrorDetailAtLoadend(NS_OK), mIsSyncXHR(false), mLastLengthComputable(false), mLastUploadLengthComputable(false), @@ -450,6 +454,7 @@ class EventRunnable final : public MainThreadProxyRunnable { bool mProgressEvent; bool mLengthComputable; nsresult mStatusResult; + nsresult mErrorDetail; // mScopeObj is used in PreDispatch only. We init it in our constructor, and // reset() in PreDispatch, to ensure that it's not still linked into the // runtime once we go off-thread. @@ -471,6 +476,7 @@ class EventRunnable final : public MainThreadProxyRunnable { mProgressEvent(true), mLengthComputable(aLengthComputable), mStatusResult(NS_OK), + mErrorDetail(NS_OK), mScopeObj(RootingCx(), aScopeObj) {} EventRunnable(Proxy* aProxy, bool aUploadEvent, const nsString& aType, @@ -487,6 +493,7 @@ class EventRunnable final : public MainThreadProxyRunnable { mProgressEvent(false), mLengthComputable(0), mStatusResult(NS_OK), + mErrorDetail(NS_OK), mScopeObj(RootingCx(), aScopeObj) {} private: @@ -1047,6 +1054,8 @@ bool EventRunnable::PreDispatch(WorkerPrivate* /* unused */) { mStatus = xhr->GetStatus(rv); mStatusResult = rv.StealNSResult(); + mErrorDetail = xhr->ErrorDetail(); + xhr->GetStatusText(mStatusText, rv); MOZ_ASSERT(!rv.Failed()); @@ -1068,6 +1077,10 @@ bool EventRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) { return true; } + if (mType.EqualsASCII(sEventStrings[STRING_loadend])) { + mProxy->mLastErrorDetailAtLoadend = mErrorDetail; + } + if (mType.EqualsASCII(sEventStrings[STRING_loadstart])) { if (mUploadEvent) { mProxy->mSeenUploadLoadStart = true; @@ -1164,6 +1177,15 @@ bool EventRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate) { event->SetTrusted(true); + if (MOZ_LOG_TEST(gXMLHttpRequestLog, LogLevel::Debug)) { + nsAutoString type; + event->GetType(type); + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p firing %s event (%u,%u,%" PRIu64 ",%" PRIu64 ")", + mProxy->mXHR.get(), NS_ConvertUTF16toUTF8(type).get(), + mUploadEvent, mLengthComputable, mLoaded, mTotal)); + } + target->DispatchEvent(*event); return true; @@ -1588,6 +1610,13 @@ void XMLHttpRequestWorker::DispatchPrematureAbortEvent( event->SetTrusted(true); + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p firing %s pre-abort event (%u,%u,%" PRIu64 ",%" PRIu64, this, + NS_ConvertUTF16toUTF8(aEventType).get(), aUploadTarget, + aUploadTarget ? mProxy->mLastUploadLengthComputable + : mProxy->mLastLengthComputable, + aUploadTarget ? mProxy->mLastUploadLoaded : mProxy->mLastLoaded, + aUploadTarget ? mProxy->mLastUploadTotal : mProxy->mLastTotal)); aTarget->DispatchEvent(*event); } @@ -1688,12 +1717,39 @@ void XMLHttpRequestWorker::SendInternal(const BodyExtractorBase* aBody, bool succeeded = NS_SUCCEEDED(autoSyncLoop->Run()); mStateData->mFlagSend = false; + // Throw appropriately If a sync XHR failed per spec's RequestErrorSteps + if (isSyncXHR && mProxy) { + nsresult error = mProxy->mLastErrorDetailAtLoadend; + if (error == NS_ERROR_DOM_ABORT_ERR) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Info, + ("%p throwing NS_ERROR_DOM_ABORT_ERR", this)); + aRv.Throw(error); + return; + } + if (error == NS_ERROR_DOM_TIMEOUT_ERR) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Info, + ("%p throwing NS_ERROR_DOM_TIMEOUT_ERR", this)); + aRv.Throw(error); + return; + } + if (error == NS_ERROR_DOM_NETWORK_ERR || + NS_ERROR_GET_MODULE(error) == NS_ERROR_MODULE_NETWORK) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Info, + ("%p throwing NS_ERROR_DOM_NETWORK_ERR (0x%" PRIx32 ")", this, + static_cast(error))); + aRv.Throw(NS_ERROR_DOM_NETWORK_ERR); + return; + } + } + // Don't clobber an existing exception that we may have thrown on aRv // already... though can there really be one? In any case, it seems to me // that this autoSyncLoop->Run() can never fail, since the StopSyncLoop call // for it will come from ProxyCompleteRunnable and that always passes true for // the second arg. if (!succeeded && !aRv.Failed()) { + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p SendInternal failed; throwing NS_ERROR_FAILURE", this)); aRv.Throw(NS_ERROR_FAILURE); } } @@ -1705,6 +1761,10 @@ void XMLHttpRequestWorker::Open(const nsACString& aMethod, ErrorResult& aRv) { mWorkerPrivate->AssertIsOnWorkerThread(); + MOZ_LOG(gXMLHttpRequestLog, LogLevel::Debug, + ("%p Open(%s,%s,%d)", this, nsAutoCString(aMethod).get(), + NS_ConvertUTF16toUTF8(aUrl).get(), aAsync)); + if (mCanceled) { aRv.ThrowUncatchableException(); return; diff --git a/dom/xhr/tests/test_XHR_timeout.js b/dom/xhr/tests/test_XHR_timeout.js index e5ab627efc3..1e75c1c1748 100644 --- a/dom/xhr/tests/test_XHR_timeout.js +++ b/dom/xhr/tests/test_XHR_timeout.js @@ -96,7 +96,24 @@ RequestTracker.prototype = { }, this.resetAfter); } - req.send(null); + var gotException; + var expectTimeoutException = + !this.async && inWorker && this.timeLimit > 0 && this.timeLimit < 3000; + + try { + req.send(null); + } catch (e) { + gotException = e; + if (expectTimeoutException) { + ok(e.name == "TimeoutError", "Should be a TimeoutError"); + } + } + + if (gotException && !expectTimeoutException) { + ok(false, `expected no exception, got ${gotException}`); + } else if (!gotException && expectTimeoutException) { + ok(false, "expected timeout exception"); + } }, /** diff --git a/gfx/2d/Coord.h b/gfx/2d/Coord.h index 20d1fe36345..ce2b54fd9e0 100644 --- a/gfx/2d/Coord.h +++ b/gfx/2d/Coord.h @@ -30,27 +30,6 @@ struct IntCoordTyped; template struct CoordTyped; -// CommonType is a metafunction that returns the type of the -// result of an arithmetic operation on the underlying type of a strongly-typed -// coordinate type 'Coord', and a primitive type 'Primitive'. C++ rules for -// arithmetic conversions are designed to avoid losing information - for -// example, the result of adding an int and a float is a float - and we want -// the same behaviour when mixing our coordinate types with primitive types. -// We get C++ to compute the desired result type using 'decltype'. - -template -struct CommonType; - -template -struct CommonType, Primitive> { - using type = decltype(Rep() + Primitive()); -}; - -template -struct CommonType, Primitive> { - using type = decltype(F() + Primitive()); -}; - // This is a base class that provides mixed-type operator overloads between // a strongly-typed Coord and a Primitive value. It is needed to avoid // ambiguities at mixed-type call sites, because Coord classes are implicitly @@ -58,7 +37,7 @@ struct CommonType, Primitive> { // to strongly-typed classes, we may be able to remove some or all of these // overloads. -template +template struct CoordOperatorsHelper { // Using SFINAE (Substitution Failure Is Not An Error) to suppress redundant // operators @@ -71,19 +50,17 @@ struct CoordOperatorsHelper { friend bool operator!=(Coord aA, Primitive aB) { return aA.value != aB; } friend bool operator!=(Primitive aA, Coord aB) { return aA != aB.value; } - using result_type = typename CommonType::type; - - friend result_type operator+(Coord aA, Primitive aB) { return aA.value + aB; } - friend result_type operator+(Primitive aA, Coord aB) { return aA + aB.value; } - friend result_type operator-(Coord aA, Primitive aB) { return aA.value - aB; } - friend result_type operator-(Primitive aA, Coord aB) { return aA - aB.value; } - friend result_type operator*(Coord aCoord, Primitive aScale) { + friend auto operator+(Coord aA, Primitive aB) { return aA.value + aB; } + friend auto operator+(Primitive aA, Coord aB) { return aA + aB.value; } + friend auto operator-(Coord aA, Primitive aB) { return aA.value - aB; } + friend auto operator-(Primitive aA, Coord aB) { return aA - aB.value; } + friend auto operator*(Coord aCoord, Primitive aScale) { return aCoord.value * aScale; } - friend result_type operator*(Primitive aScale, Coord aCoord) { + friend auto operator*(Primitive aScale, Coord aCoord) { return aScale * aCoord.value; } - friend result_type operator/(Coord aCoord, Primitive aScale) { + friend auto operator/(Coord aCoord, Primitive aScale) { return aCoord.value / aScale; } // 'scale / coord' is intentionally omitted because it doesn't make sense. diff --git a/gfx/layers/apz/src/APZCTreeManager.cpp b/gfx/layers/apz/src/APZCTreeManager.cpp index 4a1075dfe30..0b3f4642ed4 100644 --- a/gfx/layers/apz/src/APZCTreeManager.cpp +++ b/gfx/layers/apz/src/APZCTreeManager.cpp @@ -449,7 +449,7 @@ void APZCTreeManager::UpdateHitTestingTree( state.mNodesToDestroy.AppendElement(aNode); }); mRootNode = nullptr; - mAsyncZoomContainerSubtree = Nothing(); + Maybe asyncZoomContainerSubtree = Nothing(); int asyncZoomContainerNestingDepth = 0; bool haveNestedAsyncZoomContainers = false; nsTArray subtreesWithRootContentOutsideAsyncZoomContainer; @@ -480,7 +480,7 @@ void APZCTreeManager::UpdateHitTestingTree( if (asyncZoomContainerNestingDepth > 0) { haveNestedAsyncZoomContainers = true; } - mAsyncZoomContainerSubtree = Some(layersId); + asyncZoomContainerSubtree = Some(layersId); ++asyncZoomContainerNestingDepth; auto it = mZoomConstraints.find( @@ -613,9 +613,9 @@ void APZCTreeManager::UpdateHitTestingTree( mApzcTreeLog << "[end]\n"; MOZ_ASSERT( - !mAsyncZoomContainerSubtree || + !asyncZoomContainerSubtree || !subtreesWithRootContentOutsideAsyncZoomContainer.Contains( - *mAsyncZoomContainerSubtree), + *asyncZoomContainerSubtree), "If there is an async zoom container, all scroll nodes with root " "content scroll metadata should be inside it"); MOZ_ASSERT(!haveNestedAsyncZoomContainers, @@ -2209,10 +2209,12 @@ void APZCTreeManager::SetupScrollbarDrag( LayerToParentLayerMatrix4x4 thumbTransform; { RecursiveMutexAutoLock lock(mTreeLock); - thumbTransform = ComputeTransformForNode(aScrollThumbNode.Get(lock)); + thumbTransform = + ComputeTransformForScrollThumbNode(aScrollThumbNode.Get(lock)); } // Only consider the translation, since we do not support both // zooming and scrollbar dragging on any platform. + // FIXME: We do now. OuterCSSCoord thumbStart = thumbData.mThumbStart + ((*thumbData.mDirection == ScrollDirection::eHorizontal) @@ -3425,106 +3427,29 @@ SideBits APZCTreeManager::SidesStuckToRootContent( return result; } -LayerToParentLayerMatrix4x4 APZCTreeManager::ComputeTransformForNode( +LayerToParentLayerMatrix4x4 APZCTreeManager::ComputeTransformForScrollThumbNode( const HitTestingTreeNode* aNode) const { mTreeLock.AssertCurrentThreadIn(); - // The async transforms applied here for hit-testing purposes, are intended - // to match the ones AsyncCompositionManager (or equivalent WebRender code) - // applies for rendering purposes. - // Note that with containerless scrolling, the layer structure looks like - // this: - // - // root container layer - // async zoom container layer - // scrollable content layers (with scroll metadata) - // fixed content layers (no scroll metadta, annotated isFixedPosition) - // scrollbar layers - // - // The intended async transforms in this case are: - // * On the async zoom container layer, the "visual" portion of the root - // content APZC's async transform (which includes the zoom, and async - // scrolling of the visual viewport relative to the layout viewport). - // * On the scrollable layers bearing the root content APZC's scroll - // metadata, the "layout" portion of the root content APZC's async - // transform (which includes async scrolling of the layout viewport - // relative to the scrollable rect origin). - if (AsyncPanZoomController* apzc = aNode->GetApzc()) { - // If the node represents scrollable content, apply the async transform - // from its APZC. - bool visualTransformIsInheritedFromAncestor = - /* we're the APZC whose visual transform might be on the async - zoom container */ - apzc->IsRootContent() && - /* there is an async zoom container on this subtree */ - mAsyncZoomContainerSubtree == Some(aNode->GetLayersId()) && - /* it's not us */ - !aNode->GetAsyncZoomContainerId(); - AsyncTransformComponents components = - visualTransformIsInheritedFromAncestor - ? AsyncTransformComponents{AsyncTransformComponent::eLayout} - : LayoutAndVisual; - return aNode->GetTransform() * - CompleteAsyncTransform(apzc->GetCurrentAsyncTransformWithOverscroll( - AsyncPanZoomController::eForHitTesting, components)); - } else if (aNode->GetAsyncZoomContainerId()) { - if (AsyncPanZoomController* rootContent = - FindRootContentApzcForLayersId(aNode->GetLayersId())) { - return aNode->GetTransform() * - CompleteAsyncTransform( - rootContent->GetCurrentAsyncTransformWithOverscroll( - AsyncPanZoomController::eForHitTesting, - {AsyncTransformComponent::eVisual})); - } - } else if (aNode->IsScrollThumbNode()) { - // If the node represents a scrollbar thumb, compute and apply the - // transformation that will be applied to the thumb in - // AsyncCompositionManager. - ScrollableLayerGuid guid{aNode->GetLayersId(), 0, - aNode->GetScrollTargetId()}; - if (RefPtr scrollTargetNode = GetTargetNode( - guid, &ScrollableLayerGuid::EqualsIgnoringPresShell)) { - AsyncPanZoomController* scrollTargetApzc = scrollTargetNode->GetApzc(); - MOZ_ASSERT(scrollTargetApzc); - return scrollTargetApzc->CallWithLastContentPaintMetrics( - [&](const FrameMetrics& aMetrics) { - return ComputeTransformForScrollThumb( - aNode->GetTransform() * AsyncTransformMatrix(), - scrollTargetNode->GetTransform().ToUnknownMatrix(), - scrollTargetApzc, aMetrics, aNode->GetScrollbarData(), - scrollTargetNode->IsAncestorOf(aNode)); - }); - } - } else if (IsFixedToRootContent(aNode)) { - ParentLayerPoint translation; - { - MutexAutoLock mapLock(mMapLock); - translation = ViewAs( - apz::ComputeFixedMarginsOffset( - GetCompositorFixedLayerMargins(mapLock), - aNode->GetFixedPosSides(), mGeckoFixedLayerMargins), - PixelCastJustification::ScreenIsParentLayerForRoot); - } - return aNode->GetTransform() * - CompleteAsyncTransform( - AsyncTransformComponentMatrix::Translation(translation)); - } - SideBits sides = SidesStuckToRootContent(aNode); - if (sides != SideBits::eNone) { - ParentLayerPoint translation; - { - MutexAutoLock mapLock(mMapLock); - translation = ViewAs( - apz::ComputeFixedMarginsOffset( - GetCompositorFixedLayerMargins(mapLock), sides, - // For sticky layers, we don't need to factor - // mGeckoFixedLayerMargins because Gecko doesn't shift the - // position of sticky elements for dynamic toolbar movements. - ScreenMargin()), - PixelCastJustification::ScreenIsParentLayerForRoot); - } - return aNode->GetTransform() * - CompleteAsyncTransform( - AsyncTransformComponentMatrix::Translation(translation)); + // The async transform applied here is for hit-testing purposes, and is + // intended to match the one we tell WebRender to apply in + // SampleForWebRender for rendering purposes. + MOZ_ASSERT(aNode->IsScrollThumbNode()); + // If the scrollable element scrolled by the thumb is layerized, compute and + // apply the transformation that will be applied to the thumb in + // AsyncCompositionManager. + ScrollableLayerGuid guid{aNode->GetLayersId(), 0, aNode->GetScrollTargetId()}; + if (RefPtr scrollTargetNode = + GetTargetNode(guid, &ScrollableLayerGuid::EqualsIgnoringPresShell)) { + AsyncPanZoomController* scrollTargetApzc = scrollTargetNode->GetApzc(); + MOZ_ASSERT(scrollTargetApzc); + return scrollTargetApzc->CallWithLastContentPaintMetrics( + [&](const FrameMetrics& aMetrics) { + return ComputeTransformForScrollThumb( + aNode->GetTransform() * AsyncTransformMatrix(), + scrollTargetNode->GetTransform().ToUnknownMatrix(), + scrollTargetApzc, aMetrics, aNode->GetScrollbarData(), + scrollTargetNode->IsAncestorOf(aNode)); + }); } // Otherwise, the node does not have an async transform. return aNode->GetTransform() * AsyncTransformMatrix(); diff --git a/gfx/layers/apz/src/APZCTreeManager.h b/gfx/layers/apz/src/APZCTreeManager.h index 65d33073fee..896d08b8165 100644 --- a/gfx/layers/apz/src/APZCTreeManager.h +++ b/gfx/layers/apz/src/APZCTreeManager.h @@ -745,10 +745,10 @@ class APZCTreeManager : public IAPZCTreeManager, public APZInputBridge { void NotifyScrollbarDragRejected(const ScrollableLayerGuid& aGuid) const; void NotifyAutoscrollRejected(const ScrollableLayerGuid& aGuid) const; - // Returns the transform that converts from |aNode|'s coordinates to - // the coordinates of |aNode|'s parent in the hit-testing tree. - // Requires the caller to hold mTreeLock. - LayerToParentLayerMatrix4x4 ComputeTransformForNode( + // Returns the transform that converts from |aNode|'s coordinates + // to the coordinates of |aNode|'s parent in the hit-testing tree. Requires + // the caller to hold mTreeLock. + LayerToParentLayerMatrix4x4 ComputeTransformForScrollThumbNode( const HitTestingTreeNode* aNode) const MOZ_REQUIRES(mTreeLock); // Look up the GeckoContentController for the given layers id. @@ -820,11 +820,6 @@ class APZCTreeManager : public IAPZCTreeManager, public APZInputBridge { std::unordered_set mDetachedLayersIds MOZ_GUARDED_BY(mTreeLock); - /* If the current hit-testing tree contains an async zoom container - * node, this is set to the layers id of subtree that has the node. - */ - Maybe mAsyncZoomContainerSubtree; - /** A lock that protects mApzcMap, mScrollThumbInfo, mRootScrollbarInfo, * mFixedPositionInfo, and mStickyPositionInfo. */ diff --git a/gfx/layers/wr/ClipManager.cpp b/gfx/layers/wr/ClipManager.cpp index d201c85411d..658c2ced2d5 100644 --- a/gfx/layers/wr/ClipManager.cpp +++ b/gfx/layers/wr/ClipManager.cpp @@ -400,6 +400,9 @@ Maybe ClipManager::DefineClipChain( // in WR, and put their IDs into |clipIds|. for (const DisplayItemClipChain* chain = aChain; chain; chain = chain->mParent) { + MOZ_DIAGNOSTIC_ASSERT(chain->mOnStack || !chain->mASR || + chain->mASR->mScrollableFrame); + if (!chain->mClip.HasClip()) { // This item in the chain is a no-op, skip over it continue; diff --git a/ipc/glue/SharedMemoryBasic.h b/ipc/glue/SharedMemoryBasic.h index 13026be8b24..2f07ae4402c 100644 --- a/ipc/glue/SharedMemoryBasic.h +++ b/ipc/glue/SharedMemoryBasic.h @@ -7,9 +7,7 @@ #ifndef mozilla_ipc_SharedMemoryBasic_h #define mozilla_ipc_SharedMemoryBasic_h -#ifdef ANDROID -# include "mozilla/ipc/SharedMemoryBasic_android.h" -#elif defined(XP_DARWIN) +#ifdef XP_DARWIN # include "mozilla/ipc/SharedMemoryBasic_mach.h" #else # include "mozilla/ipc/SharedMemoryBasic_chromium.h" diff --git a/ipc/glue/SharedMemoryBasic_android.cpp b/ipc/glue/SharedMemoryBasic_android.cpp deleted file mode 100644 index 5c8279da6d7..00000000000 --- a/ipc/glue/SharedMemoryBasic_android.cpp +++ /dev/null @@ -1,132 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* 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/. */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "base/process_util.h" - -#include "SharedMemoryBasic.h" - -#include "mozilla/Ashmem.h" - -namespace mozilla { -namespace ipc { - -static void LogError(const char* what) { - __android_log_print(ANDROID_LOG_ERROR, "Gecko", "%s: %s (%d)", what, - strerror(errno), errno); -} - -SharedMemoryBasic::SharedMemoryBasic() - : mShmFd(-1), mMemory(nullptr), mOpenRights(RightsReadWrite) {} - -SharedMemoryBasic::~SharedMemoryBasic() { - Unmap(); - CloseHandle(); -} - -bool SharedMemoryBasic::SetHandle(Handle aHandle, OpenRights aRights) { - MOZ_ASSERT(-1 == mShmFd, "Already Create()d"); - mShmFd = aHandle.release(); - mOpenRights = aRights; - return true; -} - -bool SharedMemoryBasic::Create(size_t aNbytes) { - MOZ_ASSERT(-1 == mShmFd, "Already Create()d"); - - // Carve a new instance off of /dev/ashmem - int shmfd = mozilla::android::ashmem_create(nullptr, aNbytes); - if (-1 == shmfd) { - LogError("ShmemAndroid::Create():open"); - return false; - } - - mShmFd = shmfd; - Created(aNbytes); - return true; -} - -bool SharedMemoryBasic::Map(size_t nBytes, void* fixed_address) { - MOZ_ASSERT(nullptr == mMemory, "Already Map()d"); - - int prot = PROT_READ; - if (mOpenRights == RightsReadWrite) { - prot |= PROT_WRITE; - } - - // Don't use MAP_FIXED when a fixed_address was specified, since that can - // replace pages that are alread mapped at that address. - mMemory = mmap(fixed_address, nBytes, prot, MAP_SHARED, mShmFd, 0); - - if (MAP_FAILED == mMemory) { - if (!fixed_address) { - LogError("ShmemAndroid::Map()"); - } - mMemory = nullptr; - return false; - } - - if (fixed_address && mMemory != fixed_address) { - if (munmap(mMemory, nBytes)) { - LogError("ShmemAndroid::Map():unmap"); - mMemory = nullptr; - return false; - } - } - - Mapped(nBytes); - return true; -} - -void* SharedMemoryBasic::FindFreeAddressSpace(size_t size) { - void* memory = - mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); - munmap(memory, size); - return memory != (void*)-1 ? memory : NULL; -} - -auto SharedMemoryBasic::CloneHandle() -> Handle { - MOZ_ASSERT(mShmFd >= 0, "Should have been Create()d by now"); - - int shmfdDup = dup(mShmFd); - if (-1 == shmfdDup) { - LogError("ShmemAndroid::CloneHandle()"); - return nullptr; - } - - return mozilla::UniqueFileHandle(shmfdDup); -} - -void SharedMemoryBasic::Unmap() { - if (!mMemory) { - return; - } - - if (munmap(mMemory, Size())) { - LogError("ShmemAndroid::Unmap()"); - } - mMemory = nullptr; -} - -void SharedMemoryBasic::CloseHandle() { - if (mShmFd != -1) { - close(mShmFd); - mShmFd = -1; - mOpenRights = RightsReadWrite; - } -} - -} // namespace ipc -} // namespace mozilla diff --git a/ipc/glue/SharedMemoryBasic_android.h b/ipc/glue/SharedMemoryBasic_android.h deleted file mode 100644 index 0b9114e2aef..00000000000 --- a/ipc/glue/SharedMemoryBasic_android.h +++ /dev/null @@ -1,72 +0,0 @@ -/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ -/* vim: set ts=8 sts=2 et sw=2 tw=80: */ -/* 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/. */ - -#ifndef mozilla_ipc_SharedMemoryBasic_android_h -#define mozilla_ipc_SharedMemoryBasic_android_h - -#include "mozilla/ipc/SharedMemory.h" -#include "mozilla/UniquePtrExtensions.h" - -#ifdef FUZZING -# include "mozilla/ipc/SharedMemoryFuzzer.h" -#endif - -// -// This is a low-level wrapper around platform shared memory. Don't -// use it directly; use Shmem allocated through IPDL interfaces. -// - -namespace mozilla { -namespace ipc { - -class SharedMemoryBasic final - : public SharedMemoryCommon { - public: - SharedMemoryBasic(); - - virtual bool SetHandle(Handle aHandle, OpenRights aRights) override; - - virtual bool Create(size_t aNbytes) override; - - virtual bool Map(size_t nBytes, void* fixed_address = nullptr) override; - - virtual void Unmap() override; - - virtual void CloseHandle() override; - - virtual void* memory() const override { -#ifdef FUZZING - return SharedMemoryFuzzer::MutateSharedMemory(mMemory, mAllocSize); -#else - return mMemory; -#endif - } - - static Handle NULLHandle() { return Handle(); } - - static void* FindFreeAddressSpace(size_t aSize); - - virtual bool IsHandleValid(const Handle& aHandle) const override { - return aHandle != nullptr; - } - - virtual Handle CloneHandle() override; - - private: - ~SharedMemoryBasic(); - - // The /dev/ashmem fd we allocate. - int mShmFd; - // Pointer to mapped region, null if unmapped. - void* mMemory; - // Access rights to map an existing region with. - OpenRights mOpenRights; -}; - -} // namespace ipc -} // namespace mozilla - -#endif // ifndef mozilla_ipc_SharedMemoryBasic_android_h diff --git a/ipc/glue/moz.build b/ipc/glue/moz.build index 49f5c00e750..868bc5d83b0 100644 --- a/ipc/glue/moz.build +++ b/ipc/glue/moz.build @@ -114,15 +114,7 @@ else: "CrossProcessSemaphore_unimplemented.cpp", ] -# Android has its own, -# almost-but-not-quite-compatible-with-POSIX-or-/dev/shm shared memory -# impl. -if CONFIG["OS_TARGET"] == "Android": - EXPORTS.mozilla.ipc += ["SharedMemoryBasic_android.h"] - UNIFIED_SOURCES += [ - "SharedMemoryBasic_android.cpp", - ] -elif CONFIG["OS_ARCH"] == "Darwin": +if CONFIG["OS_ARCH"] == "Darwin": EXPORTS.mozilla.ipc += ["SharedMemoryBasic_mach.h"] SOURCES += [ "SharedMemoryBasic_mach.mm", diff --git a/ipc/glue/test/browser/browser.ini b/ipc/glue/test/browser/browser.ini index 9d5e257123a..00cb64e0545 100644 --- a/ipc/glue/test/browser/browser.ini +++ b/ipc/glue/test/browser/browser.ini @@ -24,6 +24,11 @@ support-files = ../../../../dom/media/test/small-shot.mp3 ../../../../dom/media/test/small-shot.m4a ../../../../dom/media/test/small-shot.flac +[browser_audio_telemetry_utility_EME.js] +support-files = + head-telemetry.js + ../../../../dom/media/test/eme_standalone.js + ../../../../dom/media/test/short-aac-encrypted-audio.mp4 [browser_utility_audioDecodeCrash.js] support-files = ../../../../dom/media/test/small-shot.ogg diff --git a/ipc/glue/test/browser/browser_audio_telemetry_utility_EME.js b/ipc/glue/test/browser/browser_audio_telemetry_utility_EME.js new file mode 100644 index 00000000000..8ed6db6cee7 --- /dev/null +++ b/ipc/glue/test/browser/browser_audio_telemetry_utility_EME.js @@ -0,0 +1,30 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/* import-globals-from head-telemetry.js */ + +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/ipc/glue/test/browser/head-telemetry.js", + this +); + +SimpleTest.requestCompleteLog(); + +add_setup(async function testNoTelemetry() { + await Telemetry.clearScalars(); +}); + +add_task(async function testAudioDecodingInUtility() { + await runTestWithEME(); +}); + +add_task(async function testUtilityTelemetry() { + const platform = Services.appinfo.OS; + for (let exp of utilityPerCodecs[platform]) { + if (exp.codecs.includes("aac")) { + await verifyTelemetryForProcess(exp.process, ["aac"], ""); + } + } +}); diff --git a/ipc/glue/test/browser/head-telemetry.js b/ipc/glue/test/browser/head-telemetry.js index 4ab5a408802..0c777e083a3 100644 --- a/ipc/glue/test/browser/head-telemetry.js +++ b/ipc/glue/test/browser/head-telemetry.js @@ -136,6 +136,48 @@ async function runTest({ } } +async function runTestWithEME() { + info(`Running tests with decoding from Utility for EME`); + + await SpecialPowers.pushPrefEnv({ + set: [ + ["media.utility-process.enabled", true], + ["toolkit.telemetry.ipcBatchTimeout", 0], + ], + }); + + const platform = Services.appinfo.OS; + + for (let { src, expectations } of audioTestDataEME()) { + if (!(platform in expectations)) { + info(`Skipping ${src} for ${platform}`); + continue; + } + + const expectation = expectations[platform]; + + info(`Add EME media tab`); + let tab = await addMediaTabWithEME(src.sourceBuffer, src.audioFile); + + info("Play tab"); + await play( + tab, + expectation.process, + expectation.decoder, + false, // expectContent + false, // expectJava + false, // expectError + true // withEME + ); + + info("Stop tab"); + await stop(tab); + + info("Remove tab"); + await BrowserTestUtils.removeTab(tab); + } +} + function getTelemetry() { const telemetry = Telemetry.getSnapshotForKeyedScalars("main", false).content; return telemetry; diff --git a/ipc/glue/test/browser/head.js b/ipc/glue/test/browser/head.js index 1f470bbbc3a..3b4f6361c17 100644 --- a/ipc/glue/test/browser/head.js +++ b/ipc/glue/test/browser/head.js @@ -191,6 +191,32 @@ function audioTestData() { ]; } +function audioTestDataEME() { + return [ + { + src: { + audioFile: + "https://example.com/browser/ipc/glue/test/browser/short-aac-encrypted-audio.mp4", + sourceBuffer: "audio/mp4", + }, + expectations: { + Linux: { + process: "Utility Generic", + decoder: "ffmpeg audio decoder", + }, + WINNT: { + process: "Utility WMF", + decoder: "wmf audio decoder", + }, + Darwin: { + process: "Utility AppleMedia", + decoder: "apple coremedia decoder", + }, + }, + }, + ]; +} + async function addMediaTab(src) { const tab = BrowserTestUtils.addTab(gBrowser, "about:blank", { forceNewProcess: true, @@ -201,18 +227,44 @@ async function addMediaTab(src) { return tab; } +async function addMediaTabWithEME(sourceBuffer, audioFile) { + const tab = BrowserTestUtils.addTab( + gBrowser, + "https://example.com/browser/", + { + forceNewProcess: true, + } + ); + const browser = gBrowser.getBrowserForTab(tab); + await BrowserTestUtils.browserLoaded(browser); + await SpecialPowers.spawn( + browser, + [sourceBuffer, audioFile], + createAudioElementEME + ); + return tab; +} + async function play( tab, expectUtility, expectDecoder, expectContent = false, expectJava = false, - expectError = false + expectError = false, + withEME = false ) { let browser = tab.linkedBrowser; return SpecialPowers.spawn( browser, - [expectUtility, expectDecoder, expectContent, expectJava, expectError], + [ + expectUtility, + expectDecoder, + expectContent, + expectJava, + expectError, + withEME, + ], checkAudioDecoder ); } @@ -235,12 +287,51 @@ async function createAudioElement(src) { doc.body.appendChild(audio); } +async function createAudioElementEME(sourceBuffer, audioFile) { + // Helper to clone data into content so the EME helper can use the data. + function cloneIntoContent(data) { + return Cu.cloneInto(data, content.wrappedJSObject); + } + + // Load the EME helper into content. + Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/ipc/glue/test/browser/eme_standalone.js", + content + ); + + let audio = content.document.createElement("audio"); + audio.setAttribute("controls", "true"); + audio.setAttribute("loop", true); + audio.setAttribute("_sourceBufferType", sourceBuffer); + audio.setAttribute("_audioUrl", audioFile); + content.document.body.appendChild(audio); + + let emeHelper = new content.wrappedJSObject.EmeHelper(); + emeHelper.SetKeySystem( + content.wrappedJSObject.EmeHelper.GetClearkeyKeySystemString() + ); + emeHelper.SetInitDataTypes(cloneIntoContent(["keyids", "cenc"])); + emeHelper.SetAudioCapabilities( + cloneIntoContent([{ contentType: 'audio/mp4; codecs="mp4a.40.2"' }]) + ); + emeHelper.AddKeyIdAndKey( + "2cdb0ed6119853e7850671c3e9906c3c", + "808B9ADAC384DE1E4F56140F4AD76194" + ); + emeHelper.onerror = error => { + is(false, `Got unexpected error from EME helper: ${error}`); + }; + await emeHelper.ConfigureEme(audio); + // Done setting up EME. +} + async function checkAudioDecoder( expectedProcess, expectedDecoder, expectContent = false, expectJava = false, - expectError = false + expectError = false, + withEME = false ) { const doc = typeof content !== "undefined" ? content.document : document; let audio = doc.querySelector("audio"); @@ -311,9 +402,31 @@ async function checkAudioDecoder( }); }); - // We need to make sure the decoder is ready before play()ing otherwise we - // could get into bad situations - audio.load(); + if (!withEME) { + // We need to make sure the decoder is ready before play()ing otherwise we + // could get into bad situations + audio.load(); + } else { + // For EME we need to create and load content ourselves. We do this here + // because if we do it in createAudioElementEME() above then we end up + // with events fired before we get a chance to listen to them here + async function once(target, name) { + return new Promise(r => target.addEventListener(name, r, { once: true })); + } + + // Setup MSE. + const ms = new content.wrappedJSObject.MediaSource(); + audio.src = content.wrappedJSObject.URL.createObjectURL(ms); + await once(ms, "sourceopen"); + const sb = ms.addSourceBuffer(audio.getAttribute("_sourceBufferType")); + let fetchResponse = await content.fetch(audio.getAttribute("_audioUrl")); + let dataBuffer = await fetchResponse.arrayBuffer(); + sb.appendBuffer(dataBuffer); + await once(sb, "updateend"); + ms.endOfStream(); + await once(ms, "sourceended"); + } + return checkPromise; } diff --git a/js/public/friend/ErrorNumbers.msg b/js/public/friend/ErrorNumbers.msg index 49925b5a815..6a6262dadcb 100644 --- a/js/public/friend/ErrorNumbers.msg +++ b/js/public/friend/ErrorNumbers.msg @@ -81,8 +81,9 @@ MSG_DEF(JSMSG_BAD_WEAKMAP_KEY, 0, JSEXN_TYPEERR, "cannot use the given o MSG_DEF(JSMSG_BAD_GETTER_OR_SETTER, 1, JSEXN_TYPEERR, "invalid {0} usage") MSG_DEF(JSMSG_BAD_ARRAY_LENGTH, 0, JSEXN_RANGEERR, "invalid array length") MSG_DEF(JSMSG_SOURCE_ARRAY_TOO_LONG, 0, JSEXN_RANGEERR, "source array is too long") -MSG_DEF(JSMSG_REDECLARED_PREV, 2, JSEXN_NOTE, "Previously declared at line {0}, column {1}") +MSG_DEF(JSMSG_PREV_DECLARATION, 2, JSEXN_NOTE, "Previously declared at line {0}, column {1}") MSG_DEF(JSMSG_REDECLARED_VAR, 2, JSEXN_SYNTAXERR, "redeclaration of {0} {1}") +MSG_DEF(JSMSG_MISMATCHED_PLACEMENT, 2, JSEXN_SYNTAXERR, "getter and setter for {0} {1} should either be both static or non-static") MSG_DEF(JSMSG_UNDECLARED_VAR, 1, JSEXN_REFERENCEERR, "assignment to undeclared variable {0}") MSG_DEF(JSMSG_GET_MISSING_PRIVATE, 0, JSEXN_TYPEERR, "can't access private field or method: object is not the right class") MSG_DEF(JSMSG_SET_MISSING_PRIVATE, 0, JSEXN_TYPEERR, "can't set private field: object is not the right class") diff --git a/js/src/builtin/Iterator.js b/js/src/builtin/Iterator.js index 518e4542b4c..36136b3a0a8 100644 --- a/js/src/builtin/Iterator.js +++ b/js/src/builtin/Iterator.js @@ -111,14 +111,19 @@ function GetIterator(obj, isAsync, method) { } /** - * GetIteratorFlattenable ( obj ) + * GetIteratorFlattenable ( obj, stringHandling ) * * https://tc39.es/proposal-iterator-helpers/#sec-getiteratorflattenable */ -function GetIteratorFlattenable(obj) { +function GetIteratorFlattenable(obj, rejectStrings) { + assert(typeof rejectStrings === "boolean", "rejectStrings is a boolean"); + // Step 1. if (!IsObject(obj)) { - ThrowTypeError(JSMSG_OBJECT_REQUIRED, obj === null ? "null" : typeof obj); + // Step 1.a. + if (rejectStrings || typeof obj !== "string") { + ThrowTypeError(JSMSG_OBJECT_REQUIRED, obj === null ? "null" : typeof obj); + } } // Step 2. @@ -147,16 +152,11 @@ function GetIteratorFlattenable(obj) { * https://tc39.es/proposal-iterator-helpers/#sec-iterator.from */ function IteratorFrom(O) { - // Step 1. - if (typeof O === "string") { - O = ToObject(O); - } - - // Step 2. (Inlined call to GetIteratorDirect.) - var iterator = GetIteratorFlattenable(O); + // Step 1. (Inlined call to GetIteratorDirect.) + var iterator = GetIteratorFlattenable(O, /* rejectStrings= */ false); var nextMethod = iterator.next; - // Step 3. + // Step 2. // // Calls |isPrototypeOf| instead of |instanceof| to avoid looking up the // `@@hasInstance` property. @@ -166,15 +166,15 @@ function IteratorFrom(O) { iterator ); - // Step 4. + // Step 3. if (hasInstance) { return iterator; } - // Step 5. + // Step 4. var wrapper = NewWrapForValidIterator(); - // Step 6. + // Step 5. UnsafeSetReservedSlot( wrapper, WRAP_FOR_VALID_ITERATOR_ITERATOR_SLOT, @@ -186,7 +186,7 @@ function IteratorFrom(O) { nextMethod ); - // Step 7. + // Step 6. return wrapper; } @@ -721,7 +721,7 @@ function* IteratorFlatMapGenerator(iterator, nextMethod, mapper) { // Step 5.b.v. (Implicit through for-of loop) // Steps 5.b.vi. - var innerIterator = GetIteratorFlattenable(mapped); + var innerIterator = GetIteratorFlattenable(mapped, /* rejectStrings= */ true); var innerIteratorNextMethod = innerIterator.next; // Step 5.b.vii. (Implicit through for-of loop) diff --git a/js/src/frontend/Parser.cpp b/js/src/frontend/Parser.cpp index ee620527639..a9eca285b19 100644 --- a/js/src/frontend/Parser.cpp +++ b/js/src/frontend/Parser.cpp @@ -498,9 +498,10 @@ void GeneralParser::reportMissingClosing( } template -void GeneralParser::reportRedeclaration( - TaggedParserAtomIndex name, DeclarationKind prevKind, TokenPos pos, - uint32_t prevPos) { +void GeneralParser::reportRedeclarationHelper( + TaggedParserAtomIndex& name, DeclarationKind& prevKind, TokenPos& pos, + uint32_t& prevPos, const unsigned& errorNumber, + const unsigned& noteErrorNumber) { UniqueChars bytes = this->parserAtoms().toPrintableString(name); if (!bytes) { ReportOutOfMemory(this->fc_); @@ -508,7 +509,7 @@ void GeneralParser::reportRedeclaration( } if (prevPos == DeclaredNameInfo::npos) { - errorAt(pos.begin, JSMSG_REDECLARED_VAR, DeclarationKindString(prevKind), + errorAt(pos.begin, errorNumber, DeclarationKindString(prevKind), bytes.get()); return; } @@ -529,15 +530,31 @@ void GeneralParser::reportRedeclaration( SprintfLiteral(lineNumber, "%" PRIu32, line); if (!notes->addNoteASCII(this->fc_, getFilename().c_str(), 0, line, column, - GetErrorMessage, nullptr, JSMSG_REDECLARED_PREV, + GetErrorMessage, nullptr, noteErrorNumber, lineNumber, columnNumber)) { return; } - errorWithNotesAt(std::move(notes), pos.begin, JSMSG_REDECLARED_VAR, + errorWithNotesAt(std::move(notes), pos.begin, errorNumber, DeclarationKindString(prevKind), bytes.get()); } +template +void GeneralParser::reportRedeclaration( + TaggedParserAtomIndex name, DeclarationKind prevKind, TokenPos pos, + uint32_t prevPos) { + reportRedeclarationHelper(name, prevKind, pos, prevPos, JSMSG_REDECLARED_VAR, + JSMSG_PREV_DECLARATION); +} + +template +void GeneralParser::reportMismatchedPlacement( + TaggedParserAtomIndex name, DeclarationKind prevKind, TokenPos pos, + uint32_t prevPos) { + reportRedeclarationHelper(name, prevKind, pos, prevPos, + JSMSG_MISMATCHED_PLACEMENT, JSMSG_PREV_DECLARATION); +} + // notePositionalFormalParameter is called for both the arguments of a regular // function definition and the arguments specified by the Function // constructor. @@ -861,7 +878,7 @@ bool GeneralParser::noteDeclaredPrivateName( } } - reportRedeclaration(name, p->value()->kind(), pos, p->value()->pos()); + reportMismatchedPlacement(name, p->value()->kind(), pos, p->value()->pos()); return false; } diff --git a/js/src/frontend/Parser.h b/js/src/frontend/Parser.h index 2a1290222c7..7de0eeb8993 100644 --- a/js/src/frontend/Parser.h +++ b/js/src/frontend/Parser.h @@ -1376,8 +1376,18 @@ class MOZ_STACK_CLASS GeneralParser : public PerHandlerParser { void reportMissingClosing(unsigned errorNumber, unsigned noteNumber, uint32_t openedPos); + void reportRedeclarationHelper(TaggedParserAtomIndex& name, + DeclarationKind& prevKind, TokenPos& pos, + uint32_t& prevPos, const unsigned& errorNumber, + const unsigned& noteErrorNumber); + void reportRedeclaration(TaggedParserAtomIndex name, DeclarationKind prevKind, TokenPos pos, uint32_t prevPos); + + void reportMismatchedPlacement(TaggedParserAtomIndex name, + DeclarationKind prevKind, TokenPos pos, + uint32_t prevPos); + bool notePositionalFormalParameter(FunctionNodeType funNode, TaggedParserAtomIndex name, uint32_t beginPos, diff --git a/js/src/jit-test/tests/wasm/features.js b/js/src/jit-test/tests/wasm/features.js index f6b21ff7b65..3520ecef5d3 100644 --- a/js/src/jit-test/tests/wasm/features.js +++ b/js/src/jit-test/tests/wasm/features.js @@ -1,4 +1,4 @@ -// |jit-test| test-also=--wasm-extended-const; test-also=--wasm-exceptions; test-also=--wasm-function-references; test-also=--wasm-gc +// |jit-test| test-also=--wasm-extended-const; test-also=--wasm-exceptions; // Test that if a feature is 'experimental' then we must be in a nightly build, // and if a feature is 'released' then it must be enabled on release and beta. diff --git a/js/src/tests/jstests.list b/js/src/tests/jstests.list index 39a01b2a0cb..2434ba16bf3 100644 --- a/js/src/tests/jstests.list +++ b/js/src/tests/jstests.list @@ -1033,6 +1033,198 @@ skip script test262/built-ins/Temporal/ZonedDateTime/prototype/epochMilliseconds skip script test262/built-ins/Temporal/ZonedDateTime/prototype/epochMicroseconds/basic.js skip script test262/built-ins/Temporal/ZonedDateTime/prototype/epochSeconds/basic.js +# https://github.com/tc39/proposal-temporal/issues/2532 +# https://github.com/tc39/test262/pull/3858 +skip script test262/built-ins/Temporal/PlainMonthDay/from/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/from/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/from/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/equals/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/equals/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/equals/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/with/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/with/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainMonthDay/prototype/with/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/from/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/from/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/from/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/compare/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/compare/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/compare/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/equals/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/equals/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/equals/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/since/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/since/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/since/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/with/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/with/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/with/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/until/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/until/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/ZonedDateTime/prototype/until/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/from/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/from/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/from/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/compare/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/compare/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/compare/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/equals/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/equals/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/equals/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/since/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/since/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/since/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/with/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/with/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/with/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/until/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/until/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDate/prototype/until/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/compare/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/compare/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/compare/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/round/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/round/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/round/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/add/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/add/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/add/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/subtract/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/subtract/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/subtract/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/total/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/total/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Duration/prototype/total/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/from/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/from/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/from/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/compare/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/compare/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/compare/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/equals/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/equals/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/equals/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/since/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/since/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/since/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/with/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/with/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/with/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/until/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/until/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainDateTime/prototype/until/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/from/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/from/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/from/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/compare/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/compare/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/compare/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/equals/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/equals/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/equals/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/add/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/add/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/add/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/since/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/since/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/since/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/with/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/with/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/with/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/until/constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/until/duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/PlainYearMonth/prototype/until/proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/day/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/day/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/day/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/year/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/year/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/year/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/month/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/month/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/month/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-proto-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-duplicate-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-constructor-in-calendar-fields.js +skip script test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-proto-in-calendar-fields.js + ############################################## # Temporal Intl tests # @@ -1282,6 +1474,12 @@ skip script test262/intl402/Temporal/Calendar/prototype/eraYear/argument-string- skip script test262/intl402/Temporal/Calendar/prototype/era/argument-string-multiple-calendar.js skip script test262/intl402/Temporal/Calendar/prototype/dateUntil/until-across-lunisolar-leap-months.js skip script test262/intl402/Temporal/Calendar/prototype/dateUntil/zero-length-duration-result.js +skip script test262/intl402/Temporal/Calendar/prototype/eraYear/argument-duplicate-calendar-fields.js +skip script test262/intl402/Temporal/Calendar/prototype/eraYear/argument-constructor-in-calendar-fields.js +skip script test262/intl402/Temporal/Calendar/prototype/eraYear/argument-proto-in-calendar-fields.js +skip script test262/intl402/Temporal/Calendar/prototype/era/argument-duplicate-calendar-fields.js +skip script test262/intl402/Temporal/Calendar/prototype/era/argument-constructor-in-calendar-fields.js +skip script test262/intl402/Temporal/Calendar/prototype/era/argument-proto-in-calendar-fields.js skip script test262/staging/Temporal/ZonedDateTime/old/construction-and-properties.js skip script test262/staging/Intl402/Temporal/old/date-time-format.js diff --git a/js/src/tests/non262/regress/regress-1707974.js b/js/src/tests/non262/regress/regress-1707974.js new file mode 100644 index 00000000000..ce4d3d8aee5 --- /dev/null +++ b/js/src/tests/non262/regress/regress-1707974.js @@ -0,0 +1,30 @@ +/* -*- 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/. */ + +const BUGNUMBER = 1707974; +const SUMMARY = "Test mismatched placement error"; + +printBugNumber(BUGNUMBER); +printStatus(SUMMARY); + +let actual = ""; +const expect = "SyntaxError: getter and setter for private name #x \ +should either be both static or non-static"; + +try +{ + eval(` + class A { + static set #x(_) {} + get #x() {} + } + `); +} +catch(ex) +{ + actual = ex + ""; +} + +reportCompare(expect, actual, SUMMARY); diff --git a/js/src/tests/test262/GIT-INFO b/js/src/tests/test262/GIT-INFO index c738a3d4f98..bf03797f634 100644 --- a/js/src/tests/test262/GIT-INFO +++ b/js/src/tests/test262/GIT-INFO @@ -1,5 +1,23 @@ -commit 8ce9864511c1c83ba2d0b351da3390c9e33fd60e -Author: André Bargull -Date: Thu Jun 29 16:56:28 2023 +0200 +commit 016e4bf8e84c36d1653c6bd53e74c93580d8b1ff +Author: Guillaume Emont +Date: Mon Jul 17 16:55:34 2023 +0200 - Add copy of transfer/transferToFixedLength tests with resizable-arraybuffer features removed + Temporal Issue 2532 (#3858) + + * Add tests for the new PrepareTemporalFields behavior for all direct callers + + See https://github.com/tc39/proposal-temporal/pull/2570 + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToTemporalDate + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToTemporalDateTime + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToTemporalZonedDateTime + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToTemporalYearMonth + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToTemporalMonthDay + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through ToRelativeTemporalObject + + * Add tests for the new PrepareTemporalFields behavior for indirect callers through AddDurationToOrSubtractDurationFromPlainYearMonth diff --git a/js/src/tests/test262/built-ins/Array/fromAsync/shell.js b/js/src/tests/test262/built-ins/Array/fromAsync/shell.js index 8491e803caa..c8f95705917 100644 --- a/js/src/tests/test262/built-ins/Array/fromAsync/shell.js +++ b/js/src/tests/test262/built-ins/Array/fromAsync/shell.js @@ -171,6 +171,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1455,6 +1475,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1899,8 +1938,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/built-ins/Iterator/from/iterable-primitives.js b/js/src/tests/test262/built-ins/Iterator/from/iterable-primitives.js index 779235b7afb..e441136b914 100644 --- a/js/src/tests/test262/built-ins/Iterator/from/iterable-primitives.js +++ b/js/src/tests/test262/built-ins/Iterator/from/iterable-primitives.js @@ -39,4 +39,18 @@ assert.compareArray(Array.from(Iterator.from(new Number(5))), [0, 1, 2, 3, 4]); assert.compareArray(Array.from(Iterator.from('string')), ['s', 't', 'r', 'i', 'n', 'g']); +const originalStringIterator = String.prototype[Symbol.iterator]; +let observedType; +Object.defineProperty(String.prototype, Symbol.iterator, { + get() { + 'use strict'; + observedType = typeof this; + return originalStringIterator; + } +}); +Iterator.from(''); +assert.sameValue(observedType, 'string'); +Iterator.from(new String('')); +assert.sameValue(observedType, 'object'); + reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Iterator/from/supports-iterable.js b/js/src/tests/test262/built-ins/Iterator/from/supports-iterable.js index f0848b63900..06cfa66537e 100644 --- a/js/src/tests/test262/built-ins/Iterator/from/supports-iterable.js +++ b/js/src/tests/test262/built-ins/Iterator/from/supports-iterable.js @@ -13,5 +13,6 @@ features: [iterator-helpers] flags: [] ---*/ assert.compareArray(Array.from(Iterator.from([0, 1, 2, 3])), [0, 1, 2, 3]); +assert.compareArray(Array.from(Iterator.from(new String('str'))), ['s', 't', 'r']); reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..897312501c1 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateadd +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration())); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..1ad3bc81418 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateadd +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration())); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..4e497488231 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateAdd/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateadd +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dateAdd(arg, new Temporal.Duration())); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..1f24241be62 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateuntil +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19))); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..5becde2c5a5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateuntil +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19))); + assert.throws(RangeError, () => instance.dateUntil(new Temporal.PlainDate(1977, 11, 19), arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..34e8f2c28c5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dateUntil/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dateuntil +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dateUntil(arg, new Temporal.PlainDate(1977, 11, 19))); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..9ba373f078c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.day +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.day(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..4a285f17fe1 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.day +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.day(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..eaf3311ebab --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/day/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.day +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.day(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..7839fb6454b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofweek +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dayOfWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..d492982e7fa --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofweek +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.dayOfWeek(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..efcd36bb134 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfWeek/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofweek +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dayOfWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..559093bf44b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofyear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dayOfYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..c8c47a64544 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofyear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.dayOfYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..829564e665d --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/dayOfYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.dayofyear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.dayOfYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..50db14415b2 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinmonth +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInMonth(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..d183b4ee697 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinmonth +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.daysInMonth(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..54de92486e9 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInMonth/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinmonth +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInMonth(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..8952ae023fb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinweek +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..c36efdc0a97 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinweek +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.daysInWeek(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..cda32b22e94 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInWeek/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinweek +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..f47b077c13d --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinyear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..86004672964 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinyear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.daysInYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..19af1a4da4e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/daysInYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.daysinyear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.daysInYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..767c8ba1b2f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.inleapyear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.inLeapYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..30586d5b8eb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.inleapyear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.inLeapYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..c4b97957a50 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/inLeapYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.inleapyear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.inLeapYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..b42eb7eedbb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.month +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.month(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..6c9458de2bb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.month +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.month(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..f81d9391a4f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/month/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.month +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.month(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..d79f7442146 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthcode +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.monthCode(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..a2693c60709 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthcode +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.monthCode(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..ce95efc5daa --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthCode/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthcode +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.monthCode(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..2fca9d4da22 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthsinyear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.monthsInYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..f6da9031af6 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthsinyear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.monthsInYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..0ee2a148c32 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/monthsInYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.monthsinyear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.monthsInYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..24b26e1281c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.weekofyear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.weekOfYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..cc1de124c39 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.weekofyear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.weekOfYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..d0ef9a8fd84 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/weekOfYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.weekofyear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.weekOfYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..cbf629b522a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.year +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.year(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..d9ef7646541 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.year +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.year(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..9f3120fdcd8 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/year/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.year +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.year(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ce63ac519f3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.yearofweek +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.yearOfWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..d564d1f73fa --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.yearofweek +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.yearOfWeek(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..48e0ff8e188 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Calendar/prototype/yearOfWeek/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.yearofweek +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.yearOfWeek(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/compare/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/compare/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..a6fa93b44af --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/compare/constructor-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.compare +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const duration1 = new Temporal.Duration(1); +const duration2 = new Temporal.Duration(0, 12); + +assert.throws(RangeError, () => Temporal.Duration.compare(duration1, duration2, {relativeTo: relativeTo})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/compare/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/compare/duplicate-calendar-fields.js new file mode 100644 index 00000000000..a54ae06f868 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/compare/duplicate-calendar-fields.js @@ -0,0 +1,21 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.compare +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; + const duration1 = new Temporal.Duration(1); + const duration2 = new Temporal.Duration(0, 12); + + assert.throws(RangeError, () => Temporal.Duration.compare(duration1, duration2, {relativeTo: relativeTo})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/compare/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/compare/proto-in-calendar-fields.js new file mode 100644 index 00000000000..7b7201144f4 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/compare/proto-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.compare +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const duration1 = new Temporal.Duration(1); +const duration2 = new Temporal.Duration(0, 12); + +assert.throws(RangeError, () => Temporal.Duration.compare(duration1, duration2, {relativeTo: relativeTo})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..9006e385f9c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.add +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 1); + +assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/duplicate-calendar-fields.js new file mode 100644 index 00000000000..b382a81332b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.add +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; + const instance = new Temporal.Duration(1, 0, 0, 1); + + assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo })); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/proto-in-calendar-fields.js new file mode 100644 index 00000000000..ace6c5df23c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/add/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.add +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 1); + +assert.throws(RangeError, () => instance.add(new Temporal.Duration(0, 0, 0, 0, -24), { relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..46f7ebdd181 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.round +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 0, 24); + +assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/duplicate-calendar-fields.js new file mode 100644 index 00000000000..b8eb4afffcc --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.round +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; + const instance = new Temporal.Duration(1, 0, 0, 0, 24); + + assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo })); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/proto-in-calendar-fields.js new file mode 100644 index 00000000000..5fd58bd3d1a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/round/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.round +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 0, 24); + +assert.throws(RangeError, () => instance.round({ largestUnit: "years", relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..464996155af --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.subtract +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 1); + +assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/duplicate-calendar-fields.js new file mode 100644 index 00000000000..a5bad8a4d3e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.subtract +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; + const instance = new Temporal.Duration(1, 0, 0, 1); + + assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo })); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/proto-in-calendar-fields.js new file mode 100644 index 00000000000..15e34c9622a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/subtract/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.subtract +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 1); + +assert.throws(RangeError, () => instance.subtract(new Temporal.Duration(0, 0, 0, 0, 24), { relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..4caf54a64c3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.total +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 0, 24); + +assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/duplicate-calendar-fields.js new file mode 100644 index 00000000000..516d4f56e83 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.total +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; + const instance = new Temporal.Duration(1, 0, 0, 0, 24); + + assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo })); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/proto-in-calendar-fields.js new file mode 100644 index 00000000000..b40b2d4b306 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/Duration/prototype/total/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.duration.prototype.total +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const relativeTo = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: 'Europe/Paris' }; +const instance = new Temporal.Duration(1, 0, 0, 0, 24); + +assert.throws(RangeError, () => instance.total({ unit: "days", relativeTo })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..d7f5b984791 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.compare +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18))); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..2898cce8e0f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.compare +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18))); + assert.throws(RangeError, () => Temporal.PlainDate.compare(new Temporal.PlainDate(1976, 11, 18), arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..70463984e94 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/compare/argument-proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.compare +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDate.compare(arg, new Temporal.PlainDate(1976, 11, 18))); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..a3e0d96bf86 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.from +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDate.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..bf3482afbaa --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.from +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainDate.from(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..19253021b22 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/from/argument-proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.from +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDate.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..190426203f2 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.equals +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..d233f813910 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.equals +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDate(2000, 5, 2); + + assert.throws(RangeError, () => instance.equals(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..5bc1294f59d --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/equals/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.equals +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..08aa6aebf83 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.since +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..366ef14b08b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.since +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDate(2000, 5, 2); + + assert.throws(RangeError, () => instance.since(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..21dd6f91da4 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/since/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.since +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..1151eadc13a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/duplicate-calendar-fields.js new file mode 100644 index 00000000000..34678718506 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainmonthday +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const date = new Temporal.PlainDate(2023, 5, 1, calendar); + + assert.throws(RangeError, () => date.toPlainMonthDay()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/proto-in-calendar-fields.js new file mode 100644 index 00000000000..d77d73bef1b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainMonthDay/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..25e3db25539 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/duplicate-calendar-fields.js new file mode 100644 index 00000000000..31e21202a1b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainyearmonth +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const date = new Temporal.PlainDate(2023, 5, 1, calendar); + + assert.throws(RangeError, () => date.toPlainYearMonth()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/proto-in-calendar-fields.js new file mode 100644 index 00000000000..91397b7c518 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/toPlainYearMonth/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..11d0874d9fb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.until +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..ef00260ae30 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.until +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDate(2000, 5, 2); + + assert.throws(RangeError, () => instance.until(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..01c0f901aa6 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/until/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.until +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDate(2000, 5, 2); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ec53ff16a7f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.with +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.with({day: 15})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/duplicate-calendar-fields.js new file mode 100644 index 00000000000..8e1628294db --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.with +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day'], ['month'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const date = new Temporal.PlainDate(2023, 5, 1, calendar); + + assert.throws(RangeError, () => date.with({day: 15})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/proto-in-calendar-fields.js new file mode 100644 index 00000000000..68eef30019b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDate/prototype/with/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindate.prototype.with +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const date = new Temporal.PlainDate(2023, 5, 1, calendar); + +assert.throws(RangeError, () => date.with({day: 15})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..a296792257a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.compare +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18))); +assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/duplicate-calendar-fields.js new file mode 100644 index 00000000000..7f573ce4d98 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.compare +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18))); + assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/proto-in-calendar-fields.js new file mode 100644 index 00000000000..694e3f29282 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/compare/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.compare +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDateTime.compare(arg, new Temporal.PlainDateTime(1976, 11, 18))); +assert.throws(RangeError, () => Temporal.PlainDateTime.compare(new Temporal.PlainDateTime(1976, 11, 18), arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..4df5ca8f0da --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.from +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/duplicate-calendar-fields.js new file mode 100644 index 00000000000..8ad203ebea9 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.from +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/proto-in-calendar-fields.js new file mode 100644 index 00000000000..43930f216f5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/from/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.from +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainDateTime.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..3a444f60021 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.equals +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/duplicate-calendar-fields.js new file mode 100644 index 00000000000..f8900be8ce1 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.equals +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.equals(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/proto-in-calendar-fields.js new file mode 100644 index 00000000000..fd3064caed9 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/equals/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.equals +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..051d7f7fced --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.since +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/duplicate-calendar-fields.js new file mode 100644 index 00000000000..5a714170e6b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.since +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.since(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/proto-in-calendar-fields.js new file mode 100644 index 00000000000..4c82a08a7ab --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/since/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.since +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..24fa34c241c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js new file mode 100644 index 00000000000..f0c50f32295 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + + assert.throws(RangeError, () => datetime.toPlainMonthDay()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js new file mode 100644 index 00000000000..482bbf5603a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ae3cdb87c09 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js new file mode 100644 index 00000000000..55446f83eb5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + + assert.throws(RangeError, () => datetime.toPlainYearMonth()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js new file mode 100644 index 00000000000..fb38edd6f29 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..648b1afd9bb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.until +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/duplicate-calendar-fields.js new file mode 100644 index 00000000000..3beced06e98 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.until +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.until(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/proto-in-calendar-fields.js new file mode 100644 index 00000000000..dd01f8a68b3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/until/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.until +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..35f27a64bfa --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.with +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.with({hour: 12})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/duplicate-calendar-fields.js new file mode 100644 index 00000000000..5be05fd288e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.with +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + + assert.throws(RangeError, () => datetime.with({hour: 12})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/proto-in-calendar-fields.js new file mode 100644 index 00000000000..6bfd62f345b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/with/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.with +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const datetime = new Temporal.PlainDateTime(2023, 5, 1, 0, 0, 0, 0, 0, 0, calendar); + +assert.throws(RangeError, () => datetime.with({hour: 12})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..7db65ba3b4a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.withplaindate +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.withPlainDate(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..094d3b1764f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.withplaindate +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.withPlainDate(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..8753275d774 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaindatetime.prototype.withplaindate +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainDateTime(2000, 5, 2, 12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.withPlainDate(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..5f47f9111f6 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.from +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/duplicate-calendar-fields.js new file mode 100644 index 00000000000..d12829d43c2 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.from +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/proto-in-calendar-fields.js new file mode 100644 index 00000000000..31281e1772a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/from/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.from +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainMonthDay.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..762ba80f788 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.equals +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainMonthDay(5, 2, calendar); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/duplicate-calendar-fields.js new file mode 100644 index 00000000000..dd58ceb4c54 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.equals +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainMonthDay(5, 2, calendar); + + assert.throws(RangeError, () => instance.equals(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/proto-in-calendar-fields.js new file mode 100644 index 00000000000..6530f40ac10 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/equals/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.equals +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainMonthDay(5, 2, calendar); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ba5d3dc36f5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.toplaindate +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const md = new Temporal.PlainMonthDay(5, 1, calendar); + +assert.throws(RangeError, () => md.toPlainDate({year: 2023})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/duplicate-calendar-fields.js new file mode 100644 index 00000000000..b37b1f1936e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.toplaindate +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const md = new Temporal.PlainMonthDay(5, 1, calendar); + + assert.throws(RangeError, () => md.toPlainDate({year: 2023})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/proto-in-calendar-fields.js new file mode 100644 index 00000000000..061303fea0b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/toPlainDate/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.toplaindate +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const md = new Temporal.PlainMonthDay(5, 1, calendar); + +assert.throws(RangeError, () => md.toPlainDate({year: 2023})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..6d56671ddea --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.with +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const md = new Temporal.PlainMonthDay(5, 1, calendar); + +assert.throws(RangeError, () => md.with({day: 15})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/duplicate-calendar-fields.js new file mode 100644 index 00000000000..566b0133087 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.with +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day'], ['month'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const md = new Temporal.PlainMonthDay(5, 1, calendar); + + assert.throws(RangeError, () => md.with({day: 15})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/proto-in-calendar-fields.js new file mode 100644 index 00000000000..805706edb67 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainMonthDay/prototype/with/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainmonthday.prototype.with +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const md = new Temporal.PlainMonthDay(5, 1, calendar); + +assert.throws(RangeError, () => md.with({day: 15})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ba733a7bd9e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.toplaindatetime +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.toPlainDateTime(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..671a32ba833 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.toplaindatetime +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.toPlainDateTime(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..fd70a10ff52 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toPlainDateTime/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.toplaindatetime +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.toPlainDateTime(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..df8e557c956 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.tozoneddatetime +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..c6b11b1c5e7 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.tozoneddatetime +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + + assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" })); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..ace48b7cb07 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainTime/prototype/toZonedDateTime/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plaintime.prototype.tozoneddatetime +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainTime(12, 34, 56, 987, 654, 321); + +assert.throws(RangeError, () => instance.toZonedDateTime({ plainDate: arg, timeZone: "UTC" })); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..ae2f23fafbb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.compare +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6))); +assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/duplicate-calendar-fields.js new file mode 100644 index 00000000000..ae032c2fefe --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.compare +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6))); + assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/proto-in-calendar-fields.js new file mode 100644 index 00000000000..d7757e3a18c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/compare/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.compare +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(arg, new Temporal.PlainYearMonth(2019, 6))); +assert.throws(RangeError, () => Temporal.PlainYearMonth.compare(new Temporal.PlainYearMonth(2019, 6), arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..83c2be28c80 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.from +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/duplicate-calendar-fields.js new file mode 100644 index 00000000000..066993f13a6 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.from +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + + assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/proto-in-calendar-fields.js new file mode 100644 index 00000000000..eedf95b18b4 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/from/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.from +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; + +assert.throws(RangeError, () => Temporal.PlainYearMonth.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..f92a8712071 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.add +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.add({days: 123})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/duplicate-calendar-fields.js new file mode 100644 index 00000000000..8c26670fdc8 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.add +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + + assert.throws(RangeError, () => ym.add({days: 123})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/proto-in-calendar-fields.js new file mode 100644 index 00000000000..de323c12149 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/add/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.add +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.add({days: 123})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..a86af5a09d2 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.equals +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/duplicate-calendar-fields.js new file mode 100644 index 00000000000..028b5de48ef --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.equals +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + + assert.throws(RangeError, () => instance.equals(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/proto-in-calendar-fields.js new file mode 100644 index 00000000000..cf77b12b869 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/equals/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.equals +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..7bb6258ee73 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.since +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/duplicate-calendar-fields.js new file mode 100644 index 00000000000..54cb1ae3022 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.since +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + + assert.throws(RangeError, () => instance.since(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/proto-in-calendar-fields.js new file mode 100644 index 00000000000..9a2d96724b3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/since/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.since +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..5ee587243a6 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.subtract +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.subtract({days: 123})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/duplicate-calendar-fields.js new file mode 100644 index 00000000000..9a56dc9ee7e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.subtract +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + + assert.throws(RangeError, () => ym.subtract({days: 123})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/proto-in-calendar-fields.js new file mode 100644 index 00000000000..5660520393d --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/subtract/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.subtract +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.subtract({days: 123})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..0bf6ede55d5 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.toplaindate +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.toPlainDate({day: 1})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/duplicate-calendar-fields.js new file mode 100644 index 00000000000..13243c741fc --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.toplaindate +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year'], ['day']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + + assert.throws(RangeError, () => ym.toPlainDate({day: 1})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/proto-in-calendar-fields.js new file mode 100644 index 00000000000..cd560586d2b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/toPlainDate/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.toplaindate +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.toPlainDate({day: 1})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..85e8b201030 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.until +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/duplicate-calendar-fields.js new file mode 100644 index 00000000000..5d3fafbaf76 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.until +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + + assert.throws(RangeError, () => instance.until(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/proto-in-calendar-fields.js new file mode 100644 index 00000000000..cebfe1a96b7 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/until/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.until +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.PlainYearMonth(2000, 5, calendar); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..11b0ae41f6a --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.with +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.with({month: 1})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/duplicate-calendar-fields.js new file mode 100644 index 00000000000..4b11d1d7374 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.with +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['month'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + + assert.throws(RangeError, () => ym.with({month: 1})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/proto-in-calendar-fields.js new file mode 100644 index 00000000000..b24f66a0f0c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/PlainYearMonth/prototype/with/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.plainyearmonth.prototype.with +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const ym = new Temporal.PlainYearMonth(2023, 5, calendar); + +assert.throws(RangeError, () => ym.with({month: 1})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..0404044e4d3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getinstantfor +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.TimeZone("UTC"); + +assert.throws(RangeError, () => instance.getInstantFor(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/duplicate-calendar-fields.js new file mode 100644 index 00000000000..b6a8d452a88 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getinstantfor +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.TimeZone("UTC"); + + assert.throws(RangeError, () => instance.getInstantFor(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/proto-in-calendar-fields.js new file mode 100644 index 00000000000..e9dfd7a26fd --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getInstantFor/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getinstantfor +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.TimeZone("UTC"); + +assert.throws(RangeError, () => instance.getInstantFor(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..245f90b2269 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getpossibleinstantsfor +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.TimeZone("UTC"); + +assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/duplicate-calendar-fields.js new file mode 100644 index 00000000000..30d79e324c3 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getpossibleinstantsfor +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.TimeZone("UTC"); + + assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/proto-in-calendar-fields.js new file mode 100644 index 00000000000..09aeb655a29 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/TimeZone/prototype/getPossibleInstantsFor/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.timezone.prototype.getpossibleinstantsfor +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.TimeZone("UTC"); + +assert.throws(RangeError, () => instance.getPossibleInstantsFor(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..15661422e1b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/constructor-in-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.compare +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const datetime = Temporal.ZonedDateTime.from({ year: 2023, month: 5, monthCode: 'M05', day: 15, timeZone: 'Europe/Paris' }); + +assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime)); +assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/duplicate-calendar-fields.js new file mode 100644 index 00000000000..ca8e7ba69b7 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/duplicate-calendar-fields.js @@ -0,0 +1,22 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.compare +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year'], ['timeZone'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const timeZone = 'Europe/Paris' + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + const datetime = Temporal.ZonedDateTime.from({year: 2023, month: 5, monthCode: 'M05', day: 15, timeZone: 'Europe/Paris'}); + + assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime)); + assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/proto-in-calendar-fields.js new file mode 100644 index 00000000000..b0d2d1427df --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/compare/proto-in-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.compare +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const datetime = Temporal.ZonedDateTime.from({ year: 2023, month: 5, monthCode: 'M05', day: 15, timeZone: 'Europe/Paris' }); + +assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(arg, datetime)); +assert.throws(RangeError, () => Temporal.ZonedDateTime.compare(datetime, arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..a4b9393817b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.from +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + +assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/duplicate-calendar-fields.js new file mode 100644 index 00000000000..a849d5c07dd --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.from +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year'], ['timeZone'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const timeZone = 'Europe/Paris' + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + + assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/proto-in-calendar-fields.js new file mode 100644 index 00000000000..f05165d2abb --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/from/proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.from +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + +assert.throws(RangeError, () => Temporal.ZonedDateTime.from(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..6dc6ba7ff57 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/constructor-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.equals +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/duplicate-calendar-fields.js new file mode 100644 index 00000000000..f21747aacf1 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.equals +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year'], ['timeZone'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const timeZone = 'Europe/Paris' + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + const instance = new Temporal.ZonedDateTime(0n, timeZone); + + assert.throws(RangeError, () => instance.equals(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/proto-in-calendar-fields.js new file mode 100644 index 00000000000..6d6adb89c46 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/equals/proto-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.equals +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.equals(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..38fbbcdbae8 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/constructor-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.since +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/duplicate-calendar-fields.js new file mode 100644 index 00000000000..9c308ecd5c7 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.since +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year'], ['timeZone'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const timeZone = 'Europe/Paris' + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + const instance = new Temporal.ZonedDateTime(0n, timeZone); + + assert.throws(RangeError, () => instance.since(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/proto-in-calendar-fields.js new file mode 100644 index 00000000000..2347de2c3f4 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/since/proto-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.since +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.since(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..eb95558c12c --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js new file mode 100644 index 00000000000..10110794a35 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + + assert.throws(RangeError, () => zoneddatetime.toPlainMonthDay()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js new file mode 100644 index 00000000000..37da40afa83 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainMonthDay/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainmonthday +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.toPlainMonthDay()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..5d6e709f1e2 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js new file mode 100644 index 00000000000..0314561a112 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + + assert.throws(RangeError, () => zoneddatetime.toPlainYearMonth()); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js new file mode 100644 index 00000000000..55c00cc95fd --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/toPlainYearMonth/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.toplainyearmonth +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.toPlainYearMonth()); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..22d5780862e --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/constructor-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.until +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/duplicate-calendar-fields.js new file mode 100644 index 00000000000..d0f6eb0bf20 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/duplicate-calendar-fields.js @@ -0,0 +1,20 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.until +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['monthCode'], ['nanosecond'], ['second'], ['year'], ['timeZone'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const timeZone = 'Europe/Paris' + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; + const instance = new Temporal.ZonedDateTime(0n, timeZone); + + assert.throws(RangeError, () => instance.until(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/proto-in-calendar-fields.js new file mode 100644 index 00000000000..969bbcb955b --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/until/proto-in-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.until +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const timeZone = 'Europe/Paris' +const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar, timeZone: timeZone }; +const instance = new Temporal.ZonedDateTime(0n, timeZone); + +assert.throws(RangeError, () => instance.until(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/constructor-in-calendar-fields.js new file mode 100644 index 00000000000..640cd8d6891 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/constructor-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.with +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.with({hour: 12})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/duplicate-calendar-fields.js new file mode 100644 index 00000000000..bcf2046f1ca --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/duplicate-calendar-fields.js @@ -0,0 +1,18 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.with +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['monthCode'], ['day'], ['hour'], ['microsecond'], ['millisecond'], ['minute'], ['month'], ['nanosecond'], ['second'], ['year'], ['offset']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + + assert.throws(RangeError, () => zoneddatetime.with({hour: 12})); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/proto-in-calendar-fields.js new file mode 100644 index 00000000000..e7eca2b1368 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/with/proto-in-calendar-fields.js @@ -0,0 +1,16 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.with +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const zoneddatetime = new Temporal.ZonedDateTime(1682892000000000000n, 'Europe/Madrid', calendar); + +assert.throws(RangeError, () => zoneddatetime.with({hour: 12})); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..cc96585bc9f --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.withplaindate +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + +assert.throws(RangeError, () => instance.withPlainDate(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..4ef2d3ba447 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.withplaindate +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + + assert.throws(RangeError, () => instance.withPlainDate(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..89ee626a0c4 --- /dev/null +++ b/js/src/tests/test262/built-ins/Temporal/ZonedDateTime/prototype/withPlainDate/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.zoneddatetime.prototype.withplaindate +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.ZonedDateTime(1_000_000_000_000_000_000n, "UTC"); + +assert.throws(RangeError, () => instance.withPlainDate(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/built-ins/Temporal/shell.js b/js/src/tests/test262/built-ins/Temporal/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/built-ins/Temporal/shell.js +++ b/js/src/tests/test262/built-ins/Temporal/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/harness/shell.js b/js/src/tests/test262/harness/shell.js index a9b3c6183a6..46d018eacd1 100644 --- a/js/src/tests/test262/harness/shell.js +++ b/js/src/tests/test262/harness/shell.js @@ -1462,6 +1462,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -2746,6 +2766,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -3190,8 +3229,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-default-en.js b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-default-en.js index c79483054ba..220407cd19b 100644 --- a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-default-en.js +++ b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-default-en.js @@ -53,15 +53,15 @@ const expected = [ { type: "literal", value: ", " }, { type: "integer", value: "123", unit: "millisecond" }, { type: "literal", value: " ", unit: "millisecond" }, - { type: "unit", value: "msec", unit: "millisecond" }, + { type: "unit", value: "ms", unit: "millisecond" }, { type: "literal", value: ", " }, { type: "integer", value: "456", unit: "microsecond" }, { type: "literal", value: " ", unit: "microsecond" }, - { type: "unit", value: "μsec", unit: "microsecond" }, - { type: "literal", value: " and " }, + { type: "unit", value: "μs", unit: "microsecond" }, + { type: "literal", value: ", " }, { type: "integer", value: "789", unit: "nanosecond" }, { type: "literal", value: " ", unit: "nanosecond" }, - { type: "unit", value: "nsec", unit: "nanosecond" }, + { type: "unit", value: "ns", unit: "nanosecond" }, ]; let df = new Intl.DurationFormat('en'); diff --git a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-long-en.js b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-long-en.js index fc720ccda72..e6d3ee48260 100644 --- a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-long-en.js +++ b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-long-en.js @@ -59,7 +59,7 @@ const expected = [ { type: "integer", value: "456", unit: "microsecond" }, { type: "literal", value: " ", unit: "microsecond" }, { type: "unit", value: "microseconds", unit: "microsecond" }, - { type: "literal", value: " and " }, + { type: "literal", value: ", " }, { type: "integer", value: "789", unit: "nanosecond" }, { type: "literal", value: " ", unit: "nanosecond" }, { type: "unit", value: "nanoseconds", unit: "nanosecond" }, diff --git a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-short-en.js b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-short-en.js index a0b039f1c5d..f87264b60b2 100644 --- a/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-short-en.js +++ b/js/src/tests/test262/intl402/DurationFormat/prototype/formatToParts/formatToParts-style-short-en.js @@ -54,15 +54,15 @@ const expected = [ { type: "literal", value: ", " }, { type: "integer", value: "123", unit: "millisecond" }, { type: "literal", value: " ", unit: "millisecond" }, - { type: "unit", value: "msec", unit: "millisecond" }, + { type: "unit", value: "ms", unit: "millisecond" }, { type: "literal", value: ", " }, { type: "integer", value: "456", unit: "microsecond" }, { type: "literal", value: " ", unit: "microsecond" }, - { type: "unit", value: "μsec", unit: "microsecond" }, - { type: "literal", value: " and " }, + { type: "unit", value: "μs", unit: "microsecond" }, + { type: "literal", value: ", " }, { type: "integer", value: "789", unit: "nanosecond" }, { type: "literal", value: " ", unit: "nanosecond" }, - { type: "unit", value: "nsec", unit: "nanosecond" }, + { type: "unit", value: "ns", unit: "nanosecond" }, ]; let df = new Intl.DurationFormat('en', { style }); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateAdd/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateAdd/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateAdd/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateAdd/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateFromFields/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateFromFields/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateFromFields/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateFromFields/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateUntil/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateUntil/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateUntil/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dateUntil/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/day/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/day/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/day/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/day/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfWeek/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfWeek/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfWeek/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfWeek/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/dayOfYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInMonth/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInMonth/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInMonth/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInMonth/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInWeek/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInWeek/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInWeek/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInWeek/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/daysInYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..66df73d80e5 --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.era +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.era(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-duplicate-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..39f2c7a7573 --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.era +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.era(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-proto-in-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..69c004192b1 --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.era +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.era(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/shell.js index e933632ead5..4a6ac2ae3c9 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/era/shell.js @@ -82,6 +82,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1366,6 +1386,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1810,8 +1849,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-constructor-in-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-constructor-in-calendar-fields.js new file mode 100644 index 00000000000..525d21d4fc3 --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-constructor-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.erayear +description: If a calendar's fields() method returns a field named 'constructor', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['constructor']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.eraYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-duplicate-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-duplicate-calendar-fields.js new file mode 100644 index 00000000000..243fb8de8ab --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-duplicate-calendar-fields.js @@ -0,0 +1,19 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.erayear +description: If a calendar's fields() method returns duplicate field names, PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +for (const extra_fields of [['foo', 'foo'], ['day'], ['month'], ['monthCode'], ['year']]) { + const calendar = TemporalHelpers.calendarWithExtraFields(extra_fields); + const arg = { year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar }; + const instance = new Temporal.Calendar("iso8601"); + + assert.throws(RangeError, () => instance.eraYear(arg)); +} + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-proto-in-calendar-fields.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-proto-in-calendar-fields.js new file mode 100644 index 00000000000..a664730c598 --- /dev/null +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/argument-proto-in-calendar-fields.js @@ -0,0 +1,17 @@ +// |reftest| skip-if(!this.hasOwnProperty('Temporal')) -- Temporal is not enabled unconditionally +// Copyright (C) 2023 Igalia, S.L. All rights reserved. +// This code is governed by the BSD license found in the LICENSE file. +/*--- +esid: sec-temporal.calendar.prototype.erayear +description: If a calendar's fields() method returns a field named '__proto__', PrepareTemporalFields should throw a RangeError. +includes: [temporalHelpers.js] +features: [Temporal] +---*/ + +const calendar = TemporalHelpers.calendarWithExtraFields(['__proto__']); +const arg = {year: 2023, month: 5, monthCode: 'M05', day: 1, calendar: calendar}; +const instance = new Temporal.Calendar("iso8601"); + +assert.throws(RangeError, () => instance.eraYear(arg)); + +reportCompare(0, 0); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/shell.js index e933632ead5..4a6ac2ae3c9 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/eraYear/shell.js @@ -82,6 +82,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1366,6 +1386,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1810,8 +1849,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/inLeapYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/inLeapYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/inLeapYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/inLeapYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/month/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/month/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/month/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/month/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthCode/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthCode/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthCode/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthCode/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthDayFromFields/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthDayFromFields/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthDayFromFields/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthDayFromFields/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthsInYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthsInYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthsInYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/monthsInYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/weekOfYear/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/weekOfYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/weekOfYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/weekOfYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/year/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/year/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/year/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/year/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearMonthFromFields/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearMonthFromFields/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearMonthFromFields/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearMonthFromFields/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearOfWeek/shell.js b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearOfWeek/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearOfWeek/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Calendar/prototype/yearOfWeek/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Duration/prototype/add/shell.js b/js/src/tests/test262/intl402/Temporal/Duration/prototype/add/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Duration/prototype/add/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Duration/prototype/add/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Duration/prototype/round/shell.js b/js/src/tests/test262/intl402/Temporal/Duration/prototype/round/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Duration/prototype/round/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Duration/prototype/round/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Duration/prototype/subtract/shell.js b/js/src/tests/test262/intl402/Temporal/Duration/prototype/subtract/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Duration/prototype/subtract/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Duration/prototype/subtract/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/Duration/prototype/total/shell.js b/js/src/tests/test262/intl402/Temporal/Duration/prototype/total/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/Duration/prototype/total/shell.js +++ b/js/src/tests/test262/intl402/Temporal/Duration/prototype/total/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDate/compare/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDate/compare/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDate/compare/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDate/compare/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDate/from/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDate/from/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDate/from/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDate/from/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/equals/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/equals/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/equals/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/equals/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/since/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/since/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/since/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/since/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/until/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/until/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/until/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDate/prototype/until/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/compare/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/compare/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/compare/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/compare/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/from/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/from/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/from/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/from/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/equals/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/equals/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/equals/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/equals/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/since/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/since/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/since/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/since/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/until/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/until/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/until/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/until/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/withPlainDate/shell.js b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/withPlainDate/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/withPlainDate/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainDateTime/prototype/withPlainDate/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/from/shell.js b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/from/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/from/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/from/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/equals/shell.js b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/equals/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/equals/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/equals/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/toPlainDate/shell.js b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/toPlainDate/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/toPlainDate/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainMonthDay/prototype/toPlainDate/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toPlainDateTime/shell.js b/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toPlainDateTime/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toPlainDateTime/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toPlainDateTime/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toZonedDateTime/shell.js b/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toZonedDateTime/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toZonedDateTime/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainTime/prototype/toZonedDateTime/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/compare/shell.js b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/compare/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/compare/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/compare/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/from/shell.js b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/from/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/from/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/from/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/equals/shell.js b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/equals/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/equals/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/equals/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/since/shell.js b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/since/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/since/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/since/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/until/shell.js b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/until/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/until/shell.js +++ b/js/src/tests/test262/intl402/Temporal/PlainYearMonth/prototype/until/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getInstantFor/shell.js b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getInstantFor/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getInstantFor/shell.js +++ b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getInstantFor/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPlainDateTimeFor/shell.js b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPlainDateTimeFor/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPlainDateTimeFor/shell.js +++ b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPlainDateTimeFor/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPossibleInstantsFor/shell.js b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPossibleInstantsFor/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPossibleInstantsFor/shell.js +++ b/js/src/tests/test262/intl402/Temporal/TimeZone/prototype/getPossibleInstantsFor/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/compare/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/compare/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/compare/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/compare/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/from/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/from/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/from/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/from/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/equals/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/equals/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/equals/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/equals/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/era/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/era/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/era/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/era/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/eraYear/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/eraYear/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/eraYear/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/eraYear/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/since/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/since/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/since/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/since/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/until/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/until/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/until/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/until/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/withPlainDate/shell.js b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/withPlainDate/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/withPlainDate/shell.js +++ b/js/src/tests/test262/intl402/Temporal/ZonedDateTime/prototype/withPlainDate/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/jstests.list b/js/src/tests/test262/jstests.list index 710c93a8fc8..16ca45ed540 100644 --- a/js/src/tests/test262/jstests.list +++ b/js/src/tests/test262/jstests.list @@ -28,4 +28,4 @@ test262-raw error:SyntaxError script language/directive-prologue/10.1.1-5gs.js test262-raw error:SyntaxError script language/directive-prologue/10.1.1-8gs.js test262-raw error:SyntaxError script language/directive-prologue/14.1-4gs.js test262-raw error:SyntaxError script language/directive-prologue/14.1-5gs.js -shell-option(--enable-import-assertions) test262-raw skip-if(!xulRuntime.shell) module script language/module-code/eval-gtbndng-indirect-faux-assertion.js # requires shell-options +shell-option(--enable-import-assertions) test262-raw skip-if(!xulRuntime.shell) module script language/module-code/import-assertions/eval-gtbndng-indirect-faux-assertion.js # requires shell-options diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-enumeration-abrupt.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-enumeration-abrupt.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-enumeration-abrupt.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-enumeration-abrupt.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-enumeration.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-enumeration.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-enumeration.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-enumeration.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-non-object.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-non-object.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-non-object.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-non-object.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-undefined.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-undefined.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-undefined.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-undefined.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-value-abrupt.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-value-abrupt.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-value-abrupt.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-value-abrupt.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-value-non-string.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-value-non-string.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-assert-value-non-string.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-assert-value-non-string.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-await-expr.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-await-expr.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-await-expr.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-await-expr.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-await-ident.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-await-ident.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-await-ident.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-await-ident.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-abrupt-return.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-abrupt-return.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-abrupt-return.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-abrupt-return.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-abrupt-throw.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-abrupt-throw.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-abrupt-throw.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-abrupt-throw.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-sequence.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-sequence.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-evaluation-sequence.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-evaluation-sequence.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-get-assert-error.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-get-assert-error.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-get-assert-error.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-get-assert-error.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-in.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-in.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-in.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-in.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-non-object.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-non-object.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-non-object.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-non-object.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-trailing-comma-fulfill.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-trailing-comma-fulfill.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-trailing-comma-fulfill.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-trailing-comma-fulfill.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-trailing-comma-reject.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-trailing-comma-reject.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-trailing-comma-reject.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-trailing-comma-reject.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-expr.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-expr.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-expr.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-expr.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-ident-invalid-strict.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-ident-invalid-strict.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-ident-invalid-strict.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-ident-invalid-strict.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-ident-valid.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-ident-valid.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param-yield-ident-valid.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param-yield-ident-valid.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/2nd-param_FIXTURE.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param_FIXTURE.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/2nd-param_FIXTURE.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/2nd-param_FIXTURE.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/browser.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/browser.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/shell.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/shell.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/language/expressions/dynamic-import/trailing-comma-fulfill.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/trailing-comma-fulfill.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/trailing-comma-fulfill.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/trailing-comma-fulfill.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/trailing-comma-reject.js b/js/src/tests/test262/language/expressions/dynamic-import/import-assertions/trailing-comma-reject.js similarity index 100% rename from js/src/tests/test262/language/expressions/dynamic-import/trailing-comma-reject.js rename to js/src/tests/test262/language/expressions/dynamic-import/import-assertions/trailing-comma-reject.js diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-first.js index 6aa87b12359..9f4b9da1e42 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-arrow-assignment-expression.template /*--- description: ImportCall trailing comma following first parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-second.js index 49ddd3e6de3..639c6ee7899 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-assignment-expression-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-arrow-assignment-expression.template /*--- description: ImportCall trailing comma following second parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-first.js index 6ed1b9c1e83..c29e891b2af 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-arrow.template /*--- description: ImportCall trailing comma following first parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-second.js index ea41180592c..b8dfde0a510 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-arrow-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-arrow.template /*--- description: ImportCall trailing comma following second parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-first.js index d51912b4e3a..0ef3ea1a17b 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-arrow-fn-await.template /*--- description: ImportCall trailing comma following first parameter (nested in async arrow function) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-second.js index 7b70999dfc9..33d631a25a9 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-await-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-arrow-fn-await.template /*--- description: ImportCall trailing comma following second parameter (nested in async arrow function) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-first.js index 22b5fd62a8a..3ddac112e66 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-arrow-fn-return-await.template /*--- description: ImportCall trailing comma following first parameter (nested in async arrow function, returned) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-second.js index 1164ca46e7e..a75425cdf49 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-arrow-function-return-await-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-arrow-fn-return-await.template /*--- description: ImportCall trailing comma following second parameter (nested in async arrow function, returned) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-first.js index 41440e69621..bc6d8536958 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-function-await.template /*--- description: ImportCall trailing comma following first parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-second.js index c58cb2952c4..da2e80ef0cf 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-await-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-function-await.template /*--- description: ImportCall trailing comma following second parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-first.js index 37325936605..ebeb2cb744f 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-function.template /*--- description: ImportCall trailing comma following first parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-second.js index 1acd264d06e..18ad6993bfe 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-function.template /*--- description: ImportCall trailing comma following second parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-first.js index ad276bd0857..e1a6c11203a 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-function-return-await.template /*--- description: ImportCall trailing comma following first parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-second.js index dd26fd129c6..9f42ad9a234 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-function-return-await-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-function-return-await.template /*--- description: ImportCall trailing comma following second parameter (nested arrow syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-first.js index d86d04c5d9b..1a1de33d8e5 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-async-generator-await.template /*--- description: ImportCall trailing comma following first parameter (nested in async generator, awaited) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-second.js index ec6eb93b1a4..9f977bff90d 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-async-gen-await-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-async-generator-await.template /*--- description: ImportCall trailing comma following second parameter (nested in async generator, awaited) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-first.js index a443d538c68..28fa4544a2d 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-block.template /*--- description: ImportCall trailing comma following first parameter (nested block syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-second.js index da466f8b135..e097031cf14 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-block.template /*--- description: ImportCall trailing comma following second parameter (nested block syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-first.js index 115943b6525..a0be4f8f45b 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-block-labeled.template /*--- description: ImportCall trailing comma following first parameter (nested block syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-second.js index a503fd00f90..38e1ed8cde6 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-block-labeled-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-block-labeled.template /*--- description: ImportCall trailing comma following second parameter (nested block syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-first.js index 7b4127cd3de..da97f1aff1b 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-do-while.template /*--- description: ImportCall trailing comma following first parameter (nested do while syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-second.js index f3d13c309bf..5affd6218e5 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-do-while-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-do-while.template /*--- description: ImportCall trailing comma following second parameter (nested do while syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-first.js index 0330fec8fcc..4fcd241943b 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-else-braceless.template /*--- description: ImportCall trailing comma following first parameter (nested else syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-second.js index 1bcb94ff3a6..9bdea8900dc 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-braceless-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-else-braceless.template /*--- description: ImportCall trailing comma following second parameter (nested else syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-first.js index ec1dcb26e8d..aa0e2e085c5 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-else.template /*--- description: ImportCall trailing comma following first parameter (nested else syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-second.js index 224f98e20a2..0e341f4d793 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-else-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-else.template /*--- description: ImportCall trailing comma following second parameter (nested else syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-first.js index 08d8eba3686..71d1cf4ef73 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-function.template /*--- description: ImportCall trailing comma following first parameter (nested function syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-second.js index 9ad65d74d66..c2a6af71cc4 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-function.template /*--- description: ImportCall trailing comma following second parameter (nested function syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-first.js index c3a1d279d10..d397d7ac6fa 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-function-return.template /*--- description: ImportCall trailing comma following first parameter (nested function syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-second.js index 6c70d251310..858a2248be8 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-function-return-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-function-return.template /*--- description: ImportCall trailing comma following second parameter (nested function syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-first.js index 0f44a2376ce..91848a71830 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-if-braceless.template /*--- description: ImportCall trailing comma following first parameter (nested if syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-second.js index 350531f3571..b53c5c9db71 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-braceless-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-if-braceless.template /*--- description: ImportCall trailing comma following second parameter (nested if syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-first.js index 669d26be3c1..7c7a8c50c6a 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-if.template /*--- description: ImportCall trailing comma following first parameter (nested if syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-second.js index 6c27353c6df..bd20bc49941 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-if-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-if.template /*--- description: ImportCall trailing comma following second parameter (nested if syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-first.js index 99ff3a329b0..d9fd806fdb7 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-while.template /*--- description: ImportCall trailing comma following first parameter (nested while syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-second.js index adcdfe8837e..2ff4072e363 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-while-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-while.template /*--- description: ImportCall trailing comma following second parameter (nested while syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-first.js index 2e089e2c39e..fb6c4fbb783 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-with-expression.template /*--- description: ImportCall trailing comma following first parameter (nested with syntax in the expression position) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-second.js index d585efbac56..7845851a93f 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-expression-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-with-expression.template /*--- description: ImportCall trailing comma following second parameter (nested with syntax in the expression position) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-first.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-first.js index aab54f8bc7f..a4e4af9ec9e 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/nested-with.template /*--- description: ImportCall trailing comma following first parameter (nested with syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-second.js similarity index 95% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-second.js index d3757009332..72e86d4b4de 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/nested-with-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/nested-with.template /*--- description: ImportCall trailing comma following second parameter (nested with syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-first.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-first.js similarity index 91% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-first.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-first.js index 77dbeb2019a..2e4e518d539 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-first.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-first.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-first.case +// - src/dynamic-import/import-assertions-trailing-comma-first.case // - src/dynamic-import/syntax/valid/top-level.template /*--- description: ImportCall trailing comma following first parameter (top level syntax) diff --git a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-second.js b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-second.js similarity index 91% rename from js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-second.js rename to js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-second.js index 22393f52a71..eb2b17c6b74 100644 --- a/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-trailing-comma-second.js +++ b/js/src/tests/test262/language/expressions/dynamic-import/syntax/valid/top-level-import-assertions-trailing-comma-second.js @@ -1,6 +1,6 @@ // |reftest| shell-option(--enable-import-assertions) skip-if(!xulRuntime.shell) -- requires shell-options // This file was procedurally generated from the following sources: -// - src/dynamic-import/trailing-comma-second.case +// - src/dynamic-import/import-assertions-trailing-comma-second.case // - src/dynamic-import/syntax/valid/top-level.template /*--- description: ImportCall trailing comma following second parameter (top level syntax) diff --git a/js/src/tests/test262/language/import/import-assertions/browser.js b/js/src/tests/test262/language/import/import-assertions/browser.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/language/import/json-extensibility-array.js b/js/src/tests/test262/language/import/import-assertions/json-extensibility-array.js similarity index 100% rename from js/src/tests/test262/language/import/json-extensibility-array.js rename to js/src/tests/test262/language/import/import-assertions/json-extensibility-array.js diff --git a/js/src/tests/test262/language/import/json-extensibility-object.js b/js/src/tests/test262/language/import/import-assertions/json-extensibility-object.js similarity index 100% rename from js/src/tests/test262/language/import/json-extensibility-object.js rename to js/src/tests/test262/language/import/import-assertions/json-extensibility-object.js diff --git a/js/src/tests/test262/language/import/json-idempotency-indirect_FIXTURE.js b/js/src/tests/test262/language/import/import-assertions/json-idempotency-indirect_FIXTURE.js similarity index 100% rename from js/src/tests/test262/language/import/json-idempotency-indirect_FIXTURE.js rename to js/src/tests/test262/language/import/import-assertions/json-idempotency-indirect_FIXTURE.js diff --git a/js/src/tests/test262/language/import/json-idempotency.js b/js/src/tests/test262/language/import/import-assertions/json-idempotency.js similarity index 100% rename from js/src/tests/test262/language/import/json-idempotency.js rename to js/src/tests/test262/language/import/import-assertions/json-idempotency.js diff --git a/js/src/tests/test262/language/import/json-idempotency_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-idempotency_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-idempotency_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-idempotency_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-invalid.js b/js/src/tests/test262/language/import/import-assertions/json-invalid.js similarity index 100% rename from js/src/tests/test262/language/import/json-invalid.js rename to js/src/tests/test262/language/import/import-assertions/json-invalid.js diff --git a/js/src/tests/test262/language/import/json-invalid_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-invalid_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-invalid_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-invalid_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-named-bindings.js b/js/src/tests/test262/language/import/import-assertions/json-named-bindings.js similarity index 100% rename from js/src/tests/test262/language/import/json-named-bindings.js rename to js/src/tests/test262/language/import/import-assertions/json-named-bindings.js diff --git a/js/src/tests/test262/language/import/json-named-bindings_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-named-bindings_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-named-bindings_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-named-bindings_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-array.js b/js/src/tests/test262/language/import/import-assertions/json-value-array.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-array.js rename to js/src/tests/test262/language/import/import-assertions/json-value-array.js diff --git a/js/src/tests/test262/language/import/json-value-array_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-array_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-array_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-array_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-boolean.js b/js/src/tests/test262/language/import/import-assertions/json-value-boolean.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-boolean.js rename to js/src/tests/test262/language/import/import-assertions/json-value-boolean.js diff --git a/js/src/tests/test262/language/import/json-value-boolean_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-boolean_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-boolean_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-boolean_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-null.js b/js/src/tests/test262/language/import/import-assertions/json-value-null.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-null.js rename to js/src/tests/test262/language/import/import-assertions/json-value-null.js diff --git a/js/src/tests/test262/language/import/json-value-null_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-null_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-null_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-null_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-number.js b/js/src/tests/test262/language/import/import-assertions/json-value-number.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-number.js rename to js/src/tests/test262/language/import/import-assertions/json-value-number.js diff --git a/js/src/tests/test262/language/import/json-value-number_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-number_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-number_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-number_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-object.js b/js/src/tests/test262/language/import/import-assertions/json-value-object.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-object.js rename to js/src/tests/test262/language/import/import-assertions/json-value-object.js diff --git a/js/src/tests/test262/language/import/json-value-object_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-object_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-object_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-object_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-value-string.js b/js/src/tests/test262/language/import/import-assertions/json-value-string.js similarity index 100% rename from js/src/tests/test262/language/import/json-value-string.js rename to js/src/tests/test262/language/import/import-assertions/json-value-string.js diff --git a/js/src/tests/test262/language/import/json-value-string_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-value-string_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-value-string_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-value-string_FIXTURE.json diff --git a/js/src/tests/test262/language/import/json-via-namespace.js b/js/src/tests/test262/language/import/import-assertions/json-via-namespace.js similarity index 100% rename from js/src/tests/test262/language/import/json-via-namespace.js rename to js/src/tests/test262/language/import/import-assertions/json-via-namespace.js diff --git a/js/src/tests/test262/language/import/json-via-namespace_FIXTURE.json b/js/src/tests/test262/language/import/import-assertions/json-via-namespace_FIXTURE.json similarity index 100% rename from js/src/tests/test262/language/import/json-via-namespace_FIXTURE.json rename to js/src/tests/test262/language/import/import-assertions/json-via-namespace_FIXTURE.json diff --git a/js/src/tests/test262/language/import/import-assertions/shell.js b/js/src/tests/test262/language/import/import-assertions/shell.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/language/module-code/import-assertions/browser.js b/js/src/tests/test262/language/module-code/import-assertions/browser.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/language/module-code/early-dup-assert-key-export.js b/js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-export.js similarity index 100% rename from js/src/tests/test262/language/module-code/early-dup-assert-key-export.js rename to js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-export.js diff --git a/js/src/tests/test262/language/module-code/early-dup-assert-key-import-nobinding.js b/js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-import-nobinding.js similarity index 100% rename from js/src/tests/test262/language/module-code/early-dup-assert-key-import-nobinding.js rename to js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-import-nobinding.js diff --git a/js/src/tests/test262/language/module-code/early-dup-assert-key-import-withbinding.js b/js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-import-withbinding.js similarity index 100% rename from js/src/tests/test262/language/module-code/early-dup-assert-key-import-withbinding.js rename to js/src/tests/test262/language/module-code/import-assertions/early-dup-assert-key-import-withbinding.js diff --git a/js/src/tests/test262/language/module-code/eval-gtbndng-indirect-faux-assertion.js b/js/src/tests/test262/language/module-code/import-assertions/eval-gtbndng-indirect-faux-assertion.js similarity index 100% rename from js/src/tests/test262/language/module-code/eval-gtbndng-indirect-faux-assertion.js rename to js/src/tests/test262/language/module-code/import-assertions/eval-gtbndng-indirect-faux-assertion.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-1_FIXTURE.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-1_FIXTURE.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-1_FIXTURE.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-1_FIXTURE.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-2_FIXTURE.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-2_FIXTURE.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-2_FIXTURE.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-2_FIXTURE.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-3_FIXTURE.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-3_FIXTURE.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-3_FIXTURE.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-3_FIXTURE.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-empty.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-empty.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-empty.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-empty.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-key-identifiername.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-identifiername.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-key-identifiername.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-identifiername.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-key-string-double.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-string-double.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-key-string-double.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-string-double.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-key-string-single.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-string-single.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-key-string-single.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-key-string-single.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-many.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-many.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-many.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-many.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-newlines.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-newlines.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-newlines.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-newlines.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-trlng-comma.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-trlng-comma.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-trlng-comma.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-trlng-comma.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-value-string-double.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-value-string-double.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-value-string-double.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-value-string-double.js diff --git a/js/src/tests/test262/language/module-code/import-assertion-value-string-single.js b/js/src/tests/test262/language/module-code/import-assertions/import-assertion-value-string-single.js similarity index 100% rename from js/src/tests/test262/language/module-code/import-assertion-value-string-single.js rename to js/src/tests/test262/language/module-code/import-assertions/import-assertion-value-string-single.js diff --git a/js/src/tests/test262/language/module-code/import-assertions/shell.js b/js/src/tests/test262/language/module-code/import-assertions/shell.js new file mode 100644 index 00000000000..e69de29bb2d diff --git a/js/src/tests/test262/staging/Temporal/Duration/old/shell.js b/js/src/tests/test262/staging/Temporal/Duration/old/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/staging/Temporal/Duration/old/shell.js +++ b/js/src/tests/test262/staging/Temporal/Duration/old/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/staging/Temporal/TimeZone/old/shell.js b/js/src/tests/test262/staging/Temporal/TimeZone/old/shell.js index 891009a4542..ba2ab8fc457 100644 --- a/js/src/tests/test262/staging/Temporal/TimeZone/old/shell.js +++ b/js/src/tests/test262/staging/Temporal/TimeZone/old/shell.js @@ -387,6 +387,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1671,6 +1691,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -2115,8 +2154,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/js/src/tests/test262/staging/Temporal/ZonedDateTime/old/shell.js b/js/src/tests/test262/staging/Temporal/ZonedDateTime/old/shell.js index 6411cd706e4..e4cbbd3a6dc 100644 --- a/js/src/tests/test262/staging/Temporal/ZonedDateTime/old/shell.js +++ b/js/src/tests/test262/staging/Temporal/ZonedDateTime/old/shell.js @@ -58,6 +58,26 @@ var TemporalHelpers = { assert.sameValue(duration.nanoseconds, nanoseconds, `${description} nanoseconds result`); }, + /* + * assertDateDuration(duration, years, months, weeks, days, [, description]): + * + * Shorthand for asserting that each date field of a Temporal.Duration is + * equal to an expected value. + */ + assertDateDuration(duration, years, months, weeks, days, description = "") { + assert(duration instanceof Temporal.Duration, `${description} instanceof`); + assert.sameValue(duration.years, years, `${description} years result`); + assert.sameValue(duration.months, months, `${description} months result`); + assert.sameValue(duration.weeks, weeks, `${description} weeks result`); + assert.sameValue(duration.days, days, `${description} days result`); + assert.sameValue(duration.hours, 0, `${description} hours result should be zero`); + assert.sameValue(duration.minutes, 0, `${description} minutes result should be zero`); + assert.sameValue(duration.seconds, 0, `${description} seconds result should be zero`); + assert.sameValue(duration.milliseconds, 0, `${description} milliseconds result should be zero`); + assert.sameValue(duration.microseconds, 0, `${description} microseconds result should be zero`); + assert.sameValue(duration.nanoseconds, 0, `${description} nanoseconds result should be zero`); + }, + /* * assertDurationsEqual(actual, expected[, description]): * @@ -1342,6 +1362,25 @@ var TemporalHelpers = { return new CalendarMergeFieldsPrimitive(primitive); }, + /* + * A custom calendar whose fields() method returns the same value as the + * iso8601 calendar, with the addition of extraFields provided as parameter. + */ + calendarWithExtraFields(fields) { + class CalendarWithExtraFields extends Temporal.Calendar { + constructor(extraFields) { + super("iso8601"); + this._extraFields = extraFields; + } + + fields(fieldNames) { + return super.fields(fieldNames).concat(this._extraFields); + } + } + + return new CalendarWithExtraFields(fields); + }, + /* * crossDateLineTimeZone(): * @@ -1786,8 +1825,14 @@ var TemporalHelpers = { return this._offsetValue; } - getPossibleInstantsFor() { - return []; + getPossibleInstantsFor(dt) { + if (typeof this._offsetValue !== 'number' || Math.abs(this._offsetValue) >= 86400e9 || isNaN(this._offsetValue)) return []; + const zdt = dt.toZonedDateTime("UTC").add({ nanoseconds: -this._offsetValue }); + return [zdt.toInstant()]; + } + + get id() { + return this.getOffsetStringFor(new Temporal.Instant(0n)); } } return new SpecificOffsetTimeZone(offsetValue); diff --git a/layout/generic/nsGfxScrollFrame.cpp b/layout/generic/nsGfxScrollFrame.cpp index a2d0ad35ad8..3c3feb75198 100644 --- a/layout/generic/nsGfxScrollFrame.cpp +++ b/layout/generic/nsGfxScrollFrame.cpp @@ -4202,6 +4202,9 @@ void nsHTMLScrollFrame::BuildDisplayList(nsDisplayListBuilder* aBuilder, ©OfDirtyRect, /* aSetBase = */ false, nullptr); if (mWillBuildScrollableLayer) { +#ifndef MOZ_WIDGET_ANDROID + gfxCriticalNoteOnce << "inserted scroll frame"; +#endif asrSetter.InsertScrollFrame(this); aBuilder->SetDisablePartialUpdates(true); } diff --git a/layout/painting/DisplayItemClipChain.h b/layout/painting/DisplayItemClipChain.h index 32779e09c03..64917dd9f6c 100644 --- a/layout/painting/DisplayItemClipChain.h +++ b/layout/painting/DisplayItemClipChain.h @@ -69,7 +69,7 @@ struct DisplayItemClipChain { mASR(aASR), mParent(aParent), mNextClipChainToDestroy(aNextClipChainToDestroy) -#ifdef DEBUG +#if defined(DEBUG) || defined(MOZ_DIAGNOSTIC_ASSERT_ENABLED) , mOnStack(true) #endif @@ -79,7 +79,7 @@ struct DisplayItemClipChain { DisplayItemClipChain() : mASR(nullptr), mNextClipChainToDestroy(nullptr) -#ifdef DEBUG +#if defined(DEBUG) || defined(MOZ_DIAGNOSTIC_ASSERT_ENABLED) , mOnStack(true) #endif @@ -91,7 +91,7 @@ struct DisplayItemClipChain { RefPtr mParent; uint32_t mRefCount = 0; DisplayItemClipChain* mNextClipChainToDestroy; -#ifdef DEBUG +#if defined(DEBUG) || defined(MOZ_DIAGNOSTIC_ASSERT_ENABLED) bool mOnStack; #endif }; diff --git a/layout/painting/RetainedDisplayListBuilder.cpp b/layout/painting/RetainedDisplayListBuilder.cpp index 3e968b21a71..5ff275d8a0e 100644 --- a/layout/painting/RetainedDisplayListBuilder.cpp +++ b/layout/painting/RetainedDisplayListBuilder.cpp @@ -362,6 +362,9 @@ static Maybe SelectContainerASR( const ActiveScrolledRoot* itemClipASR = aClipChain ? aClipChain->mASR : nullptr; + MOZ_DIAGNOSTIC_ASSERT(!aClipChain || aClipChain->mOnStack || !itemClipASR || + itemClipASR->mScrollableFrame); + const ActiveScrolledRoot* finiteBoundsASR = ActiveScrolledRoot::PickDescendant(itemClipASR, aItemASR); diff --git a/layout/painting/nsDisplayList.cpp b/layout/painting/nsDisplayList.cpp index 5a11ad5a28c..13e3f769bf4 100644 --- a/layout/painting/nsDisplayList.cpp +++ b/layout/painting/nsDisplayList.cpp @@ -1428,12 +1428,12 @@ ActiveScrolledRoot* nsDisplayListBuilder::AllocateActiveScrolledRoot( const DisplayItemClipChain* nsDisplayListBuilder::AllocateDisplayItemClipChain( const DisplayItemClip& aClip, const ActiveScrolledRoot* aASR, const DisplayItemClipChain* aParent) { - MOZ_ASSERT(!(aParent && aParent->mOnStack)); + MOZ_DIAGNOSTIC_ASSERT(!(aParent && aParent->mOnStack)); void* p = Allocate(sizeof(DisplayItemClipChain), DisplayListArenaObjectId::CLIPCHAIN); DisplayItemClipChain* c = new (KnownNotNull, p) DisplayItemClipChain(aClip, aASR, aParent, mFirstClipChainToDestroy); -#ifdef DEBUG +#if defined(DEBUG) || defined(MOZ_DIAGNOSTIC_ASSERT_ENABLED) c->mOnStack = false; #endif auto result = mClipDeduplicator.insert(c); diff --git a/layout/style/nsCSSValue.cpp b/layout/style/nsCSSValue.cpp index 97740d098e5..5d815c25f23 100644 --- a/layout/style/nsCSSValue.cpp +++ b/layout/style/nsCSSValue.cpp @@ -31,34 +31,16 @@ using namespace mozilla; using namespace mozilla::css; using namespace mozilla::dom; -nsCSSValue::nsCSSValue(int32_t aValue, nsCSSUnit aUnit) : mUnit(aUnit) { - MOZ_ASSERT(aUnit == eCSSUnit_Integer || aUnit == eCSSUnit_Enumerated, - "not an int value"); - if (aUnit == eCSSUnit_Integer || aUnit == eCSSUnit_Enumerated) { - mValue.mInt = aValue; - } else { - mUnit = eCSSUnit_Null; - mValue.mInt = 0; - } -} - nsCSSValue::nsCSSValue(float aValue, nsCSSUnit aUnit) : mUnit(aUnit) { - MOZ_ASSERT(eCSSUnit_Percent <= aUnit, "not a float value"); - if (eCSSUnit_Percent <= aUnit) { - mValue.mFloat = aValue; - MOZ_ASSERT(!std::isnan(mValue.mFloat)); - } else { - mUnit = eCSSUnit_Null; - mValue.mInt = 0; - } + MOZ_ASSERT(eCSSUnit_Null == aUnit, "not a float value"); + mValue = aValue; + MOZ_ASSERT(!std::isnan(mValue)); } nsCSSValue::nsCSSValue(const nsCSSValue& aCopy) : mUnit(aCopy.mUnit) { - if (eCSSUnit_Percent <= mUnit) { - mValue.mFloat = aCopy.mValue.mFloat; - MOZ_ASSERT(!std::isnan(mValue.mFloat)); - } else if (eCSSUnit_Integer <= mUnit && mUnit <= eCSSUnit_Enumerated) { - mValue.mInt = aCopy.mValue.mInt; + if (eCSSUnit_Null != mUnit) { + mValue = aCopy.mValue; + MOZ_ASSERT(!std::isnan(mValue)); } else { MOZ_ASSERT_UNREACHABLE("unknown unit"); } @@ -87,19 +69,7 @@ bool nsCSSValue::operator==(const nsCSSValue& aOther) const { if (mUnit != aOther.mUnit) { return false; } - if ((eCSSUnit_Integer <= mUnit) && (mUnit <= eCSSUnit_Enumerated)) { - return mValue.mInt == aOther.mValue.mInt; - } - return mValue.mFloat == aOther.mValue.mFloat; -} - -double nsCSSValue::GetAngleValueInDegrees() const { - // Note that this extends the value from float to double. - return GetAngleValue(); -} - -double nsCSSValue::GetAngleValueInRadians() const { - return GetAngleValueInDegrees() * M_PI / 180.0; + return mValue == aOther.mValue; } nscoord nsCSSValue::GetPixelLength() const { @@ -108,7 +78,7 @@ nscoord nsCSSValue::GetPixelLength() const { double scaleFactor; switch (mUnit) { case eCSSUnit_Pixel: - return nsPresContext::CSSPixelsToAppUnits(mValue.mFloat); + return nsPresContext::CSSPixelsToAppUnits(mValue); case eCSSUnit_Pica: scaleFactor = 16.0; break; @@ -131,24 +101,14 @@ nscoord nsCSSValue::GetPixelLength() const { NS_ERROR("should never get here"); return 0; } - return nsPresContext::CSSPixelsToAppUnits(float(mValue.mFloat * scaleFactor)); -} - -void nsCSSValue::SetIntValue(int32_t aValue, nsCSSUnit aUnit) { - MOZ_ASSERT(aUnit == eCSSUnit_Integer || aUnit == eCSSUnit_Enumerated, - "not an int value"); - Reset(); - if (aUnit == eCSSUnit_Integer || aUnit == eCSSUnit_Enumerated) { - mUnit = aUnit; - mValue.mInt = aValue; - } + return nsPresContext::CSSPixelsToAppUnits(float(mValue * scaleFactor)); } void nsCSSValue::SetPercentValue(float aValue) { Reset(); mUnit = eCSSUnit_Percent; - mValue.mFloat = aValue; - MOZ_ASSERT(!std::isnan(mValue.mFloat)); + mValue = aValue; + MOZ_ASSERT(!std::isnan(mValue)); } void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) { @@ -156,7 +116,7 @@ void nsCSSValue::SetFloatValue(float aValue, nsCSSUnit aUnit) { Reset(); if (IsFloatUnit(aUnit)) { mUnit = aUnit; - mValue.mFloat = aValue; - MOZ_ASSERT(!std::isnan(mValue.mFloat)); + mValue = aValue; + MOZ_ASSERT(!std::isnan(mValue)); } } diff --git a/layout/style/nsCSSValue.h b/layout/style/nsCSSValue.h index 7dc4e2fa6d7..c364ec637df 100644 --- a/layout/style/nsCSSValue.h +++ b/layout/style/nsCSSValue.h @@ -49,44 +49,27 @@ bool Servo_CssUrlData_IsLocalRef(const RawServoCssUrlData* url); enum nsCSSUnit : uint32_t { eCSSUnit_Null = 0, // (n/a) null unit, value is not specified - eCSSUnit_Integer = 70, // (int) simple value - eCSSUnit_Enumerated = 71, // (int) value has enumerated meaning - - eCSSUnit_Percent = 100, // (float) (1.0 == 100%) value is percentage of + eCSSUnit_Percent = 100, // (1.0 == 100%) value is percentage of // something - eCSSUnit_Number = 101, // (float) value is numeric (usually multiplier, + eCSSUnit_Number = 101, // value is numeric (usually multiplier, // different behavior than percent) // Font relative measure - eCSSUnit_EM = 800, // (float) == current font size - eCSSUnit_XHeight = 801, // (float) distance from top of lower case x to + eCSSUnit_EM = 800, // == current font size + eCSSUnit_XHeight = 801, // distance from top of lower case x to // baseline - eCSSUnit_Char = 802, // (float) number of characters, used for width with + eCSSUnit_Char = 802, // number of characters, used for width with // monospace font - eCSSUnit_RootEM = 803, // (float) == root element font size + eCSSUnit_RootEM = 803, // == root element font size // Screen relative measure - eCSSUnit_Point = 900, // (float) 4/3 of a CSS pixel - eCSSUnit_Inch = 901, // (float) 96 CSS pixels - eCSSUnit_Millimeter = 902, // (float) 96/25.4 CSS pixels - eCSSUnit_Centimeter = 903, // (float) 96/2.54 CSS pixels - eCSSUnit_Pica = 904, // (float) 12 points == 16 CSS pixls - eCSSUnit_Quarter = 905, // (float) 96/101.6 CSS pixels - eCSSUnit_Pixel = 906, // (float) CSS pixel unit - - // Angular units - eCSSUnit_Degree = 1000, // (float) 360 per circle - - // Frequency units - eCSSUnit_Hertz = 2000, // (float) 1/seconds - eCSSUnit_Kilohertz = 2001, // (float) 1000 Hertz - - // Time units - eCSSUnit_Seconds = 3000, // (float) Standard time - eCSSUnit_Milliseconds = 3001, // (float) 1/1000 second - - // Flexible fraction (CSS Grid) - eCSSUnit_FlexFraction = 4000, // (float) Fraction of free space + eCSSUnit_Point = 900, // 4/3 of a CSS pixel + eCSSUnit_Inch = 901, // 96 CSS pixels + eCSSUnit_Millimeter = 902, // 96/25.4 CSS pixels + eCSSUnit_Centimeter = 903, // 96/2.54 CSS pixels + eCSSUnit_Pica = 904, // 12 points == 16 CSS pixls + eCSSUnit_Quarter = 905, // 96/101.6 CSS pixels + eCSSUnit_Pixel = 906, // CSS pixel unit }; struct nsCSSValuePair; @@ -101,18 +84,11 @@ class nsCSSValue { public: explicit nsCSSValue() : mUnit(eCSSUnit_Null) {} - nsCSSValue(int32_t aValue, nsCSSUnit aUnit); nsCSSValue(float aValue, nsCSSUnit aUnit); nsCSSValue(const nsCSSValue& aCopy); nsCSSValue(nsCSSValue&& aOther) : mUnit(aOther.mUnit), mValue(aOther.mValue) { aOther.mUnit = eCSSUnit_Null; } - template ::value>> - explicit nsCSSValue(T aValue) : mUnit(eCSSUnit_Enumerated) { - static_assert(mozilla::EnumTypeFitsWithin::value, - "aValue must be an enum that fits within mValue.mInt"); - mValue.mInt = static_cast(aValue); - } nsCSSValue& operator=(const nsCSSValue& aCopy); nsCSSValue& operator=(nsCSSValue&& aCopy); @@ -124,21 +100,6 @@ class nsCSSValue { bool IsLengthUnit() const { return eCSSUnit_EM <= mUnit && mUnit <= eCSSUnit_Pixel; } - bool IsLengthPercentUnit() const { - return IsLengthUnit() || mUnit == eCSSUnit_Percent; - } - /** - * What the spec calls relative length units is, for us, split - * between relative length units and pixel length units. - * - * A "relative" length unit is a multiple of some derived metric, - * such as a font em-size, which itself was controlled by an input CSS - * length. Relative length units should not be scaled by zooming, since - * the underlying CSS length would already have been scaled. - */ - bool IsRelativeLengthUnit() const { - return eCSSUnit_EM <= mUnit && mUnit <= eCSSUnit_RootEM; - } /** * A "pixel" length unit is a some multiple of CSS pixels. */ @@ -149,68 +110,31 @@ class nsCSSValue { static bool IsPercentLengthUnit(nsCSSUnit aUnit) { return aUnit == eCSSUnit_Percent; } - bool IsPercentLengthUnit() { return IsPercentLengthUnit(mUnit); } static bool IsFloatUnit(nsCSSUnit aUnit) { return eCSSUnit_Number <= aUnit; } - bool IsAngularUnit() const { return eCSSUnit_Degree == mUnit; } - bool IsFrequencyUnit() const { - return eCSSUnit_Hertz <= mUnit && mUnit <= eCSSUnit_Kilohertz; - } - bool IsTimeUnit() const { - return eCSSUnit_Seconds <= mUnit && mUnit <= eCSSUnit_Milliseconds; - } - - int32_t GetIntValue() const { - MOZ_ASSERT(mUnit == eCSSUnit_Integer || mUnit == eCSSUnit_Enumerated, - "not an int value"); - return mValue.mInt; - } float GetPercentValue() const { MOZ_ASSERT(mUnit == eCSSUnit_Percent, "not a percent value"); - return mValue.mFloat; + return mValue; } float GetFloatValue() const { MOZ_ASSERT(eCSSUnit_Number <= mUnit, "not a float value"); - MOZ_ASSERT(!std::isnan(mValue.mFloat)); - return mValue.mFloat; + MOZ_ASSERT(!std::isnan(mValue)); + return mValue; } - float GetAngleValue() const { - MOZ_ASSERT(eCSSUnit_Degree == mUnit, "not an angle value"); - return mValue.mFloat; - } - - // Converts any angle to radians. - double GetAngleValueInRadians() const; - - // Converts any angle to degrees. - double GetAngleValueInDegrees() const; - nscoord GetPixelLength() const; void Reset() { mUnit = eCSSUnit_Null; } ~nsCSSValue() { Reset(); } public: - void SetIntValue(int32_t aValue, nsCSSUnit aUnit); - template ::value>> - void SetEnumValue(T aValue) { - static_assert(mozilla::EnumTypeFitsWithin::value, - "aValue must be an enum that fits within mValue.mInt"); - SetIntValue(static_cast(aValue), eCSSUnit_Enumerated); - } void SetPercentValue(float aValue); void SetFloatValue(float aValue, nsCSSUnit aUnit); - // converts the nscoord to pixels - void SetIntegerCoordValue(nscoord aCoord); protected: nsCSSUnit mUnit; - union { - int32_t mInt; - float mFloat; - } mValue; + float mValue; }; #endif /* nsCSSValue_h___ */ diff --git a/layout/style/test/mochitest.ini b/layout/style/test/mochitest.ini index c5bf03ba20e..a9a16c45d22 100644 --- a/layout/style/test/mochitest.ini +++ b/layout/style/test/mochitest.ini @@ -8,7 +8,6 @@ prefs = dom.animations.mainthread-synchronization-with-geometric-animations=true gfx.omta.background-color=true gfx.font_loader.delay=0 - layout.css.accent-color.enabled=true layout.css.container-queries.enabled=true layout.css.individual-transform.enabled=true layout.css.motion-path.enabled=true diff --git a/media/webrtc/signaling/gtest/Canonicals.h b/media/webrtc/signaling/gtest/Canonicals.h index d9be46faa5b..e7bab2d4fd6 100644 --- a/media/webrtc/signaling/gtest/Canonicals.h +++ b/media/webrtc/signaling/gtest/Canonicals.h @@ -29,6 +29,8 @@ class ConcreteCanonicals { INIT_CANONICAL(mLocalRecvRtpExtensions, RtpExtList()), INIT_CANONICAL(mRemoteSsrc, 0), INIT_CANONICAL(mRemoteVideoRtxSsrc, 0), + INIT_CANONICAL(mFrameTransformerProxySend, nullptr), + INIT_CANONICAL(mFrameTransformerProxyRecv, nullptr), INIT_CANONICAL(mAudioRecvCodecs, std::vector()), INIT_CANONICAL(mAudioSendCodec, Nothing()), INIT_CANONICAL(mVideoRecvCodecs, std::vector()), @@ -49,6 +51,8 @@ class ConcreteCanonicals { Canonical mLocalRecvRtpExtensions; Canonical mRemoteSsrc; Canonical mRemoteVideoRtxSsrc; + Canonical> mFrameTransformerProxySend; + Canonical> mFrameTransformerProxyRecv; Canonical> mAudioRecvCodecs; Canonical> mAudioSendCodec; @@ -103,6 +107,14 @@ class ConcreteControl : public AudioConduitControlInterface, Canonical& CanonicalLocalSendRtpExtensions() override { return mLocalSendRtpExtensions; } + Canonical>& CanonicalFrameTransformerProxySend() + override { + return mFrameTransformerProxySend; + } + Canonical>& CanonicalFrameTransformerProxyRecv() + override { + return mFrameTransformerProxyRecv; + } // AudioConduitControlInterface Canonical>& CanonicalAudioSendCodec() override { diff --git a/media/webrtc/signaling/gtest/MockConduit.h b/media/webrtc/signaling/gtest/MockConduit.h index d0c43f7c45a..c2c5becd1ba 100644 --- a/media/webrtc/signaling/gtest/MockConduit.h +++ b/media/webrtc/signaling/gtest/MockConduit.h @@ -9,6 +9,7 @@ #include "gmock/gmock.h" #include "MediaConduitInterface.h" +#include "libwebrtcglue/FrameTransformer.h" namespace webrtc { std::ostream& operator<<(std::ostream& aStream, diff --git a/media/webrtc/signaling/gtest/videoconduit_unittests.cpp b/media/webrtc/signaling/gtest/videoconduit_unittests.cpp index 07e15a87ead..cdf4a951e69 100644 --- a/media/webrtc/signaling/gtest/videoconduit_unittests.cpp +++ b/media/webrtc/signaling/gtest/videoconduit_unittests.cpp @@ -532,10 +532,10 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecScaleResolutionBy) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 2U); - ASSERT_EQ(videoStreams[0].width, 160U); - ASSERT_EQ(videoStreams[0].height, 90U); - ASSERT_EQ(videoStreams[1].width, 320U); - ASSERT_EQ(videoStreams[1].height, 180U); + ASSERT_EQ(videoStreams[0].width, 320U); + ASSERT_EQ(videoStreams[0].height, 180U); + ASSERT_EQ(videoStreams[1].width, 160U); + ASSERT_EQ(videoStreams[1].height, 90U); } TEST_F(VideoConduitTest, TestConfigureSendMediaCodecCodecMode) { @@ -660,8 +660,8 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecRids) { }); ASSERT_TRUE(Call()->mVideoSendConfig); ASSERT_EQ(Call()->mVideoSendConfig->rtp.rids.size(), 2U); - ASSERT_EQ(Call()->mVideoSendConfig->rtp.rids[0], "2"); - ASSERT_EQ(Call()->mVideoSendConfig->rtp.rids[1], "1"); + ASSERT_EQ(Call()->mVideoSendConfig->rtp.rids[0], "1"); + ASSERT_EQ(Call()->mVideoSendConfig->rtp.rids[1], "2"); } TEST_F(VideoConduitTest, TestOnSinkWantsChanged) { @@ -835,12 +835,12 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecSimulcastOddScreen) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 3U); - EXPECT_EQ(videoStreams[2].width, 26U); - EXPECT_EQ(videoStreams[2].height, 24U); + EXPECT_EQ(videoStreams[0].width, 26U); + EXPECT_EQ(videoStreams[0].height, 24U); EXPECT_EQ(videoStreams[1].width, 13U); EXPECT_EQ(videoStreams[1].height, 12U); - EXPECT_EQ(videoStreams[0].width, 6U); - EXPECT_EQ(videoStreams[0].height, 6U); + EXPECT_EQ(videoStreams[2].width, 6U); + EXPECT_EQ(videoStreams[2].height, 6U); } mControl.Update([&](auto& aControl) { @@ -897,12 +897,12 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecSimulcastAllScaling) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 3U); - EXPECT_EQ(videoStreams[2].width, 640U); - EXPECT_EQ(videoStreams[2].height, 360U); + EXPECT_EQ(videoStreams[0].width, 640U); + EXPECT_EQ(videoStreams[0].height, 360U); EXPECT_EQ(videoStreams[1].width, 320U); EXPECT_EQ(videoStreams[1].height, 180U); - EXPECT_EQ(videoStreams[0].width, 213U); - EXPECT_EQ(videoStreams[0].height, 120U); + EXPECT_EQ(videoStreams[2].width, 213U); + EXPECT_EQ(videoStreams[2].height, 120U); } SendVideoFrame(1281, 721, 2); @@ -911,12 +911,12 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecSimulcastAllScaling) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 3U); - EXPECT_EQ(videoStreams[2].width, 640U); - EXPECT_EQ(videoStreams[2].height, 360U); + EXPECT_EQ(videoStreams[0].width, 640U); + EXPECT_EQ(videoStreams[0].height, 360U); EXPECT_EQ(videoStreams[1].width, 320U); EXPECT_EQ(videoStreams[1].height, 180U); - EXPECT_EQ(videoStreams[0].width, 213U); - EXPECT_EQ(videoStreams[0].height, 120U); + EXPECT_EQ(videoStreams[2].width, 213U); + EXPECT_EQ(videoStreams[2].height, 120U); } SendVideoFrame(1280, 720, 3); @@ -925,12 +925,12 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecSimulcastAllScaling) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 3U); - EXPECT_EQ(videoStreams[2].width, 640U); - EXPECT_EQ(videoStreams[2].height, 360U); + EXPECT_EQ(videoStreams[0].width, 640U); + EXPECT_EQ(videoStreams[0].height, 360U); EXPECT_EQ(videoStreams[1].width, 320U); EXPECT_EQ(videoStreams[1].height, 180U); - EXPECT_EQ(videoStreams[0].width, 213U); - EXPECT_EQ(videoStreams[0].height, 120U); + EXPECT_EQ(videoStreams[2].width, 213U); + EXPECT_EQ(videoStreams[2].height, 120U); } mControl.Update([&](auto& aControl) { @@ -947,12 +947,12 @@ TEST_F(VideoConduitTest, TestConfigureSendMediaCodecSimulcastAllScaling) { Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); ASSERT_EQ(videoStreams.size(), 3U); - EXPECT_EQ(videoStreams[2].width, 1280U); - EXPECT_EQ(videoStreams[2].height, 720U); + EXPECT_EQ(videoStreams[0].width, 1280U); + EXPECT_EQ(videoStreams[0].height, 720U); EXPECT_EQ(videoStreams[1].width, 640U); EXPECT_EQ(videoStreams[1].height, 360U); - EXPECT_EQ(videoStreams[0].width, 320U); - EXPECT_EQ(videoStreams[0].height, 180U); + EXPECT_EQ(videoStreams[2].width, 320U); + EXPECT_EQ(videoStreams[2].height, 180U); } } @@ -1886,8 +1886,8 @@ TEST_F(VideoConduitTest, TestVideoEncodeSimulcastScaleResolutionBy) { const std::vector videoStreams = Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); - ASSERT_EQ(videoStreams[2].width, 320U); - ASSERT_EQ(videoStreams[2].height, 240U); + ASSERT_EQ(videoStreams[0].width, 320U); + ASSERT_EQ(videoStreams[0].height, 240U); ASSERT_EQ(sink->mVideoFrame.timestamp_us(), 1000U); ASSERT_EQ(sink->mOnFrameCount, 1U); } @@ -1897,8 +1897,8 @@ TEST_F(VideoConduitTest, TestVideoEncodeSimulcastScaleResolutionBy) { const std::vector videoStreams = Call()->CreateEncoderStreams(sink->mVideoFrame.width(), sink->mVideoFrame.height()); - ASSERT_EQ(videoStreams[2].width, 640U); - ASSERT_EQ(videoStreams[2].height, 360U); + ASSERT_EQ(videoStreams[0].width, 640U); + ASSERT_EQ(videoStreams[0].height, 360U); ASSERT_EQ(sink->mVideoFrame.timestamp_us(), 2000U); ASSERT_EQ(sink->mOnFrameCount, 2U); mVideoConduit->RemoveSink(sink.get()); @@ -2036,7 +2036,7 @@ TEST_F(VideoConduitTest, TestVideoEncodeLargeScaleResolutionByStreamCreation) { ASSERT_EQ(videoStreams.size(), scales.size()); for (size_t i = 0; i < scales.size(); ++i) { // Streams are backwards for some reason - const auto& stream = videoStreams[scales.size() - i - 1]; + const auto& stream = videoStreams[i]; const auto& scale = scales[i]; if (scale == 200U) { EXPECT_EQ(stream.width, 3U); @@ -2080,7 +2080,7 @@ TEST_F(VideoConduitTest, TestVideoEncodeResolutionAlignment) { ASSERT_EQ(videoStreams.size(), scales.size()); for (size_t i = 0; i < videoStreams.size(); ++i) { // videoStreams is backwards - const auto& stream = videoStreams[videoStreams.size() - 1 - i]; + const auto& stream = videoStreams[i]; const auto& scale = scales[i]; uint32_t expectation = 480 / scale < static_cast(alignment) ? 1 : 0; diff --git a/mfbt/RefCounted.h b/mfbt/RefCounted.h index e0458ac6bcb..5c083f3524f 100644 --- a/mfbt/RefCounted.h +++ b/mfbt/RefCounted.h @@ -10,6 +10,7 @@ #define mozilla_RefCounted_h #include +#include #include "mozilla/AlreadyAddRefed.h" #include "mozilla/Assertions.h" @@ -256,6 +257,9 @@ class RefCounted { } } + using HasThreadSafeRefCnt = + std::integral_constant; + // Compatibility with wtf::RefPtr. void ref() { AddRef(); } void deref() { Release(); } diff --git a/mfbt/ThreadSafeWeakPtr.h b/mfbt/ThreadSafeWeakPtr.h index c3121d5981b..d5176f5ffa2 100644 --- a/mfbt/ThreadSafeWeakPtr.h +++ b/mfbt/ThreadSafeWeakPtr.h @@ -181,6 +181,8 @@ class SupportsThreadSafeWeakPtr : public detail::SupportsThreadSafeWeakPtrBase { return cnt; } + using HasThreadSafeRefCnt = std::true_type; + // Compatibility with wtf::RefPtr void ref() { AddRef(); } void deref() { Release(); } diff --git a/mfbt/double-conversion/GIT-INFO b/mfbt/double-conversion/GIT-INFO deleted file mode 100644 index 70016edd4aa..00000000000 --- a/mfbt/double-conversion/GIT-INFO +++ /dev/null @@ -1,5 +0,0 @@ -commit 4f7a25d8ced8c7cf6eee6fd09d6788eaa23c9afe -Author: Florian Loitsch -Date: Thu May 18 14:20:37 2023 +0200 - - Prepare v3.2.0 release. (#196) diff --git a/mfbt/double-conversion/double-conversion/LICENSE b/mfbt/double-conversion/LICENSE similarity index 100% rename from mfbt/double-conversion/double-conversion/LICENSE rename to mfbt/double-conversion/LICENSE diff --git a/mfbt/double-conversion/add-mfbt-api-markers.patch b/mfbt/double-conversion/add-mfbt-api-markers.patch index d8e96cea43d..6fd0ae70912 100644 --- a/mfbt/double-conversion/add-mfbt-api-markers.patch +++ b/mfbt/double-conversion/add-mfbt-api-markers.patch @@ -1,6 +1,6 @@ -diff --git a/mfbt/double-conversion/double-conversion/double-to-string.h b/mfbt/double-conversion/double-conversion/double-to-string.h ---- a/mfbt/double-conversion/double-conversion/double-to-string.h -+++ b/mfbt/double-conversion/double-conversion/double-to-string.h +diff --git a/double-conversion/double-to-string.h b/double-conversion/double-to-string.h +--- a/double-conversion/double-to-string.h ++++ b/double-conversion/double-to-string.h @@ -23,16 +23,17 @@ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT @@ -145,9 +145,9 @@ diff --git a/mfbt/double-conversion/double-conversion/double-to-string.h b/mfbt/ const int flags_; const char* const infinity_symbol_; const char* const nan_symbol_; -diff --git a/mfbt/double-conversion/double-conversion/string-to-double.h b/mfbt/double-conversion/double-conversion/string-to-double.h ---- a/mfbt/double-conversion/double-conversion/string-to-double.h -+++ b/mfbt/double-conversion/double-conversion/string-to-double.h +diff --git a/double-conversion/string-to-double.h b/double-conversion/string-to-double.h +--- a/double-conversion/string-to-double.h ++++ b/double-conversion/string-to-double.h @@ -23,16 +23,17 @@ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT diff --git a/mfbt/double-conversion/debug-only-functions.patch b/mfbt/double-conversion/debug-only-functions.patch index 3988eaad56c..b231e369494 100644 --- a/mfbt/double-conversion/debug-only-functions.patch +++ b/mfbt/double-conversion/debug-only-functions.patch @@ -1,6 +1,6 @@ -diff --git a/mfbt/double-conversion/double-conversion/strtod.cc b/mfbt/double-conversion/double-conversion/strtod.cc ---- a/mfbt/double-conversion/double-conversion/strtod.cc -+++ b/mfbt/double-conversion/double-conversion/strtod.cc +diff --git a/double-conversion/strtod.cc b/double-conversion/strtod.cc +--- a/double-conversion/strtod.cc ++++ b/double-conversion/strtod.cc @@ -436,16 +436,17 @@ static bool ComputeGuess(Vector] -# -# Copies the needed files from a directory containing the original -# double-conversion source that we need. If no revision is specified, the tip -# revision is used. See GIT-INFO for the last revision used. - -set -e - -LOCAL_PATCHES="" - -LOCAL_PATCHES="$LOCAL_PATCHES add-mfbt-api-markers.patch" -LOCAL_PATCHES="$LOCAL_PATCHES use-mozilla-assertions.patch" -LOCAL_PATCHES="$LOCAL_PATCHES debug-only-functions.patch" -LOCAL_PATCHES="$LOCAL_PATCHES to-fixed-dbl-max.patch" - -TMPDIR=`mktemp -d` -LOCAL_CLONE="$TMPDIR/new-double-conversion" - -git clone https://github.com/google/double-conversion.git "$LOCAL_CLONE" - -# If a particular revision was requested, check it out. -if [ "$1" != "" ]; then - git -C "$LOCAL_CLONE" checkout "$1" -fi - -# First clear out everything already present. -DEST=./double-conversion -mv "$DEST" "$TMPDIR"/old-double-conversion -mkdir "$DEST" - -# Copy over critical files. -cp "$LOCAL_CLONE/LICENSE" "$DEST/" -cp "$LOCAL_CLONE/README.md" "$DEST/" - -# Includes -for header in "$LOCAL_CLONE/double-conversion/"*.h; do - cp "$header" "$DEST/" -done - -# Source -for ccfile in "$LOCAL_CLONE/double-conversion/"*.cc; do - cp "$ccfile" "$DEST/" -done - -# Now apply our local patches. -for patch in $LOCAL_PATCHES; do - patch --directory "$DEST" --strip 4 < "$patch" - - # Out-of-date patches may spew *.{orig,rej} when applied. Report an error if - # any such file is found, and roll the source directory back to its previous - # state in such case. - detritus_files=`find "$DEST" -name '*.orig' -o -name '*.rej'` - if [ "$detritus_files" != "" ]; then - echo "ERROR: Local patch $patch created these detritus files when applied:" - echo "" - echo " $detritus_files" - echo "" - echo "Please fix $patch before running $0." - - rm -rf "$DEST" - mv "$TMPDIR"/source "$DEST" - - exit 1 - fi -done - -# Update Mercurial file status. -hg addremove "$DEST" - -# Note the revision used in this update. -git -C "$LOCAL_CLONE" show -s > ./GIT-INFO - -# Delete the tmpdir. -rm -rf "$TMPDIR" diff --git a/mfbt/double-conversion/use-mozilla-assertions.patch b/mfbt/double-conversion/use-mozilla-assertions.patch index 4a7574f9b52..c6f8988d6b1 100644 --- a/mfbt/double-conversion/use-mozilla-assertions.patch +++ b/mfbt/double-conversion/use-mozilla-assertions.patch @@ -1,6 +1,6 @@ -diff --git a/mfbt/double-conversion/double-conversion/utils.h b/mfbt/double-conversion/double-conversion/utils.h ---- a/mfbt/double-conversion/double-conversion/utils.h -+++ b/mfbt/double-conversion/double-conversion/utils.h +diff --git a/double-conversion/utils.h b/double-conversion/utils.h +--- a/double-conversion/utils.h ++++ b/double-conversion/utils.h @@ -36,27 +36,29 @@ // For pre-C++11 compatibility diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index 64201641b36..7d4ba65ce38 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -8214,13 +8214,6 @@ mirror: always rust: true -# Whether the `accent-color` css property is enabled. -- name: layout.css.accent-color.enabled - type: RelaxedAtomicBool - value: true - mirror: always - rust: true - # Whether the `color-scheme` css property and meta tags are enabled. - name: layout.css.color-scheme.enabled type: RelaxedAtomicBool @@ -10750,7 +10743,12 @@ # navigator.mediaDevices and getUserMedia() support as well. # See also media.navigator.enabled - name: media.peerconnection.enabled - type: bool + type: RelaxedAtomicBool + value: true + mirror: always + +- name: media.peerconnection.scripttransform.enabled + type: RelaxedAtomicBool value: true mirror: always diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index ff1380f764a..1388c45cd94 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -592,6 +592,10 @@ pref("toolkit.autocomplete.richBoundaryCutoff", 200); pref("toolkit.scrollbox.scrollIncrement", 20); pref("toolkit.scrollbox.clickToScroll.scrollDelay", 150); +pref("toolkit.shopping.useOHTTP", false); +pref("toolkit.shopping.ohttpConfigURL", ""); +pref("toolkit.shopping.ohttpRelayURL", ""); + // Controls logging for Sqlite.sys.mjs. pref("toolkit.sqlitejsm.loglevel", "Error"); diff --git a/netwerk/dns/effective_tld_names.dat b/netwerk/dns/effective_tld_names.dat index a667c91151c..0c7305dd443 100644 --- a/netwerk/dns/effective_tld_names.dat +++ b/netwerk/dns/effective_tld_names.dat @@ -12167,7 +12167,6 @@ iobb.net // Submitted by Ihor Kolodyuk mel.cloudlets.com.au cloud.interhostsolutions.be -users.scale.virtualcloud.com.br mycloud.by alp1.ae.flow.ch appengine.flow.ch @@ -12191,9 +12190,7 @@ ch.trendhosting.cloud de.trendhosting.cloud jele.club amscompute.com -clicketcloud.com dopaas.com -hidora.com paas.hosted-by-previder.com rag-cloud.hosteur.com rag-cloud-ch.hosteur.com @@ -13395,6 +13392,10 @@ myspreadshop.co.uk // Submitted by Jacob Lee api.stdlib.com +// Storipress : https://storipress.com +// Submitted by Benno Liu +storipress.app + // Storj Labs Inc. : https://storj.io/ // Submitted by Philip Hutchins storj.farm diff --git a/netwerk/protocol/http/OHTTPConfigManager.sys.mjs b/netwerk/protocol/http/OHTTPConfigManager.sys.mjs new file mode 100644 index 00000000000..8b61abdf496 --- /dev/null +++ b/netwerk/protocol/http/OHTTPConfigManager.sys.mjs @@ -0,0 +1,42 @@ +/* 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/. */ + +let knownConfigs = new Map(); + +export class OHTTPConfigManager { + static async get(aURL, aOptions = {}) { + try { + let config = await this.#getInternal(aURL, aOptions); + return new Uint8Array(config); + } catch (ex) { + console.error(ex); + return null; + } + } + + static async #getInternal(aURL, aOptions = {}) { + let { maxAge = -1 } = aOptions; + let knownConfig = knownConfigs.get(aURL); + if ( + knownConfig && + (maxAge < 0 || Date.now() - knownConfig.fetchDate < maxAge) + ) { + return knownConfig.config; + } + return this.fetchAndStore(aURL, aOptions); + } + + static async fetchAndStore(aURL, aOptions = {}) { + let fetchDate = Date.now(); + let resp = await fetch(aURL); + if (!resp?.ok) { + throw new Error( + `Fetching OHTTP config from ${aURL} failed with error ${resp.status}` + ); + } + let config = await resp.blob().then(b => b.arrayBuffer()); + knownConfigs.set(aURL, { config, fetchDate }); + return config; + } +} diff --git a/netwerk/protocol/http/moz.build b/netwerk/protocol/http/moz.build index 9f2a2668a47..d37d0855345 100644 --- a/netwerk/protocol/http/moz.build +++ b/netwerk/protocol/http/moz.build @@ -207,6 +207,7 @@ if CONFIG["MOZ_AUTH_EXTENSION"]: ] EXTRA_JS_MODULES += [ + "OHTTPConfigManager.sys.mjs", "WellKnownOpportunisticUtils.sys.mjs", ] diff --git a/netwerk/test/httpserver/httpd.sys.mjs b/netwerk/test/httpserver/httpd.sys.mjs index 69a5b5a42e6..aaaa2be2a9d 100644 --- a/netwerk/test/httpserver/httpd.sys.mjs +++ b/netwerk/test/httpserver/httpd.sys.mjs @@ -2958,7 +2958,12 @@ ServerHandler.prototype = { response.setHeader("Content-Type", type, false); maybeAddInformationalResponse(file, metadata, response); maybeAddHeaders(file, metadata, response); - response.setHeader("Content-Length", "" + count, false); + // Allow overriding Content-Length + try { + response.getHeader("Content-Length"); + } catch (e) { + response.setHeader("Content-Length", "" + count, false); + } let fis = new FileInputStream( file, diff --git a/netwerk/test/unit/test_ohttp_config_manager.js b/netwerk/test/unit/test_ohttp_config_manager.js new file mode 100644 index 00000000000..738d332bee3 --- /dev/null +++ b/netwerk/test/unit/test_ohttp_config_manager.js @@ -0,0 +1,112 @@ +/* Any copyright is dedicated to the Public Domain. +http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +let { OHTTPConfigManager } = ChromeUtils.importESModule( + "resource://gre/modules/OHTTPConfigManager.sys.mjs" +); + +const { HttpServer } = ChromeUtils.importESModule( + "resource://testing-common/httpd.sys.mjs" +); + +let gHttpServer; +let gValidRequestCount = 0; +let gFickleIsWorking = true; + +add_setup(async function () { + gHttpServer = new HttpServer(); + let invalidHandler = (req, res) => { + res.setStatusLine(req.httpVersion, 500, "Oh no, it broke"); + res.write("Uh oh, it broke."); + }; + let validHandler = (req, res) => { + res.setHeader("Content-Type", "application/ohttp-keys"); + res.write("1234"); + gValidRequestCount++; + }; + + gHttpServer.registerPathHandler("/.wellknown/invalid", invalidHandler); + gHttpServer.registerPathHandler("/.wellknown/valid", validHandler); + + gHttpServer.registerPathHandler("/.wellknown/fickle", (req, res) => { + if (gFickleIsWorking) { + return validHandler(req, res); + } + return invalidHandler(req, res); + }); + + gHttpServer.start(-1); +}); + +function getLocalURL(path) { + return `http://localhost:${gHttpServer.identity.primaryPort}/.wellknown/${path}`; +} + +add_task(async function test_broken_url_returns_null() { + Assert.equal(await OHTTPConfigManager.get(getLocalURL("invalid")), null); +}); + +add_task(async function test_working_url_returns_data() { + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("valid")), + new TextEncoder().encode("1234") + ); +}); + +add_task(async function test_we_only_request_once() { + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("valid")), + new TextEncoder().encode("1234") + ); + let oldRequestCount = gValidRequestCount; + + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("valid")), + new TextEncoder().encode("1234") + ); + Assert.equal( + oldRequestCount, + gValidRequestCount, + "Shouldn't have made another request." + ); +}); + +add_task(async function test_maxAge_forces_refresh() { + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("valid")), + new TextEncoder().encode("1234") + ); + let oldRequestCount = gValidRequestCount; + + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("valid"), { maxAge: 0 }), + new TextEncoder().encode("1234") + ); + Assert.equal( + oldRequestCount + 1, + gValidRequestCount, + "Should have made another request due to maxAge." + ); +}); + +add_task(async function test_maxAge_handling_of_invalid_requests() { + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("fickle")), + new TextEncoder().encode("1234") + ); + + gFickleIsWorking = false; + + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("fickle"), { maxAge: 0 }), + null + ); + + Assert.deepEqual( + await OHTTPConfigManager.get(getLocalURL("fickle")), + new TextEncoder().encode("1234"), + "Should still have the cached config if no max age is passed." + ); +}); diff --git a/netwerk/test/unit/xpcshell.ini b/netwerk/test/unit/xpcshell.ini index caa85928bf4..f485f63d3a8 100644 --- a/netwerk/test/unit/xpcshell.ini +++ b/netwerk/test/unit/xpcshell.ini @@ -39,6 +39,7 @@ prefs = dom.serviceWorkers.enabled=true network.allow_redirect_to_data=true +[test_ohttp_config_manager.js] [test_trr_nat64.js] run-sequentially = node server exceptions dont replay well [test_nsIBufferedOutputStream_writeFrom_block.js] diff --git a/netwerk/wifi/nsWifiMonitor.cpp b/netwerk/wifi/nsWifiMonitor.cpp index 51bc16e1621..19003b44949 100644 --- a/netwerk/wifi/nsWifiMonitor.cpp +++ b/netwerk/wifi/nsWifiMonitor.cpp @@ -248,14 +248,12 @@ nsresult nsWifiMonitor::DispatchScanToBackgroundThread(uint64_t aPollingId, #else // If this ASSERT fails, we've increased our default stack size and // may no longer need to special-case the stack size on macOS. - static_assert(kMacOS13MonitorStackSize > + static_assert(kMacOSWifiMonitorStackSize > nsIThreadManager::DEFAULT_STACK_SIZE); // Mac needs a stack size larger than the default for CoreWLAN. nsIThreadManager::ThreadCreationOptions options = { - .stackSize = nsCocoaFeatures::OnVenturaOrLater() - ? kMacOS13MonitorStackSize - : nsIThreadManager::DEFAULT_STACK_SIZE}; + .stackSize = kMacOSWifiMonitorStackSize}; #endif nsresult rv = NS_NewNamedThread("Wifi Monitor", getter_AddRefs(mThread), diff --git a/netwerk/wifi/nsWifiMonitor.h b/netwerk/wifi/nsWifiMonitor.h index f595e06aab4..5a37cc75be0 100644 --- a/netwerk/wifi/nsWifiMonitor.h +++ b/netwerk/wifi/nsWifiMonitor.h @@ -33,9 +33,9 @@ class nsWifiAccessPoint; #define WIFI_SCAN_INTERVAL_MS_PREF "network.wifi.scanning_period" #ifdef XP_MACOSX -// Use a larger stack size for the monitor thread on macOS 13+ -// to accommodate Core WLAN making large stack allocations. -# define kMacOS13MonitorStackSize (512 * 1024) +// Use a larger stack size for the wifi monitor thread of macOS, to +// accommodate Core WLAN making large stack allocations. +# define kMacOSWifiMonitorStackSize (512 * 1024) #endif struct WifiListenerHolder { diff --git a/python/mozbuild/mozbuild/configure/help.py b/python/mozbuild/mozbuild/configure/help.py index bfd5e6ad6d0..132e61deb97 100644 --- a/python/mozbuild/mozbuild/configure/help.py +++ b/python/mozbuild/mozbuild/configure/help.py @@ -19,15 +19,38 @@ class HelpFormatter(object): if option.possible_origins == ("implied",): # Don't display help if our option can only be implied. return - self.options.append(option) + if ( + option.default + and len(option.default) == 0 + and option.choices + and option.nargs in ("?", "*") + ): + # Uncommon case where the option defaults to an enabled value, + # but can take values. The help should mention both the disabling + # flag and the enabling flag that takes values. + # Because format_options_by_category does not handle the original + # Option very well, we create two fresh ones for what should appear + # in the help. + option_1 = Option( + option.option, + default=False, + choices=option.choices, + help=option.help, + define_depth=1, + ) + option_2 = Option( + option.option, default=True, help=option.help, define_depth=1 + ) + self.options.append(option_1) + self.options.append(option_2) + else: + self.options.append(option) def format_options_by_category(self, options_by_category): ret = [] - for category, options in sorted( - options_by_category.items(), key=lambda x: x[0] - ): + for category, options in options_by_category.items(): ret.append(" " + category + ":") - for option in sorted(options, key=lambda opt: opt.option): + for option in options: opt = option.option if option.choices: opt += "={%s}" % ",".join(option.choices) @@ -76,15 +99,23 @@ class HelpFormatter(object): for option in self.options: target = options_by_category if option.name else env_by_category target[option.category].append(option) - options_formatted = [ - "Options: [defaults in brackets after descriptions]" - ] + self.format_options_by_category(options_by_category) - env_formatted = ["Environment variables:"] + self.format_options_by_category( - env_by_category - ) + if options_by_category: + options_formatted = [ + "Options: [defaults in brackets after descriptions]" + ] + self.format_options_by_category(options_by_category) + else: + options_formatted = [] + if env_by_category: + env_formatted = [ + "Environment variables:" + ] + self.format_options_by_category(env_by_category) + else: + env_formatted = [] print( "\n\n".join( - "\n".join(t) for t in (self.intro, options_formatted, env_formatted) + "\n".join(t) + for t in (self.intro, options_formatted, env_formatted) + if t ), file=out, ) diff --git a/python/mozbuild/mozbuild/configure/lint.py b/python/mozbuild/mozbuild/configure/lint.py index 359b148cc6e..c6bda9a540e 100644 --- a/python/mozbuild/mozbuild/configure/lint.py +++ b/python/mozbuild/mozbuild/configure/lint.py @@ -219,17 +219,15 @@ class LintSandbox(ConfigureSandbox): return result def _check_option(self, option, *args, **kwargs): - if "default" not in kwargs: - return if len(args) == 0: return self._check_prefix_for_bool_option(*args, **kwargs) - self._check_help_for_option_with_func_default(option, *args, **kwargs) + self._check_help_for_option(option, *args, **kwargs) def _check_prefix_for_bool_option(self, *args, **kwargs): name = args[0] - default = kwargs["default"] + default = kwargs.get("default") if type(default) != bool: return @@ -261,17 +259,27 @@ class LintSandbox(ConfigureSandbox): ) self._raise_from(e, frame.f_back if frame else None) - def _check_help_for_option_with_func_default(self, option, *args, **kwargs): - default = kwargs["default"] - - if not isinstance(default, SandboxDependsFunction): - return - + def _check_help_for_option(self, option, *args, **kwargs): if not option.prefix: return - default = self._resolve(default) - if type(default) is str: + check = None + + default = kwargs.get("default") + if isinstance(default, SandboxDependsFunction): + default = self._resolve(default) + if type(default) is not str: + check = "of non-constant default" + + if ( + option.default + and len(option.default) == 0 + and option.choices + and option.nargs in ("?", "*") + ): + check = "it can be both disabled and enabled with an optional value" + + if not check: return help = kwargs["help"] @@ -287,9 +295,7 @@ class LintSandbox(ConfigureSandbox): frame = inspect.currentframe() while frame and frame.f_code.co_name != self.option_impl.__name__: frame = frame.f_back - e = ConfigureError( - '`help` should contain "{}" because of non-constant default'.format(rule) - ) + e = ConfigureError('`help` should contain "{}" because {}'.format(rule, check)) self._raise_from(e, frame.f_back if frame else None) def unwrap(self, func): diff --git a/python/mozbuild/mozbuild/configure/options.py b/python/mozbuild/mozbuild/configure/options.py index 266c83e8904..874f4cad740 100644 --- a/python/mozbuild/mozbuild/configure/options.py +++ b/python/mozbuild/mozbuild/configure/options.py @@ -320,7 +320,7 @@ class Option(object): self.nargs = nargs has_choices = choices is not None if isinstance(self.default, PositiveOptionValue): - if has_choices and len(self.default) == 0: + if has_choices and len(self.default) == 0 and nargs not in ("?", "*"): raise InvalidOptionError( "A `default` must be given along with `choices`" ) diff --git a/python/mozbuild/mozbuild/test/configure/data/moz.configure b/python/mozbuild/mozbuild/test/configure/data/moz.configure index 4d57eabbb92..3a7d84b0e3a 100644 --- a/python/mozbuild/mozbuild/test/configure/data/moz.configure +++ b/python/mozbuild/mozbuild/test/configure/data/moz.configure @@ -13,6 +13,9 @@ option("--enable-with-env", env="MOZ_WITH_ENV", help="Enable with env") # Optional values option("--enable-values", nargs="*", help="Enable values") +# Optional values from a set of choices +option("--enable-choices", nargs="*", choices=("a", "b", "c"), help="Enable choices") + # Everything supported in the Option class is supported in option(). Assume # the tests of the Option class are extensive about this. @@ -117,6 +120,18 @@ def default(value): set_config("DEFAULTED", default) +@depends("--enable-simple") +def other_default(simple): + return bool(simple) + + +# When the default comes from the result of a @depends function, the help +# string can be picked between two variants automatically. +option( + "--with-other-default", default=other_default, help="{With|Without} other default" +) + + @depends("--enable-values") def choices(values): if len(values): @@ -136,9 +151,23 @@ def returned_choices(values): set_config("CHOICES", returned_choices) +# Unusual case: an option can default to enabled, but still allow for optional +# values. In that case, both --disable and --enable options will be shown in +# configure --help, and the help message needs to include both variants. +option("--disable-foo", nargs="*", choices=("x", "y"), help="{Enable|Disable} Foo") + + # All options must be referenced by some @depends function. # It is possible to depend on multiple options/functions -@depends("--without-thing", "--with-stuff", with_env4, "--option") +@depends( + "--without-thing", + "--with-stuff", + with_env4, + "--option", + "--enable-choices", + "--with-other-default", + "--disable-foo", +) def remainder(*args): return args diff --git a/python/mozbuild/mozbuild/test/configure/test_configure.py b/python/mozbuild/mozbuild/test/configure/test_configure.py index 110e5db3a33..418c235abe7 100644 --- a/python/mozbuild/mozbuild/test/configure/test_configure.py +++ b/python/mozbuild/mozbuild/test/configure/test_configure.py @@ -57,6 +57,9 @@ class TestConfigure(unittest.TestCase): NegativeOptionValue(), NegativeOptionValue(), NegativeOptionValue(), + NegativeOptionValue(), + NegativeOptionValue(), + PositiveOptionValue(), ), "SIMPLE": NegativeOptionValue(), "VALUES": NegativeOptionValue(), @@ -79,21 +82,69 @@ class TestConfigure(unittest.TestCase): " Help options:\n" " --help print this message\n" "\n" + " Options from python/mozbuild/mozbuild/test/configure/data/moz.configure:\n" + " --enable-simple Enable simple\n" + " --enable-with-env Enable with env\n" + " --enable-values Enable values\n" + " --enable-choices={a,b,c} Enable choices\n" + " --without-thing Build without thing\n" + " --with-stuff Build with stuff\n" + " --option Option\n" + " --with-returned-default Returned default [not-simple]\n" + " --with-other-default With other default\n" + " --returned-choices Choices\n" + " --enable-foo={x,y} Enable Foo\n" + " --disable-foo Disable Foo\n" + " --enable-include Include\n" + " --with-imports Imports\n" + " --indirect-option Indirectly defined option\n" + "\n" " Options from python/mozbuild/mozbuild/test/configure/data/included.configure:\n" - " --enable-imports-in-template\n Imports in template\n" + " --enable-imports-in-template\n" + " Imports in template\n" + "\n" + "\n" + "Environment variables:\n" + " Options from python/mozbuild/mozbuild/test/configure/data/moz.configure:\n" + " CC C Compiler\n" + "\n", + help.replace("\\", "/"), + ) + + help, config = self.get_config( + ["--help", "--enable-simple", "--enable-values=numeric"], prog="configure" + ) + + self.assertEqual({}, config) + self.maxDiff = None + self.assertEqual( + "Usage: configure [options]\n" + "\n" + "Options: [defaults in brackets after descriptions]\n" + " Help options:\n" + " --help print this message\n" "\n" " Options from python/mozbuild/mozbuild/test/configure/data/moz.configure:\n" - " --enable-include Include\n" " --enable-simple Enable simple\n" - " --enable-values Enable values\n" " --enable-with-env Enable with env\n" - " --indirect-option Indirectly defined option\n" - " --option Option\n" - " --returned-choices Choices\n" - " --with-imports Imports\n" - " --with-returned-default Returned default [not-simple]\n" - " --with-stuff Build with stuff\n" + " --enable-values Enable values\n" + " --enable-choices={a,b,c} Enable choices\n" " --without-thing Build without thing\n" + " --with-stuff Build with stuff\n" + " --option Option\n" + " --with-returned-default Returned default [simple]\n" + " --without-other-default Without other default\n" + " --returned-choices={0,1,2}\n" + " Choices\n" + " --enable-foo={x,y} Enable Foo\n" + " --disable-foo Disable Foo\n" + " --enable-include Include\n" + " --with-imports Imports\n" + " --indirect-option Indirectly defined option\n" + "\n" + " Options from python/mozbuild/mozbuild/test/configure/data/included.configure:\n" + " --enable-imports-in-template\n" + " Imports in template\n" "\n" "\n" "Environment variables:\n" @@ -1228,8 +1279,6 @@ class TestConfigure(unittest.TestCase): Options from python/mozbuild/mozbuild/test/configure/data/moz.configure: --with-foo foo - - Environment variables: """ ), ) @@ -1249,8 +1298,6 @@ class TestConfigure(unittest.TestCase): --with-foo foo --with-qux qux - - Environment variables: """ ), ) diff --git a/python/mozbuild/mozbuild/test/configure/test_lint.py b/python/mozbuild/mozbuild/test/configure/test_lint.py index 5524f3a7010..5c54af84f56 100644 --- a/python/mozbuild/mozbuild/test/configure/test_lint.py +++ b/python/mozbuild/mozbuild/test/configure/test_lint.py @@ -430,6 +430,29 @@ class TestLint(unittest.TestCase): "non-constant default", ) + def test_dual_help(self): + # Help text for an option that can be both disabled and enabled with an + # optional value should contain {enable|disable} rule. + with self.moz_configure( + """ + option('--disable-bar', nargs="*", choices=("a", "b"), + help='{Enable|Disable} bar') + """ + ): + self.lint_test() + with self.assertRaisesFromLine(ConfigureError, 2) as e: + with self.moz_configure( + """ + option('--disable-bar', nargs="*", choices=("a", "b"), help='Enable bar') + """ + ): + self.lint_test() + self.assertEqual( + str(e.exception), + '`help` should contain "{Enable|Disable}" because it ' + "can be both disabled and enabled with an optional value", + ) + def test_large_offset(self): with self.assertRaisesFromLine(ConfigureError, 375): with self.moz_configure( diff --git a/python/mozbuild/mozbuild/test/configure/test_options.py b/python/mozbuild/mozbuild/test/configure/test_options.py index 59ba616355a..91f29680232 100644 --- a/python/mozbuild/mozbuild/test/configure/test_options.py +++ b/python/mozbuild/mozbuild/test/configure/test_options.py @@ -254,6 +254,17 @@ class TestOption(unittest.TestCase): self.assertTrue(value) self.assertEqual(PositiveOptionValue(("b", "a")), value) + # Default is enabled without a value, but the option can be also be disabled or + # used with a value. + option = Option("--without-option", nargs="*", choices=("a", "b")) + value = option.get_value("--with-option") + self.assertEqual(PositiveOptionValue(), value) + value = option.get_value("--with-option=a") + self.assertEqual(PositiveOptionValue(("a",)), value) + with self.assertRaises(InvalidOptionError) as e: + option.get_value("--with-option=c") + self.assertEqual(str(e.exception), "'c' is not one of 'a', 'b'") + # Test nargs inference from choices option = Option("--with-option", choices=("a", "b")) self.assertEqual(option.nargs, 1) diff --git a/python/sites/mach.txt b/python/sites/mach.txt index 3b410a0a887..c7100b92f98 100644 --- a/python/sites/mach.txt +++ b/python/sites/mach.txt @@ -59,15 +59,18 @@ pth:testing/xpcshell vendored:third_party/python/aiohttp vendored:third_party/python/ansicon vendored:third_party/python/appdirs +vendored:third_party/python/arrow vendored:third_party/python/async_timeout vendored:third_party/python/attrs vendored:third_party/python/blessed +vendored:third_party/python/binaryornot vendored:third_party/python/cbor2 vendored:third_party/python/certifi vendored:third_party/python/chardet vendored:third_party/python/click vendored:third_party/python/colorama vendored:third_party/python/compare_locales +vendored:third_party/python/cookiecutter vendored:third_party/python/cookies vendored:third_party/python/cram vendored:third_party/python/diskcache @@ -84,6 +87,7 @@ vendored:third_party/python/idna vendored:third_party/python/importlib_metadata vendored:third_party/python/importlib_resources vendored:third_party/python/Jinja2 +vendored:third_party/python/jinja2_time vendored:third_party/python/jinxed vendored:third_party/python/jsmin vendored:third_party/python/json-e @@ -106,6 +110,8 @@ vendored:third_party/python/pylru vendored:third_party/python/pyparsing vendored:third_party/python/pyrsistent vendored:third_party/python/python-hglib +vendored:third_party/python/python_dateutil +vendored:third_party/python/python_slugify vendored:third_party/python/PyYAML/lib vendored:third_party/python/redo vendored:third_party/python/requests @@ -119,6 +125,7 @@ vendored:third_party/python/slugid vendored:third_party/python/taskcluster vendored:third_party/python/taskcluster_taskgraph vendored:third_party/python/taskcluster_urls +vendored:third_party/python/text_unidecode vendored:third_party/python/toml vendored:third_party/python/tqdm vendored:third_party/python/typing_extensions diff --git a/remote/shared/test/browser/browser_NavigationManager_no_navigation.js b/remote/shared/test/browser/browser_NavigationManager_no_navigation.js index 46d34504b23..a429e373a53 100644 --- a/remote/shared/test/browser/browser_NavigationManager_no_navigation.js +++ b/remote/shared/test/browser/browser_NavigationManager_no_navigation.js @@ -27,16 +27,19 @@ add_task(async function testDocumentOpenWriteClose() { is(events.length, 0, "No event recorded"); info("Replace the document"); - SpecialPowers.spawn(browser, [], () => { + await SpecialPowers.spawn(browser, [], async () => { // Note: we need to use eval here to have reduced permissions and avoid // security errors. content.eval(` document.open(); - document.write("

Replaced

"); + document.write("

Replaced

"); document.close(); `); + + await ContentTaskUtils.waitForCondition(() => + content.document.querySelector(".replaced") + ); }); - await wait(500); // See Bug 1844517. // document.open/write/close is identical to same-url + same-hash navigations. @@ -53,9 +56,3 @@ add_task(async function testDocumentOpenWriteClose() { navigationManager.off("navigation-stopped", onEvent); navigationManager.stopMonitoring(); }); - -function wait(ms) { - info(`Wait for ${ms} milliseconds`); - // eslint-disable-next-line mozilla/no-arbitrary-setTimeout - return new Promise(r => setTimeout(r, ms)); -} diff --git a/remote/webdriver-bidi/modules/root/browsingContext.sys.mjs b/remote/webdriver-bidi/modules/root/browsingContext.sys.mjs index 4baf4fc665e..da325e29898 100644 --- a/remote/webdriver-bidi/modules/root/browsingContext.sys.mjs +++ b/remote/webdriver-bidi/modules/root/browsingContext.sys.mjs @@ -969,17 +969,73 @@ class BrowsingContextModule extends Module { ); }; + #onLocationChange = async (eventName, data) => { + const { id, navigableId, url } = data; + const context = this.#getBrowsingContext(navigableId); + + if (this.#subscribedEvents.has("browsingContext.fragmentNavigated")) { + const contextInfo = { + contextId: context.id, + type: lazy.WindowGlobalMessageHandler.type, + }; + this.emitEvent( + "browsingContext.fragmentNavigated", + { + context: navigableId, + navigation: id, + timestamp: Date.now(), + url, + }, + contextInfo + ); + } + }; + + #startListeningLocationChanged() { + if (!this.#subscribedEvents.has("browsingContext.fragmentNavigated")) { + this.messageHandler.navigationManager.on( + "location-changed", + this.#onLocationChange + ); + } + } + + #stopListeningLocationChanged() { + if (this.#subscribedEvents.has("browsingContext.fragmentNavigated")) { + this.messageHandler.navigationManager.off( + "location-changed", + this.#onLocationChange + ); + } + } + #subscribeEvent(event) { - if (event === "browsingContext.contextCreated") { - this.#contextListener.startListening(); - this.#subscribedEvents.add(event); + switch (event) { + case "browsingContext.contextCreated": { + this.#contextListener.startListening(); + this.#subscribedEvents.add(event); + break; + } + case "browsingContext.fragmentNavigated": { + this.#startListeningLocationChanged(); + this.#subscribedEvents.add(event); + break; + } } } #unsubscribeEvent(event) { - if (event === "browsingContext.contextCreated") { - this.#contextListener.stopListening(); - this.#subscribedEvents.delete(event); + switch (event) { + case "browsingContext.contextCreated": { + this.#contextListener.stopListening(); + this.#subscribedEvents.delete(event); + break; + } + case "browsingContext.fragmentNavigated": { + this.#stopListeningLocationChanged(); + this.#subscribedEvents.delete(event); + break; + } } } @@ -1016,6 +1072,7 @@ class BrowsingContextModule extends Module { return [ "browsingContext.contextCreated", "browsingContext.domContentLoaded", + "browsingContext.fragmentNavigated", "browsingContext.load", ]; } diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index f10632f4b80..95f074a8399 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -879,4 +879,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1698058110333000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1698316881393000); diff --git a/security/manager/ssl/nsSTSPreloadList.inc b/security/manager/ssl/nsSTSPreloadList.inc index 3074d7a151c..5f02835e087 100644 --- a/security/manager/ssl/nsSTSPreloadList.inc +++ b/security/manager/ssl/nsSTSPreloadList.inc @@ -8,7 +8,7 @@ /*****************************************************************************/ #include -const PRTime gPreloadListExpirationTime = INT64_C(1700477304836000); +const PRTime gPreloadListExpirationTime = INT64_C(1700736075049000); %% 0--1.de, 1 0-0.io, 1 @@ -380,7 +380,6 @@ const PRTime gPreloadListExpirationTime = INT64_C(1700477304836000); 0q0.eu, 1 0r3.de, 1 0rap.tk, 1 -0safar.ir, 1 0system.tk, 1 0trust.cloud, 1 0trust.pro, 1 @@ -2216,6 +2215,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1700477304836000); 262569.com, 1 263email.com, 1 263mail.com, 1 +267326.com, 1 268162.com, 1 269196.com, 1 2698pacificave.com, 1 @@ -2245,6 +2245,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1700477304836000); 284365.com, 1 285128.com, 1 285928.com, 1 +287328.com, 1 287628.com, 1 2881dh.com, 1 288628.com, 1 @@ -4956,6 +4957,7 @@ const PRTime gPreloadListExpirationTime = INT64_C(1700477304836000); 82365z.com, 1 825382.com, 1 826282.com, 1 +826382.com, 1 82781111.com, 0 82783333.com, 0 82784444.com, 0 @@ -7216,7 +7218,7 @@ abigailstark.com, 1 abigisp.com, 1 abigruppe.de, 1 abileneef.org, 1 -abilenemachine.com, 0 +abilenemachine.com, 1 abilities-inc.jp, 1 abilityone.gov, 1 abilix.tk, 1 @@ -7524,6 +7526,7 @@ acaeum.com, 0 acafellas.com, 1 acalcio.ga, 1 acallawayroofing.com, 1 +acaltair.com, 1 acandroid.top, 1 acani.xyz, 1 acaonegocios.com.br, 1 @@ -8474,6 +8477,7 @@ adultdvdparadise.com, 1 adulteducation.org.uk, 1 adultforum.gr, 1 adultgames.pro, 1 +adultmalecontent.com, 1 adultshop.com.au, 0 adultwebcams1.com, 1 adurra.com, 1 @@ -8523,7 +8527,6 @@ advanceoptical.com, 1 advanceworx.com, 1 advania.info, 1 advanqi.se, 1 -advantagehomeexteriors.com, 1 advantagehomeinteriors.com, 1 advantagemechanicalinc.com, 1 advantageroofer.com, 1 @@ -8591,7 +8594,6 @@ advicepay.com, 1 adviceprime.tk, 1 adviesfactuur.nl, 1 adviesgv.nl, 1 -advinans.se, 1 advinix.fr, 1 advirk.tk, 1 advisercentre.com.au, 1 @@ -8926,7 +8928,6 @@ afiyetolsun.jp, 1 aflam-online.tk, 1 aflattr.com, 1 aflebedevo.tk, 1 -afoikrali.gr, 1 aforadearrastu.tk, 1 aforism.tk, 1 afp548.com, 1 @@ -10602,6 +10603,7 @@ albertpedersen.com, 1 alberts-blatt.de, 0 albertspahiu.tk, 1 alberttwpmi.gov, 1 +albertvillemn.gov, 1 albeso.ml, 1 albhof-wasserfall.de, 1 albi-tourisme.fr, 1 @@ -10931,7 +10933,6 @@ alfateks.com.ua, 1 alfavipambulans.com, 1 alfavit.cf, 1 alfawedding.com, 1 -alfiebarker.com, 1 alfonso-baya.tk, 1 alfonsostriano.it, 1 alforto.nl, 0 @@ -10996,7 +10997,6 @@ aliakpoyraz.com, 1 alialkurdy.tk, 1 aliamakeup.com, 1 aliancadesentupidora.com.br, 1 -aliancatrainingcenter.online, 1 alianet.org, 1 aliantsoft.pl, 1 aliasbox.ovh, 1 @@ -11113,7 +11113,6 @@ alitajran.com, 1 alitec.it, 1 alitpedia.ga, 1 alittledelightful.com, 1 -aliud.be, 1 aliv.biz, 1 alivecast.co.jp, 1 alix-board.de, 1 @@ -12022,6 +12021,7 @@ amagdic.com, 1 amagical.net, 0 amagraduates.tk, 1 amagroup.io, 1 +amaisd.org, 1 amaiz.com, 1 amalbansode.com, 1 amalfi5stars.com, 1 @@ -12640,6 +12640,7 @@ anarchie-in-lippe.tk, 1 anarchie.tk, 1 anarchista.top, 1 anarchistfederation.net, 1 +anarchistischefoderation.de, 1 anarchistischegroepnijmegen.nl, 0 anarchistos.tk, 1 anarchotv.tk, 1 @@ -13478,6 +13479,7 @@ anorexia-nervosa.tk, 1 anoservices.co.uk, 1 another.ch, 1 anotherfatgeek.net, 1 +anotherinvest.pl, 1 anothermilan.net, 1 anothermusic.tk, 1 anotheronedead.tk, 1 @@ -13542,7 +13544,6 @@ antalyahomes.com, 1 antalyamasajsalonu.gq, 1 antama.eu, 1 antama.nl, 1 -antanavagefarbiarz.com, 1 antani.cloud, 1 antarcti.co, 1 antarctida.tk, 1 @@ -13760,6 +13761,7 @@ antota.lt, 1 antragsgruen.de, 1 antraxx.ee, 1 antrimnh.gov, 1 +antrodiulisse.eu, 0 antropico.com, 1 antroposboutique.it, 1 antroposofica.com.br, 1 @@ -13976,7 +13978,6 @@ apercloud.es, 1 aperioadvice.ga, 1 aperiomoney.ga, 1 aperiotaxation.ga, 1 -apert.be, 1 aperta.ro, 1 aperta.shop, 1 apertis.org, 0 @@ -14463,7 +14464,6 @@ aquacitylands.com, 1 aquaconcepts.be, 1 aquadarts.tk, 1 aquadecor.cf, 1 -aquadonis.ch, 0 aquadrom.cz, 1 aquaexpo.com.ec, 1 aquafc.com, 1 @@ -14557,7 +14557,6 @@ arabictranslation.tk, 1 arabicxz.com, 1 arabigolestan.tk, 1 arabmusic.tk, 1 -arabpure.com, 1 arabschools.edu.sa, 1 arabseed.cf, 1 arabska.tk, 1 @@ -15153,7 +15152,7 @@ arnoweterings.nl, 1 arnstein.it, 1 arny.ru, 1 aroablog.tk, 1 -arobaz-informatique.org, 1 +arobaz-informatique.org, 0 arockets.ru, 1 arod.tk, 1 arofabric.com, 1 @@ -15563,7 +15562,6 @@ arzinfo.pw, 1 arzmercury.tk, 1 arztpraxis-kubalok.de, 1 arzua.gal, 1 -as-aeu-ecp-dev-ecomeeting.azurewebsites.net, 1 as-aeu-ecp-qas-ecomeeting.azurewebsites.net, 1 as.roma.it, 1 as136964.com, 1 @@ -17318,7 +17316,6 @@ av163.cc, 1 ava-creative.de, 0 ava-sky.ga, 1 ava-software.at, 1 -ava.exposed, 1 ava360.com, 1 avaaddamspornstar.com, 1 avaamo.com, 1 @@ -17450,7 +17447,6 @@ avi9526.pp.ua, 1 avia-krasnoyarsk.ru, 0 avia-ufa.ru, 0 aviabilet.tk, 1 -aviacao.pt, 0 aviandirectory.uk, 1 avianotravel.com, 1 aviaphoto.tk, 1 @@ -18318,7 +18314,7 @@ babuccu.com, 1 baburhat.tk, 1 babursahvizeofisi.com, 1 babushkin-mir.tk, 1 -baby-bath-tub.com, 0 +baby-bath-tub.com, 1 baby-doll.tk, 1 baby-massage.tk, 1 baby-skin-care.ga, 1 @@ -18842,7 +18838,6 @@ ballpythonsaspets.com, 1 ballroompages.com, 1 balls.zone, 1 balluncar.tk, 1 -balmofgilead.org.uk, 1 balneariodearchena.com, 1 baloch-intelligence.tk, 1 balochism.tk, 1 @@ -18981,7 +18976,6 @@ banglargolpo.tk, 1 banglatec.tk, 1 banglatypography.com, 1 banglets.com, 1 -bangorfederal.com, 1 bangsparks.com, 1 bangujero.tk, 1 bangyu.wang, 1 @@ -19275,7 +19269,6 @@ barricader.network, 1 barrierefreie-medien.info, 1 barrierpestservices.com, 1 barrikade.tk, 1 -barrilito.com.mx, 1 barro.ga, 1 barruntos.tk, 1 barrydenicola.com, 1 @@ -19481,6 +19474,7 @@ bateaux-sans-permis.com, 0 batelco.com, 1 baterias.com, 1 baterioverolety.cz, 1 +batescountymo.gov, 1 batesvillearkansas.gov, 1 batextiles.tk, 1 bath.limited, 1 @@ -19893,7 +19887,6 @@ beacinsight.com, 1 beaconfed.org, 1 beaconhealthoptions.com, 1 beaconhouse.org.uk, 1 -beaconmm.com, 1 beaconny.gov, 1 beaconstac.com, 1 beadaptive.ca, 1 @@ -20195,7 +20188,6 @@ beersheba.co.il, 1 beersheva.city, 1 beersheva.co.il, 1 beerview.ga, 1 -beerwallpa.com, 1 beerxa.cz, 1 beescloud.com, 1 beesco.us, 1 @@ -20249,6 +20241,7 @@ behaving.tk, 1 behaviorchangeimpact.org, 1 behead.de, 1 behealthoncologia.com, 1 +behealthpr.com, 1 behealthyeveryday.eu, 1 behemoth.cf, 1 beherit.pl, 1 @@ -20426,6 +20419,7 @@ bellacasarealtyaz.com, 1 belladeluxxe.net, 1 bellafashion.tk, 1 bellaflor.net, 1 +bellaireroofinginc.com, 1 bellamodeling.com, 1 bellamy.cloud, 1 bellamy.md, 1 @@ -20495,6 +20489,7 @@ beltramifashion.be, 1 belug.de, 1 belugadev.ml, 1 belveb24.by, 1 +belvidereil.gov, 1 belviderepoliceil.gov, 1 belvideretownshipmi.gov, 1 belvitajoreggelt.hu, 1 @@ -20680,6 +20675,7 @@ bentleyks.gov, 1 bento-kurumaya.co.jp, 1 bentoncountyia.gov, 1 bentoncountyor.gov, 1 +bentoncountywa.gov, 1 bentongroup.co.uk, 1 bentonvillemedia.com, 1 bentonvilleppc.com, 1 @@ -21534,7 +21530,6 @@ betish.tk, 1 betkorea1.com, 1 betleakbot.com, 1 betmobilenigeria.com, 1 -betnation.win, 0 betobaccofree.gov, 1 betolerant.fr, 1 beton-vloer.nl, 1 @@ -22427,6 +22422,7 @@ biocarbonregistry.com, 1 biocentricinc.com, 1 biochart.ga, 1 biocheminee.com, 1 +bioclaudia.it, 1 biocrafting.net, 0 biocybernaut.com, 1 biodaan.com, 1 @@ -22965,7 +22961,6 @@ bizzvisor.site, 0 bizzybee.buzz, 1 bizzysites.gr, 1 bj-caffe.tk, 1 -bja.gov, 1 bjargradakerfi.is, 1 bjarnerest.de, 0 bjarno.xyz, 1 @@ -23768,7 +23763,6 @@ bluecrossmn.com, 1 blued.moe, 1 bluedeck.org, 1 bluedivision.tk, 1 -bluedog-security.com, 1 bluedotsigns.com, 1 blueenergy.tk, 1 blueeyesworld.tk, 1 @@ -24051,7 +24045,7 @@ bobstronomie.fr, 1 bobvincent.com, 1 bocaaboca.ml, 1 bocabeats.tk, 1 -bocada.com, 1 +bocada.com, 0 bocahkampus.com, 1 bocal.cf, 1 bocamo.it, 1 @@ -24171,7 +24165,6 @@ bojoproductions.tk, 1 bokadoktorn.se, 1 bokaldo.com, 1 bokatas.tk, 1 -boke.one, 0 boke112.com, 1 bokehandbows.ca, 1 bokhaldari.is, 1 @@ -24390,7 +24383,6 @@ book-excursion.com, 1 book-in-hotel.com, 1 book-online.tk, 1 book-sites.cf, 1 -bookaflightdeals.com, 1 bookameeting.se, 1 bookb.com, 1 bookbazar.co.in, 1 @@ -25589,7 +25581,7 @@ bringfido.com, 1 bringform.ml, 1 bringonbusiness.com, 1 brinker.com, 1 -brinkhu.is, 1 +brinkhu.is, 0 brinksurl.com, 1 brinokidzonline.tk, 1 brio-shop.ch, 1 @@ -26259,7 +26251,6 @@ bugwie.com, 1 bugzilla.mozilla.org, 1 buharkeyf1.com, 1 buhayprincipal.com, 1 -buhaystudent.com, 1 buhsantoandre.vip, 1 buhunov.tk, 1 buick1958.tk, 1 @@ -26288,6 +26279,7 @@ buildingmaterials.tk, 1 buildingpassport.com, 1 buildingpoint.pt, 1 buildingpointne.com, 1 +buildingprojectsswanseama.gov, 1 buildingqueries.com, 1 buildingresiliency.org, 1 buildit.se, 1 @@ -27049,7 +27041,6 @@ buymetforminonline.tk, 1 buymobic.ml, 1 buymyvoip.com, 1 buyneurontin.ml, 1 -buyonlineclass.com, 1 buyonmov.online, 1 buyorbye.com.au, 1 buyornot.tk, 1 @@ -27811,7 +27802,6 @@ calendarsnow.com, 1 calendly.com, 1 calendriergn.ch, 1 calendriergratuit.fr, 1 -calendum.ru, 1 caletka.cz, 1 caletka.nl, 1 calgarydermatologisters.ga, 1 @@ -27849,7 +27839,7 @@ calisteniaperu.ga, 1 calisthenicroutines.com, 1 calitateavietii-ardeal.ro, 1 call.me, 1 -call2counter.com, 1 +call2counter.com, 0 calla.pl, 1 callabs.net, 1 callamnow.com, 1 @@ -27919,6 +27909,7 @@ calvario.tk, 1 calvaryhospital.org, 1 calverleyparish.church, 1 calvertcityky.gov, 1 +calverttx.gov, 1 calvin.my, 1 calvusconsultancy.nl, 1 calwildgarden.com, 1 @@ -28311,7 +28302,6 @@ cannabislegality.info, 1 cannabisoffers.net, 1 cannabisreports.org, 1 cannabistraininguniversity.com, 1 -cannabitimes.com, 1 cannabiz.tk, 1 cannabytes.net, 1 cannacards.ca, 1 @@ -28389,6 +28379,7 @@ canyoncreekjeep.com, 1 canyonisd.net, 1 canyonshoa.com, 1 canyontx.gov, 1 +canyou.ai, 1 canyou.com.au, 1 canyoupwn.me, 1 cao.bi, 1 @@ -28742,6 +28733,7 @@ caribeeficiente.com.co, 1 caribuku.tk, 1 caricature.fr, 1 caricatureavenue.com, 1 +carien.eu, 1 carif-idf.net, 0 carigami.fr, 1 cariki.gq, 1 @@ -29525,7 +29517,6 @@ cathelp.cf, 1 cathelp.cn, 1 cathelp.xyz, 1 catherinejf.com, 1 -catherinejflee.com, 1 catherinesarasin.com, 1 catherinesofpartick.co.uk, 0 catholic8964.org, 1 @@ -29725,7 +29716,6 @@ cc98.eu.org, 1 cca.ky, 1 ccaa.gg, 1 ccaag.me, 1 -ccaag.mx, 1 ccaag.net, 1 ccaag.us, 0 ccac.gov, 1 @@ -29819,7 +29809,6 @@ ccvr6smarthome.de, 1 ccwallet.io, 1 ccwebdevelopment.com, 1 ccxperience.com, 1 -ccxsta.com, 1 cd-shopware.de, 1 cd-sport.com, 1 cd.search.yahoo.com, 0 @@ -31433,7 +31422,6 @@ chitinfo.tk, 1 chitlar.ml, 1 chitraltune.tk, 1 chittagongtextile.tk, 1 -chitti4feet.com, 1 chiucainlaw.co.nz, 1 chiusa-klausen.com, 1 chiva-ariege.fr, 1 @@ -31584,6 +31572,7 @@ chrismiller.xyz, 1 chrismorgan.info, 1 chrismurrayfilm.com, 1 chrisnekarda.com, 1 +chrisogedengbe.org, 1 chrispaul.ml, 1 chrispontius.tk, 1 chrisrude.com, 1 @@ -31607,7 +31596,6 @@ christhewebguy.com, 1 christiaanconover.com, 1 christian-folini.ch, 1 christian-garo.com, 0 -christian-garo.org, 1 christian-gredig.de, 1 christian-host.com, 1 christian-liebel.com, 1 @@ -31819,6 +31807,7 @@ chundelac.com, 1 chunga.tk, 1 chungachyan.ga, 1 chungnguyenblog.tk, 1 +chungsir.com.pa, 1 chunk.science, 1 chunkeat.cyou, 1 chunkeat.me, 1 @@ -32080,7 +32069,6 @@ cipherli.st, 0 ciphermail.com, 1 ciphersuite.info, 1 ciphertech.com.tw, 1 -cipies.com, 1 ciplerli.st, 1 cippus.tk, 1 cipri.com, 1 @@ -32186,6 +32174,7 @@ citations.tk, 1 citazine.fr, 1 citazioni.tk, 1 citcuit.in, 1 +citee.vn, 1 citerne-eau.be, 1 citfin.cz, 1 citharas.org, 1 @@ -32241,7 +32230,6 @@ cityconsultants.tk, 1 citycreek.studio, 1 citycricket.tk, 1 cityfacialplastics.com, 1 -cityfish.com, 1 cityhide.tk, 1 cityhotel.tk, 1 cityjam.tk, 1 @@ -32340,6 +32328,8 @@ cityofrobertsidaho.gov, 1 cityofroncevertewv.gov, 1 cityofsacramento.gov, 1 cityofsalemky.gov, 1 +cityofsanmateoca.gov, 1 +cityofsantamariaca.gov, 1 cityofsenatobiams.gov, 1 cityofsourlake.gov, 1 cityofspoonerwi.gov, 1 @@ -32588,6 +32578,7 @@ clarkstatecontract.com, 1 clarkstown.gov, 1 clarksvilletn.gov, 1 clarkturnkey.com, 1 +clarktwpmi.gov, 1 clarkwinkelmann.com, 1 clarotvpromocao.com.br, 1 claroty.com, 1 @@ -32697,6 +32688,7 @@ cleanenergy.gov, 1 cleanenergywire.org, 1 cleaner-en.com, 1 cleaner.tk, 1 +cleanerstool.com, 1 cleanertoday.com, 1 cleanertool.co.uk, 1 cleanfacesest.ga, 1 @@ -32779,7 +32771,6 @@ cles-asso.fr, 1 cles.jp, 1 clesurporte.be, 1 clevelandheights.gov, 1 -clevelandohioinvesting.com, 1 clevelandokla.com, 1 clever-datenschutz.de, 1 clever-invest.cf, 1 @@ -33523,6 +33514,7 @@ co2eco.cn, 0 co2fr.ee, 0 co3app.com, 1 coa.gov.ph, 1 +coach-enligne.fr, 1 coach-hpe.ch, 1 coach.org.uk, 1 coachablebyabel.nl, 1 @@ -33619,12 +33611,12 @@ cocoafl.gov, 1 cocoamexico.com, 1 cocobollo-sallanches.com, 1 cocobrother.ddnss.de, 1 -cocodroid.com, 0 +cocodroid.com, 1 cocokmobi.ga, 1 cocolink.jp, 1 cocomelody.com, 0 cocomelody.de, 1 -cocomelody.jp, 0 +cocomelody.jp, 1 coconutguy.gq, 1 coconutio.com, 1 coconutoil.ml, 1 @@ -34309,7 +34301,6 @@ comfy.cafe, 0 comfy.gay, 1 comfyliving.net, 1 comfypc.com, 1 -comgamerch.com, 1 comhack.com, 1 comic-conmuseum.org, 1 comical.ml, 1 @@ -35409,7 +35400,6 @@ corepacks.tk, 1 corepartners.com.ua, 1 corerad.net, 1 corescientific.com, 1 -coresignal.com, 1 coresos.com, 1 coresystems.hu, 1 coretema.eu, 1 @@ -35715,6 +35705,7 @@ cottagegroveor.gov, 1 cottagelife.com, 1 cottonage.tk, 1 cottonwoodcountymn.gov, 1 +cottonwoodimprovement.gov, 1 cotwe-ge.ch, 0 coubron-escrime.fr, 1 couchidiomas.com, 1 @@ -36276,6 +36267,7 @@ creativephysics.ml, 1 creativescastle.com, 1 creativescorpio.tk, 1 creativesectors.tk, 1 +creativesmm.com.ua, 1 creativestories.me, 1 creativevietnam.com.vn, 1 creativeweb.biz, 1 @@ -38206,7 +38198,6 @@ dal-loop.xyz, 1 dal.net.sa, 1 dalagore.com, 1 dalaran.city, 1 -dalat.blog, 1 dalb.in, 1 dalbar.com, 1 dalbarsqm.com, 1 @@ -38262,7 +38253,6 @@ damasgonzalezabogados.com, 1 dambachpeacebuilderfellowships.org, 1 dambo.tk, 1 dame.cf, 1 -damebe.com.br, 1 damedrogy.cz, 1 dameeq.cf, 1 dameisports.com, 1 @@ -38973,7 +38963,6 @@ datingopportunitiesest.ga, 1 datingru.ml, 1 datingru.tk, 1 datingsite.ml, 1 -datingso.com, 1 datingsrit.tk, 1 datingswagger.ga, 1 datingticino.ch, 0 @@ -39077,7 +39066,6 @@ davidepalma.it, 1 davidereinato.tk, 1 davidetmagali.fr, 1 davidfarland.com, 1 -davidfetveit.com, 1 davidfindlay.org, 1 davidforward.net, 1 davidfuentes.es, 1 @@ -39142,6 +39130,8 @@ davidzarza.tk, 1 davidzeegers.nl, 1 davidzimmerman3.com, 1 davie3.com, 1 +daviesscountyin.gov, 1 +daviesscountyinsheriff.gov, 1 davimun.org, 1 davinamccall.tk, 1 davinciwaldorfschool.org, 1 @@ -39553,7 +39543,6 @@ debewaker.tk, 1 debian.link, 1 debianizzati.org, 1 debie-usedcars.be, 1 -debierhandel.nl, 1 debigare.com, 1 debijloke.be, 1 debijloke.gent, 1 @@ -39923,6 +39912,7 @@ dejorisenkeesshow.tk, 1 dejoylandschools.com, 1 dejure.org, 0 dejuzconsults.com, 1 +dekalbcountyclerkil.gov, 1 dekalbcountymo.gov, 1 dekampioenen.tk, 1 dekasegi-kansai.com, 1 @@ -40070,6 +40060,7 @@ deltadentalsc.com, 1 deltafm.tk, 1 deltaloja.com.br, 1 deltamusik.tk, 1 +deltamvcd.gov, 1 deltanio.nl, 1 deltaonlineguards.com, 1 deltaphiepsilon.tk, 1 @@ -40321,6 +40312,7 @@ dentistslilburnga.com, 1 dentoncounty.gov, 1 dentonolab.lt, 1 dentrassi.de, 1 +dentsimplant.com, 1 dentsugrantgroup.com, 1 dentystabirmingham.co.uk, 1 denuevestore.com, 1 @@ -40595,7 +40587,6 @@ designgurus.org, 0 designhoheit.de, 1 designhuddle.com, 1 designmodernideas.tk, 1 -designops-conference.online, 1 designpro.tk, 1 designrhome.com, 1 designsbyjanith.com, 1 @@ -41448,6 +41439,7 @@ digiaika.fi, 1 digiarc.net, 1 digibean.com.au, 0 digibild.ch, 1 +digibook.id, 1 digiboxx.com, 1 digibtw.nl, 1 digibull.email, 1 @@ -42641,7 +42633,6 @@ dmarc.io, 1 dmarcian.com, 1 dmarcpal.com, 1 dmartpreneur.com, 1 -dmautomek.no, 1 dmc-cc.de, 1 dmc-commerce-consultants.de, 1 dmc.ae, 1 @@ -42834,6 +42825,7 @@ doc.ai, 1 doc.new, 1 doc.python.org, 1 doc.to, 0 +doc8643.com, 1 docabo.ch, 1 docbox.ch, 1 docbrown.dk, 1 @@ -43981,6 +43973,7 @@ dranik.ml, 1 drankenweb.tk, 1 drankkoning.nl, 1 drapeauxdespays.fr, 1 +draper.wtf, 1 draperutah.gov, 1 dras.hu, 1 drastik.cz, 1 @@ -44419,7 +44412,6 @@ drstephanieteotia.com, 1 drsteveart.com, 1 drstevenwarnock.com, 1 drsturgeonfreitas.com, 1 -drsubbio.com, 1 drt.org.nz, 1 drtanyaescobedo.com, 1 drthalhammer.at, 1 @@ -44527,7 +44519,9 @@ dsdlove.com, 1 dsdomains.com, 1 dsds-ltd.com, 0 dse-assessments.co.uk, 0 +dse.com.bd, 1 dsebastien.net, 1 +dsebd.org, 1 dsecure.me, 1 dseg.org, 1 dsektionen.se, 0 @@ -44806,6 +44800,7 @@ dunamiscommunity.com, 1 dunangel.com, 1 dunassyn.com, 1 dunatos.tk, 1 +dunbarboropa.gov, 1 dunbarmoving.com, 1 dunberghof.tk, 1 duncancmt.com, 1 @@ -45336,7 +45331,7 @@ e-sell.tk, 1 e-servicerms.com, 1 e-shobai.com, 1 e-shonai.com, 1 -e-sisyu.com, 1 +e-sisyu.com, 0 e-skalniak.pl, 1 e-sklep.biz, 1 e-slots.tk, 1 @@ -46340,7 +46335,6 @@ economie2.alsace, 1 economie2.fr, 1 economiefidu.ch, 0 economies.ch, 0 -economipedia.com, 1 economixportal.tk, 1 economycarrentalscyprus.com, 1 economydiva.com, 1 @@ -47122,7 +47116,6 @@ einhorn.space, 1 einmonolog.de, 1 einreiseanmeldung.de, 1 einrichtenonline.com, 1 -einrichtwerk.de, 1 einsatzstiefel.info, 1 einsteinathome.org, 1 einsteinbros.com, 1 @@ -47233,7 +47226,6 @@ ekole.shop, 1 ekologie.tk, 1 ekologija.tk, 1 ekonbenefits.com, 1 -ekong366.com, 1 ekonomika.tk, 1 ekonomipolitik.tk, 1 ekonomival.se, 1 @@ -47450,7 +47442,6 @@ electricsimivalley.com, 1 electricthousandoaks.com, 1 electricwestlakevillage.com, 1 electriczone.tk, 1 -electro.moe, 1 electrobraid.com, 1 electrocity.ie, 1 electrocomplect.com.ua, 1 @@ -47993,7 +47984,6 @@ eltair.com, 1 eltar.pl, 1 eltconsultants.com.mx, 1 eltec.es, 1 -elteeta.com, 1 eltern-verein.ch, 1 elternbeiratswahl.online, 1 elternverein-utzenstorf.ch, 1 @@ -48553,7 +48543,6 @@ endofodo.goip.de, 1 endoftenancycleaninglondon.co.uk, 1 endohaus.us, 1 endometriu.ml, 1 -endondehay.com, 1 endpaydayloandebt.net, 1 endpipe.com, 1 endplasticwaste.org, 1 @@ -48583,7 +48572,6 @@ enefitvolt.com, 1 enefitvolt.ee, 1 enefitvolt.eu, 1 enefitvolt.fi, 1 -enefitvolt.lt, 1 enefitvolt.lv, 1 enefitvolt.pl, 1 enefitvolt.se, 1 @@ -48708,7 +48696,7 @@ engi.fyi, 1 engie-laadpalen.nl, 1 engima.nl, 1 engineer-kobe.ga, 1 -engineer.org.my, 1 +engineer.org.my, 0 engineeringclicks.com, 1 engineeringidea.ga, 1 engineertaplin.co.uk, 1 @@ -49568,7 +49556,6 @@ esburgos.info, 1 esc-romania.tk, 1 esc-turkey.tk, 1 esc18.net, 1 -esc3.net, 1 esc9.net, 1 escae.ml, 1 escael.org, 1 @@ -49631,6 +49618,7 @@ escrowalliance.com, 1 escspain.tk, 1 escuda.eu, 1 escuelabiblica.com, 1 +escuelacaninalatejera.es, 1 escueladego.tk, 1 escueladelsabor.com, 1 escueladeministerioytecnologia.com, 1 @@ -50318,7 +50306,6 @@ europeanpolice.net, 1 europeanpreppers.com, 1 europeanstudies-chemnitz.de, 1 europeantransportmanagement.com, 1 -europeanwineresource.com, 1 europeluxuryweddings.com, 1 europeonline.tk, 1 europeontrack.org, 1 @@ -50880,7 +50867,6 @@ exegese.ch, 0 exegol.co.uk, 1 exehack.net, 1 exeintel.com, 1 -exeltis.com.mx, 1 exemplarypainting.com, 1 exemples-de-stands.com, 1 exentio.sexy, 1 @@ -51491,7 +51477,6 @@ fabulouseventsmiami.com, 1 fabulousfarmgirl.com, 1 fabulouslyyouthfulskin.com, 1 fabulouslyyouthfulskineyeserum.com, 1 -faburocks.com, 1 fabuye.cf, 1 fabuye.ga, 1 fabuye.gq, 1 @@ -51802,7 +51787,6 @@ falconinsurance.com.hk, 1 falconstap.tk, 1 falcoz.net, 1 faldoria.de, 1 -fale.io, 1 falegname-roma.it, 1 falegname.roma.it, 1 falegnameria.milano.it, 1 @@ -51983,6 +51967,7 @@ fanshenzhiyi.com, 1 fansided.com, 1 fansport.space, 1 fansta.jp, 1 +fanstuff.ru, 1 fantacast.it, 1 fantasea.pl, 1 fantasiatravel.hr, 1 @@ -52123,6 +52108,7 @@ farmakon.tk, 1 farmasimahaganesha.ac.id, 1 farmaspeed.it, 1 farmauna.com, 1 +farmaweb.be, 1 farmbureauinsurance-mi.com, 1 farmer-miniaturen.tk, 1 farmerfairness.gov, 1 @@ -52565,6 +52551,7 @@ feastshare.com, 1 feat.agency, 1 feataccess.in, 1 feath.net, 1 +featherfan.io, 1 feathermc.com, 1 feathersbtq.com, 1 featherweightlabs.com, 1 @@ -53121,7 +53108,6 @@ ffccc55.com, 1 ffccc66.com, 1 ffccc88.com, 1 ffccc99.com, 1 -ffclinic.com.br, 1 ffddd00.com, 1 ffddd11.com, 1 ffddd22.com, 1 @@ -53739,6 +53725,7 @@ findlayohio.gov, 1 findlimitsers.ga, 1 findlocalproduce.co.uk, 1 findmail.ga, 1 +findmassmoney.gov, 1 findme.partners, 1 findmentalhealth.co.uk, 1 findmespot.com, 1 @@ -53914,6 +53901,7 @@ firenza.org, 1 firenzetoday.it, 1 fireoakstrategies.com, 1 fireperformerstoronto.com, 1 +fireplacerepairlasvegas.com, 1 fireplex.co.uk, 1 fireportal.cz, 1 fireportal.sk, 1 @@ -53963,7 +53951,6 @@ firsov.gq, 1 first-aid-kit.net, 0 first-house.no, 1 first-hyp.de, 1 -first-legion.eu, 1 first-money.tk, 1 first-ns.com, 0 first-time-offender.com, 1 @@ -54378,6 +54365,7 @@ flaszka.com, 1 flat-cdn.com, 1 flat-embed.com, 1 flat-tire.biz, 1 +flat.io, 1 flatart.pl, 1 flatbellyreview.com, 1 flatbook.one, 1 @@ -55533,6 +55521,7 @@ formworkcontractorssydney.com, 1 fornarisandres.com, 1 fornata.it, 1 fornaxmall.com, 1 +fornoreason.net.au, 1 foro-coopfuture.tk, 1 foro.io, 0 foroaranda.com, 1 @@ -55847,7 +55836,6 @@ fournarisopenday.com, 1 fournisseur-des-collectivites.com, 1 fourpeaks.com, 1 fourscore.ga, 1 -fourseasons.com, 1 fourseasonsgrower.com, 1 foursight.io, 0 fourstrategy.de, 1 @@ -55879,7 +55867,6 @@ foxes.no, 1 foxesofleicester.com, 1 foxeworks.net, 1 foxholehq.net, 1 -foxilla.ch, 1 foxing.club, 1 foxite.me, 1 foxly.de, 1 @@ -56317,7 +56304,6 @@ fredoum.fr, 1 fredriksslaktforskning.se, 1 fredriksslekt.se, 1 freds4buildings.com, 1 -fredtalk.tv, 1 fredtec.ru, 0 fredvoyage.fr, 1 fredz.eu, 1 @@ -56714,7 +56700,6 @@ fridaybridge.tk, 1 fridayfoucoud.ma, 1 fridaynightskate.tk, 1 fridays.is, 1 -fridaysforfuture-bremen.de, 1 fridge.dk, 1 fridgesearchest.ga, 1 fridolinka.cz, 1 @@ -56890,7 +56875,6 @@ frontigate.com, 1 frontline.cloud, 1 frontline6.com, 0 frontlinepolicies.com, 1 -frontmeedia.ee, 1 frontrouge.fr, 1 frontrunneragency.com, 1 froogo.co.uk, 1 @@ -56967,6 +56951,7 @@ fruxnux.net, 1 frwmb.gov, 1 frydrychit.cz, 1 fryergroup.com, 1 +fryfiredistrictaz.gov, 1 fs-d.org, 1 fs-fitness.eu, 1 fs-g.org, 1 @@ -57065,6 +57050,7 @@ ftrac.com.br, 1 ftrfnd.me, 1 ftth.eu.org, 0 ftv.re, 1 +ftw.lol, 1 ftworthhousekeeper.com, 1 ftx.io, 1 ftx.tech, 1 @@ -57190,7 +57176,6 @@ fulgaz.com, 1 fulgenzis.com, 1 fulisex.com, 1 fuliwang.info, 1 -fuliwang.us, 1 full-hd.info, 1 full-stack.ninja, 1 full.eu.org, 1 @@ -57746,7 +57731,6 @@ fyptt.to, 1 fyrebox.guru, 1 fyrehost.net, 0 fyrehost.xyz, 1 -fyretrine.com, 1 fyrfalkcontent.se, 1 fyroeo.fr, 0 fysio-ict.nl, 1 @@ -58666,6 +58650,7 @@ gazi.edu.tr, 1 gazik.com.ua, 1 gazizov.tk, 1 gazobeton-don.ru, 1 +gazoneo.fr, 1 gazor.tk, 1 gazoz.ga, 1 gazza.tk, 1 @@ -59039,7 +59024,7 @@ generalinsuranceagencies.com.au, 1 generalinsuranceservices.com, 1 generalliabilityinsure.com, 1 generalpsych.cf, 1 -generalshale.com, 0 +generalshale.com, 1 generalsync.com, 1 generaltitlewebui-stage.azurewebsites.net, 1 generaly.ga, 1 @@ -59231,6 +59216,7 @@ gentmuziekstad.be, 1 gentoo-blog.de, 0 gentooblog.de, 1 gentoocn.org, 1 +gentryarkansaspd.gov, 1 gentrydeng.cn, 1 gentrydeng.com, 1 gentse-ondernemersdagen.be, 1 @@ -59375,9 +59361,11 @@ georglauterbach.de, 1 georgmayer.eu, 1 geosales.tk, 1 geoscout.uk, 1 +geoserves.com, 1 geosever.cz, 0 geosno.com, 1 geospecialsers.ga, 1 +geostems.com, 1 geoswohnen.de, 1 geotabgov.us, 1 geotec-weilrod.de, 1 @@ -59477,6 +59465,7 @@ geschwinder.net, 1 geseduc.cl, 1 gesentorno.tk, 1 gesetz.tk, 1 +gesica.cloud, 1 gesmav-trier.de, 1 gesnerfigueiredo.com.br, 1 gesnex.com, 1 @@ -59583,6 +59572,7 @@ getgeek.io, 1 getgeek.no, 1 getgeek.nu, 1 getgeek.pl, 1 +getgeek.se, 1 gethere.gq, 1 gethost.co.zw, 1 gethotspotshield.com, 1 @@ -60395,6 +60385,7 @@ glendalewv.gov, 1 glendarraghbouncycastles.co.uk, 1 glendivemt.gov, 1 glenhuntlyapartments.com.au, 1 +glenmorewisconsin.gov, 1 glennfitzpatrick.com, 1 glennhamers.nl, 1 glennwilson.co.uk, 1 @@ -60598,6 +60589,7 @@ globowood.ml, 1 globuli-info.de, 1 globus-plus.ml, 1 globustrust.tk, 1 +glocesterri.gov, 1 glocken-apotheke.info, 1 gloeckle-gruppe.de, 1 glofox.com, 1 @@ -60967,6 +60959,7 @@ goingreen.com.au, 1 goiymua.com, 1 goizalde.tk, 1 gojo.global, 1 +gokartwiki.com, 0 gokazakhstan.com, 1 gokgids.nl, 1 gokhankesici.com, 1 @@ -61703,6 +61696,7 @@ graft.spb.ru, 1 graftoncountynh.gov, 1 graftonglobe.cf, 1 graftonglobe.tk, 1 +graftonnd.gov, 1 graftworld.pw, 1 grafuroam.com, 1 grahambaggett.com, 1 @@ -61846,6 +61840,7 @@ grapheneos.social, 1 graphenepower.com, 1 graphic-schools.com, 1 graphic-shot.com, 1 +graphicbuffet.co.th, 1 graphicdesignresources.net, 1 graphicdream.tk, 1 graphicinfo.com, 1 @@ -62326,6 +62321,7 @@ gripeh1n1.com, 1 gripencrossfit.cf, 1 gripencrossfit.gq, 1 gripnijmegen.rip, 1 +gripopit.nl, 1 grippingtheether.com, 1 gripvol.nl, 1 gripwenab.cf, 1 @@ -62473,6 +62469,7 @@ growinghumankindness.com, 1 growingsearch.com, 1 growitsecure.com, 1 growledlamp.fr, 1 +growledlamp.it, 1 growling.net, 1 growme.gq, 1 growth-rocket.com, 1 @@ -63357,6 +63354,7 @@ hackhouse.sh, 1 hackingand.coffee, 0 hackingdh.com, 1 hackingfever.tk, 1 +hackingondemand.com, 1 hackingwithswift.com, 1 hackintosh.eu, 1 hackintosh.social, 1 @@ -63368,7 +63366,6 @@ hackops.tk, 1 hackreone.com, 1 hackrepreneur.com, 1 hacksecu.re, 1 -hacksnation.com, 1 hacksoc.co.uk, 1 hackthat.tk, 1 hackthecat.com, 1 @@ -63652,6 +63649,7 @@ hamibot.cn, 1 hamibot.com, 1 hamiltonatlnj.gov, 1 hamiltoncountyil.gov, 1 +hamiltoncountyne.gov, 1 hamiltone-clearance.co.uk, 1 hamiltone.co.uk, 1 hamiltonil.gov, 1 @@ -64222,7 +64220,6 @@ hasel.news, 1 haselsteiner.me, 1 hasenmueller.de, 1 hasgeek.com, 1 -hash.army, 1 hash.works, 1 hashcat.net, 1 hashemian.com, 1 @@ -64474,6 +64471,7 @@ hboeck.de, 1 hbomaxaustralia.com, 1 hbpro.pt, 1 hbr.link, 1 +hbr.org, 1 hbs-it-gmbh.de, 1 hbshop.com.br, 1 hbsslaw.co.uk, 1 @@ -64574,7 +64572,6 @@ hdrezka2018.tk, 1 hdrip.info, 1 hdrtranscon.com, 0 hds-lan.de, 1 -hdsaglik.net, 1 hdscheduleers.ga, 1 hdscheduleest.ga, 1 hdsengine.ml, 1 @@ -64696,6 +64693,7 @@ healthcare4ppl.com, 1 healthcareadministrationedu.org, 1 healthcareagency.tk, 1 healthcareareainfo.tk, 1 +healthcareconnexion.com, 1 healthcarediversion.org, 1 healthcaredrugs.tk, 1 healthcareera.tk, 1 @@ -65453,7 +65451,6 @@ hemnet.se, 1 hemorroi.ga, 1 hemp.com, 1 hemphopper.eu, 1 -hempoffset.com, 1 hempsteadcitytx.gov, 1 hemrin.com, 1 hems.si, 1 @@ -65653,6 +65650,7 @@ hermetas.org, 1 hermetien.tk, 1 hermietkreeft.site, 0 herminghaus24.de, 1 +hermiston.gov, 1 hermitant.fr, 1 hermiu.com, 1 hermodesign.com, 1 @@ -66244,7 +66242,6 @@ hiringopps.com, 1 hiringprocess.careers, 1 hiringrise.com, 1 hirisejanitorial.com, 1 -hiro-dc.info, 1 hirobbie.com, 1 hiromi.eu.org, 1 hiromuogawa.com, 1 @@ -66399,7 +66396,7 @@ hj99333.com, 0 hjallboscoutkar.se, 1 hjaltespizza.dk, 1 hjartasmarta.se, 1 -hjbw-sterken.nl, 0 +hjbw-sterken.nl, 1 hjdiaz.com, 1 hjelmqvist-it.se, 1 hjelpemiddeldatabasen.no, 1 @@ -66715,6 +66712,7 @@ hollyloless.net, 1 hollyloless.org, 1 hollyspringsms.gov, 1 hollywoodbios.com, 1 +hollywoodsmilesfl.com, 1 hollywoodstars.tk, 1 hollyworks.com, 1 holmenwi.gov, 1 @@ -67516,7 +67514,6 @@ hotchillibox.co.za, 1 hotchillibox.com, 1 hotcoder.tk, 1 hotcursosrio.com.br, 1 -hotdates18.com.au, 1 hotdates18.dk, 1 hotdates18.fi, 1 hotdishes.tk, 1 @@ -67940,7 +67937,6 @@ hrcrew.com.au, 1 hrd.pl, 1 hrdns.de, 1 hreflang.info, 1 -hrejterzy.com, 1 hrgt.eu, 1 hristijanspirovski.tk, 1 hristov.help, 1 @@ -68356,6 +68352,7 @@ humbledot.com, 0 humblenano.africa, 1 humblenano.io, 1 humboldt-wi.gov, 1 +humboldtcountyca.gov, 1 humboldtcountynv.gov, 1 humboldthomeguide.com, 1 humboldtmfg.com, 1 @@ -68469,13 +68466,15 @@ hurricanehvacservices.com, 1 hurricanelabs.com, 0 hurricaneplaneers.ga, 1 hurricaneplaneest.ga, 1 +hurricanewv.gov, 1 +hurricanewvpd.gov, 1 hurriyetseriilan.tk, 1 +hurstbourneacresky.gov, 1 hurstiharrell.tk, 1 hurtigrabat.dk, 1 hurtigtinternet.dk, 1 husakbau.at, 1 hushbabysleep.com, 1 -hushescorts.com.au, 1 hushfile.it, 1 hushpuppiesobuv.ru, 1 husic.net, 0 @@ -68940,7 +68939,6 @@ ibericarmovilsur.es, 1 ibericarreicomsa.es, 1 ibericartechnik.es, 1 ibero.edu.co, 1 -ibestproduct.com, 0 ibetora.com, 1 ibex.co, 1 ibexmultiday.com, 1 @@ -71088,7 +71086,6 @@ inin.gq, 1 init.blog, 1 init.ink, 1 init3.cn, 1 -init8.lol, 1 initblogger.com, 1 initiative20x20.org, 1 initq.net, 1 @@ -71676,7 +71673,6 @@ intergenx.com, 1 intergenx.org, 1 intergenx.org.uk, 1 intergermania.com, 1 -intergraphix.com.ar, 1 interguard.net, 1 interguardian.de, 1 interiery-waters.cz, 1 @@ -71850,13 +71846,12 @@ intim-ru.tk, 1 intima-mente.com, 1 intimastoreatacado.com.br, 1 intimidad.tk, 1 -intimmix.ru, 1 intimznakomstvo.tk, 1 intmissioncenter.org, 0 into-the-mountain.com, 1 intomsk.tk, 1 inton.biz, 1 -intoparking.com, 1 +intoparking.com, 0 intoparking.fi, 1 intor.fi, 1 intosec.nl, 1 @@ -71951,6 +71946,7 @@ inverselink.com, 1 inversion.travel, 1 inversionesgalindo.com, 1 invertiaweb.com, 1 +invertir.gov, 1 invespex.com, 1 invest-stroj.tk, 1 invest.gov, 1 @@ -72264,7 +72260,6 @@ iposm.net, 0 ipost.rocks, 1 ipoteka.az, 1 ipow.tk, 1 -ippawards.com, 0 ipperde.tk, 1 ipplans.com, 1 ippo-juku.com, 1 @@ -73087,6 +73082,7 @@ itmx.cc, 0 itnet.com.ua, 1 itninja.one, 1 itnota.com, 1 +itnow.ng, 1 itoady.com, 1 itochan.jp, 1 itoezichtprotocol.nl, 1 @@ -73336,7 +73332,6 @@ ivyhelpers.com, 1 ivypanda.com, 1 ivyseeds.cf, 1 ivywolfepornstar.com, 1 -iw.net.sa, 1 iwalton.com, 1 iwant-sex.com, 1 iwant.cz, 1 @@ -73742,7 +73737,6 @@ jake.ml, 1 jake.nom.za, 1 jake.rodeo, 1 jakegyllenhaal.ga, 1 -jakehamblin.com, 1 jakemansfield.com, 1 jakereynolds.co, 1 jakeross.me, 1 @@ -73881,6 +73875,7 @@ jammy4312.me, 1 jammysplodgers.co.uk, 1 jamonesrute.com, 1 jamonsilva.com, 1 +jamstallt.se, 1 jamstatic.fr, 0 jamusa.tk, 1 jamyeprice.com, 0 @@ -74726,7 +74721,6 @@ jevel-mag.tk, 1 jevisite.ca, 1 jewadvert.ml, 1 jewaedv.de, 1 -jeweet.net, 1 jewelcaddesigns.com, 1 jewellerynet.com, 1 jewelleryoutlook.com, 1 @@ -75301,6 +75295,7 @@ johannes-sprink.de, 0 johannes-zinke.de, 1 johannes.io, 1 johannes.wtf, 1 +johannesen.tv, 1 johannfritsche.de, 1 johanpeeters.com, 1 johansf.tech, 1 @@ -76984,6 +76979,7 @@ kandofu.com, 1 kandr.net, 1 kandra.com.br, 1 kandrahechiceravudu.com, 1 +kandrive.gov, 1 kanduit.live, 1 kanecastles.com, 1 kanecountyhospitalut.gov, 1 @@ -77475,6 +77471,7 @@ kazarmy.tk, 1 kazino5.tk, 1 kazmamall.com, 1 kazna.ml, 1 +kaznice.art, 1 kaznur.tk, 1 kazoohr.com, 1 kaztest.tk, 1 @@ -77779,6 +77776,7 @@ keln.net, 1 kelp.agency, 0 kelsa.io, 0 kelsall39.com, 1 +kelteks.com, 1 kelts.tk, 1 kelvinchung.tk, 1 kelvinfichter.com, 0 @@ -78098,7 +78096,6 @@ keys.casa, 1 keys.fedoraproject.org, 1 keyscore.me, 1 keyserver.sexy, 0 -keysession.jp, 1 keysix.com, 1 keysmedspa.com, 1 keysofart.com, 1 @@ -78391,7 +78388,6 @@ kiki-voice.jp, 1 kikikanri.biz, 1 kikivega.net, 1 kikki.io, 1 -kikoskia.com, 1 kiku.pw, 1 kilencamping.no, 0 kilian.gallery, 1 @@ -79236,6 +79232,7 @@ knorrnet.de, 1 knotenpunkt-nbg.de, 1 knovator.com, 1 know.cf, 1 +know2protect.gov, 1 knowarth.com, 1 knowbook.org, 1 knowdebt.org, 1 @@ -80635,7 +80632,6 @@ kurirplus.tk, 1 kuritsa.tk, 1 kurnia.tk, 1 kurniadwin.to, 1 -kurniasihmandiri.com, 1 kuroha.co.uk, 1 kuroinu.jp, 1 kuroisalva.xyz, 0 @@ -81056,6 +81052,7 @@ lacazadora.tk, 1 lacebeauty.it, 1 laceleste.it, 1 lacentral.com, 0 +lacera.gov, 1 lacetsroses.ch, 1 laceysfarm.ie, 1 lacfm.cf, 1 @@ -81472,6 +81469,7 @@ lanausea.tk, 1 lanbroa.eu, 1 lancashirebeekeepers.org.uk, 1 lancashirecca.org.uk, 1 +lancastercountysc.gov, 1 lancasterma.gov, 1 lancastertableandseating.com, 1 lancastervillageny.gov, 1 @@ -81840,6 +81838,7 @@ laslilas.tk, 1 laslo-hauschild.eu, 1 lasmallbizonline.gov, 1 lasmesas.tk, 1 +lasmoarquitectos.com, 1 lasmorfianapoletana.com, 1 lasofertas.tk, 1 lasonindia.com, 1 @@ -83486,6 +83485,7 @@ lexikon24.tk, 1 lexilowepornstar.com, 1 lexilunapornstar.com, 1 lexington-credit-repair.com, 1 +lexingtonil.gov, 1 lexingtonok.gov, 1 lexiprof.com, 1 lexis.ml, 1 @@ -83657,7 +83657,7 @@ liberategrace.com, 1 liberation2020.com, 1 liberationgroup.com, 1 liberationschool.org, 1 -liberationtek.com, 0 +liberationtek.com, 1 liberatupotencial.site, 1 liberdademg.com.br, 1 liberecstehovani.cz, 1 @@ -83937,7 +83937,7 @@ lifeskills-education.co.uk, 0 lifeslice.online, 1 lifeslonglist.com, 1 lifesoccer.tk, 1 -lifestorage.com, 1 +lifestorage.com, 0 lifestyle.bg, 1 lifestyle7788.com, 1 lifestyledoctor.in, 1 @@ -84520,6 +84520,7 @@ linyunbin.com, 1 linz.eu.org, 1 linz.host, 1 linzyjx.com, 1 +liodex.com, 1 lion-log.com, 1 lion3star.store, 1 lionchita.tk, 1 @@ -84549,7 +84550,6 @@ lipovka.tk, 1 lipowebsite.tk, 1 lippu1.fi, 1 lips.ne.jp, 1 -liptonunmissableconference2023.com, 1 liptor.gq, 1 lipturess.tk, 1 liq.com.br, 1 @@ -85878,7 +85878,6 @@ loshalcones.tk, 1 loshogares.mx, 1 losinterrogantes.com, 1 losjardines.tk, 1 -losjuegosdemesa.online, 1 loslegendarios.tk, 1 losless.fr, 1 loslunesalrock.tk, 1 @@ -85985,7 +85984,6 @@ louisapolicefoundation.com, 1 louisapolicefoundation.org, 1 louisdefunes.tk, 1 louisefar.tk, 1 -louiselaliberte.ca, 1 louisemisellinteriors.co.uk, 1 louiserutkowski.tk, 1 louisianalifesciences.gov, 1 @@ -86079,7 +86077,6 @@ lovelovenavi.jp, 1 lovelybook4u.gq, 1 lovelyfamilymm.com, 1 lovelylanguedoc.com, 0 -lovelynaked.com, 1 lovelytimes.net, 1 lovemaker.se, 1 lovemanagementaccounts.co.uk, 1 @@ -86157,7 +86154,6 @@ loyaliplaw.com, 1 loyaltech.ch, 1 loyaltech.tk, 1 loyaltyreviewers.ga, 1 -loyd.co, 1 loyisa.cn, 1 loyloy.net, 1 loyolahs.edu, 1 @@ -86414,6 +86410,7 @@ lueersen.homedns.org, 1 luehne.de, 1 luelistan.net, 0 luematecidos.com, 1 +luematecidos.com.br, 1 luenwarneke.com, 1 lufa.com, 1 luffyhair.com, 1 @@ -86550,6 +86547,7 @@ luminsmart.com, 1 lumitop.com, 1 lumixtar.com, 1 lummi-nsn.gov, 1 +lummihealth.gov, 1 lumminary.com, 1 lumoa.me, 1 lumoria.eu, 1 @@ -87246,7 +87244,6 @@ madlandezboard.tk, 1 madlife.fr, 1 madluging.tk, 1 madmasters.tk, 1 -madmax-store.gr, 1 madmaxstore.it, 1 madmoizelle.com, 1 madnetwork.org, 1 @@ -87374,6 +87371,7 @@ magesypro.com, 1 magewell.nl, 1 maggianos.com, 1 maggie-shaw.co.uk, 0 +maggie.gy, 1 maggiemcgee.tk, 1 maggot.cf, 1 maggsy.co.uk, 1 @@ -88163,7 +88161,6 @@ mangahigh.com, 1 mangajp.top, 1 mangakita.net, 1 mangalove.top, 1 -mangamonde.fr, 1 manganimefan.tk, 1 mangapoi.com, 1 mangareactor.tk, 1 @@ -88543,7 +88540,7 @@ marcopolo-restaurant.com, 1 marcopolonetwork.com, 0 marcoreitmeier.de, 1 marcorubiol.com, 1 -marcositaliandeli.co.uk, 1 +marcositaliandeli.co.uk, 0 marcosocio.com, 1 marcossan.com, 1 marcosteixeira.tk, 1 @@ -88687,7 +88684,6 @@ marinella.tk, 1 marinershousecalstock.com, 1 marinettecountywi.gov, 1 marinettewi.gov, 1 -marinpet.net, 1 mario-ancic.tk, 1 mario-sarto.com, 1 mario.com.ua, 1 @@ -89518,7 +89514,6 @@ mattcoles.io, 1 mattconstruction.com, 1 mattcorallo.com, 1 mattcorp.com, 1 -mattcronin.co.uk, 1 mattdbarton.com, 1 mattelek.com, 1 mattelekharris.com, 1 @@ -89974,6 +89969,7 @@ mcbooks.vn, 0 mccannhealth.com, 1 mccannworldgroup.com, 1 mccarthyprestige.com.au, 1 +mccarthystonefoundation.org, 0 mccinc.ca, 1 mccn.pp.ua, 1 mccommando.tk, 1 @@ -90176,6 +90172,7 @@ mdsave.com, 1 mdscomp.net, 1 mdsglobal.com, 1 mdswlegal.com, 1 +mdtaxconnect.gov, 1 mdtorelli.it, 1 mdwedding168.com, 1 mdwellness.ca, 1 @@ -90810,7 +90807,6 @@ meditarenargentina.org, 1 meditateinolympia.org, 1 meditation-music.shop, 1 meditation-rennes.org, 1 -meditationsydney.org.au, 1 meditel.nl, 1 meditez.ca, 1 meditrak.ml, 1 @@ -91811,6 +91807,7 @@ metronidazolee.gq, 1 metronik.it, 0 metronome.ga, 1 metroparks.net, 1 +metroplanorlando.gov, 1 metroplex.me, 1 metropole.com.au, 1 metropolis.ga, 1 @@ -92032,6 +92029,7 @@ miamiobgyndreams.com, 1 mianbao.ga, 1 mianfei.us, 1 miankamran.tk, 1 +mianra.ddns.net, 1 miao.team, 1 miaoft.com, 0 miaovps.com, 0 @@ -92264,6 +92262,7 @@ microvb.com, 1 microwesen.de, 1 microworkers.com, 1 microzubr.com, 1 +micruity.com, 1 mics-notrack.com, 1 micsell.com, 1 micsoft.gq, 1 @@ -92376,6 +92375,7 @@ mignonneapi.com, 1 migraine-en-werk.nl, 1 migrainereliefplan.com, 1 migrantskillsregister.org.uk, 1 +migrantworker.gov, 1 migraplus.ru, 1 migrations.tk, 1 migrinfo.fr, 1 @@ -92482,7 +92482,6 @@ mikaelf.com, 0 mikaeljansson.net, 1 mikaelk.tk, 1 mikaelkulig.duckdns.org, 1 -mikaelvesavuori.se, 1 mikaila.tk, 1 mikakalathil.ca, 1 mikakalevi.com, 1 @@ -92650,6 +92649,7 @@ militaryonesource.mil, 1 militarypumps.com, 1 militarysrit.tk, 1 miliumnet.tk, 1 +milivcounty.gov, 1 miljotankar.se, 1 milk.games, 1 milkaalpesiutazas.hu, 1 @@ -92676,6 +92676,7 @@ millasexshopoficial.com.br, 1 millburyma.gov, 1 millcreekwa.gov, 1 millefleurs.eu, 1 +millenn.photos, 1 millennium-thisiswhoweare.net, 1 millenniumfalcon.org, 1 millenniumhotels.com, 1 @@ -92692,7 +92693,6 @@ millerfabricationsolutions.com, 1 milleron.net, 1 milleron.xyz, 1 millersminibarns.com, 1 -millersprolandscape.com, 0 millesime-communication.fr, 1 millettable.com, 1 millhill.org.uk, 1 @@ -93040,7 +93040,6 @@ mintymoney.com, 1 mintywhite.com, 1 minu.link, 1 minube.co.cr, 1 -minucaelena.com, 1 minul.in, 1 minungdomsbolig.dk, 1 minutashop.ru, 1 @@ -94147,7 +94146,6 @@ moleskinestudio.com, 1 molexces.com, 1 molinillo.tk, 1 moliporex.pt, 1 -molise.store, 1 molkerei-ammerland.com, 1 molleron.net, 1 molletjesveer.tk, 1 @@ -94213,6 +94211,7 @@ momy-genealogie.info, 1 mon-a-lisa.com, 1 mon-agenda.org, 0 mon-agora.com, 1 +mon-assurance-deces.fr, 1 mon-butin.fr, 1 mon-cartable.fr, 1 mon-dolibarr.fr, 1 @@ -94447,6 +94446,7 @@ montaguehotel.com, 1 montala.com, 1 montanabiack.de, 1 montanacreativitymovement.tk, 1 +montanaguard.gov, 1 montanaonlinedivorce.com, 1 montanatrouthunters.com, 1 montanawi.gov, 1 @@ -94845,6 +94845,7 @@ mostbetr.com, 1 mostc.is, 1 mosternaut.com, 1 mostfamousbirthdays.com, 1 +mostickers.shop, 1 mostlyharmless.at, 1 mostlyoverhead.com, 1 mostmost.tk, 1 @@ -95388,11 +95389,13 @@ mservers.cz, 1 msfishingcharter.com, 1 msgallery.tk, 1 msgauctions.com, 1 +msgmon.com, 1 msgr.com, 1 msgs.ee, 1 msgtrust.com, 1 msh100.uk, 1 msha.gov, 1 +mshastanddown.gov, 1 mshemailmarketer.com.au, 1 mshgame.ga, 1 msi-zlin.cz, 1 @@ -96649,11 +96652,11 @@ mykolhoz.tk, 1 mykonos-island.tk, 1 mykontool.de, 1 mykoreankitchen.com, 1 -mykukun.com, 1 mykumedir.com, 1 mykurgan.tk, 1 mykursumlija.tk, 1 mylabaih.com, 1 +mylacera.gov, 1 mylastchapter.tk, 1 mylatestnews.org, 1 mylawer.ga, 1 @@ -96848,7 +96851,6 @@ mypropertal.com, 1 myprotime.eu, 1 myproxy.eu.org, 0 mypskov.tk, 1 -mypsy.online, 1 mypsychicreadings.tk, 1 mypt3.com, 1 mypvhc.com, 1 @@ -97059,13 +97061,13 @@ mytfg.de, 1 mythen-fonds.ch, 1 mythenfonds.ch, 1 mythicdelirium.com, 1 -mythiqueamerique.fr, 1 mytime.fr, 1 mytime.gl, 1 mytimer.tk, 1 myting.net, 1 mytntware.com, 1 mytodo.cloud, 1 +mytoncityut.gov, 1 mytraiteurs.com, 1 mytraning.cf, 1 mytransmissionexperts.com, 1 @@ -97129,7 +97131,6 @@ mywish.co.il, 1 mywiwe.com.au, 1 myworkboard.com, 1 myworkfromhome.ml, 1 -myworkinfo.com, 0 myworkplaceperks.ca, 1 myworkplaceperks.com, 1 myworldbbs.tk, 1 @@ -97515,7 +97516,6 @@ namu.live, 1 namu.moe, 1 namu.news, 1 namu.wiki, 1 -namus.gov, 1 nan0.cloud, 1 nanafeed.com, 1 nanaimo.ca, 1 @@ -97913,7 +97913,6 @@ naturalkitchen.co.uk, 1 naturallychildled.com, 1 naturallyuncommon.com, 1 naturalmentesinescuela.com, 1 -naturalprobiotica.com, 1 naturalreaders.com, 1 naturalresources.wales, 1 naturalstyle.tk, 1 @@ -98222,7 +98221,6 @@ ndplumbingboard.gov, 1 ndq.be, 1 ndrew.me, 1 nds-helicopter.de, 1 -nds-online.ru, 1 ndscreening.com, 1 ndtblog.com, 1 ndum.ch, 1 @@ -98456,6 +98454,7 @@ nelnet.net, 1 nelnetbank.com, 1 nelosculpteur.fr, 1 nelson-marine.com, 0 +nelsoncountyky.gov, 1 nelsonrecruitmentservices.co.uk, 1 nelsonrodrigues.tk, 1 nelsontwpoh.gov, 1 @@ -98706,7 +98705,6 @@ netbasequid.com, 1 netbeacon.de, 1 netbears.com, 1 netbears.ro, 1 -netbeez.net, 1 netbeyond.de, 1 netbird.tk, 1 netbows.com, 1 @@ -98983,6 +98981,7 @@ neumanncontractors.com.au, 1 neumanndredging.com.au, 1 neumannindustrialcoatings.com.au, 1 neumarkcb.com, 1 +neumaticar.cl, 1 neurabyte.com, 1 neuraclix.com, 1 neuralink.com, 1 @@ -99088,6 +99087,7 @@ newbabylon.tk, 1 newbackup.ml, 1 newbasemedia.us, 1 newberlinwi.gov, 1 +newberrycounty.gov, 1 newberryfl.gov, 1 newbieboss.com, 1 newbies.tk, 1 @@ -99694,7 +99694,6 @@ nicava.com.mx, 1 nice-autosurf.com, 1 nice-germany.tk, 1 nice-links.tk, 1 -nice-pay.com, 1 nice-school.com.ua, 1 nice.ch, 1 nice.com, 1 @@ -99958,7 +99957,6 @@ niituniversity.in, 1 niituva.ga, 1 niiu.digital, 1 niiucapital.com.sg, 1 -nij.gov, 1 nijiero-ch.com, 0 nijikata.com, 1 nijimama-life.com, 1 @@ -100550,7 +100548,6 @@ nomaster.cc, 1 nomee6.xyz, 1 nomenclator.org, 1 nomerel.com, 1 -nomerodekors.no, 1 nomesbiblicos.com, 1 nomial.co.uk, 1 nomifensine.com, 1 @@ -100719,6 +100716,7 @@ normity.nl, 1 norml.fr, 1 noroutine.com, 1 noroutine.me, 1 +norridgewock.gov, 1 norrisautomotiveinc.com, 1 norrishome.tk, 1 norristn.gov, 1 @@ -100801,6 +100799,7 @@ northrose.net, 1 northshoremums.com.au, 1 northshorevisitor.com, 1 northstarmodular.com, 1 +northsummitfireut.gov, 1 northtek.tk, 1 northteksystems.com, 1 northtexaspiano.org, 1 @@ -100811,6 +100810,7 @@ northumberlandcountypa.gov, 1 northumbria.ac.uk, 1 northwest-events.co.uk, 1 northwestimaging.com, 1 +northwilkesboronc.gov, 1 northwoodoh.gov, 1 northwoodstudios.org, 1 northzone.ml, 1 @@ -100952,7 +100952,6 @@ notify.gov, 1 notifyed.com, 1 notifymy.team, 1 notime.tk, 1 -notimundodbs.info, 1 notinglife.com, 1 notionbackups.com, 1 notipress.mx, 1 @@ -100980,6 +100979,7 @@ notre-planete.info, 0 notrefuse.tk, 1 notrero13.com, 1 notresiteduvercors.tk, 1 +notryden.com, 1 notsafefor.work, 1 notsoape.com, 1 nottawatwpisabellami.gov, 1 @@ -101831,6 +101831,7 @@ oaken.duckdns.org, 1 oakesfam.net, 1 oakface.com.au, 1 oakharbor.gov, 1 +oakhillfl.gov, 1 oakhillseniors.com, 1 oakislandnc.gov, 1 oaklandenrolls.org, 1 @@ -103170,7 +103171,7 @@ oneone.moe, 1 oneonemedia.tk, 1 oneononeonone.de, 1 oneononeonone.tv, 1 -onepeloton.ca, 1 +onepeloton.ca, 0 onepeloton.co.uk, 1 onepeloton.com, 1 onepersona.io, 1 @@ -103229,7 +103230,6 @@ onex.bet, 1 onezero24.net, 1 onfaloc.tk, 1 onfilm.tk, 1 -onfireonboarding.nl, 1 onfleet.com, 1 onformative.net, 1 ongea.io, 1 @@ -103942,6 +103942,7 @@ optimizedlabs.uk, 1 optimom.ca, 1 optimon.io, 1 optimummenhealth.com, 1 +optimumpacific.net, 1 optimumvikingsatcom.com, 1 optimumwebdesigns.com, 1 optimus.io, 1 @@ -104520,7 +104521,7 @@ otdyh-v-abhazii.tk, 1 oteri.de, 1 otg-drives.tk, 1 otgadaika.tk, 1 -oth666.com, 1 +oth666.com, 0 other98.com, 0 othercdn.com, 1 otherkinforum.com, 1 @@ -104939,6 +104940,7 @@ oxygenforchennai.com, 1 oxygin.net, 0 oxylabs-china.net, 1 oxylabs.cn, 1 +oxylabs.io, 1 oxymail.ru, 1 oxymoron.tk, 1 oxynux.xyz, 1 @@ -105343,7 +105345,6 @@ paintbrush.ga, 1 paintcolorsbysue.com, 1 painted-designs.tk, 1 painteddesertfrenchies.com, 1 -paintersgc.com.au, 1 paintingindurban.co.za, 1 paintingrepair.ga, 1 paintlabcustom.com.br, 1 @@ -105943,6 +105944,7 @@ parkeer.nl, 1 parkeerserviceboxtel.nl, 1 parkefficient.de, 1 parker-pllc.com, 1 +parkerco.gov, 1 parkercs.cf, 1 parkercs.ga, 1 parkercs.gq, 1 @@ -106166,7 +106168,6 @@ pasnederland.tk, 1 pasnine.my.id, 1 pasportaservo.org, 1 pasquinelli-truebag.ch, 1 -pass.org.my, 1 passa.org, 1 passabook.com, 1 passau-webdesign.com, 1 @@ -106315,6 +106316,7 @@ patentpanelers.ga, 1 patentpanelest.ga, 1 patentu.ga, 1 paterno-gaming.com, 1 +patersonpdnj.gov, 1 patguzmanconstruction.com, 1 pathagoras.com, 1 pathfinderbank.com, 1 @@ -106508,6 +106510,7 @@ pavelrebrov.com, 1 pavelstriz.cz, 1 paven.io, 0 pavernosmatao.tk, 1 +paviliontwpmi.gov, 1 pavingtiles.tk, 1 pavitrajyotish.com, 0 pavlecic.de, 1 @@ -106538,7 +106541,6 @@ pawpawtownshipmi.gov, 1 pawserv.pw, 1 pawsitiv.space, 1 pawson.tk, 1 -pawspetwear.com.au, 1 pawsr.us, 1 pawsru.org, 1 pawtraitcaptures.com.au, 1 @@ -106902,6 +106904,7 @@ pebkac.gr, 0 peblet.be, 1 pebook.tk, 1 pec-email.com, 1 +pec.net, 1 pecadis.de, 1 pecan.ai, 1 pecetowicz.pl, 1 @@ -106920,6 +106923,7 @@ ped-bike.de, 1 peda.net, 1 pedago.it, 1 pedagoplume.fr, 1 +pedaleuse.be, 1 pedalia.cc, 1 pedalirovanie.tk, 1 pedalr.eu, 1 @@ -108801,6 +108805,7 @@ pirate-proxy.onl, 1 pirate-proxy.pro, 1 pirate-proxy.pw, 1 pirate-punk.net, 1 +pirate.chat, 1 pirate.gq, 0 piraten-basel.ch, 1 piraten-kleinbasel.ch, 1 @@ -109771,7 +109776,6 @@ poc89.com, 1 poc899.com, 1 poc916.com, 1 poc918.com, 1 -poc965.com, 1 poc98.com, 1 poc99.com, 1 poc992.com, 1 @@ -109884,7 +109888,6 @@ pogljad-brest.tk, 1 pogodavolgograd.tk, 1 pogodok.tk, 1 pogomate.com, 1 -pogoswine.com, 1 pogotowie-komputerowe.tk, 1 pogotowiekomputeroweolsztyn.pl, 1 pogrebeniq-sofia.com, 1 @@ -111093,6 +111096,7 @@ prazdniktost.tk, 1 prazeremamamentar.com.br, 1 prc.gov, 1 prcarrier.tk, 1 +prcsurvey.com, 1 prd-use-device-api.azurewebsites.net, 1 prdashboard.tk, 1 prdctz.tips, 1 @@ -111548,6 +111552,7 @@ principia-magazin.de, 1 principia-online.de, 1 princovi.cz, 1 prinesec.com, 1 +prineville.gov, 1 prinice.org, 1 print-street.tk, 1 print.dk, 1 @@ -112453,8 +112458,8 @@ provision-isr.nl, 1 provisionircd.tk, 1 provitec.com, 1 provlas.se, 1 +provo.gov, 1 provocador.es, 1 -proweb-design.no, 1 prowi.se, 1 prowindow.sk, 1 prowise.com, 1 @@ -113082,8 +113087,6 @@ puroyorganico.com.co, 1 purple-dpss.co.uk, 1 purple.tech, 1 purplebricks.co.uk, 1 -purplebricks.com, 1 -purplebricks.com.au, 1 purplehost.com.br, 1 purplehotel.cf, 1 purplemath.com, 1 @@ -113235,7 +113238,6 @@ pwaiwm.site, 1 pwanotes.ga, 1 pwaresume.com, 1 pwbaccountants.com, 1 -pwclean.com.br, 1 pwcva.gov, 1 pwd.az, 1 pwd.vc, 1 @@ -113943,7 +113945,7 @@ quiltmc.org, 1 quimatic.com.br, 1 quimba.tk, 1 quimica.science, 1 -quin.md, 1 +quin.md, 0 quinder.tk, 1 quinmedia.tk, 1 quinn.com, 0 @@ -114553,7 +114555,6 @@ raidensnakesden.com, 1 raidensnakesden.net, 1 raidentawork.lt, 1 raiderhacks.com, 1 -raidkeeper.com, 1 raidstone.net, 1 raidstone.rocks, 1 raiffeisen-kosovo.com, 1 @@ -114764,6 +114765,7 @@ ran-ran.top, 1 rana.realestate, 1 rana.shop, 1 ranasinha.com, 1 +rancakmedia.com, 1 rancheriastereo.tk, 1 ranchesterwy.gov, 1 rancowar.com, 1 @@ -115188,7 +115190,6 @@ rburchell.com, 0 rbx.com, 1 rbx.gg, 1 rc-offi.net, 1 -rc-refer.nhs.uk, 1 rc-shop.ch, 1 rc.cruises, 1 rc1.eu, 1 @@ -115283,7 +115284,7 @@ rdmc.vision, 1 rdmc.wiki, 1 rdmrotterdam.nl, 0 rdmshit.net, 1 -rdmtaxservice.com, 1 +rdmtaxservice.com, 0 rdn-team.com, 1 rdns.gq, 1 rdo.gg, 1 @@ -115295,7 +115296,6 @@ rdv-cni.fr, 1 rdv-coquin-rapide.fr, 1 rdvobras.pt, 0 rdwh.tech, 0 -rdxbioscience.com, 1 rdzenie.pl, 1 re-align.life, 1 re-arranged.tk, 1 @@ -116886,6 +116886,7 @@ restrealitaet.de, 1 restream.fi, 1 resultsatretail.com, 1 resultsdate.news, 1 +resulttado.com, 1 resumecompanion.com, 1 resumegenius.com, 1 resumegets.com, 1 @@ -117026,6 +117027,7 @@ revers.tk, 1 reverse1999.wiki, 1 reverseaustralia.com, 1 reversecanada.com, 1 +reversecrucifixkm.altervista.org, 1 reversedns.tk, 1 reverseloansolutions.com, 1 reverselookupphone.us, 1 @@ -117201,6 +117203,7 @@ rgf.be, 0 rgfundraising.com, 1 rggraphics.mx, 1 rgpd-elearning.com, 1 +rgpdkit.io, 1 rgservice.ml, 1 rgtonline.com, 1 rgz.ee, 1 @@ -117291,6 +117294,7 @@ rib-ims.de, 1 rib-leipzig.com, 1 riba-lov.ga, 1 ribafs.tk, 1 +ribapo.com, 1 ribar.com, 1 ribblu.com, 1 ribdigital.com, 0 @@ -117316,7 +117320,6 @@ riceadvice.info, 1 ricecountymn.gov, 1 ricedust.com, 1 ricelasvegas.com, 1 -ricettesemplicieveloci.altervista.org, 1 rich-good.com, 0 richadams.me, 1 richandsteph.co.uk, 1 @@ -117417,6 +117420,7 @@ riddimsworld.com, 1 riddler.com.ar, 1 riddlock.com, 1 rideapart.com, 1 +rideelectric.gov, 1 ridegravel.ch, 1 rideintaxi.com, 1 rident-estetic.ro, 1 @@ -118020,7 +118024,6 @@ rocabot.ddns.net, 1 rochaaricanduva.com.br, 1 rochakhand-knitcraft.com.np, 1 rochcloud.cf, 1 -rochediagram.com, 1 rochesterglobal.com, 1 rochesternh.gov, 1 rochestertwpil.gov, 1 @@ -118044,6 +118047,7 @@ rockcountyne.gov, 1 rockcult.ru, 1 rockdaisy.com, 1 rockdalecoprobatecourt.gov, 1 +rockdaletx.gov, 1 rockenfolie.com, 0 rockenfuerlachenhelfen.de, 1 rockernj.com, 1 @@ -118483,7 +118487,6 @@ rosabellas.co.uk, 1 rosabrasiv.ga, 1 rosacosmos.tn, 1 rosaflorbijoux.com.br, 1 -rosakkreditatsiya-forum.ru, 1 rosalindmillercakes.com, 1 rosalindturner.co.uk, 1 rosalopezcortes.tk, 1 @@ -118505,6 +118508,7 @@ rosebikes.com, 1 rosebikes.de, 1 rosebikes.nl, 1 roseboom-bouwkundigadvies.nl, 1 +rosebudcountysheriffmt.gov, 1 rosecoaudit.com, 1 rosecrance.org, 1 rosedenellandudno.co.uk, 1 @@ -119942,6 +119946,7 @@ safewatchsecurity.ie, 1 safewayins.com, 1 safewayinsurance.com, 1 safewaysecurityscreens.com.au, 1 +safewaywaterproofing.com, 1 safex.az, 1 saffron.com, 1 safijourney.com, 1 @@ -120011,7 +120016,6 @@ saieditor.com, 1 saifonvillas.com, 1 saifoundation.in, 1 saifoundation.org, 1 -saifulanam.com, 1 saigonflowers.com, 1 saigonland24h.vn, 1 saigonstar.de, 1 @@ -120311,6 +120315,7 @@ saltedpasta.com, 1 salter.com.tr, 1 saltercane.com, 0 saltlakecounty.gov, 1 +saltlakehealth.gov, 1 saltnsauce.cf, 1 saltnsauce.ga, 1 saltnsauce.gq, 1 @@ -120717,6 +120722,7 @@ santabarbaraca.gov, 1 santackergaard.nl, 1 santaclaracounty.gov, 1 santaclaratx.gov, 1 +santaclarautah.gov, 1 santaclarita.gov, 1 santacruzca.gov, 1 santacruzcountyca.gov, 1 @@ -121449,7 +121455,7 @@ schimmel-test.info, 1 schimmelnagelspecialist.nl, 0 schindler.com, 1 schinkelplatz.com, 1 -schipholwatch.nl, 0 +schipholwatch.nl, 1 schipholwatch.org, 1 schippendale.de, 1 schippers-it.nl, 1 @@ -122019,6 +122025,7 @@ sdaniel55.com, 1 sdarcc.gov, 1 sdarot.buzz, 1 sdarot.tw, 1 +sdbehavioralhealth.gov, 1 sdcapp.in, 1 sdcardrecovery.de, 1 sdea.ca, 1 @@ -122165,7 +122172,6 @@ seasonlevel.com, 1 seasons.nu, 0 seasonsboutique.com.au, 1 seasonsof.berlin, 1 -seaspineortho.com, 1 seat61.com, 1 seatbeltpledge.com, 1 seatinglane2u.com, 1 @@ -122251,6 +122257,7 @@ sec3ure.co.uk, 1 sec455.com, 1 sec530.com, 1 secadoresdepelo.tk, 1 +secapp.fi, 1 secard.cc, 1 secard.me, 1 secard.xyz, 1 @@ -122725,7 +122732,6 @@ selwyn.cc, 1 semacode.com, 1 semaflex.it, 1 semalt.net, 1 -semanaacademica.org.br, 1 semanarioaqui.tk, 1 semantic-systems.com, 1 semantica.cz, 0 @@ -123971,7 +123977,6 @@ shechipin.ga, 1 shechipin.gq, 1 shechipin.ml, 1 shed49.com, 1 -shedrickflowers.com, 0 shedrin.tk, 1 sheds.online, 1 shee.org, 1 @@ -124421,6 +124426,7 @@ shoppbs.org, 1 shoppe561.com, 1 shopperexperts.com, 1 shopperexpertss.com, 1 +shoppersvineyard.com, 1 shoppies.tk, 1 shopping-cart-migration.com, 1 shopping-il.org.il, 1 @@ -124978,7 +124984,7 @@ sightful.nl, 1 sightseeing.news, 1 sighup.nz, 1 sigi.tk, 1 -sigint.pw, 1 +sigint.pw, 0 sigio.nl, 1 sigma957.net, 1 sigmacomputers.ga, 1 @@ -125027,6 +125033,7 @@ signix.net, 1 signmore.com, 1 signmycode.com, 1 signpath.io, 1 +signrequest.com, 1 signrightsigns.co.uk, 1 signsdance.uk, 1 signslabelstapesandmore.com, 0 @@ -125090,7 +125097,6 @@ silentdream.tk, 1 silentgreen.tk, 1 silentinstaller.com, 1 silentkernel.fr, 1 -silentkeynote.com, 1 silentneko.ga, 1 silentsite.tk, 1 silentsky.tk, 1 @@ -125134,7 +125140,6 @@ silverback.is, 0 silverbankltd.com, 1 silverbowflyshop.com, 1 silverbox.ga, 1 -silvercrossbaby.com, 1 silverdollaracademy.com, 1 silverdroid.gq, 1 silverfalcon.me, 1 @@ -125642,7 +125647,6 @@ siptls.com, 1 sipuri.me, 1 sipyuru.com, 1 sipyuru.lk, 1 -siq.li, 1 siqi.wang, 1 sirakov.tk, 1 siralyvisegrad.hu, 1 @@ -126152,7 +126156,6 @@ skvele-cesko.cz, 1 skvelecesko.cz, 1 skvot.de, 1 skwile-cafe.com, 1 -skwitko.com, 1 skwlkrs.com, 1 skxpl.eu.org, 1 sky-aroma.com, 1 @@ -126644,7 +126647,6 @@ smart-travel.tk, 1 smart-tux.de, 1 smart-wohnen.net, 1 smart-zona.tk, 1 -smart.gov, 1 smartacademy.ge, 1 smartacademy.pro, 1 smartagilesolution.com, 1 @@ -126775,7 +126777,6 @@ smartsupply.global, 1 smartthursday.hu, 1 smarttins.com, 1 smartvalor.com, 1 -smartvideo.io, 1 smartwank.com, 1 smartweb.ge, 1 smartwebportal.co.uk, 1 @@ -126788,7 +126789,7 @@ smash-gg.club, 1 smashbros-chile.tk, 1 smashbylaney.com, 1 smashcooper.tk, 1 -smashingconf.com, 0 +smashingconf.com, 1 smashingmagazine.com, 1 smashnl.tk, 1 smashno.ru, 1 @@ -127083,7 +127084,6 @@ sniffnfetch.com, 1 sniffy.ee, 1 snight.co, 1 snille.com, 1 -snip.host, 1 snip.software, 1 snipdrive.com, 1 sniper.sh, 1 @@ -127172,6 +127172,7 @@ snsp.ro, 1 sntial.co.za, 1 snukep.kr, 1 snwsjz.com, 1 +snyder-ne.gov, 1 snz.pw, 1 so-link.co, 1 so-spa.ru, 1 @@ -127376,7 +127377,6 @@ sofasthousebuyers.com, 1 sofdwi.gov, 1 soff.se, 1 soffit.com, 1 -sofgen.com, 1 sofi.codes, 1 sofiaestado.com, 1 sofialobocera.com, 1 @@ -127487,14 +127487,12 @@ sohka.eu, 1 soia.ca, 1 soilegustafsson.fi, 1 soillessgeek.com, 1 -soin-rebozo.fr, 1 soinsparlesmains.fr, 1 sointelcom.com.co, 1 soinvett.com, 0 soissons-technopole.org, 1 soji.io, 1 sokak-sanati.tk, 1 -sokaksepeti.com, 1 sokenconstruction.com, 1 soket.ee, 1 sokkenkraam.nl, 1 @@ -127597,6 +127595,7 @@ solidarityzone.org, 1 solidform.ml, 1 solidgroundchiro.com, 1 solidhost.cf, 1 +solidian.com, 1 solidimage.com.br, 1 solidincome.ga, 1 solidnet.software, 1 @@ -128349,7 +128348,6 @@ spalding-labs.com, 1 spaldingwall.com, 1 spalnobelyo.com, 1 spaltron.net, 1 -spam.lol, 1 spamasaurus.com, 1 spamcage.com, 1 spamdrain.com, 1 @@ -128546,7 +128544,6 @@ spectrum.gov, 1 spectrum3d.ru, 1 spectrumelectrical-brisbane.com.au, 1 spectrumtexas.net, 1 -spectrumtheatreaustin.org, 1 spediscifiori.com, 1 spedizioni.roma.it, 1 speechdrop.net, 1 @@ -129012,6 +129009,7 @@ springportny.gov, 1 springsoffthegrid.com, 1 springspeedshop.com, 1 springtxcarpetcleaning.com, 1 +sprintkitchen.com, 1 sprintlee.com, 1 sprintswac.tk, 1 spriterinc.com, 1 @@ -129099,7 +129097,6 @@ squad.fr, 1 squadco.com, 1 squadgames.ru, 1 squalesdechatou.org, 1 -squality2.xyz, 1 squardllc.ml, 1 square-gamers.tk, 1 square-gaming.org, 0 @@ -129320,6 +129317,7 @@ ssld.at, 1 ssldecoder.eu, 1 ssldev.net, 1 sslgctx.gov, 1 +sslgram.com, 1 sslhello.com, 1 sslle.eu, 1 sslmate.com, 1 @@ -129572,6 +129570,7 @@ stantabler.com, 1 stanthony-hightstown.net, 1 stantonca.gov, 1 stantoncountyne.gov, 1 +stanwoodwa.gov, 1 stanza.group, 1 stape.io, 1 staplespromo.com, 1 @@ -129589,7 +129588,6 @@ starb.in, 1 starbaese.de, 1 starbase01.com, 1 starboardmarketing.io, 1 -starborne.space, 1 starbreaker.org, 1 starbt.ro, 1 starbucks.vn, 1 @@ -129874,7 +129872,6 @@ stcatharinesromawolves.tk, 1 stcc.edu, 1 stccordoba.com, 1 stceciliakearny.org, 1 -stced.org, 1 stcharlescountycsfamo.gov, 1 stcharlesparish.gov, 1 stclairpa.gov, 1 @@ -129891,6 +129888,7 @@ stdev.top, 1 stdnet.ru, 1 stdssr.com, 1 ste2.de, 1 +stea-web.com, 1 steacy.tech, 1 steadfastagencies.com.au, 1 steadfastplacements.com.au, 1 @@ -130417,7 +130415,6 @@ stnews.ga, 1 stnl.de, 0 stntrading.eu, 1 sto-garant.nl, 1 -stob-architekten.de, 1 stock-ai.com, 1 stockageprive.net, 1 stockanalysis.com, 1 @@ -130606,7 +130603,6 @@ storepaperoomates.com, 1 storepaperoomates.net, 1 storephotovoltaique.com, 1 storeplus.ml, 1 -storepy.com.mx, 1 storesonline.fr, 1 storgaarddieu.com, 1 stori.press, 1 @@ -130943,7 +130939,6 @@ stroimsami.tk, 1 stroimvse.ml, 1 stroiproect.tk, 1 strojmaster.tk, 1 -stroke-of-luck.com, 1 strokesb.store, 1 strokesurvivor.nz, 1 strom.family, 1 @@ -131096,7 +131091,6 @@ studio678.com, 0 studio91.tk, 1 studioabq.com, 1 studioadevents.com, 1 -studioamai.be, 1 studioamoureus.nl, 1 studioandrew.tk, 1 studioavvocato.milano.it, 1 @@ -131111,6 +131105,7 @@ studiodentisticosanmarco.it, 0 studiodoprazer.com.br, 1 studiodpe.com, 0 studiodriban.com, 0 +studioelo.com.br, 0 studioevent.tk, 1 studiofpvet.it, 1 studiofutbol.com.ec, 1 @@ -131658,6 +131653,7 @@ sunfeathers.net, 1 sunfiregold.com, 1 sunfireshop.com.br, 1 sunflare.tk, 1 +sunflowercircuitclerk.gov, 1 sunflyer.cn, 1 sunfox.cz, 1 sunfulong.blog, 1 @@ -131846,7 +131842,6 @@ superfluous.tk, 1 superfly.tk, 1 superfoodsexplained.com, 1 superfury.tk, 1 -superglidewardrobes.co.uk, 1 supergmtransport.com.au, 1 supergood.ga, 1 supergoods.tk, 1 @@ -131980,6 +131975,7 @@ supportericking.org, 1 supportfan.gov, 1 supportiv.com, 1 supportivecare.org, 1 +supportlafd.org, 1 supportme123.com, 0 supportmeindia.com, 1 suppos-net.tk, 1 @@ -132607,7 +132603,6 @@ sylencegsm.com, 1 sylfie.net, 1 sylino.tk, 1 syllogi.xyz, 1 -sylmar-cash-for-cars.com, 1 sylnaukraina.com.ua, 1 sylvaindurand.fr, 1 sylvaindurand.org, 1 @@ -133188,7 +133183,6 @@ taitlinstudio.com, 1 taittowers.com, 1 taiwan-kitchen.com, 1 taiwanbible.com.tw, 1 -taiwanhotspring.net, 1 taiwania.capital, 1 taiwania.vc, 1 taiwaniacapital.com, 1 @@ -134351,7 +134345,6 @@ techmerch.ru, 0 techmusea.com, 1 technamin.com, 1 technavio.com, 1 -technewera.com, 1 technewsetc.tk, 1 technewyork.tk, 1 techni-k.co.uk, 1 @@ -134889,12 +134882,9 @@ teml.in, 1 temmyzplace.com, 1 temnacepel.cz, 1 temnikova.tk, 1 -temofoundation.com, 1 temogroup.com, 1 -temogroup.org, 1 temogroupe.com, 1 temoinfidele.fr, 1 -temoinfo.com, 1 temonews.com, 1 temp-lars.army, 1 temp.pm, 1 @@ -134915,7 +134905,6 @@ templatetrip.com, 1 templeandalucia.tk, 1 templeoverheaddoors.com, 1 templete.tk, 1 -templodelmasaje.com, 1 tempmail.ninja, 1 tempo.co, 1 tempo.com.ph, 1 @@ -135007,6 +134996,7 @@ tenshoku-hanashi.com, 1 tenshokudo.com, 1 tenshokufair.jp, 1 tent.io, 1 +tenta.com, 1 tentacle.monster, 1 tentacle.net, 1 tentacletank.com, 1 @@ -135371,10 +135361,8 @@ texnoguru.tk, 1 texnolog.tk, 1 texnotroniks.tk, 1 texosmotr.tk, 1 -texpresspainting.com, 1 textadventure.tk, 1 textassistant.ga, 1 -textbrawlers.com, 1 textcleaner.net, 1 textcounter.tk, 1 texteditor.co, 1 @@ -135448,6 +135436,7 @@ tfw-a.com, 1 tfx.com.br, 1 tfxstartup.com, 1 tfxstartup.com.br, 1 +tfyre.co.za, 1 tg2sclient.com, 1 tgb.org.uk, 1 tgbyte.de, 1 @@ -135622,7 +135611,6 @@ theadelaideshow.com.au, 1 theadultswiki.com, 1 theafleo.ga, 1 theafleo.gq, 1 -theafricanvibeking.com, 0 theagencywithoutaname.com, 1 theaidigitalmarketingblog.com, 1 thealchemistatelier.com, 1 @@ -136044,7 +136032,6 @@ thefranklinnewspost.com, 1 thefreebay.tk, 1 thefreemail.com, 1 thefreethinker.tk, 1 -thefrenchbeautyacademy.edu.au, 1 thefrenchconnection.tk, 1 thefridaycinema.com, 1 thefriedzombie.com, 1 @@ -136078,7 +136065,6 @@ thegeekguy.eu, 1 thegeeklab.de, 1 thegeektools.com, 1 thegemriverside.com.vn, 1 -thegenesisshop.com, 1 thegeniusdz.tk, 1 thegentleman.tk, 1 thegeriatricdietitian.com, 1 @@ -136131,7 +136117,6 @@ thehairrepublic.net, 1 thehalchal.com, 1 thehamiltoncoblog.com, 1 thehammerfund.com, 1 -thehamptonsvegan.com, 1 thehappeny.com, 1 thehappyxwife.ga, 1 thehardgame.top, 1 @@ -136839,7 +136824,6 @@ theveils.net, 1 thevelvetlove.tk, 1 thevenueofhollywood.com, 1 thevern.co.za, 1 -theverybusyoffice.co.uk, 1 thevetstop.co.uk, 1 thevillageok.gov, 1 thevillasatparkaire.com, 1 @@ -137031,7 +137015,6 @@ thirdman.auction, 0 thirdwave.tk, 1 thirdwaverevenue.com, 1 thirdworld.moe, 1 -thirstyjourneys.com, 1 thirteen.pm, 1 thirtysixseventy.ml, 1 thiruvarur.org, 1 @@ -137464,7 +137447,6 @@ tiendadeperros.com, 1 tiendadolca.com, 1 tiendaengeneral.com, 1 tiendafetichista.com, 1 -tiendagamer.co, 1 tiendamacoco.com.ar, 1 tiendamagia.com, 1 tiendanube.com, 1 @@ -137805,7 +137787,6 @@ tintamas.tk, 1 tinte24.de, 1 tintenfix.net, 1 tintiger.com, 1 -tintop.xyz, 1 tintoria.roma.it, 1 tintuonmobile.tk, 1 tinturanaturale.it, 1 @@ -138932,7 +138913,6 @@ torgopt.tk, 1 torgovaya.tk, 1 toricafe.com, 1 torigaoka-dc.com, 1 -toriihq.com, 1 toriko-official.ml, 1 torino.fi, 1 torinotoday.it, 1 @@ -139256,6 +139236,7 @@ townofcadizwi.gov, 1 townofcaledoniacolumbiawi.gov, 1 townofcampbellwi.gov, 1 townofcanandaigua.gov, 1 +townofcantonct.gov, 1 townofcaponbridgewv.gov, 1 townofcarthagetn.gov, 1 townofcedarburgwi.gov, 1 @@ -139268,6 +139249,7 @@ townofclearfieldwi.gov, 1 townofclearlakewi.gov, 1 townofclevelandnc.gov, 1 townofclymanwi.gov, 1 +townofcohoctonny.gov, 1 townofcoldspringny.gov, 1 townofcooperstownwi.gov, 1 townofcranmoor.gov, 1 @@ -139361,6 +139343,7 @@ townofonalaskawi.gov, 1 townofonondaga.gov, 1 townoforegonwi.gov, 1 townofpolk-wi.gov, 1 +townofpoygan.gov, 1 townofprincessannemd.gov, 1 townofredriverwis.gov, 1 townofreseburgwi.gov, 1 @@ -139379,6 +139362,7 @@ townofsananselmoca.gov, 1 townofsandcreekwi.gov, 1 townofsasserga.gov, 1 townofscottbrownwi.gov, 1 +townofscottsheboyganwi.gov, 1 townofsenecawoodcowi.gov, 1 townofsevastopolwi.gov, 1 townofsheboyganfallswi.gov, 1 @@ -139404,6 +139388,7 @@ townofuniondoorwi.gov, 1 townofuticawi.gov, 1 townofvarnamtown.gov, 1 townofvermontwi.gov, 1 +townofveteranny.gov, 1 townofvinlandwi.gov, 1 townofwalworthwi.gov, 1 townofwarrensccwi.gov, 1 @@ -139452,7 +139437,6 @@ toyotapartsprime.com, 1 toyotasp.ru, 1 toyouiv.net, 1 toyouiv.org, 1 -toypoodlepet.com, 1 toys-robots.cf, 1 toys4education.com.au, 1 toyscenter.it, 1 @@ -139512,6 +139496,7 @@ tr0n.net, 1 tr3fit.xyz, 1 tra-tra.be, 1 traas.org, 1 +trabajadormigrante.gov, 1 trabajaenvitamina.cl, 1 trabajarytrabajar.com, 1 trabajoenmx.com, 0 @@ -140456,7 +140441,6 @@ tripout.tech, 1 tripozo.com, 1 tripp.xyz, 1 trippati.com, 1 -tripplanet.com, 1 tripsided.com, 1 tripspoint.com, 1 tripsweet.com, 1 @@ -140790,6 +140774,7 @@ trussville.gov, 1 trust-btc.ml, 1 trust-s.ru, 1 trust-ted.co.uk, 1 +trust.com, 1 trust.zone, 1 trust2protect.de, 1 trustarc.com, 1 @@ -141149,7 +141134,6 @@ tulippublishing.com.au, 1 tulisan.tk, 1 tull.tk, 1 tuller.tk, 1 -tully.co.uk, 1 tulocura.tk, 1 tulpawiki.org, 1 tulsa.tech, 1 @@ -141329,6 +141313,7 @@ turkuradyo.tk, 1 turkutitans.tk, 1 turl.pl, 1 turlewicz.pl, 1 +turlockca.gov, 1 turm-umzuege.de, 1 turn-sticks.com, 1 turnali.tk, 1 @@ -142572,7 +142557,6 @@ unicycle.show, 1 unidadvirtual.com, 1 unidata.ca, 1 unideb.hu, 1 -unieducar.org.br, 1 uniekglas.nl, 1 uniex.ch, 1 uniex.pw, 1 @@ -144254,7 +144238,6 @@ vasilisa-volodina.ga, 1 vasilisa-volodina.gq, 1 vasilisa-volodina.ml, 1 vaskulitis-info.de, 1 -vasogroup.com, 1 vasp.at, 1 vassalengine.org, 1 vastdata.com, 0 @@ -144418,10 +144401,10 @@ veetechnologies.com, 1 veethi.com, 1 veeva.link, 1 vefagas.com, 1 -vefald.no, 1 veg-leiden.nl, 1 veg.lv, 0 vega-diva.com, 1 +vega-rumia.com.pl, 1 vega-rumia.pl, 0 vega.education, 1 vegalanguageacademy.ca, 1 @@ -145268,7 +145251,6 @@ vierna.ga, 1 vierpfeile.de, 1 vierpluseins.wtf, 1 vietconghackz.tk, 1 -vietdungit.com, 1 vietfes.asia, 1 vietforum.ml, 1 vietnam-fishing.com, 1 @@ -145302,7 +145284,6 @@ viewzipcode.com, 1 viez.vn, 1 vifranco.cl, 1 vifsoft.com, 1 -vigerust.net, 1 vigilanciatotal.com, 1 vigilanciaysalud.com, 1 vigilantesporcolombia.org, 1 @@ -145453,6 +145434,7 @@ villageofgraftonwi.gov, 1 villageofgrantsburg.gov, 1 villageofhempsteadpdny.gov, 1 villageofjacksonwi.gov, 1 +villageoflagrangeohio.gov, 1 villageoflavallewi.gov, 1 villageoflomira.gov, 1 villageoflonerock-wi.gov, 1 @@ -145772,6 +145754,7 @@ virgosecurity.com.au, 1 virgulazero.com.br, 1 virial.de, 0 viridis-milites.cz, 1 +virima.com, 1 viris.si, 1 virkhost.com, 1 virostack.com, 1 @@ -145788,6 +145771,7 @@ virtual-dba.com, 1 virtual-insanity.tk, 1 virtual-webcam.com, 1 virtual.hk, 0 +virtualarkansas.org, 1 virtualbrands.com, 0 virtualbrestby.tk, 1 virtualbruges.tk, 1 @@ -146312,7 +146296,7 @@ vlovgr.se, 1 vltonline.org, 1 vlzbazar.ru, 1 vm-0.com, 1 -vm.co.mz, 1 +vm.co.mz, 0 vm.ee, 0 vm0.eu, 1 vmagadane.tk, 1 @@ -146675,6 +146659,7 @@ voteks.gov, 1 votelevy.gov, 1 votemarion.gov, 1 votemate.org, 1 +votemt.gov, 1 votenassaufl.gov, 1 voteokaloosa.gov, 1 voteokeechobee.gov, 1 @@ -146754,7 +146739,6 @@ vozhuo.cf, 1 vozpopuli.com, 1 vp-arc.org, 1 vparilke.su, 1 -vpbuilds.com, 1 vpetkov.tk, 1 vpn-suomi.fi, 1 vpn-sverige.se, 1 @@ -146948,9 +146932,9 @@ vtaxi.se, 1 vtbclub.xyz, 1 vtbs.moe, 1 vtc-bordeaux-gironde.fr, 1 +vtcourts.gov, 1 vtech.com, 1 vtescebu.com, 1 -vtexpayments.com.br, 1 vtipe-vylez.cz, 0 vtivision.com, 1 vtjud.gov, 1 @@ -147441,6 +147425,7 @@ wallix.com, 1 wallmanderstd.se, 1 wallmarketing.cz, 1 wallmounttvinstallation.com, 1 +wallnj.gov, 1 wallnot.dk, 1 wallpaperstreet.tk, 1 wallpapertag.com, 1 @@ -147457,6 +147442,8 @@ wally4000.tk, 1 wallytest.tk, 1 walma.re, 1 walnus.com, 1 +walnutcreekca.gov, 1 +walnutcreekpdca.gov, 1 walnutgaming.com, 1 walnutgrovemo.gov, 1 walnutvalleywater.gov, 1 @@ -147574,7 +147561,6 @@ wapspaces.tk, 1 wapsychiatry.com.au, 1 waptransfer.tk, 1 wapveil.ml, 1 -waqood.tech, 1 war-requiem.com, 1 war-team.com, 1 warbox.ga, 1 @@ -148121,7 +148107,7 @@ web-smart.com, 1 web-snadno.online, 1 web-space.design, 1 web-station.tk, 1 -web-stories.at, 1 +web-stories.at, 0 web-studio-kzo.ml, 1 web-style.tk, 1 web-tcapwebsite-dev.azurewebsites.net, 1 @@ -148859,7 +148845,6 @@ welty.io, 1 welty.me, 1 wemadegod.tk, 1 wemakebookkeepingeasy.com, 1 -wemakemenus.com, 0 wemakemx.mx, 1 wemakeonlinereviews.com, 1 weme.eco, 1 @@ -148971,6 +148956,7 @@ wesleywarnell.com, 1 wesoco.de, 1 wespath.org, 1 wespeakgeek.co.za, 1 +wespeakk9.com, 1 wespringforward.com, 1 wesreportportal.com, 1 wessalicious.com, 1 @@ -149026,7 +149012,6 @@ westfund.com.au, 1 westgatecruiseandtravel.com, 1 westhamptonma.gov, 1 westhighlandwhiteterrier.com.br, 1 -westhillselectrical.com, 1 westie.tk, 1 westjp-tetuke-hosyou.co.jp, 1 westlab.ch, 1 @@ -149340,7 +149325,6 @@ whitebirdclinic.org, 1 whitebox.ga, 1 whitefieldnhpd.gov, 1 whitefordtownshipmi.gov, 1 -whiteglovemoving.us, 0 whitehallal.gov, 1 whitehathackers.com.br, 1 whitehats.nl, 1 @@ -149486,6 +149470,7 @@ wicca-witchcraft.com, 1 wiccansupplies.ga, 1 wiccanwicks.ca, 1 wiccasima.fr, 1 +wicharypawel.com, 1 wichitafoundationpros.com, 1 wichtel-umzuege.de, 1 wickedsick.tk, 1 @@ -149899,6 +149884,7 @@ wilsonfire.com, 1 wilsoninfanteadv.com.br, 1 wilsonlanguage.com, 1 wilsonovi.com, 1 +wilsontnvotes.gov, 1 wilsonvilleoregon.gov, 1 wiltonmanors.gov, 1 wiltonsandstonequarry.com.au, 1 @@ -149993,7 +149979,7 @@ windsorelectricalservice.com, 1 windsorite.ca, 1 windsornc.gov, 1 windsorrslsubbranch.com.au, 1 -windstreamhosting.com, 0 +windstreamhosting.com, 1 windsurfercrs.com, 1 windturbine.tk, 1 windwoodmedia.com, 1 @@ -150006,6 +149992,7 @@ wine.com.br, 1 wine.com.my, 1 wine.money, 1 wine.my, 1 +wineandcheeseplace.com, 1 winebrasil.com.br, 1 winechapter.be, 1 winedineunwind.org, 1 @@ -150484,7 +150471,6 @@ wolfgang-kerschbaumer.com, 1 wolfgang-kerschbaumer.net, 1 wolfgang-kloke.de, 1 wolfgang-ziegler.com, 1 -wolfgang.space, 1 wolfgangkowar.de, 1 wolfie.tv, 1 wolflabs.co.uk, 1 @@ -150643,6 +150629,7 @@ woodsidepottery.ca, 1 woodstar.ro, 1 woodstocknh.gov, 1 woodstocksupply.com, 1 +woodstockva.gov, 1 woodstone.nu, 1 woodtrust.com, 1 woodvibes.pl, 1 @@ -150672,7 +150659,7 @@ woonplein.tk, 1 woontegelwinkel.nl, 1 woonverkoop.be, 1 woopie.com, 1 -woopiq.com, 1 +woopiq.com, 0 wooplaces.com, 1 wooproducciones.tk, 1 woordvanvandaag.nl, 1 @@ -150754,6 +150741,7 @@ workathomenoscams.com, 1 workathomeopportunities.tk, 1 workathomernjobs.tk, 1 workcare.com, 1 +workcenter.gov, 1 workcheck.bz, 1 workclaims.org, 1 workcloud.jp, 1 @@ -151048,6 +151036,7 @@ wownskportal.tk, 1 wowpilates.com, 1 wowpolisa.pl, 1 wows-mods.tk, 1 +wows.sb, 1 wowsosellout.com, 1 wox.ac, 1 woyao.ml, 1 @@ -152420,7 +152409,6 @@ xn--80aejljbfwxn.xn--p1ai, 1 xn--80affa6ai0a.tk, 1 xn--80afvgfgb0aa.xn--p1ai, 1 xn--80ah4f.xn--p1ai, 1 -xn--80ahclcaoccacrhfebi0dcn5c1jh.xn--p1ai, 1 xn--80ahjdhy.tk, 1 xn--80ahnefiifo0g.xn--p1ai, 1 xn--80aihgal0apt.xn--p1ai, 1 @@ -153429,6 +153417,7 @@ yamei8866.com, 1 yamei98.com, 1 yamei99.com, 1 yamei9955.com, 1 +yamhillcounty.gov, 1 yami.fun, 0 yamm.io, 1 yamobila.tk, 1 @@ -154269,7 +154258,7 @@ yourpersonalfrance.com, 1 yourpillstore.com, 1 yourscotlandtour.co.uk, 1 yoursfunny.top, 1 -yourskin.nl, 1 +yourskin.nl, 0 yoursoul.gq, 1 yoursoulmate.tk, 1 yoursouthwales.wedding, 1 @@ -155405,6 +155394,7 @@ zetflix24.online, 1 zettahertz.com, 1 zettaplan.ru, 1 zettaport.com, 1 +zettel.io, 1 zettlmeissl.de, 1 zety.com, 1 zety.es, 1 @@ -155558,7 +155548,7 @@ ziaiai.com, 1 ziarajoias.com.br, 1 ziaulnmonzur.tk, 1 zible.io, 1 -zidanpainting.com, 1 +zidanpainting.com, 0 ziddea.com, 1 ziegenhagel.com, 1 ziegler-heizung-frankfurt.de, 1 @@ -155663,7 +155653,7 @@ zisoo.nl, 1 zistemo.com, 1 zitadel.ch, 0 zitadel.cloud, 1 -zitadel.com, 0 +zitadel.com, 1 zithromaxstrepthroat.gq, 1 zitstabureau24.nl, 1 zivava.ge, 1 @@ -156144,7 +156134,6 @@ zusammen-grossartig.de, 1 zusjesvandenbos.nl, 1 zuss.tk, 1 zusterjansen.nl, 1 -zutobi.com, 1 zuu.fi, 1 zuviel.space, 1 zuyzi.com, 1 diff --git a/security/nss/TAG-INFO b/security/nss/TAG-INFO index cd68ff270d5..d1108784b12 100644 --- a/security/nss/TAG-INFO +++ b/security/nss/TAG-INFO @@ -1 +1 @@ -NSS_3_91_RTM \ No newline at end of file +NSS_3_92_BETA1 \ No newline at end of file diff --git a/security/nss/automation/abi-check/expected-report-libfreebl3.so.txt b/security/nss/automation/abi-check/expected-report-libfreebl3.so.txt index fb319d75561..e69de29bb2d 100644 --- a/security/nss/automation/abi-check/expected-report-libfreebl3.so.txt +++ b/security/nss/automation/abi-check/expected-report-libfreebl3.so.txt @@ -1,18 +0,0 @@ - -1 function with some indirect sub-type change: - - [C]'function NSSLOWHASHContext* NSSLOWHASH_NewContext(NSSLOWInitContext*, HASH_HashType)' at lowhash_vector.c:171:1 has some indirect sub-type changes: - parameter 2 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - diff --git a/security/nss/automation/abi-check/expected-report-libnss3.so.txt b/security/nss/automation/abi-check/expected-report-libnss3.so.txt index 48c8c369b26..e69de29bb2d 100644 --- a/security/nss/automation/abi-check/expected-report-libnss3.so.txt +++ b/security/nss/automation/abi-check/expected-report-libnss3.so.txt @@ -1,132 +0,0 @@ - -8 functions with some indirect sub-type change: - - [C]'function SECStatus CERT_AddOCSPAcceptableResponses(CERTOCSPRequest*, SECOidTag, ...)' at ocsp.c:2202:1 has some indirect sub-type changes: - parameter 2 of type 'typedef SECOidTag' has sub-type changes: - underlying type 'enum __anonymous_enum__' at secoidt.h:34:1 changed: - type size hasn't changed - 8 enumerator insertions: - '__anonymous_enum__::SEC_OID_SHA3_224' value '364' - '__anonymous_enum__::SEC_OID_SHA3_256' value '365' - '__anonymous_enum__::SEC_OID_SHA3_384' value '366' - '__anonymous_enum__::SEC_OID_SHA3_512' value '367' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_224' value '368' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_256' value '369' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_384' value '370' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_512' value '371' - - 1 enumerator change: - '__anonymous_enum__::SEC_OID_TOTAL' from value '364' to '372' at secoidt.h:34:1 - - - [C]'function void HASH_Begin(HASHContext*)' at sechash.c:553:1 has some indirect sub-type changes: - parameter 1 of type 'HASHContext*' has sub-type changes: - in pointed to type 'typedef HASHContext' at hasht.h:12:1: - underlying type 'struct HASHContextStr' at hasht.h:66:1 changed: - type size hasn't changed - 1 data member change: - type of 'const SECHashObjectStr* HASHContextStr::hashobj' changed: - in pointed to type 'const SECHashObjectStr': - in unqualified underlying type 'struct SECHashObjectStr' at hasht.h:53:1: - type size hasn't changed - 1 data member change: - type of 'HASH_HashType SECHashObjectStr::type' changed: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - - - [C]'function const SECHashObject* HASH_GetHashObject(HASH_HashType)' at sechash.c:236:1 has some indirect sub-type changes: - parameter 1 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - [C]'function SECOidTag HASH_GetHashOidTagByHashType(HASH_HashType)' at sechash.c:288:1 has some indirect sub-type changes: - parameter 1 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - [C]'function HASH_HashType HASH_GetHashTypeByOidTag(SECOidTag)' at sechash.c:242:1 has some indirect sub-type changes: - return type changed: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - [C]'function HASH_HashType HASH_GetType(HASHContext*)' at sechash.c:580:1 has some indirect sub-type changes: - return type changed: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - [C]'function SECStatus HASH_HashBuf(HASH_HashType, unsigned char*, const unsigned char*, PRUint32)' at sechash.c:458:1 has some indirect sub-type changes: - parameter 1 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - [C]'function unsigned int HASH_ResultLen(HASH_HashType)' at sechash.c:441:1 has some indirect sub-type changes: - parameter 1 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - diff --git a/security/nss/automation/abi-check/expected-report-libnssutil3.so.txt b/security/nss/automation/abi-check/expected-report-libnssutil3.so.txt index c0253e367ba..e69de29bb2d 100644 --- a/security/nss/automation/abi-check/expected-report-libnssutil3.so.txt +++ b/security/nss/automation/abi-check/expected-report-libnssutil3.so.txt @@ -1,22 +0,0 @@ - -1 function with some indirect sub-type change: - - [C]'function SECStatus NSS_GetAlgorithmPolicy(SECOidTag, PRUint32*)' at secoid.c:2262:1 has some indirect sub-type changes: - parameter 1 of type 'typedef SECOidTag' has sub-type changes: - underlying type 'enum __anonymous_enum__' at secoidt.h:34:1 changed: - type size hasn't changed - 8 enumerator insertions: - '__anonymous_enum__::SEC_OID_SHA3_224' value '364' - '__anonymous_enum__::SEC_OID_SHA3_256' value '365' - '__anonymous_enum__::SEC_OID_SHA3_384' value '366' - '__anonymous_enum__::SEC_OID_SHA3_512' value '367' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_224' value '368' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_256' value '369' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_384' value '370' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_512' value '371' - - 1 enumerator change: - '__anonymous_enum__::SEC_OID_TOTAL' from value '364' to '372' at secoidt.h:34:1 - - - diff --git a/security/nss/automation/abi-check/expected-report-libsmime3.so.txt b/security/nss/automation/abi-check/expected-report-libsmime3.so.txt index 474a73f0f29..e69de29bb2d 100644 --- a/security/nss/automation/abi-check/expected-report-libsmime3.so.txt +++ b/security/nss/automation/abi-check/expected-report-libsmime3.so.txt @@ -1,66 +0,0 @@ - -2 functions with some indirect sub-type change: - - [C]'function PK11SymKey* NSS_CMSContentInfo_GetBulkKey(NSSCMSContentInfo*)' at cmscinfo.c:426:1 has some indirect sub-type changes: - parameter 1 of type 'NSSCMSContentInfo*' has sub-type changes: - in pointed to type 'typedef NSSCMSContentInfo' at cmst.h:54:1: - underlying type 'struct NSSCMSContentInfoStr' at cmst.h:126:1 changed: - type size hasn't changed - 1 data member changes (2 filtered): - type of 'NSSCMSContent NSSCMSContentInfoStr::content' changed: - underlying type 'union NSSCMSContentUnion' at cmst.h:113:1 changed: - type size hasn't changed - 1 data member changes (3 filtered): - type of 'NSSCMSEncryptedData* NSSCMSContentUnion::encryptedData' changed: - in pointed to type 'typedef NSSCMSEncryptedData' at cmst.h:65:1: - underlying type 'struct NSSCMSEncryptedDataStr' at cmst.h:463:1 changed: - type size hasn't changed - 1 data member changes (1 filtered): - type of 'NSSCMSAttribute** NSSCMSEncryptedDataStr::unprotectedAttr' changed: - in pointed to type 'NSSCMSAttribute*': - in pointed to type 'typedef NSSCMSAttribute' at cmst.h:69:1: - underlying type 'struct NSSCMSAttributeStr' at cmst.h:482:1 changed: - type size hasn't changed - 1 data member change: - type of 'SECOidData* NSSCMSAttributeStr::typeTag' changed: - in pointed to type 'typedef SECOidData' at secoidt.h:16:1: - underlying type 'struct SECOidDataStr' at secoidt.h:531:1 changed: - type size hasn't changed - 1 data member change: - type of 'SECOidTag SECOidDataStr::offset' changed: - underlying type 'enum __anonymous_enum__' at secoidt.h:34:1 changed: - type size hasn't changed - 8 enumerator insertions: - '__anonymous_enum__::SEC_OID_SHA3_224' value '364' - '__anonymous_enum__::SEC_OID_SHA3_256' value '365' - '__anonymous_enum__::SEC_OID_SHA3_384' value '366' - '__anonymous_enum__::SEC_OID_SHA3_512' value '367' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_224' value '368' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_256' value '369' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_384' value '370' - '__anonymous_enum__::SEC_OID_HMAC_SHA3_512' value '371' - - 1 enumerator change: - '__anonymous_enum__::SEC_OID_TOTAL' from value '364' to '372' at secoidt.h:34:1 - - - - - - - - [C]'function PRBool SEC_PKCS7VerifyDetachedSignature(SEC_PKCS7ContentInfo*, SECCertUsage, const SECItem*, HASH_HashType, PRBool)' at p7decode.c:1767:1 has some indirect sub-type changes: - parameter 4 of type 'typedef HASH_HashType' has sub-type changes: - underlying type 'enum __anonymous_enum__' at hasht.h:18:1 changed: - type size hasn't changed - 4 enumerator insertions: - '__anonymous_enum__::HASH_AlgSHA3_224' value '8' - '__anonymous_enum__::HASH_AlgSHA3_256' value '9' - '__anonymous_enum__::HASH_AlgSHA3_384' value '10' - '__anonymous_enum__::HASH_AlgSHA3_512' value '11' - - 1 enumerator change: - '__anonymous_enum__::HASH_AlgTOTAL' from value '8' to '12' at hasht.h:18:1 - - - diff --git a/security/nss/automation/abi-check/previous-nss-release b/security/nss/automation/abi-check/previous-nss-release index a50f2afbd49..b20fa5ec988 100644 --- a/security/nss/automation/abi-check/previous-nss-release +++ b/security/nss/automation/abi-check/previous-nss-release @@ -1 +1 @@ -NSS_3_90_BRANCH +NSS_3_91_BRANCH diff --git a/security/nss/coreconf/coreconf.dep b/security/nss/coreconf/coreconf.dep index 5182f75552c..590d1bfaeee 100644 --- a/security/nss/coreconf/coreconf.dep +++ b/security/nss/coreconf/coreconf.dep @@ -10,3 +10,4 @@ */ #error "Do not include this header file." + diff --git a/security/nss/lib/ckfw/builtins/certdata.txt b/security/nss/lib/ckfw/builtins/certdata.txt index f604b265e2d..dd113ae0010 100644 --- a/security/nss/lib/ckfw/builtins/certdata.txt +++ b/security/nss/lib/ckfw/builtins/certdata.txt @@ -1766,173 +1766,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Camerfirma Chambers of Commerce Root" -# -# Issuer: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Serial Number: 0 (0x0) -# Subject: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Not Valid Before: Tue Sep 30 16:13:43 2003 -# Not Valid After : Wed Sep 30 16:13:44 2037 -# Fingerprint (SHA-256): 0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3 -# Fingerprint (SHA1): 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Camerfirma Chambers of Commerce Root" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\042\060 -\040\006\003\125\004\003\023\031\103\150\141\155\142\145\162\163 -\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157 -\164 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\042\060 -\040\006\003\125\004\003\023\031\103\150\141\155\142\145\162\163 -\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157 -\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\004\275\060\202\003\245\240\003\002\001\002\002\001\000 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\060 -\177\061\013\060\011\006\003\125\004\006\023\002\105\125\061\047 -\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155\145 -\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101\070 -\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004\013 -\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150\141 -\155\142\145\162\163\151\147\156\056\157\162\147\061\042\060\040 -\006\003\125\004\003\023\031\103\150\141\155\142\145\162\163\040 -\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157\164 -\060\036\027\015\060\063\060\071\063\060\061\066\061\063\064\063 -\132\027\015\063\067\060\071\063\060\061\066\061\063\064\064\132 -\060\177\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\042\060 -\040\006\003\125\004\003\023\031\103\150\141\155\142\145\162\163 -\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157 -\164\060\202\001\040\060\015\006\011\052\206\110\206\367\015\001 -\001\001\005\000\003\202\001\015\000\060\202\001\010\002\202\001 -\001\000\267\066\125\345\245\135\030\060\340\332\211\124\221\374 -\310\307\122\370\057\120\331\357\261\165\163\145\107\175\033\133 -\272\165\305\374\241\210\044\372\057\355\312\010\112\071\124\304 -\121\172\265\332\140\352\070\074\201\262\313\361\273\331\221\043 -\077\110\001\160\165\251\005\052\255\037\161\363\311\124\075\035 -\006\152\100\076\263\014\205\356\134\033\171\302\142\304\270\066 -\216\065\135\001\014\043\004\107\065\252\233\140\116\240\146\075 -\313\046\012\234\100\241\364\135\230\277\161\253\245\000\150\052 -\355\203\172\017\242\024\265\324\042\263\200\260\074\014\132\121 -\151\055\130\030\217\355\231\236\361\256\342\225\346\366\107\250 -\326\014\017\260\130\130\333\303\146\067\236\233\221\124\063\067 -\322\224\034\152\110\311\311\362\245\332\245\014\043\367\043\016 -\234\062\125\136\161\234\204\005\121\232\055\375\346\116\052\064 -\132\336\312\100\067\147\014\124\041\125\167\332\012\014\314\227 -\256\200\334\224\066\112\364\076\316\066\023\036\123\344\254\116 -\072\005\354\333\256\162\234\070\213\320\071\073\211\012\076\167 -\376\165\002\001\003\243\202\001\104\060\202\001\100\060\022\006 -\003\125\035\023\001\001\377\004\010\060\006\001\001\377\002\001 -\014\060\074\006\003\125\035\037\004\065\060\063\060\061\240\057 -\240\055\206\053\150\164\164\160\072\057\057\143\162\154\056\143 -\150\141\155\142\145\162\163\151\147\156\056\157\162\147\057\143 -\150\141\155\142\145\162\163\162\157\157\164\056\143\162\154\060 -\035\006\003\125\035\016\004\026\004\024\343\224\365\261\115\351 -\333\241\051\133\127\213\115\166\006\166\341\321\242\212\060\016 -\006\003\125\035\017\001\001\377\004\004\003\002\001\006\060\021 -\006\011\140\206\110\001\206\370\102\001\001\004\004\003\002\000 -\007\060\047\006\003\125\035\021\004\040\060\036\201\034\143\150 -\141\155\142\145\162\163\162\157\157\164\100\143\150\141\155\142 -\145\162\163\151\147\156\056\157\162\147\060\047\006\003\125\035 -\022\004\040\060\036\201\034\143\150\141\155\142\145\162\163\162 -\157\157\164\100\143\150\141\155\142\145\162\163\151\147\156\056 -\157\162\147\060\130\006\003\125\035\040\004\121\060\117\060\115 -\006\013\053\006\001\004\001\201\207\056\012\003\001\060\076\060 -\074\006\010\053\006\001\005\005\007\002\001\026\060\150\164\164 -\160\072\057\057\143\160\163\056\143\150\141\155\142\145\162\163 -\151\147\156\056\157\162\147\057\143\160\163\057\143\150\141\155 -\142\145\162\163\162\157\157\164\056\150\164\155\154\060\015\006 -\011\052\206\110\206\367\015\001\001\005\005\000\003\202\001\001 -\000\014\101\227\302\032\206\300\042\174\237\373\220\363\032\321 -\003\261\357\023\371\041\137\004\234\332\311\245\215\047\154\226 -\207\221\276\101\220\001\162\223\347\036\175\137\366\211\306\135 -\247\100\011\075\254\111\105\105\334\056\215\060\150\262\011\272 -\373\303\057\314\272\013\337\077\167\173\106\175\072\022\044\216 -\226\217\074\005\012\157\322\224\050\035\155\014\300\056\210\042 -\325\330\317\035\023\307\360\110\327\327\005\247\317\307\107\236 -\073\074\064\310\200\117\324\024\273\374\015\120\367\372\263\354 -\102\137\251\335\155\310\364\165\317\173\301\162\046\261\001\034 -\134\054\375\172\116\264\001\305\005\127\271\347\074\252\005\331 -\210\351\007\106\101\316\357\101\201\256\130\337\203\242\256\312 -\327\167\037\347\000\074\235\157\216\344\062\011\035\115\170\064 -\170\064\074\224\233\046\355\117\161\306\031\172\275\040\042\110 -\132\376\113\175\003\267\347\130\276\306\062\116\164\036\150\335 -\250\150\133\263\076\356\142\175\331\200\350\012\165\172\267\356 -\264\145\232\041\220\340\252\320\230\274\070\265\163\074\213\370 -\334 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -# For Email Distrust After: Mon Mar 01 00:00:00 2021 -CKA_NSS_EMAIL_DISTRUST_AFTER MULTILINE_OCTAL -\062\061\060\063\060\061\060\060\060\060\060\060\132 -END - -# Trust for "Camerfirma Chambers of Commerce Root" -# Issuer: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Serial Number: 0 (0x0) -# Subject: CN=Chambers of Commerce Root,OU=http://www.chambersign.org,O=AC Camerfirma SA CIF A82743287,C=EU -# Not Valid Before: Tue Sep 30 16:13:43 2003 -# Not Valid After : Wed Sep 30 16:13:44 2037 -# Fingerprint (SHA-256): 0C:25:8A:12:A5:67:4A:EF:25:F2:8B:A7:DC:FA:EC:EE:A3:48:E5:41:E6:F5:CC:4E:E6:3B:71:B3:61:60:6A:C3 -# Fingerprint (SHA1): 6E:3A:55:A4:19:0C:19:5C:93:84:3C:C0:DB:72:2E:31:30:61:F0:B1 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Camerfirma Chambers of Commerce Root" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\156\072\125\244\031\014\031\134\223\204\074\300\333\162\056\061 -\060\141\360\261 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\260\001\356\024\331\257\051\030\224\166\216\361\151\063\052\204 -END -CKA_ISSUER MULTILINE_OCTAL -\060\177\061\013\060\011\006\003\125\004\006\023\002\105\125\061 -\047\060\045\006\003\125\004\012\023\036\101\103\040\103\141\155 -\145\162\146\151\162\155\141\040\123\101\040\103\111\106\040\101 -\070\062\067\064\063\062\070\067\061\043\060\041\006\003\125\004 -\013\023\032\150\164\164\160\072\057\057\167\167\167\056\143\150 -\141\155\142\145\162\163\151\147\156\056\157\162\147\061\042\060 -\040\006\003\125\004\003\023\031\103\150\141\155\142\145\162\163 -\040\157\146\040\103\157\155\155\145\162\143\145\040\122\157\157 -\164 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\001\000 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "XRamp Global CA Root" # @@ -4447,133 +4280,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "Hongkong Post Root CA 1" -# -# Issuer: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK -# Serial Number: 1000 (0x3e8) -# Subject: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK -# Not Valid Before: Thu May 15 05:13:14 2003 -# Not Valid After : Mon May 15 04:52:29 2023 -# Fingerprint (SHA-256): F9:E6:7D:33:6C:51:00:2A:C0:54:C6:32:02:2D:66:DD:A2:E7:E3:FF:F1:0A:D0:61:ED:31:D8:BB:B4:10:CF:B2 -# Fingerprint (SHA1): D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hongkong Post Root CA 1" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\026\060\024\006\003\125\004\012\023\015\110\157\156\147\153\157 -\156\147\040\120\157\163\164\061\040\060\036\006\003\125\004\003 -\023\027\110\157\156\147\153\157\156\147\040\120\157\163\164\040 -\122\157\157\164\040\103\101\040\061 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\026\060\024\006\003\125\004\012\023\015\110\157\156\147\153\157 -\156\147\040\120\157\163\164\061\040\060\036\006\003\125\004\003 -\023\027\110\157\156\147\153\157\156\147\040\120\157\163\164\040 -\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\003\350 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\003\060\060\202\002\030\240\003\002\001\002\002\002\003 -\350\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000 -\060\107\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\026\060\024\006\003\125\004\012\023\015\110\157\156\147\153\157 -\156\147\040\120\157\163\164\061\040\060\036\006\003\125\004\003 -\023\027\110\157\156\147\153\157\156\147\040\120\157\163\164\040 -\122\157\157\164\040\103\101\040\061\060\036\027\015\060\063\060 -\065\061\065\060\065\061\063\061\064\132\027\015\062\063\060\065 -\061\065\060\064\065\062\062\071\132\060\107\061\013\060\011\006 -\003\125\004\006\023\002\110\113\061\026\060\024\006\003\125\004 -\012\023\015\110\157\156\147\153\157\156\147\040\120\157\163\164 -\061\040\060\036\006\003\125\004\003\023\027\110\157\156\147\153 -\157\156\147\040\120\157\163\164\040\122\157\157\164\040\103\101 -\040\061\060\202\001\042\060\015\006\011\052\206\110\206\367\015 -\001\001\001\005\000\003\202\001\017\000\060\202\001\012\002\202 -\001\001\000\254\377\070\266\351\146\002\111\343\242\264\341\220 -\371\100\217\171\371\342\275\171\376\002\275\356\044\222\035\042 -\366\332\205\162\151\376\327\077\011\324\335\221\265\002\234\320 -\215\132\341\125\303\120\206\271\051\046\302\343\331\240\361\151 -\003\050\040\200\105\042\055\126\247\073\124\225\126\042\131\037 -\050\337\037\040\075\155\242\066\276\043\240\261\156\265\261\047 -\077\071\123\011\352\253\152\350\164\262\302\145\134\216\277\174 -\303\170\204\315\236\026\374\365\056\117\040\052\010\237\167\363 -\305\036\304\232\122\146\036\110\136\343\020\006\217\042\230\341 -\145\216\033\135\043\146\073\270\245\062\121\310\206\252\241\251 -\236\177\166\224\302\246\154\267\101\360\325\310\006\070\346\324 -\014\342\363\073\114\155\120\214\304\203\047\301\023\204\131\075 -\236\165\164\266\330\002\136\072\220\172\300\102\066\162\354\152 -\115\334\357\304\000\337\023\030\127\137\046\170\310\326\012\171 -\167\277\367\257\267\166\271\245\013\204\027\135\020\352\157\341 -\253\225\021\137\155\074\243\134\115\203\133\362\263\031\212\200 -\213\013\207\002\003\001\000\001\243\046\060\044\060\022\006\003 -\125\035\023\001\001\377\004\010\060\006\001\001\377\002\001\003 -\060\016\006\003\125\035\017\001\001\377\004\004\003\002\001\306 -\060\015\006\011\052\206\110\206\367\015\001\001\005\005\000\003 -\202\001\001\000\016\106\325\074\256\342\207\331\136\201\213\002 -\230\101\010\214\114\274\332\333\356\047\033\202\347\152\105\354 -\026\213\117\205\240\363\262\160\275\132\226\272\312\156\155\356 -\106\213\156\347\052\056\226\263\031\063\353\264\237\250\262\067 -\356\230\250\227\266\056\266\147\047\324\246\111\375\034\223\145 -\166\236\102\057\334\042\154\232\117\362\132\025\071\261\161\327 -\053\121\350\155\034\230\300\331\052\364\241\202\173\325\311\101 -\242\043\001\164\070\125\213\017\271\056\147\242\040\004\067\332 -\234\013\323\027\041\340\217\227\171\064\157\204\110\002\040\063 -\033\346\064\104\237\221\160\364\200\136\204\103\302\051\322\154 -\022\024\344\141\215\254\020\220\236\204\120\273\360\226\157\105 -\237\212\363\312\154\117\372\021\072\025\025\106\303\315\037\203 -\133\055\101\022\355\120\147\101\023\075\041\253\224\212\252\116 -\174\301\261\373\247\326\265\047\057\227\253\156\340\035\342\321 -\034\054\037\104\342\374\276\221\241\234\373\326\051\123\163\206 -\237\123\330\103\016\135\326\143\202\161\035\200\164\312\366\342 -\002\153\331\132 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "Hongkong Post Root CA 1" -# Issuer: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK -# Serial Number: 1000 (0x3e8) -# Subject: CN=Hongkong Post Root CA 1,O=Hongkong Post,C=HK -# Not Valid Before: Thu May 15 05:13:14 2003 -# Not Valid After : Mon May 15 04:52:29 2023 -# Fingerprint (SHA-256): F9:E6:7D:33:6C:51:00:2A:C0:54:C6:32:02:2D:66:DD:A2:E7:E3:FF:F1:0A:D0:61:ED:31:D8:BB:B4:10:CF:B2 -# Fingerprint (SHA1): D6:DA:A8:20:8D:09:D2:15:4D:24:B5:2F:CB:34:6E:B2:58:B2:8A:58 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "Hongkong Post Root CA 1" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\326\332\250\040\215\011\322\025\115\044\265\057\313\064\156\262 -\130\262\212\130 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\250\015\157\071\170\271\103\155\167\102\155\230\132\314\043\312 -END -CKA_ISSUER MULTILINE_OCTAL -\060\107\061\013\060\011\006\003\125\004\006\023\002\110\113\061 -\026\060\024\006\003\125\004\012\023\015\110\157\156\147\153\157 -\156\147\040\120\157\163\164\061\040\060\036\006\003\125\004\003 -\023\027\110\157\156\147\153\157\156\147\040\120\157\163\164\040 -\122\157\157\164\040\103\101\040\061 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\002\003\350 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "SecureSign RootCA11" # @@ -8943,203 +8649,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "E-Tugra Certification Authority" -# -# Issuer: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR -# Serial Number:6a:68:3e:9c:51:9b:cb:53 -# Subject: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR -# Not Valid Before: Tue Mar 05 12:09:48 2013 -# Not Valid After : Fri Mar 03 12:09:48 2023 -# Fingerprint (SHA-256): B0:BF:D5:2B:B0:D7:D9:BD:92:BF:5D:4D:C1:3D:A2:55:C0:2C:54:2F:37:83:65:EA:89:39:11:F5:5E:55:F2:3C -# Fingerprint (SHA1): 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Certification Authority" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\262\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\014\006\101\156\153\141\162 -\141\061\100\060\076\006\003\125\004\012\014\067\105\055\124\165 -\304\237\162\141\040\105\102\107\040\102\151\154\151\305\237\151 -\155\040\124\145\153\156\157\154\157\152\151\154\145\162\151\040 -\166\145\040\110\151\172\155\145\164\154\145\162\151\040\101\056 -\305\236\056\061\046\060\044\006\003\125\004\013\014\035\105\055 -\124\165\147\162\141\040\123\145\162\164\151\146\151\153\141\163 -\171\157\156\040\115\145\162\153\145\172\151\061\050\060\046\006 -\003\125\004\003\014\037\105\055\124\165\147\162\141\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\262\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\014\006\101\156\153\141\162 -\141\061\100\060\076\006\003\125\004\012\014\067\105\055\124\165 -\304\237\162\141\040\105\102\107\040\102\151\154\151\305\237\151 -\155\040\124\145\153\156\157\154\157\152\151\154\145\162\151\040 -\166\145\040\110\151\172\155\145\164\154\145\162\151\040\101\056 -\305\236\056\061\046\060\044\006\003\125\004\013\014\035\105\055 -\124\165\147\162\141\040\123\145\162\164\151\146\151\153\141\163 -\171\157\156\040\115\145\162\153\145\172\151\061\050\060\046\006 -\003\125\004\003\014\037\105\055\124\165\147\162\141\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\152\150\076\234\121\233\313\123 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\006\113\060\202\004\063\240\003\002\001\002\002\010\152 -\150\076\234\121\233\313\123\060\015\006\011\052\206\110\206\367 -\015\001\001\013\005\000\060\201\262\061\013\060\011\006\003\125 -\004\006\023\002\124\122\061\017\060\015\006\003\125\004\007\014 -\006\101\156\153\141\162\141\061\100\060\076\006\003\125\004\012 -\014\067\105\055\124\165\304\237\162\141\040\105\102\107\040\102 -\151\154\151\305\237\151\155\040\124\145\153\156\157\154\157\152 -\151\154\145\162\151\040\166\145\040\110\151\172\155\145\164\154 -\145\162\151\040\101\056\305\236\056\061\046\060\044\006\003\125 -\004\013\014\035\105\055\124\165\147\162\141\040\123\145\162\164 -\151\146\151\153\141\163\171\157\156\040\115\145\162\153\145\172 -\151\061\050\060\046\006\003\125\004\003\014\037\105\055\124\165 -\147\162\141\040\103\145\162\164\151\146\151\143\141\164\151\157 -\156\040\101\165\164\150\157\162\151\164\171\060\036\027\015\061 -\063\060\063\060\065\061\062\060\071\064\070\132\027\015\062\063 -\060\063\060\063\061\062\060\071\064\070\132\060\201\262\061\013 -\060\011\006\003\125\004\006\023\002\124\122\061\017\060\015\006 -\003\125\004\007\014\006\101\156\153\141\162\141\061\100\060\076 -\006\003\125\004\012\014\067\105\055\124\165\304\237\162\141\040 -\105\102\107\040\102\151\154\151\305\237\151\155\040\124\145\153 -\156\157\154\157\152\151\154\145\162\151\040\166\145\040\110\151 -\172\155\145\164\154\145\162\151\040\101\056\305\236\056\061\046 -\060\044\006\003\125\004\013\014\035\105\055\124\165\147\162\141 -\040\123\145\162\164\151\146\151\153\141\163\171\157\156\040\115 -\145\162\153\145\172\151\061\050\060\046\006\003\125\004\003\014 -\037\105\055\124\165\147\162\141\040\103\145\162\164\151\146\151 -\143\141\164\151\157\156\040\101\165\164\150\157\162\151\164\171 -\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 -\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 -\000\342\365\077\223\005\121\036\205\142\124\136\172\013\365\030 -\007\203\256\176\257\174\367\324\212\153\245\143\103\071\271\113 -\367\303\306\144\211\075\224\056\124\200\122\071\071\007\113\113 -\335\205\007\166\207\314\277\057\225\114\314\175\247\075\274\107 -\017\230\160\370\214\205\036\164\216\222\155\033\100\321\231\015 -\273\165\156\310\251\153\232\300\204\061\257\312\103\313\353\053 -\064\350\217\227\153\001\233\325\016\112\010\252\133\222\164\205 -\103\323\200\256\241\210\133\256\263\352\136\313\026\232\167\104 -\310\241\366\124\150\316\336\217\227\053\272\133\100\002\014\144 -\027\300\265\223\315\341\361\023\146\316\014\171\357\321\221\050 -\253\137\240\022\122\060\163\031\216\217\341\214\007\242\303\273 -\112\360\352\037\025\250\356\045\314\244\106\370\033\042\357\263 -\016\103\272\054\044\270\305\054\134\324\034\370\135\144\275\303 -\223\136\050\247\077\047\361\216\036\323\052\120\005\243\125\331 -\313\347\071\123\300\230\236\214\124\142\213\046\260\367\175\215 -\174\344\306\236\146\102\125\202\107\347\262\130\215\146\367\007 -\174\056\066\346\120\034\077\333\103\044\305\277\206\107\171\263 -\171\034\367\132\364\023\354\154\370\077\342\131\037\225\356\102 -\076\271\255\250\062\205\111\227\106\376\113\061\217\132\313\255 -\164\107\037\351\221\267\337\050\004\042\240\324\017\135\342\171 -\117\352\154\205\206\275\250\246\316\344\372\303\341\263\256\336 -\074\121\356\313\023\174\001\177\204\016\135\121\224\236\023\014 -\266\056\245\114\371\071\160\066\157\226\312\056\014\104\125\305 -\312\372\135\002\243\337\326\144\214\132\263\001\012\251\265\012 -\107\027\377\357\221\100\052\216\241\106\072\061\230\345\021\374 -\314\273\111\126\212\374\271\320\141\232\157\145\154\346\303\313 -\076\165\111\376\217\247\342\211\305\147\327\235\106\023\116\061 -\166\073\044\263\236\021\145\206\253\177\357\035\324\370\274\347 -\254\132\134\267\132\107\134\125\316\125\264\042\161\133\133\013 -\360\317\334\240\141\144\352\251\327\150\012\143\247\340\015\077 -\240\257\323\252\322\176\357\121\240\346\121\053\125\222\025\027 -\123\313\267\146\016\146\114\370\371\165\114\220\347\022\160\307 -\105\002\003\001\000\001\243\143\060\141\060\035\006\003\125\035 -\016\004\026\004\024\056\343\333\262\111\320\234\124\171\134\372 -\047\052\376\314\116\322\350\116\124\060\017\006\003\125\035\023 -\001\001\377\004\005\060\003\001\001\377\060\037\006\003\125\035 -\043\004\030\060\026\200\024\056\343\333\262\111\320\234\124\171 -\134\372\047\052\376\314\116\322\350\116\124\060\016\006\003\125 -\035\017\001\001\377\004\004\003\002\001\006\060\015\006\011\052 -\206\110\206\367\015\001\001\013\005\000\003\202\002\001\000\005 -\067\072\364\115\267\105\342\105\165\044\217\266\167\122\350\034 -\330\020\223\145\363\362\131\006\244\076\036\051\354\135\321\320 -\253\174\340\012\220\110\170\355\116\230\003\231\376\050\140\221 -\035\060\035\270\143\174\250\346\065\265\372\323\141\166\346\326 -\007\113\312\151\232\262\204\172\167\223\105\027\025\237\044\320 -\230\023\022\377\273\240\056\375\116\114\207\370\316\134\252\230 -\033\005\340\000\106\112\202\200\245\063\213\050\334\355\070\323 -\337\345\076\351\376\373\131\335\141\204\117\322\124\226\023\141 -\023\076\217\200\151\276\223\107\265\065\103\322\132\273\075\134 -\357\263\102\107\315\073\125\023\006\260\011\333\375\143\366\072 -\210\012\231\157\176\341\316\033\123\152\104\146\043\121\010\173 -\274\133\122\242\375\006\067\070\100\141\217\112\226\270\220\067 -\370\146\307\170\220\000\025\056\213\255\121\065\123\007\250\153 -\150\256\371\116\074\007\046\315\010\005\160\314\071\077\166\275 -\245\323\147\046\001\206\246\123\322\140\073\174\103\177\125\212 -\274\225\032\301\050\071\114\037\103\322\221\364\162\131\212\271 -\126\374\077\264\235\332\160\234\166\132\214\103\120\356\216\060 -\162\115\337\377\111\367\306\251\147\331\155\254\002\021\342\072 -\026\045\247\130\010\313\157\123\101\234\110\070\107\150\063\321 -\327\307\217\324\164\041\324\303\005\220\172\377\316\226\210\261 -\025\051\135\043\253\320\140\241\022\117\336\364\027\315\062\345 -\311\277\310\103\255\375\056\216\361\257\342\364\230\372\022\037 -\040\330\300\247\014\205\305\220\364\073\055\226\046\261\054\276 -\114\253\353\261\322\212\311\333\170\023\017\036\011\235\155\217 -\000\237\002\332\301\372\037\172\172\011\304\112\346\210\052\227 -\237\211\213\375\067\137\137\072\316\070\131\206\113\257\161\013 -\264\330\362\160\117\237\062\023\343\260\247\127\345\332\332\103 -\313\204\064\362\050\304\352\155\364\052\357\301\153\166\332\373 -\176\273\205\074\322\123\302\115\276\161\341\105\321\375\043\147 -\015\023\165\373\317\145\147\042\235\256\260\011\321\011\377\035 -\064\277\376\043\227\067\322\071\372\075\015\006\013\264\333\073 -\243\253\157\134\035\266\176\350\263\202\064\355\006\134\044 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "E-Tugra Certification Authority" -# Issuer: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR -# Serial Number:6a:68:3e:9c:51:9b:cb:53 -# Subject: CN=E-Tugra Certification Authority,OU=E-Tugra Sertifikasyon Merkezi,O=E-Tu..ra EBG Bili..im Teknolojileri ve Hizmetleri A....,L=Ankara,C=TR -# Not Valid Before: Tue Mar 05 12:09:48 2013 -# Not Valid After : Fri Mar 03 12:09:48 2023 -# Fingerprint (SHA-256): B0:BF:D5:2B:B0:D7:D9:BD:92:BF:5D:4D:C1:3D:A2:55:C0:2C:54:2F:37:83:65:EA:89:39:11:F5:5E:55:F2:3C -# Fingerprint (SHA1): 51:C6:E7:08:49:06:6E:F3:92:D4:5C:A0:0D:6D:A3:62:8F:C3:52:39 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Certification Authority" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\121\306\347\010\111\006\156\363\222\324\134\240\015\155\243\142 -\217\303\122\071 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\270\241\003\143\260\275\041\161\160\212\157\023\072\273\171\111 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\262\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\014\006\101\156\153\141\162 -\141\061\100\060\076\006\003\125\004\012\014\067\105\055\124\165 -\304\237\162\141\040\105\102\107\040\102\151\154\151\305\237\151 -\155\040\124\145\153\156\157\154\157\152\151\154\145\162\151\040 -\166\145\040\110\151\172\155\145\164\154\145\162\151\040\101\056 -\305\236\056\061\046\060\044\006\003\125\004\013\014\035\105\055 -\124\165\147\162\141\040\123\145\162\164\151\146\151\153\141\163 -\171\157\156\040\115\145\162\153\145\172\151\061\050\060\046\006 -\003\125\004\003\014\037\105\055\124\165\147\162\141\040\103\145 -\162\164\151\146\151\143\141\164\151\157\156\040\101\165\164\150 -\157\162\151\164\171 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\010\152\150\076\234\121\233\313\123 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "T-TeleSec GlobalRoot Class 2" # @@ -23336,323 +22845,6 @@ CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE -# -# Certificate "E-Tugra Global Root CA RSA v3" -# -# Issuer: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Serial Number:0d:4d:c5:cd:16:22:95:96:08:7e:b8:0b:7f:15:06:34:fb:79:10:34 -# Subject: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Not Valid Before: Wed Mar 18 09:07:17 2020 -# Not Valid After : Sun Mar 12 09:07:17 2045 -# Fingerprint (SHA-256): EF:66:B0:B1:0A:3C:DB:9F:2E:36:48:C7:6B:D2:AF:18:EA:D2:BF:E6:F1:17:65:5E:28:C4:06:0D:A1:A3:F4:C2 -# Fingerprint (SHA1): E9:A8:5D:22:14:52:1C:5B:AA:0A:B4:BE:24:6A:23:8A:C9:BA:E2:A9 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Global Root CA RSA v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101 -\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101 -\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\015\115\305\315\026\042\225\226\010\176\270\013\177\025 -\006\064\373\171\020\064 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\005\363\060\202\003\333\240\003\002\001\002\002\024\015 -\115\305\315\026\042\225\226\010\176\270\013\177\025\006\064\373 -\171\020\064\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\060\201\200\061\013\060\011\006\003\125\004\006\023\002 -\124\122\061\017\060\015\006\003\125\004\007\023\006\101\156\153 -\141\162\141\061\031\060\027\006\003\125\004\012\023\020\105\055 -\124\165\147\162\141\040\105\102\107\040\101\056\123\056\061\035 -\060\033\006\003\125\004\013\023\024\105\055\124\165\147\162\141 -\040\124\162\165\163\164\040\103\145\156\164\145\162\061\046\060 -\044\006\003\125\004\003\023\035\105\055\124\165\147\162\141\040 -\107\154\157\142\141\154\040\122\157\157\164\040\103\101\040\122 -\123\101\040\166\063\060\036\027\015\062\060\060\063\061\070\060 -\071\060\067\061\067\132\027\015\064\065\060\063\061\062\060\071 -\060\067\061\067\132\060\201\200\061\013\060\011\006\003\125\004 -\006\023\002\124\122\061\017\060\015\006\003\125\004\007\023\006 -\101\156\153\141\162\141\061\031\060\027\006\003\125\004\012\023 -\020\105\055\124\165\147\162\141\040\105\102\107\040\101\056\123 -\056\061\035\060\033\006\003\125\004\013\023\024\105\055\124\165 -\147\162\141\040\124\162\165\163\164\040\103\145\156\164\145\162 -\061\046\060\044\006\003\125\004\003\023\035\105\055\124\165\147 -\162\141\040\107\154\157\142\141\154\040\122\157\157\164\040\103 -\101\040\122\123\101\040\166\063\060\202\002\042\060\015\006\011 -\052\206\110\206\367\015\001\001\001\005\000\003\202\002\017\000 -\060\202\002\012\002\202\002\001\000\242\146\360\211\267\162\173 -\356\011\311\143\322\323\103\335\136\303\246\204\070\112\361\215 -\201\273\024\275\107\350\100\027\363\075\303\170\105\162\246\056 -\220\336\232\072\324\040\161\312\274\237\035\113\227\012\307\061 -\272\076\327\376\045\251\052\216\066\364\321\057\307\267\251\135 -\063\334\060\160\370\100\154\113\262\246\061\141\321\064\074\075 -\061\172\307\257\304\247\247\204\341\227\244\350\113\366\027\174 -\356\074\007\355\342\212\127\334\266\373\370\103\045\120\352\047 -\201\250\206\274\217\122\112\226\072\140\032\226\273\375\163\364 -\205\375\203\375\177\204\155\064\154\177\152\267\113\001\003\277 -\255\151\267\327\062\331\365\127\152\351\206\202\076\245\146\061 -\263\026\075\302\363\046\140\062\323\122\036\260\154\244\067\076 -\364\365\257\353\341\337\200\006\317\052\101\347\146\011\341\113 -\227\347\167\275\041\155\051\266\147\303\055\176\355\326\171\145 -\321\317\072\266\321\261\136\126\141\120\172\132\316\116\120\061 -\200\003\230\107\347\344\030\174\104\132\306\244\263\073\306\306 -\303\072\360\154\303\213\310\244\221\005\363\365\331\266\252\006 -\241\267\253\344\261\352\041\024\134\203\244\374\377\266\120\323 -\214\022\046\231\166\160\351\300\017\246\164\374\273\320\033\170 -\316\162\222\342\050\234\274\346\351\011\330\072\323\211\346\276 -\056\167\337\001\012\157\226\366\345\215\074\115\122\166\032\126 -\341\163\176\027\254\075\255\154\243\122\022\030\160\346\200\116 -\063\362\176\046\062\254\005\215\070\244\346\166\074\237\020\151 -\016\155\235\322\301\171\040\153\133\317\063\215\321\224\166\065 -\347\135\125\307\267\254\050\253\106\314\347\073\041\265\012\012 -\344\112\131\334\201\065\113\104\225\022\012\147\245\241\377\133 -\000\007\322\300\314\371\077\374\237\063\362\000\370\214\154\207 -\235\006\055\361\357\343\346\006\372\305\146\023\133\374\120\007 -\236\161\206\262\332\157\164\060\317\223\123\350\334\042\326\336 -\040\037\141\215\243\056\243\170\062\220\154\334\254\062\265\005 -\344\365\074\063\015\326\340\207\167\027\114\235\260\330\011\250 -\015\127\367\104\205\360\310\004\276\134\135\132\343\027\216\124 -\143\151\177\111\164\144\005\214\243\002\003\001\000\001\243\143 -\060\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003 -\001\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024 -\262\264\256\346\055\367\046\325\252\165\055\166\113\300\033\123 -\041\320\110\357\060\035\006\003\125\035\016\004\026\004\024\262 -\264\256\346\055\367\046\325\252\165\055\166\113\300\033\123\041 -\320\110\357\060\016\006\003\125\035\017\001\001\377\004\004\003 -\002\001\006\060\015\006\011\052\206\110\206\367\015\001\001\013 -\005\000\003\202\002\001\000\211\250\162\177\214\353\316\056\030 -\304\020\200\055\020\014\377\373\024\315\004\340\024\074\116\232 -\373\237\051\277\042\236\127\271\202\163\022\143\046\265\314\220 -\351\322\052\051\356\234\055\314\054\231\276\105\047\344\261\161 -\355\344\070\225\061\101\362\175\172\143\170\337\312\066\026\057 -\202\210\237\274\021\107\117\166\115\310\055\216\353\337\055\174 -\116\073\332\256\366\343\332\135\024\246\256\350\205\104\235\006 -\156\216\373\357\172\112\152\055\053\050\030\376\277\220\054\165 -\026\237\017\352\226\175\005\356\233\023\245\104\154\370\003\320 -\335\043\341\375\003\022\022\010\364\030\064\263\340\067\013\167 -\021\001\110\277\141\264\265\370\031\331\313\115\352\243\214\357 -\375\360\006\265\155\222\364\112\141\120\204\355\354\111\323\344 -\276\150\346\056\343\061\013\124\013\032\222\326\202\330\266\242 -\145\074\146\004\371\125\332\154\373\333\265\024\146\115\224\203 -\073\315\036\246\053\262\376\167\100\206\253\347\337\012\311\375 -\366\335\207\126\030\330\260\054\125\140\226\372\010\176\122\220 -\365\113\246\056\207\174\313\040\333\006\076\240\135\003\167\175 -\242\074\023\033\051\242\023\125\240\075\024\042\257\157\270\320 -\232\033\162\335\005\001\215\206\140\277\244\147\356\265\245\015 -\321\177\346\032\053\142\146\303\007\272\347\240\110\034\070\303 -\351\105\373\247\177\374\355\002\150\032\312\167\022\167\246\000 -\125\050\024\354\326\307\022\242\033\145\102\351\221\350\313\076 -\207\211\124\135\331\257\235\227\234\151\347\012\377\017\132\170 -\213\143\052\114\175\107\224\077\336\113\351\123\320\060\361\305 -\366\236\111\337\073\240\221\243\243\376\315\130\314\352\337\257 -\157\050\073\240\151\233\217\354\254\256\053\124\235\233\004\261 -\107\040\257\226\022\076\143\224\035\004\347\056\273\206\307\014 -\232\210\277\166\107\357\367\260\013\227\146\322\104\317\140\122 -\007\341\325\054\112\072\047\141\167\312\327\217\347\207\016\060 -\377\014\273\004\342\141\303\242\310\227\141\216\264\060\152\074 -\155\302\007\137\112\163\057\077\371\026\212\001\146\357\272\221 -\312\122\127\173\256\324\346\017\335\013\172\177\213\236\046\040 -\317\073\357\201\161\203\131 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "E-Tugra Global Root CA RSA v3" -# Issuer: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Serial Number:0d:4d:c5:cd:16:22:95:96:08:7e:b8:0b:7f:15:06:34:fb:79:10:34 -# Subject: CN=E-Tugra Global Root CA RSA v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Not Valid Before: Wed Mar 18 09:07:17 2020 -# Not Valid After : Sun Mar 12 09:07:17 2045 -# Fingerprint (SHA-256): EF:66:B0:B1:0A:3C:DB:9F:2E:36:48:C7:6B:D2:AF:18:EA:D2:BF:E6:F1:17:65:5E:28:C4:06:0D:A1:A3:F4:C2 -# Fingerprint (SHA1): E9:A8:5D:22:14:52:1C:5B:AA:0A:B4:BE:24:6A:23:8A:C9:BA:E2:A9 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Global Root CA RSA v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\351\250\135\042\024\122\034\133\252\012\264\276\044\152\043\212 -\311\272\342\251 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\042\276\020\366\302\370\003\210\163\137\063\051\107\050\107\244 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\122\123\101 -\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\015\115\305\315\026\042\225\226\010\176\270\013\177\025 -\006\064\373\171\020\064 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - -# -# Certificate "E-Tugra Global Root CA ECC v3" -# -# Issuer: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Serial Number:26:46:19:77:31:e1:4f:6f:28:36:de:39:51:86:e6:d4:97:88:22:c1 -# Subject: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Not Valid Before: Wed Mar 18 09:46:58 2020 -# Not Valid After : Sun Mar 12 09:46:58 2045 -# Fingerprint (SHA-256): 87:3F:46:85:FA:7F:56:36:25:25:2E:6D:36:BC:D7:F1:6F:C2:49:51:F2:64:E4:7E:1B:95:4F:49:08:CD:CA:13 -# Fingerprint (SHA1): 8A:2F:AF:57:53:B1:B0:E6:A1:04:EC:5B:6A:69:71:6D:F6:1C:E2:84 -CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Global Root CA ECC v3" -CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 -CKA_SUBJECT MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103 -\040\166\063 -END -CKA_ID UTF8 "0" -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103 -\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\046\106\031\167\061\341\117\157\050\066\336\071\121\206 -\346\324\227\210\042\301 -END -CKA_VALUE MULTILINE_OCTAL -\060\202\002\245\060\202\002\052\240\003\002\001\002\002\024\046 -\106\031\167\061\341\117\157\050\066\336\071\121\206\346\324\227 -\210\042\301\060\012\006\010\052\206\110\316\075\004\003\003\060 -\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122\061 -\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162\141 -\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165\147 -\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033\006 -\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124\162 -\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006\003 -\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154\157 -\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103\040 -\166\063\060\036\027\015\062\060\060\063\061\070\060\071\064\066 -\065\070\132\027\015\064\065\060\063\061\062\060\071\064\066\065 -\070\132\060\201\200\061\013\060\011\006\003\125\004\006\023\002 -\124\122\061\017\060\015\006\003\125\004\007\023\006\101\156\153 -\141\162\141\061\031\060\027\006\003\125\004\012\023\020\105\055 -\124\165\147\162\141\040\105\102\107\040\101\056\123\056\061\035 -\060\033\006\003\125\004\013\023\024\105\055\124\165\147\162\141 -\040\124\162\165\163\164\040\103\145\156\164\145\162\061\046\060 -\044\006\003\125\004\003\023\035\105\055\124\165\147\162\141\040 -\107\154\157\142\141\154\040\122\157\157\164\040\103\101\040\105 -\103\103\040\166\063\060\166\060\020\006\007\052\206\110\316\075 -\002\001\006\005\053\201\004\000\042\003\142\000\004\216\230\051 -\277\307\020\036\047\333\253\003\314\050\054\330\136\110\031\020 -\051\314\313\131\201\314\214\270\222\027\211\203\052\222\366\303 -\244\035\114\142\325\237\326\240\106\334\034\274\166\301\343\107 -\320\133\023\332\347\245\263\146\110\347\041\232\112\117\206\012 -\175\154\352\115\062\200\012\262\172\011\233\151\113\230\201\342 -\056\354\002\160\226\037\375\365\106\316\312\334\202\243\143\060 -\141\060\017\006\003\125\035\023\001\001\377\004\005\060\003\001 -\001\377\060\037\006\003\125\035\043\004\030\060\026\200\024\377 -\202\061\162\076\371\304\146\154\255\070\236\321\260\121\210\245 -\220\314\365\060\035\006\003\125\035\016\004\026\004\024\377\202 -\061\162\076\371\304\146\154\255\070\236\321\260\121\210\245\220 -\314\365\060\016\006\003\125\035\017\001\001\377\004\004\003\002 -\001\006\060\012\006\010\052\206\110\316\075\004\003\003\003\151 -\000\060\146\002\061\000\346\005\130\151\141\345\055\312\015\313 -\361\031\010\275\326\375\121\222\032\176\143\124\004\220\221\232 -\065\221\071\231\372\007\251\146\223\272\310\150\324\212\077\372 -\355\156\026\002\047\267\002\061\000\335\132\027\053\166\035\145 -\102\226\246\254\135\212\171\126\330\212\033\337\232\336\137\307 -\120\217\261\133\161\014\046\337\152\100\000\354\063\221\041\161 -\276\150\344\043\244\331\255\241\067 -END -CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE -CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE -CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE - -# Trust for "E-Tugra Global Root CA ECC v3" -# Issuer: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Serial Number:26:46:19:77:31:e1:4f:6f:28:36:de:39:51:86:e6:d4:97:88:22:c1 -# Subject: CN=E-Tugra Global Root CA ECC v3,OU=E-Tugra Trust Center,O=E-Tugra EBG A.S.,L=Ankara,C=TR -# Not Valid Before: Wed Mar 18 09:46:58 2020 -# Not Valid After : Sun Mar 12 09:46:58 2045 -# Fingerprint (SHA-256): 87:3F:46:85:FA:7F:56:36:25:25:2E:6D:36:BC:D7:F1:6F:C2:49:51:F2:64:E4:7E:1B:95:4F:49:08:CD:CA:13 -# Fingerprint (SHA1): 8A:2F:AF:57:53:B1:B0:E6:A1:04:EC:5B:6A:69:71:6D:F6:1C:E2:84 -CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST -CKA_TOKEN CK_BBOOL CK_TRUE -CKA_PRIVATE CK_BBOOL CK_FALSE -CKA_MODIFIABLE CK_BBOOL CK_FALSE -CKA_LABEL UTF8 "E-Tugra Global Root CA ECC v3" -CKA_CERT_SHA1_HASH MULTILINE_OCTAL -\212\057\257\127\123\261\260\346\241\004\354\133\152\151\161\155 -\366\034\342\204 -END -CKA_CERT_MD5_HASH MULTILINE_OCTAL -\106\274\201\273\361\265\036\367\113\226\274\024\342\347\047\144 -END -CKA_ISSUER MULTILINE_OCTAL -\060\201\200\061\013\060\011\006\003\125\004\006\023\002\124\122 -\061\017\060\015\006\003\125\004\007\023\006\101\156\153\141\162 -\141\061\031\060\027\006\003\125\004\012\023\020\105\055\124\165 -\147\162\141\040\105\102\107\040\101\056\123\056\061\035\060\033 -\006\003\125\004\013\023\024\105\055\124\165\147\162\141\040\124 -\162\165\163\164\040\103\145\156\164\145\162\061\046\060\044\006 -\003\125\004\003\023\035\105\055\124\165\147\162\141\040\107\154 -\157\142\141\154\040\122\157\157\164\040\103\101\040\105\103\103 -\040\166\063 -END -CKA_SERIAL_NUMBER MULTILINE_OCTAL -\002\024\046\106\031\167\061\341\117\157\050\066\336\071\121\206 -\346\324\227\210\042\301 -END -CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR -CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST -CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE - # # Certificate "DIGITALSIGN GLOBAL ROOT RSA CA" # @@ -24516,3 +23708,1860 @@ CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "LAWtrust Root CA2 (4096)" +# +# Issuer: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA +# Serial Number: 1427795633 (0x551a6eb1) +# Subject: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA +# Not Valid Before: Tue Feb 14 09:19:38 2023 +# Not Valid After : Fri Feb 14 09:49:38 2053 +# Fingerprint (SHA-256): 48:E1:CF:9E:43:B6:88:A5:10:44:16:0F:46:D7:73:B8:27:7F:E4:5B:EA:AD:0E:4D:F9:0D:19:74:38:2F:EA:99 +# Fingerprint (SHA1): EC:A2:D5:30:A9:AB:2C:7D:0E:75:61:64:4E:0A:E0:16:A1:54:38:7D +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "LAWtrust Root CA2 (4096)" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 +\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 +\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 +\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 +\064\060\071\066\051 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 +\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 +\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 +\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 +\064\060\071\066\051 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\004\125\032\156\261 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\230\060\202\003\200\240\003\002\001\002\002\004\125 +\032\156\261\060\015\006\011\052\206\110\206\367\015\001\001\013 +\005\000\060\103\061\013\060\011\006\003\125\004\006\023\002\132 +\101\061\021\060\017\006\003\125\004\012\023\010\114\101\127\164 +\162\165\163\164\061\041\060\037\006\003\125\004\003\023\030\114 +\101\127\164\162\165\163\164\040\122\157\157\164\040\103\101\062 +\040\050\064\060\071\066\051\060\040\027\015\062\063\060\062\061 +\064\060\071\061\071\063\070\132\030\017\062\060\065\063\060\062 +\061\064\060\071\064\071\063\070\132\060\103\061\013\060\011\006 +\003\125\004\006\023\002\132\101\061\021\060\017\006\003\125\004 +\012\023\010\114\101\127\164\162\165\163\164\061\041\060\037\006 +\003\125\004\003\023\030\114\101\127\164\162\165\163\164\040\122 +\157\157\164\040\103\101\062\040\050\064\060\071\066\051\060\202 +\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 +\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\314 +\027\313\053\103\272\154\371\311\223\212\145\015\022\114\354\047 +\024\267\023\171\340\324\325\055\030\126\361\371\352\052\020\026 +\116\154\104\307\152\145\106\363\232\211\065\321\207\370\063\211 +\057\210\011\032\222\020\221\220\301\153\237\016\156\177\046\212 +\023\135\030\254\150\001\015\020\170\145\160\330\216\217\204\132 +\227\060\030\320\021\016\112\215\122\020\245\201\053\121\050\365 +\143\304\266\354\100\263\001\345\255\167\275\345\070\357\274\215 +\263\335\031\240\173\015\215\264\333\152\373\045\063\132\372\221 +\257\304\161\105\060\370\210\051\173\313\277\325\272\047\004\216 +\335\262\000\367\312\134\231\065\024\352\375\165\006\025\010\273 +\312\127\150\373\077\373\264\064\163\143\321\325\343\310\070\132 +\151\175\152\172\104\014\015\212\116\355\222\035\020\217\073\042 +\054\266\337\355\305\306\360\211\171\124\145\136\137\033\275\217 +\175\337\271\267\355\353\344\305\007\321\147\074\225\073\221\376 +\102\172\122\100\200\004\322\071\127\113\364\222\175\377\233\357 +\345\235\311\011\262\221\022\070\246\051\010\073\256\353\312\314 +\355\115\347\116\041\001\007\374\157\062\316\151\214\204\122\306 +\167\352\047\060\012\336\245\257\060\053\150\037\254\324\354\041 +\255\042\111\166\316\017\302\362\007\052\371\152\022\203\232\073 +\004\256\031\172\376\241\206\044\372\101\136\045\174\100\254\047 +\266\343\051\066\157\065\342\127\320\031\130\337\377\144\366\303 +\001\111\166\333\053\276\274\271\117\024\012\325\033\130\041\366 +\034\056\000\174\370\224\265\313\067\032\024\344\062\271\026\324 +\140\354\005\252\137\062\372\152\043\022\254\324\020\273\322\242 +\202\264\113\016\213\160\047\252\326\007\301\147\210\372\204\303 +\010\311\212\204\310\322\067\162\201\017\215\026\112\344\327\065 +\121\245\070\017\214\204\113\225\066\300\365\327\235\340\135\217 +\253\221\356\000\010\271\235\122\037\354\370\231\273\171\126\261 +\111\332\322\345\330\141\213\133\257\360\253\067\305\173\032\216 +\206\276\176\305\173\025\036\141\150\350\013\207\213\163\111\241 +\027\163\176\051\170\216\312\340\101\057\165\163\164\242\227\072 +\177\367\056\164\011\270\114\140\213\106\066\031\020\055\235\002 +\003\001\000\001\243\201\221\060\201\216\060\017\006\003\125\035 +\023\001\001\377\004\005\060\003\001\001\377\060\016\006\003\125 +\035\017\001\001\377\004\004\003\002\001\006\060\053\006\003\125 +\035\020\004\044\060\042\200\017\062\060\062\063\060\062\061\064 +\060\071\061\071\063\070\132\201\017\062\060\065\063\060\062\061 +\064\060\071\064\071\063\070\132\060\037\006\003\125\035\043\004 +\030\060\026\200\024\327\326\126\142\134\077\027\201\346\163\104 +\051\365\121\005\357\013\140\067\254\060\035\006\003\125\035\016 +\004\026\004\024\327\326\126\142\134\077\027\201\346\163\104\051 +\365\121\005\357\013\140\067\254\060\015\006\011\052\206\110\206 +\367\015\001\001\013\005\000\003\202\002\001\000\111\234\051\376 +\075\354\236\105\177\253\076\074\376\043\157\067\076\167\247\123 +\377\170\237\374\111\104\200\127\146\234\156\332\171\377\315\105 +\255\114\223\277\265\131\306\351\020\267\345\370\214\373\207\305 +\036\213\330\263\077\002\226\012\273\212\216\357\327\264\300\203 +\040\070\227\131\105\144\374\366\167\023\362\011\327\241\310\070 +\164\010\352\371\110\114\372\037\004\234\264\377\354\156\126\066 +\162\223\154\225\076\054\137\336\017\013\253\311\314\025\076\026 +\217\146\374\262\020\270\241\321\264\336\300\143\031\314\357\123 +\252\165\066\042\213\045\037\277\233\310\327\301\137\354\246\067 +\011\252\173\142\274\366\042\055\361\326\130\335\214\273\122\364 +\013\247\166\251\172\173\032\215\334\255\232\201\142\056\206\005 +\220\162\107\057\241\311\147\204\260\015\154\260\270\233\026\267 +\320\231\024\057\234\022\233\043\250\215\246\103\036\351\345\055 +\345\170\247\037\144\224\144\266\167\262\250\134\373\011\253\051 +\353\036\155\165\321\366\320\305\245\303\035\237\036\363\032\055 +\262\310\037\345\050\012\156\363\137\375\332\346\043\241\166\220 +\134\113\230\001\202\054\356\107\055\002\032\137\177\064\305\151 +\265\162\255\076\363\317\236\155\370\051\350\021\047\053\340\131 +\013\033\141\353\112\312\151\245\244\325\315\121\033\224\216\171 +\315\337\366\256\164\135\261\054\033\206\123\376\321\060\006\101 +\064\007\142\202\114\364\176\307\207\164\016\260\041\036\011\040 +\200\301\263\025\075\106\155\323\361\006\222\077\357\240\225\212 +\034\156\167\061\266\353\170\051\014\173\356\202\245\117\176\244 +\051\136\236\252\055\370\216\300\363\374\015\006\205\233\116\334 +\367\342\011\174\320\024\121\036\172\263\043\257\372\321\141\052 +\145\265\001\331\270\343\007\312\044\166\322\360\112\276\357\206 +\004\200\102\025\160\021\150\176\327\307\273\376\347\116\233\234 +\225\245\034\112\244\311\320\011\214\252\316\110\322\036\222\227 +\327\021\351\355\146\314\067\334\365\327\033\164\233\246\352\102 +\254\135\062\340\130\364\201\107\377\322\022\342\176\034\334\111 +\166\226\303\035\237\113\312\134\052\067\133\075\212\321\070\233 +\041\332\343\277\105\103\323\340\130\167\037\050 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "LAWtrust Root CA2 (4096)" +# Issuer: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA +# Serial Number: 1427795633 (0x551a6eb1) +# Subject: CN=LAWtrust Root CA2 (4096),O=LAWtrust,C=ZA +# Not Valid Before: Tue Feb 14 09:19:38 2023 +# Not Valid After : Fri Feb 14 09:49:38 2053 +# Fingerprint (SHA-256): 48:E1:CF:9E:43:B6:88:A5:10:44:16:0F:46:D7:73:B8:27:7F:E4:5B:EA:AD:0E:4D:F9:0D:19:74:38:2F:EA:99 +# Fingerprint (SHA1): EC:A2:D5:30:A9:AB:2C:7D:0E:75:61:64:4E:0A:E0:16:A1:54:38:7D +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "LAWtrust Root CA2 (4096)" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\354\242\325\060\251\253\054\175\016\165\141\144\116\012\340\026 +\241\124\070\175 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\257\035\306\323\105\305\353\365\246\141\043\060\075\056\021\261 +END +CKA_ISSUER MULTILINE_OCTAL +\060\103\061\013\060\011\006\003\125\004\006\023\002\132\101\061 +\021\060\017\006\003\125\004\012\023\010\114\101\127\164\162\165 +\163\164\061\041\060\037\006\003\125\004\003\023\030\114\101\127 +\164\162\165\163\164\040\122\157\157\164\040\103\101\062\040\050 +\064\060\071\066\051 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\004\125\032\156\261 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Sectigo Public Email Protection Root E46" +# +# Issuer: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB +# Serial Number:6e:f5:d3:a7:41:8e:a0:59:40:a7:30:6b:d2:40:65:56 +# Subject: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): 22:D9:59:92:34:D6:0F:1D:4B:C7:C7:E9:6F:43:FA:55:5B:07:30:1F:D4:75:17:50:89:DA:FB:8C:25:E4:77:B3 +# Fingerprint (SHA1): 3A:C5:C3:78:34:5B:E1:82:92:46:ED:17:86:B3:93:91:7B:51:F2:14 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Email Protection Root E46" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\105\064\066 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\105\064\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\156\365\323\247\101\216\240\131\100\247\060\153\322\100 +\145\126 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\061\060\202\001\267\240\003\002\001\002\002\020\156 +\365\323\247\101\216\240\131\100\247\060\153\322\100\145\126\060 +\012\006\010\052\206\110\316\075\004\003\003\060\132\061\013\060 +\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003 +\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155 +\151\164\145\144\061\061\060\057\006\003\125\004\003\023\050\123 +\145\143\164\151\147\157\040\120\165\142\154\151\143\040\105\155 +\141\151\154\040\120\162\157\164\145\143\164\151\157\156\040\122 +\157\157\164\040\105\064\066\060\036\027\015\062\061\060\063\062 +\062\060\060\060\060\060\060\132\027\015\064\066\060\063\062\061 +\062\063\065\071\065\071\132\060\132\061\013\060\011\006\003\125 +\004\006\023\002\107\102\061\030\060\026\006\003\125\004\012\023 +\017\123\145\143\164\151\147\157\040\114\151\155\151\164\145\144 +\061\061\060\057\006\003\125\004\003\023\050\123\145\143\164\151 +\147\157\040\120\165\142\154\151\143\040\105\155\141\151\154\040 +\120\162\157\164\145\143\164\151\157\156\040\122\157\157\164\040 +\105\064\066\060\166\060\020\006\007\052\206\110\316\075\002\001 +\006\005\053\201\004\000\042\003\142\000\004\270\247\122\224\365 +\076\005\260\033\366\037\261\323\176\271\344\005\146\124\200\316 +\154\245\150\175\344\123\122\333\202\372\304\206\337\103\170\367 +\310\255\026\274\077\170\062\313\153\323\111\326\104\345\263\176 +\237\173\246\306\054\362\342\266\323\211\260\232\074\113\316\211 +\113\306\306\313\072\111\140\017\106\274\155\116\172\234\311\233 +\205\173\012\266\260\107\302\210\343\324\321\243\102\060\100\060 +\035\006\003\125\035\016\004\026\004\024\055\116\214\247\302\043 +\262\127\251\006\153\076\153\053\211\363\303\136\107\316\060\016 +\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\017 +\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 +\012\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145 +\002\061\000\222\235\032\131\143\105\130\216\033\026\344\175\172 +\154\066\110\060\037\053\162\347\220\063\064\375\044\242\306\006 +\214\157\073\062\127\132\370\376\306\111\022\123\232\331\020\262 +\231\121\162\002\060\005\045\052\063\041\374\223\346\042\242\314 +\160\125\050\065\126\242\007\304\041\204\043\032\114\114\231\120 +\231\222\024\313\112\334\126\373\365\323\217\152\054\365\161\072 +\370\213\073\003\236 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Sectigo Public Email Protection Root E46" +# Issuer: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB +# Serial Number:6e:f5:d3:a7:41:8e:a0:59:40:a7:30:6b:d2:40:65:56 +# Subject: CN=Sectigo Public Email Protection Root E46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): 22:D9:59:92:34:D6:0F:1D:4B:C7:C7:E9:6F:43:FA:55:5B:07:30:1F:D4:75:17:50:89:DA:FB:8C:25:E4:77:B3 +# Fingerprint (SHA1): 3A:C5:C3:78:34:5B:E1:82:92:46:ED:17:86:B3:93:91:7B:51:F2:14 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Email Protection Root E46" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\072\305\303\170\064\133\341\202\222\106\355\027\206\263\223\221 +\173\121\362\024 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\271\032\257\054\211\226\100\140\047\006\073\241\177\335\211\323 +END +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\105\064\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\156\365\323\247\101\216\240\131\100\247\060\153\322\100 +\145\126 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Sectigo Public Email Protection Root R46" +# +# Issuer: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB +# Serial Number:1d:44:9e:b9:0d:83:91:74:ae:dd:f2:eb:88:b7:a6:a3 +# Subject: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): D5:91:7A:77:91:EB:7C:F2:0A:2E:57:EB:98:28:4A:67:B2:8A:57:E8:91:82:DA:53:D5:46:67:8C:9F:DE:2B:4F +# Fingerprint (SHA1): D3:7B:8B:0A:E8:42:44:FB:6B:80:38:EE:AE:91:80:26:1A:48:70:66 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Email Protection Root R46" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\122\064\066 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\122\064\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\035\104\236\271\015\203\221\164\256\335\362\353\210\267 +\246\243 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\200\060\202\003\150\240\003\002\001\002\002\020\035 +\104\236\271\015\203\221\164\256\335\362\353\210\267\246\243\060 +\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\132 +\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030\060 +\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157\040 +\114\151\155\151\164\145\144\061\061\060\057\006\003\125\004\003 +\023\050\123\145\143\164\151\147\157\040\120\165\142\154\151\143 +\040\105\155\141\151\154\040\120\162\157\164\145\143\164\151\157 +\156\040\122\157\157\164\040\122\064\066\060\036\027\015\062\061 +\060\063\062\062\060\060\060\060\060\060\132\027\015\064\066\060 +\063\062\061\062\063\065\071\065\071\132\060\132\061\013\060\011 +\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003\125 +\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155\151 +\164\145\144\061\061\060\057\006\003\125\004\003\023\050\123\145 +\143\164\151\147\157\040\120\165\142\154\151\143\040\105\155\141 +\151\154\040\120\162\157\164\145\143\164\151\157\156\040\122\157 +\157\164\040\122\064\066\060\202\002\042\060\015\006\011\052\206 +\110\206\367\015\001\001\001\005\000\003\202\002\017\000\060\202 +\002\012\002\202\002\001\000\221\345\033\372\252\155\067\053\165 +\307\056\137\024\245\333\054\227\266\054\106\217\151\331\354\226 +\055\363\035\132\276\323\035\043\346\150\011\377\112\021\163\032 +\256\147\237\166\232\322\347\354\270\331\137\053\371\046\126\121 +\257\166\235\251\374\027\357\062\012\320\043\074\272\054\117\107 +\203\354\235\005\150\102\136\006\340\325\350\053\150\110\227\262 +\372\363\244\161\065\175\064\233\027\213\177\115\015\333\334\117 +\005\114\224\142\277\065\372\057\310\247\034\146\331\161\137\345 +\346\132\125\312\253\364\270\167\031\105\120\105\116\112\253\333 +\236\146\301\031\267\067\102\310\126\245\100\022\371\063\350\070 +\105\072\306\204\243\002\216\057\044\260\303\101\205\007\111\234 +\317\334\321\362\046\157\355\063\034\063\147\052\105\067\331\205 +\145\042\032\261\265\020\122\011\153\003\306\037\160\075\221\304 +\175\220\075\355\146\370\220\377\045\340\355\222\242\213\061\051 +\255\234\022\146\170\143\235\127\354\373\013\336\216\334\213\313 +\072\251\167\364\272\345\354\070\214\213\346\023\146\247\151\130 +\303\202\032\032\315\361\237\330\123\222\116\111\175\251\105\347 +\361\103\041\132\267\076\100\315\143\211\317\331\277\307\120\013 +\341\274\347\210\226\255\236\324\027\332\135\317\340\221\375\246 +\020\324\271\003\201\233\151\254\373\204\250\201\065\353\033\353 +\150\154\174\140\076\303\337\311\264\256\164\035\110\255\335\156 +\021\206\341\052\152\066\026\256\310\316\274\333\130\374\100\223 +\100\330\216\123\227\302\254\042\070\345\210\061\263\056\241\357 +\354\340\102\015\352\377\223\126\112\006\244\233\114\002\150\144 +\217\126\120\301\201\005\375\313\333\305\327\025\362\153\265\166 +\303\243\371\062\316\312\265\112\251\033\175\031\334\177\307\152 +\176\225\354\266\270\215\375\225\112\234\243\053\155\213\361\160 +\345\107\053\000\134\344\271\236\324\370\331\130\051\320\313\340 +\050\142\154\256\234\142\342\314\274\066\223\101\365\357\376\106 +\142\225\260\127\112\164\054\107\122\051\235\335\242\241\117\102 +\302\222\316\055\120\122\136\214\012\241\367\330\235\305\370\375 +\066\207\116\127\375\150\241\137\231\203\034\360\265\335\350\222 +\323\145\100\125\312\226\205\002\003\001\000\001\243\102\060\100 +\060\035\006\003\125\035\016\004\026\004\024\247\327\225\167\353 +\112\303\047\315\223\276\067\114\046\204\041\024\175\135\230\060 +\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 +\017\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377 +\060\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003 +\202\002\001\000\064\322\361\025\363\223\001\324\162\213\360\253 +\010\037\023\074\163\264\260\253\350\170\331\154\272\232\257\046 +\354\020\200\345\015\123\061\335\343\372\214\121\042\044\063\067 +\270\030\176\072\372\130\350\064\345\214\340\241\037\011\101\322 +\067\077\314\313\011\065\102\210\351\374\021\327\317\102\252\244 +\160\266\161\301\123\275\305\164\257\304\042\044\143\317\142\202 +\175\311\313\121\301\210\220\155\133\134\276\373\231\250\272\266 +\206\260\351\146\013\345\033\153\257\352\053\206\247\337\250\043 +\114\226\077\117\127\102\030\025\203\103\361\206\046\267\052\003 +\316\013\235\350\245\150\036\214\157\275\205\343\033\121\217\347 +\027\057\053\320\326\170\302\055\335\162\210\324\145\236\372\231 +\324\176\347\227\012\222\001\232\245\251\204\072\014\052\164\075 +\063\030\310\207\367\350\244\365\206\102\071\375\153\165\051\374 +\000\006\254\242\245\032\124\216\351\120\111\027\146\257\113\004 +\055\233\224\200\245\124\253\214\127\027\104\237\017\326\150\144 +\162\264\113\036\001\307\331\233\224\331\203\231\257\022\005\021 +\243\230\042\322\362\127\312\044\371\272\070\025\022\110\272\143 +\073\374\213\225\170\326\162\007\126\314\315\374\235\034\320\305 +\144\073\143\064\317\004\231\212\267\060\171\172\266\362\306\325 +\331\124\172\207\013\176\116\367\204\354\024\363\210\026\022\361 +\325\256\012\032\011\356\206\255\345\253\375\256\303\051\171\164 +\303\001\137\021\233\337\165\231\306\112\367\233\217\154\111\354 +\041\057\264\002\131\263\055\320\162\220\272\013\024\164\170\113 +\317\301\137\125\162\216\124\053\023\316\372\130\014\323\273\054 +\331\251\221\141\370\370\361\266\173\336\274\251\314\222\004\314 +\113\153\137\163\200\266\041\355\120\117\327\166\207\156\316\337 +\322\267\275\142\241\175\130\142\150\105\122\266\077\336\022\333 +\355\004\151\236\166\210\252\001\155\332\206\307\140\033\303\122 +\254\067\354\120\161\200\162\052\041\105\012\123\107\074\031\353 +\215\322\131\004\336\045\260\353\037\065\157\140\175\327\265\306 +\273\013\047\215\340\115\124\345\317\035\046\001\156\073\065\310 +\040\022\211\203\360\322\355\130\073\064\235\273\061\365\062\375 +\061\363\126\032 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Sectigo Public Email Protection Root R46" +# Issuer: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB +# Serial Number:1d:44:9e:b9:0d:83:91:74:ae:dd:f2:eb:88:b7:a6:a3 +# Subject: CN=Sectigo Public Email Protection Root R46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): D5:91:7A:77:91:EB:7C:F2:0A:2E:57:EB:98:28:4A:67:B2:8A:57:E8:91:82:DA:53:D5:46:67:8C:9F:DE:2B:4F +# Fingerprint (SHA1): D3:7B:8B:0A:E8:42:44:FB:6B:80:38:EE:AE:91:80:26:1A:48:70:66 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Email Protection Root R46" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\323\173\213\012\350\102\104\373\153\200\070\356\256\221\200\046 +\032\110\160\146 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\102\047\005\220\034\246\300\373\242\015\375\337\142\211\335\133 +END +CKA_ISSUER MULTILINE_OCTAL +\060\132\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\061\060\057\006\003\125 +\004\003\023\050\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\105\155\141\151\154\040\120\162\157\164\145\143\164 +\151\157\156\040\122\157\157\164\040\122\064\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\035\104\236\271\015\203\221\164\256\335\362\353\210\267 +\246\243 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Sectigo Public Server Authentication Root E46" +# +# Issuer: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB +# Serial Number:42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 +# Subject: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 +# Fingerprint (SHA1): EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Server Authentication Root E46" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 +\066 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 +\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\102\362\314\332\033\151\067\104\137\025\376\165\050\020 +\270\364 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\072\060\202\001\301\240\003\002\001\002\002\020\102 +\362\314\332\033\151\067\104\137\025\376\165\050\020\270\364\060 +\012\006\010\052\206\110\316\075\004\003\003\060\137\061\013\060 +\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006\003 +\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151\155 +\151\164\145\144\061\066\060\064\006\003\125\004\003\023\055\123 +\145\143\164\151\147\157\040\120\165\142\154\151\143\040\123\145 +\162\166\145\162\040\101\165\164\150\145\156\164\151\143\141\164 +\151\157\156\040\122\157\157\164\040\105\064\066\060\036\027\015 +\062\061\060\063\062\062\060\060\060\060\060\060\132\027\015\064 +\066\060\063\062\061\062\063\065\071\065\071\132\060\137\061\013 +\060\011\006\003\125\004\006\023\002\107\102\061\030\060\026\006 +\003\125\004\012\023\017\123\145\143\164\151\147\157\040\114\151 +\155\151\164\145\144\061\066\060\064\006\003\125\004\003\023\055 +\123\145\143\164\151\147\157\040\120\165\142\154\151\143\040\123 +\145\162\166\145\162\040\101\165\164\150\145\156\164\151\143\141 +\164\151\157\156\040\122\157\157\164\040\105\064\066\060\166\060 +\020\006\007\052\206\110\316\075\002\001\006\005\053\201\004\000 +\042\003\142\000\004\166\372\231\251\156\040\355\371\327\167\343 +\007\073\250\333\075\137\070\350\253\125\246\126\117\326\110\352 +\354\177\055\252\303\262\305\171\354\231\141\177\020\171\307\002 +\132\371\004\067\365\064\065\053\167\316\177\040\217\122\243\000 +\211\354\325\247\242\155\133\343\113\222\223\240\200\365\001\224 +\334\360\150\007\036\315\356\376\045\122\265\040\103\034\033\376 +\353\031\316\103\243\243\102\060\100\060\035\006\003\125\035\016 +\004\026\004\024\321\042\332\114\131\361\113\137\046\070\252\235 +\326\356\353\015\303\373\251\141\060\016\006\003\125\035\017\001 +\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023\001 +\001\377\004\005\060\003\001\001\377\060\012\006\010\052\206\110 +\316\075\004\003\003\003\147\000\060\144\002\060\047\356\244\132 +\250\041\273\351\107\227\224\211\245\164\040\155\171\117\310\275 +\223\136\130\030\373\055\032\000\152\311\270\075\320\244\117\104 +\107\224\001\126\242\370\063\045\014\102\337\252\002\060\035\352 +\341\056\210\056\341\371\247\035\002\062\116\362\237\154\125\164 +\343\256\256\373\245\032\356\355\322\374\302\003\021\353\105\134 +\140\020\075\134\177\231\003\133\155\124\110\001\212\163 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Sectigo Public Server Authentication Root E46" +# Issuer: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB +# Serial Number:42:f2:cc:da:1b:69:37:44:5f:15:fe:75:28:10:b8:f4 +# Subject: CN=Sectigo Public Server Authentication Root E46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): C9:0F:26:F0:FB:1B:40:18:B2:22:27:51:9B:5C:A2:B5:3E:2C:A5:B3:BE:5C:F1:8E:FE:1B:EF:47:38:0C:53:83 +# Fingerprint (SHA1): EC:8A:39:6C:40:F0:2E:BC:42:75:D4:9F:AB:1C:1A:5B:67:BE:D2:9A +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Server Authentication Root E46" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\354\212\071\154\100\360\056\274\102\165\324\237\253\034\032\133 +\147\276\322\232 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\050\043\370\262\230\134\067\026\073\076\106\023\116\260\263\001 +END +CKA_ISSUER MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\105\064 +\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\102\362\314\332\033\151\067\104\137\025\376\165\050\020 +\270\364 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Sectigo Public Server Authentication Root R46" +# +# Issuer: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB +# Serial Number:75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 +# Subject: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): 7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 +# Fingerprint (SHA1): AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Server Authentication Root R46" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 +\066 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 +\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\165\215\375\213\256\174\007\000\372\251\045\247\341\307 +\255\024 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\212\060\202\003\162\240\003\002\001\002\002\020\165 +\215\375\213\256\174\007\000\372\251\045\247\341\307\255\024\060 +\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\137 +\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030\060 +\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157\040 +\114\151\155\151\164\145\144\061\066\060\064\006\003\125\004\003 +\023\055\123\145\143\164\151\147\157\040\120\165\142\154\151\143 +\040\123\145\162\166\145\162\040\101\165\164\150\145\156\164\151 +\143\141\164\151\157\156\040\122\157\157\164\040\122\064\066\060 +\036\027\015\062\061\060\063\062\062\060\060\060\060\060\060\132 +\027\015\064\066\060\063\062\061\062\063\065\071\065\071\132\060 +\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061\030 +\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147\157 +\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125\004 +\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154\151 +\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156\164 +\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064\066 +\060\202\002\042\060\015\006\011\052\206\110\206\367\015\001\001 +\001\005\000\003\202\002\017\000\060\202\002\012\002\202\002\001 +\000\223\276\325\066\122\165\330\001\043\240\034\107\102\111\356 +\143\266\267\041\375\304\225\325\110\053\046\174\024\123\020\332 +\171\375\053\267\055\244\324\054\372\352\062\335\111\302\271\275 +\017\110\075\173\132\230\124\257\236\135\061\164\117\007\374\120 +\041\335\244\317\150\117\033\022\143\155\045\231\114\052\231\363 +\110\060\141\372\201\174\036\247\010\112\334\076\053\034\037\030 +\114\161\252\065\214\255\370\156\350\073\112\331\345\224\002\326 +\211\204\023\252\155\310\117\063\314\120\226\067\222\063\334\137 +\210\347\237\124\331\110\360\230\103\326\146\375\237\027\070\103 +\305\001\121\013\327\343\043\017\024\135\133\024\347\113\276\335 +\364\310\332\003\067\321\326\071\241\041\121\060\203\260\155\327 +\060\116\226\133\221\360\160\044\253\277\105\201\144\103\015\275 +\041\072\057\074\351\236\015\313\040\265\102\047\314\332\157\233 +\356\144\060\220\071\315\223\145\201\041\061\265\043\120\063\067 +\042\343\070\355\370\061\060\314\105\376\142\371\321\135\062\171 +\102\207\337\152\314\126\031\100\115\316\252\273\371\265\166\111 +\224\361\047\370\221\245\203\345\006\263\143\016\200\334\340\022 +\125\200\246\073\146\264\071\207\055\310\360\320\321\024\351\344 +\015\115\016\366\135\127\162\305\073\034\107\126\235\342\325\373 +\201\141\214\314\115\200\220\064\133\267\327\024\165\334\330\004 +\110\237\300\301\050\210\264\351\034\312\247\261\361\126\267\173 +\111\114\131\345\040\025\250\204\002\051\372\070\224\151\232\111 +\006\217\315\037\171\024\027\022\014\203\172\336\037\261\227\356 +\371\227\170\050\244\310\104\222\351\175\046\005\246\130\162\233 +\171\023\330\021\137\256\305\070\142\064\150\262\206\060\216\370 +\220\141\236\062\154\365\007\066\315\242\114\156\354\212\066\355 +\362\346\231\025\104\160\303\174\274\234\071\300\264\341\153\367 +\203\045\043\127\331\022\200\345\111\360\165\017\357\215\353\034 +\233\124\050\264\041\074\374\174\012\377\357\173\153\165\377\213 +\035\240\031\005\253\372\370\053\201\102\350\070\272\273\373\252 +\375\075\340\363\312\337\116\227\227\051\355\363\030\126\351\245 +\226\254\275\303\220\230\262\340\371\242\324\246\107\103\174\155 +\317\002\003\001\000\001\243\102\060\100\060\035\006\003\125\035 +\016\004\026\004\024\126\163\130\144\225\371\222\032\260\022\052 +\004\142\171\241\100\025\210\041\111\060\016\006\003\125\035\017 +\001\001\377\004\004\003\002\001\206\060\017\006\003\125\035\023 +\001\001\377\004\005\060\003\001\001\377\060\015\006\011\052\206 +\110\206\367\015\001\001\014\005\000\003\202\002\001\000\057\134 +\231\074\374\006\136\214\224\056\160\352\322\062\061\215\264\360 +\121\325\274\012\363\144\237\007\136\325\301\163\150\144\172\242 +\271\016\350\371\135\205\055\250\067\105\252\050\364\226\005\120 +\140\251\111\176\237\342\231\066\051\023\104\107\152\235\125\040 +\074\330\233\361\003\062\272\332\100\241\163\352\203\241\267\104 +\246\016\231\001\233\344\274\177\276\023\224\176\312\246\036\166 +\200\066\075\204\006\213\063\046\145\155\312\176\236\376\037\214 +\130\070\173\032\203\261\017\274\027\021\273\346\006\314\143\372 +\201\362\201\114\332\013\020\153\241\372\325\050\245\317\006\100 +\026\377\173\175\030\136\071\022\244\123\236\176\062\102\020\246 +\041\221\251\034\116\027\174\204\274\237\214\321\350\337\346\121 +\271\066\107\077\220\271\307\274\002\334\133\034\117\016\110\301 +\045\203\234\012\077\236\261\003\063\022\032\047\254\367\042\154 +\044\321\001\101\370\130\003\376\045\150\042\037\232\132\074\174 +\154\236\165\110\363\201\361\146\147\156\114\202\300\356\272\127 +\016\030\357\056\232\367\022\330\240\153\351\005\245\241\351\150 +\370\274\114\077\022\036\105\350\122\300\243\277\022\047\171\271 +\314\061\074\303\366\072\042\026\003\240\311\217\146\244\133\242 +\115\326\201\045\006\351\166\244\000\012\076\313\315\065\233\340 +\341\070\313\140\123\206\050\102\101\034\104\127\350\250\255\253 +\105\343\045\020\274\333\076\145\101\373\033\246\227\017\353\271 +\164\171\371\036\274\035\127\015\107\257\303\057\237\207\106\247 +\353\046\132\017\126\143\265\142\140\156\000\373\343\047\021\042 +\347\376\231\217\064\365\271\350\303\221\162\275\330\303\036\271 +\056\362\221\104\121\320\127\315\014\064\325\110\041\277\333\023 +\361\146\045\103\122\322\160\042\066\315\237\304\034\165\040\255 +\143\162\143\006\017\016\047\316\322\152\015\274\265\071\032\351 +\321\166\172\321\134\344\347\111\111\055\125\067\150\360\032\072 +\230\076\124\027\207\124\351\246\047\120\211\173\040\057\077\377 +\277\241\213\112\107\230\377\053\173\111\076\303\051\106\140\030 +\102\253\063\051\272\300\051\271\023\211\323\210\212\071\101\073 +\311\375\246\355\037\364\140\143\337\322\055\125\001\213 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Sectigo Public Server Authentication Root R46" +# Issuer: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB +# Serial Number:75:8d:fd:8b:ae:7c:07:00:fa:a9:25:a7:e1:c7:ad:14 +# Subject: CN=Sectigo Public Server Authentication Root R46,O=Sectigo Limited,C=GB +# Not Valid Before: Mon Mar 22 00:00:00 2021 +# Not Valid After : Wed Mar 21 23:59:59 2046 +# Fingerprint (SHA-256): 7B:B6:47:A6:2A:EE:AC:88:BF:25:7A:A5:22:D0:1F:FE:A3:95:E0:AB:45:C7:3F:93:F6:56:54:EC:38:F2:5A:06 +# Fingerprint (SHA1): AD:98:F9:F3:E4:7D:75:3B:65:D4:82:B3:A4:52:17:BB:6E:F5:E4:38 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Sectigo Public Server Authentication Root R46" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\255\230\371\363\344\175\165\073\145\324\202\263\244\122\027\273 +\156\365\344\070 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\062\020\011\122\000\325\176\154\103\337\025\300\261\026\223\345 +END +CKA_ISSUER MULTILINE_OCTAL +\060\137\061\013\060\011\006\003\125\004\006\023\002\107\102\061 +\030\060\026\006\003\125\004\012\023\017\123\145\143\164\151\147 +\157\040\114\151\155\151\164\145\144\061\066\060\064\006\003\125 +\004\003\023\055\123\145\143\164\151\147\157\040\120\165\142\154 +\151\143\040\123\145\162\166\145\162\040\101\165\164\150\145\156 +\164\151\143\141\164\151\157\156\040\122\157\157\164\040\122\064 +\066 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\165\215\375\213\256\174\007\000\372\251\045\247\341\307 +\255\024 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "SSL.com TLS RSA Root CA 2022" +# +# Issuer: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US +# Serial Number:6f:be:da:ad:73:bd:08:40:e2:8b:4d:be:d4:f7:5b:91 +# Subject: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:34:22 2022 +# Not Valid After : Sun Aug 19 16:34:21 2046 +# Fingerprint (SHA-256): 8F:AF:7D:2E:2C:B4:70:9B:B8:E0:B3:36:66:BF:75:A5:DD:45:B5:DE:48:0F:8E:A8:D4:BF:E6:BE:BC:17:F2:ED +# Fingerprint (SHA1): EC:2C:83:40:72:AF:26:95:10:FF:0E:F2:03:EE:31:70:F6:78:9D:CA +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com TLS RSA Root CA 2022" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\157\276\332\255\163\275\010\100\342\213\115\276\324\367 +\133\221 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\211\060\202\003\161\240\003\002\001\002\002\020\157 +\276\332\255\163\275\010\100\342\213\115\276\324\367\133\221\060 +\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\116 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 +\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 +\157\162\141\164\151\157\156\061\045\060\043\006\003\125\004\003 +\014\034\123\123\114\056\143\157\155\040\124\114\123\040\122\123 +\101\040\122\157\157\164\040\103\101\040\062\060\062\062\060\036 +\027\015\062\062\060\070\062\065\061\066\063\064\062\062\132\027 +\015\064\066\060\070\061\071\061\066\063\064\062\061\132\060\116 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 +\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 +\157\162\141\164\151\157\156\061\045\060\043\006\003\125\004\003 +\014\034\123\123\114\056\143\157\155\040\124\114\123\040\122\123 +\101\040\122\157\157\164\040\103\101\040\062\060\062\062\060\202 +\002\042\060\015\006\011\052\206\110\206\367\015\001\001\001\005 +\000\003\202\002\017\000\060\202\002\012\002\202\002\001\000\320 +\244\011\162\117\100\210\022\141\076\065\043\236\356\366\164\317 +\057\173\130\075\316\074\015\020\050\220\057\227\367\214\110\330 +\240\330\045\261\114\260\021\114\027\163\120\320\042\112\143\273 +\201\323\051\156\325\265\011\076\046\030\177\262\022\177\223\230 +\267\257\360\066\277\362\356\030\236\234\073\122\305\107\031\135 +\164\363\144\146\325\135\307\150\264\277\033\034\006\243\274\217 +\100\043\266\036\306\204\275\121\304\033\071\301\225\322\051\354 +\113\256\173\055\277\071\375\264\142\336\226\173\101\306\234\240 +\340\006\162\373\360\007\227\011\071\201\164\257\367\064\131\021 +\127\012\302\133\301\044\364\061\163\060\202\306\235\272\002\367 +\076\174\104\137\203\015\363\361\335\040\151\026\011\120\342\324 +\125\266\340\200\162\166\156\114\107\267\165\125\131\264\123\164 +\331\224\306\101\255\130\212\061\146\017\036\242\033\051\100\116 +\057\337\173\346\026\054\055\374\277\354\363\264\372\276\030\366 +\233\111\324\356\005\156\331\064\363\234\361\354\001\213\321\040 +\306\017\240\265\274\027\116\110\173\121\302\374\351\134\151\067 +\107\146\263\150\370\025\050\360\271\323\244\025\314\132\117\272 +\122\160\243\022\105\335\306\272\116\373\302\320\367\250\122\047 +\155\156\171\265\214\374\173\214\301\026\114\356\200\177\276\360 +\166\276\101\123\022\063\256\132\070\102\253\327\017\076\101\215 +\166\007\062\325\253\211\366\116\147\331\261\102\165\043\156\363 +\315\102\262\374\125\365\123\207\027\073\300\063\130\361\122\322 +\371\200\244\360\350\360\073\213\070\314\244\306\220\177\017\234 +\375\213\321\243\317\332\203\247\151\311\120\066\325\134\005\322 +\012\101\164\333\143\021\067\301\245\240\226\113\036\214\026\022 +\167\256\224\064\173\036\177\302\146\000\344\252\203\352\212\220 +\255\316\066\104\115\321\121\351\274\037\363\152\005\375\300\164 +\037\045\031\100\121\156\352\202\121\100\337\233\271\010\052\006 +\002\325\043\034\023\326\351\333\333\306\260\172\313\173\047\233 +\373\340\325\106\044\355\020\113\143\113\245\005\217\272\270\035 +\053\246\372\221\342\222\122\275\354\353\147\227\155\232\055\237 +\201\062\005\147\062\373\110\010\077\331\045\270\004\045\057\002 +\003\001\000\001\243\143\060\141\060\017\006\003\125\035\023\001 +\001\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043 +\004\030\060\026\200\024\373\056\067\356\343\204\172\047\056\315 +\031\065\261\063\174\377\324\104\102\271\060\035\006\003\125\035 +\016\004\026\004\024\373\056\067\356\343\204\172\047\056\315\031 +\065\261\063\174\377\324\104\102\271\060\016\006\003\125\035\017 +\001\001\377\004\004\003\002\001\206\060\015\006\011\052\206\110 +\206\367\015\001\001\013\005\000\003\202\002\001\000\215\211\155 +\204\105\030\361\117\263\240\357\150\244\300\035\254\060\274\147 +\146\260\232\315\266\253\042\031\146\323\073\101\265\020\235\020 +\272\162\156\051\044\040\034\001\231\142\323\226\340\342\373\014 +\102\327\341\132\304\226\115\124\315\217\312\103\123\375\052\270 +\352\370\145\312\001\302\255\140\150\006\237\071\032\121\331\340 +\215\046\371\013\116\245\123\045\172\043\244\034\316\010\033\337 +\107\210\262\255\076\340\047\207\213\111\214\037\251\107\130\173 +\226\362\210\035\030\256\263\321\246\012\224\372\333\323\345\070 +\012\153\171\022\063\373\112\131\067\026\100\016\273\336\365\211 +\014\361\154\323\367\121\153\136\065\365\333\300\046\352\022\163 +\116\251\221\220\246\027\303\154\057\070\324\243\162\224\103\054 +\142\341\116\134\062\075\275\114\175\031\107\242\303\111\347\226 +\077\217\232\323\073\344\021\330\213\003\334\366\266\140\125\030 +\246\201\121\363\341\250\025\152\353\340\013\360\024\061\326\271 +\214\105\072\250\020\330\360\271\047\353\367\313\172\357\005\162 +\226\265\304\217\226\163\304\350\126\163\234\274\151\121\143\274 +\357\147\034\103\032\137\167\031\037\030\370\034\045\051\371\111 +\231\051\266\222\075\242\203\067\261\040\221\250\233\060\351\152 +\154\264\043\223\145\004\253\021\363\016\035\123\044\111\123\035 +\241\077\235\110\222\021\342\175\015\117\365\327\275\242\130\076 +\170\235\036\037\053\376\041\273\032\023\266\261\050\144\375\260 +\002\000\307\154\200\242\275\026\120\040\017\162\201\137\314\224 +\377\273\231\346\272\220\313\352\371\306\014\302\256\305\031\316 +\063\241\153\134\273\176\174\064\127\027\255\360\077\256\315\352 +\257\231\354\054\124\176\214\316\056\022\126\110\357\027\073\077 +\112\136\140\322\334\164\066\274\245\103\143\313\017\133\243\002 +\126\011\236\044\054\341\206\201\214\376\253\027\054\372\310\342 +\062\032\072\377\205\010\311\203\237\362\112\110\020\124\167\067 +\355\242\274\100\276\344\020\164\367\344\133\273\271\363\211\371 +\217\101\330\307\344\120\220\065\200\076\034\270\115\220\323\324 +\367\303\260\241\176\204\312\167\222\061\054\270\220\261\202\172 +\164\116\233\023\046\264\325\120\146\124\170\256\140 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "SSL.com TLS RSA Root CA 2022" +# Issuer: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US +# Serial Number:6f:be:da:ad:73:bd:08:40:e2:8b:4d:be:d4:f7:5b:91 +# Subject: CN=SSL.com TLS RSA Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:34:22 2022 +# Not Valid After : Sun Aug 19 16:34:21 2046 +# Fingerprint (SHA-256): 8F:AF:7D:2E:2C:B4:70:9B:B8:E0:B3:36:66:BF:75:A5:DD:45:B5:DE:48:0F:8E:A8:D4:BF:E6:BE:BC:17:F2:ED +# Fingerprint (SHA1): EC:2C:83:40:72:AF:26:95:10:FF:0E:F2:03:EE:31:70:F6:78:9D:CA +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com TLS RSA Root CA 2022" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\354\054\203\100\162\257\046\225\020\377\016\362\003\356\061\160 +\366\170\235\312 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\330\116\306\131\060\330\376\240\326\172\132\054\054\151\170\332 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\157\276\332\255\163\275\010\100\342\213\115\276\324\367 +\133\221 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "SSL.com TLS ECC Root CA 2022" +# +# Issuer: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US +# Serial Number:14:03:f5:ab:fb:37:8b:17:40:5b:e2:43:b2:a5:d1:c4 +# Subject: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:33:48 2022 +# Not Valid After : Sun Aug 19 16:33:47 2046 +# Fingerprint (SHA-256): C3:2F:FD:9F:46:F9:36:D1:6C:36:73:99:09:59:43:4B:9A:D6:0A:AF:BB:9E:7C:F3:36:54:F1:44:CC:1B:A1:43 +# Fingerprint (SHA1): 9F:5F:D9:1A:54:6D:F5:0C:71:F0:EE:7A:BD:17:49:98:84:73:E2:39 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com TLS ECC Root CA 2022" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\024\003\365\253\373\067\213\027\100\133\342\103\262\245 +\321\304 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\072\060\202\001\300\240\003\002\001\002\002\020\024 +\003\365\253\373\067\213\027\100\133\342\103\262\245\321\304\060 +\012\006\010\052\206\110\316\075\004\003\003\060\116\061\013\060 +\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 +\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 +\164\151\157\156\061\045\060\043\006\003\125\004\003\014\034\123 +\123\114\056\143\157\155\040\124\114\123\040\105\103\103\040\122 +\157\157\164\040\103\101\040\062\060\062\062\060\036\027\015\062 +\062\060\070\062\065\061\066\063\063\064\070\132\027\015\064\066 +\060\070\061\071\061\066\063\063\064\067\132\060\116\061\013\060 +\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 +\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 +\164\151\157\156\061\045\060\043\006\003\125\004\003\014\034\123 +\123\114\056\143\157\155\040\124\114\123\040\105\103\103\040\122 +\157\157\164\040\103\101\040\062\060\062\062\060\166\060\020\006 +\007\052\206\110\316\075\002\001\006\005\053\201\004\000\042\003 +\142\000\004\105\051\065\163\372\302\270\043\316\024\175\250\261 +\115\240\133\066\356\052\054\123\303\140\011\065\262\044\146\046 +\151\300\263\225\326\135\222\100\031\016\306\245\023\160\364\357 +\022\121\050\135\347\314\275\371\074\205\301\317\224\220\311\053 +\316\222\102\130\131\147\375\224\047\020\144\214\117\004\261\115 +\111\344\173\117\233\365\347\010\370\003\210\367\247\303\222\113 +\031\124\201\243\143\060\141\060\017\006\003\125\035\023\001\001 +\377\004\005\060\003\001\001\377\060\037\006\003\125\035\043\004 +\030\060\026\200\024\211\217\057\243\350\053\240\024\124\173\363 +\126\270\046\137\147\070\013\234\320\060\035\006\003\125\035\016 +\004\026\004\024\211\217\057\243\350\053\240\024\124\173\363\126 +\270\046\137\147\070\013\234\320\060\016\006\003\125\035\017\001 +\001\377\004\004\003\002\001\206\060\012\006\010\052\206\110\316 +\075\004\003\003\003\150\000\060\145\002\060\125\343\042\126\351 +\327\222\044\130\117\036\224\062\017\014\002\066\302\375\254\164 +\062\116\341\373\034\200\210\243\314\373\327\353\053\377\067\175 +\360\355\327\236\165\152\065\166\122\105\340\002\061\000\307\215 +\157\102\040\217\276\266\115\131\355\167\115\051\304\040\040\105 +\144\206\072\120\306\304\255\055\223\365\030\175\162\355\251\317 +\304\254\127\066\050\010\145\337\074\171\146\176\240\352 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "SSL.com TLS ECC Root CA 2022" +# Issuer: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US +# Serial Number:14:03:f5:ab:fb:37:8b:17:40:5b:e2:43:b2:a5:d1:c4 +# Subject: CN=SSL.com TLS ECC Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:33:48 2022 +# Not Valid After : Sun Aug 19 16:33:47 2046 +# Fingerprint (SHA-256): C3:2F:FD:9F:46:F9:36:D1:6C:36:73:99:09:59:43:4B:9A:D6:0A:AF:BB:9E:7C:F3:36:54:F1:44:CC:1B:A1:43 +# Fingerprint (SHA1): 9F:5F:D9:1A:54:6D:F5:0C:71:F0:EE:7A:BD:17:49:98:84:73:E2:39 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com TLS ECC Root CA 2022" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\237\137\331\032\124\155\365\014\161\360\356\172\275\027\111\230 +\204\163\342\071 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\231\327\134\361\121\066\314\351\316\331\031\056\167\161\126\305 +END +CKA_ISSUER MULTILINE_OCTAL +\060\116\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\045\060\043\006\003\125 +\004\003\014\034\123\123\114\056\143\157\155\040\124\114\123\040 +\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\024\003\365\253\373\067\213\027\100\133\342\103\262\245 +\321\304 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "SSL.com Client ECC Root CA 2022" +# +# Issuer: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US +# Serial Number:76:f8:48:1e:ae:f0:3c:70:1f:e0:3f:25:54:01:83:d5 +# Subject: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:30:32 2022 +# Not Valid After : Sun Aug 19 16:30:31 2046 +# Fingerprint (SHA-256): AD:7D:D5:8D:03:AE:DB:22:A3:0B:50:84:39:49:20:CE:12:23:0C:2D:80:17:AD:9B:81:AB:04:07:9B:DD:02:6B +# Fingerprint (SHA1): 80:7B:1D:9D:65:72:3D:C7:56:F9:EC:C5:00:83:49:F6:F2:AC:F4:86 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com Client ECC Root CA 2022" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\166\370\110\036\256\360\074\160\037\340\077\045\124\001 +\203\325 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\100\060\202\001\306\240\003\002\001\002\002\020\166 +\370\110\036\256\360\074\160\037\340\077\045\124\001\203\325\060 +\012\006\010\052\206\110\316\075\004\003\003\060\121\061\013\060 +\011\006\003\125\004\006\023\002\125\123\061\030\060\026\006\003 +\125\004\012\014\017\123\123\114\040\103\157\162\160\157\162\141 +\164\151\157\156\061\050\060\046\006\003\125\004\003\014\037\123 +\123\114\056\143\157\155\040\103\154\151\145\156\164\040\105\103 +\103\040\122\157\157\164\040\103\101\040\062\060\062\062\060\036 +\027\015\062\062\060\070\062\065\061\066\063\060\063\062\132\027 +\015\064\066\060\070\061\071\061\066\063\060\063\061\132\060\121 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 +\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 +\157\162\141\164\151\157\156\061\050\060\046\006\003\125\004\003 +\014\037\123\123\114\056\143\157\155\040\103\154\151\145\156\164 +\040\105\103\103\040\122\157\157\164\040\103\101\040\062\060\062 +\062\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 +\053\201\004\000\042\003\142\000\004\055\123\176\237\213\076\263 +\066\272\120\342\314\353\334\272\046\212\323\214\006\077\147\017 +\357\365\027\345\324\256\232\106\052\101\001\007\151\347\147\161 +\361\302\003\066\306\360\053\122\216\317\024\222\150\244\076\160 +\121\022\151\215\170\242\202\312\051\024\300\344\224\042\262\104 +\222\140\157\310\004\244\147\325\242\320\363\320\327\352\216\074 +\017\272\322\100\107\220\064\356\175\243\143\060\141\060\017\006 +\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037 +\006\003\125\035\043\004\030\060\026\200\024\267\376\055\142\305 +\201\123\315\122\032\057\135\140\240\303\135\373\262\034\034\060 +\035\006\003\125\035\016\004\026\004\024\267\376\055\142\305\201 +\123\315\122\032\057\135\140\240\303\135\373\262\034\034\060\016 +\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\012 +\006\010\052\206\110\316\075\004\003\003\003\150\000\060\145\002 +\060\115\007\021\055\021\373\271\046\303\041\335\162\341\027\374 +\301\317\024\352\111\316\161\207\216\326\123\334\021\315\135\124 +\212\257\331\055\364\214\121\352\274\146\107\342\177\225\203\140 +\145\002\061\000\214\041\114\117\273\345\260\120\337\220\142\111 +\346\314\221\333\370\077\135\161\221\010\216\117\222\311\177\246 +\134\352\023\176\355\155\304\350\303\052\157\134\021\341\245\363 +\152\132\232\115 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "SSL.com Client ECC Root CA 2022" +# Issuer: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US +# Serial Number:76:f8:48:1e:ae:f0:3c:70:1f:e0:3f:25:54:01:83:d5 +# Subject: CN=SSL.com Client ECC Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:30:32 2022 +# Not Valid After : Sun Aug 19 16:30:31 2046 +# Fingerprint (SHA-256): AD:7D:D5:8D:03:AE:DB:22:A3:0B:50:84:39:49:20:CE:12:23:0C:2D:80:17:AD:9B:81:AB:04:07:9B:DD:02:6B +# Fingerprint (SHA1): 80:7B:1D:9D:65:72:3D:C7:56:F9:EC:C5:00:83:49:F6:F2:AC:F4:86 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com Client ECC Root CA 2022" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\200\173\035\235\145\162\075\307\126\371\354\305\000\203\111\366 +\362\254\364\206 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\063\271\151\231\022\166\125\274\337\257\101\334\042\213\167\200 +END +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\105\103\103\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\166\370\110\036\256\360\074\160\037\340\077\045\124\001 +\203\325 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "SSL.com Client RSA Root CA 2022" +# +# Issuer: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US +# Serial Number:76:af:ee:88:93:15:45:b6:50:53:9b:80:9c:a4:df:9a +# Subject: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:31:07 2022 +# Not Valid After : Sun Aug 19 16:31:06 2046 +# Fingerprint (SHA-256): 1D:4C:A4:A2:AB:21:D0:09:36:59:80:4F:C0:EB:21:75:A6:17:27:9B:56:A2:47:52:45:C9:51:7A:FE:B5:91:53 +# Fingerprint (SHA1): AA:59:70:E5:20:32:9F:CB:D0:D5:79:9F:FB:1B:82:1D:FD:1F:79:65 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com Client RSA Root CA 2022" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\166\257\356\210\223\025\105\266\120\123\233\200\234\244 +\337\232 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\217\060\202\003\167\240\003\002\001\002\002\020\166 +\257\356\210\223\025\105\266\120\123\233\200\234\244\337\232\060 +\015\006\011\052\206\110\206\367\015\001\001\013\005\000\060\121 +\061\013\060\011\006\003\125\004\006\023\002\125\123\061\030\060 +\026\006\003\125\004\012\014\017\123\123\114\040\103\157\162\160 +\157\162\141\164\151\157\156\061\050\060\046\006\003\125\004\003 +\014\037\123\123\114\056\143\157\155\040\103\154\151\145\156\164 +\040\122\123\101\040\122\157\157\164\040\103\101\040\062\060\062 +\062\060\036\027\015\062\062\060\070\062\065\061\066\063\061\060 +\067\132\027\015\064\066\060\070\061\071\061\066\063\061\060\066 +\132\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123 +\061\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103 +\157\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003 +\125\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151 +\145\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040 +\062\060\062\062\060\202\002\042\060\015\006\011\052\206\110\206 +\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 +\002\202\002\001\000\270\130\333\106\060\373\311\077\343\310\360 +\001\063\064\342\332\110\250\030\351\040\156\232\327\001\341\325 +\051\217\060\264\043\152\344\313\142\260\276\342\237\040\275\076 +\124\240\071\150\307\206\067\146\164\006\006\357\164\053\332\334 +\237\204\251\122\057\220\322\356\176\174\373\245\042\255\157\160 +\106\147\226\075\051\324\243\273\126\173\024\004\131\301\041\143 +\104\036\262\037\022\134\220\207\145\015\210\366\036\210\042\342 +\143\124\273\363\066\370\326\177\334\332\377\051\065\251\306\156 +\016\151\133\077\330\276\202\207\025\160\135\260\307\134\022\017 +\143\246\070\315\317\163\271\303\016\211\046\067\033\077\142\034 +\062\151\321\233\331\377\125\220\061\336\261\143\335\317\305\164 +\167\374\357\210\041\123\277\000\061\032\046\054\000\060\245\137 +\154\343\344\366\000\212\312\230\207\234\164\003\172\213\146\354 +\176\375\243\217\065\045\134\170\245\263\244\373\075\155\251\212 +\360\154\210\202\213\375\112\320\157\344\327\243\264\216\064\111 +\070\276\316\105\345\322\034\312\136\302\067\024\213\315\146\126 +\063\067\235\345\153\354\103\222\144\240\102\332\165\157\300\025 +\354\371\151\275\064\271\212\173\372\026\373\125\376\122\040\350 +\004\004\126\126\145\365\067\104\230\310\212\106\351\267\254\270 +\350\276\142\216\124\066\133\367\073\160\277\135\356\055\272\137 +\336\102\031\206\360\177\213\353\010\313\330\276\352\016\102\102 +\240\066\163\127\027\355\062\352\320\215\350\007\033\233\231\350 +\304\232\142\004\016\110\367\074\022\272\367\130\301\232\214\351 +\307\260\043\066\126\064\035\313\154\332\272\007\204\035\375\321 +\254\237\346\302\211\357\303\271\154\030\263\151\207\127\137\265 +\014\070\133\247\041\044\052\073\247\064\221\236\264\124\352\050 +\117\323\301\243\213\344\346\053\325\362\235\277\233\141\000\042 +\335\326\113\104\037\077\135\126\376\336\234\170\314\231\133\252 +\344\275\272\333\103\113\255\114\046\114\243\115\064\212\154\164 +\066\023\333\142\374\233\262\005\201\377\256\077\014\315\366\033 +\242\364\071\347\312\365\114\134\373\124\167\065\200\132\300\022 +\241\023\001\063\147\075\235\201\241\251\365\205\044\130\210\170 +\347\364\343\150\125\002\003\001\000\001\243\143\060\141\060\017 +\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 +\037\006\003\125\035\043\004\030\060\026\200\024\360\070\102\224 +\064\251\074\000\177\122\356\071\245\367\113\015\274\152\175\043 +\060\035\006\003\125\035\016\004\026\004\024\360\070\102\224\064 +\251\074\000\177\122\356\071\245\367\113\015\274\152\175\043\060 +\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 +\015\006\011\052\206\110\206\367\015\001\001\013\005\000\003\202 +\002\001\000\231\117\333\360\352\326\021\372\052\375\310\253\155 +\344\016\163\142\322\102\237\025\376\174\160\122\077\144\207\202 +\061\077\105\100\056\341\042\237\006\146\051\374\226\323\055\215 +\266\070\307\331\363\047\301\131\051\240\214\366\163\044\017\050 +\042\327\116\141\335\023\335\333\237\062\122\223\373\117\314\352 +\070\074\230\152\003\253\026\257\041\321\102\256\175\105\053\352 +\304\317\212\131\237\202\160\166\072\370\142\046\311\020\227\130 +\100\044\244\055\271\057\051\200\047\341\211\153\162\312\111\010 +\161\067\123\005\361\200\316\323\102\002\322\374\302\321\224\006 +\356\007\342\366\203\342\177\237\347\273\126\303\133\277\335\225 +\223\011\036\044\301\317\046\315\255\244\256\302\264\151\347\252 +\265\355\067\224\351\335\321\143\205\153\232\172\112\126\166\334 +\031\205\050\324\344\306\244\330\270\226\101\167\320\264\131\361 +\106\005\207\207\002\037\151\271\202\030\320\103\331\046\332\032 +\147\250\326\165\166\352\362\155\016\102\377\210\046\242\156\204 +\376\176\142\033\360\306\075\355\300\034\152\307\221\326\270\000 +\067\111\233\271\204\005\241\315\156\061\326\104\352\123\213\272 +\123\230\035\241\220\212\351\205\370\033\362\223\130\303\310\334 +\232\046\117\076\040\317\117\103\363\020\214\177\020\141\172\066 +\312\252\013\175\314\237\107\104\131\256\245\225\306\231\123\343 +\007\153\075\111\020\260\030\377\135\016\205\103\024\113\347\153 +\323\112\265\262\140\141\334\151\111\002\043\135\350\222\161\303 +\234\237\105\147\171\036\334\062\206\272\252\125\074\144\157\062 +\265\020\100\025\336\162\100\170\340\156\160\273\156\353\011\350 +\071\331\254\272\222\165\335\103\312\272\001\225\255\032\201\053 +\072\360\343\305\057\014\030\115\020\306\256\300\355\376\005\122 +\177\031\005\313\251\257\065\010\014\070\042\344\376\126\345\123 +\076\277\344\326\263\331\010\303\075\325\063\062\201\044\305\251 +\341\145\021\270\062\063\060\161\030\111\035\032\105\306\232\024 +\212\130\071\050\156\363\313\121\271\111\046\144\170\003\307\221 +\021\203\251\271\220\064\266\157\252\005\236\205\050\127\231\276 +\177\047\006\111\142\115\241\374\011\341\053\106\011\114\024\233 +\126\217\105 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "SSL.com Client RSA Root CA 2022" +# Issuer: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US +# Serial Number:76:af:ee:88:93:15:45:b6:50:53:9b:80:9c:a4:df:9a +# Subject: CN=SSL.com Client RSA Root CA 2022,O=SSL Corporation,C=US +# Not Valid Before: Thu Aug 25 16:31:07 2022 +# Not Valid After : Sun Aug 19 16:31:06 2046 +# Fingerprint (SHA-256): 1D:4C:A4:A2:AB:21:D0:09:36:59:80:4F:C0:EB:21:75:A6:17:27:9B:56:A2:47:52:45:C9:51:7A:FE:B5:91:53 +# Fingerprint (SHA1): AA:59:70:E5:20:32:9F:CB:D0:D5:79:9F:FB:1B:82:1D:FD:1F:79:65 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "SSL.com Client RSA Root CA 2022" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\252\131\160\345\040\062\237\313\320\325\171\237\373\033\202\035 +\375\037\171\145 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\011\215\322\312\256\154\024\276\276\014\224\157\067\027\040\316 +END +CKA_ISSUER MULTILINE_OCTAL +\060\121\061\013\060\011\006\003\125\004\006\023\002\125\123\061 +\030\060\026\006\003\125\004\012\014\017\123\123\114\040\103\157 +\162\160\157\162\141\164\151\157\156\061\050\060\046\006\003\125 +\004\003\014\037\123\123\114\056\143\157\155\040\103\154\151\145 +\156\164\040\122\123\101\040\122\157\157\164\040\103\101\040\062 +\060\062\062 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\166\257\356\210\223\025\105\266\120\123\233\200\234\244 +\337\232 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Atos TrustedRoot Root CA ECC G2 2020" +# +# Issuer: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE +# Serial Number:0b:73:28:11:18:74:30:1c:ef:6f:08:84 +# Subject: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE +# Not Valid Before: Tue Dec 15 08:39:10 2020 +# Not Valid After : Mon Dec 10 08:39:09 2040 +# Fingerprint (SHA-256): E3:86:55:F4:B0:19:0C:84:D3:B3:89:3D:84:0A:68:7E:19:0A:25:6D:98:05:2F:15:9E:6D:4A:39:F5:89:A6:EB +# Fingerprint (SHA1): 61:25:56:DA:62:94:E5:AE:B3:3C:F8:11:BD:B1:DC:F8:A5:D8:B3:E4 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC G2 2020" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\105\103\103\040\107\062\040\062\060\062\060 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\105\103\103\040\107\062\040\062\060\062\060 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\014\013\163\050\021\030\164\060\034\357\157\010\204 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\061\060\202\001\266\240\003\002\001\002\002\014\013 +\163\050\021\030\164\060\034\357\157\010\204\060\012\006\010\052 +\206\110\316\075\004\003\003\060\113\061\013\060\011\006\003\125 +\004\006\023\002\104\105\061\015\060\013\006\003\125\004\012\014 +\004\101\164\157\163\061\055\060\053\006\003\125\004\003\014\044 +\101\164\157\163\040\124\162\165\163\164\145\144\122\157\157\164 +\040\122\157\157\164\040\103\101\040\105\103\103\040\107\062\040 +\062\060\062\060\060\036\027\015\062\060\061\062\061\065\060\070 +\063\071\061\060\132\027\015\064\060\061\062\061\060\060\070\063 +\071\060\071\132\060\113\061\013\060\011\006\003\125\004\006\023 +\002\104\105\061\015\060\013\006\003\125\004\012\014\004\101\164 +\157\163\061\055\060\053\006\003\125\004\003\014\044\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\105\103\103\040\107\062\040\062\060\062 +\060\060\166\060\020\006\007\052\206\110\316\075\002\001\006\005 +\053\201\004\000\042\003\142\000\004\310\134\200\312\116\302\050 +\037\127\277\070\346\141\043\374\320\251\133\226\026\026\303\014 +\136\025\245\220\011\377\070\050\264\172\036\012\326\123\052\301 +\273\220\100\164\067\351\201\350\215\057\150\001\065\174\122\056 +\330\364\130\263\021\034\133\331\207\030\223\221\055\354\235\332 +\154\236\155\204\110\374\302\211\005\353\230\023\002\001\154\123 +\036\016\111\143\130\107\261\257\302\243\143\060\141\060\017\006 +\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060\037 +\006\003\125\035\043\004\030\060\026\200\024\133\037\304\161\154 +\262\033\237\276\134\037\214\375\263\266\373\263\016\011\207\060 +\035\006\003\125\035\016\004\026\004\024\133\037\304\161\154\262 +\033\237\276\134\037\214\375\263\266\373\263\016\011\207\060\016 +\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060\012 +\006\010\052\206\110\316\075\004\003\003\003\151\000\060\146\002 +\061\000\354\340\231\375\335\344\124\301\313\037\350\076\050\327 +\025\131\112\202\312\123\060\354\353\066\245\271\310\316\223\107 +\126\310\141\246\341\155\222\123\225\217\366\343\125\123\360\335 +\172\347\002\061\000\260\207\325\033\263\140\374\221\215\200\312 +\242\033\121\113\070\124\313\252\036\173\327\345\104\225\026\057 +\074\104\170\056\045\272\352\220\344\354\122\356\127\354\003\204 +\363\136\333\026\015 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Atos TrustedRoot Root CA ECC G2 2020" +# Issuer: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE +# Serial Number:0b:73:28:11:18:74:30:1c:ef:6f:08:84 +# Subject: CN=Atos TrustedRoot Root CA ECC G2 2020,O=Atos,C=DE +# Not Valid Before: Tue Dec 15 08:39:10 2020 +# Not Valid After : Mon Dec 10 08:39:09 2040 +# Fingerprint (SHA-256): E3:86:55:F4:B0:19:0C:84:D3:B3:89:3D:84:0A:68:7E:19:0A:25:6D:98:05:2F:15:9E:6D:4A:39:F5:89:A6:EB +# Fingerprint (SHA1): 61:25:56:DA:62:94:E5:AE:B3:3C:F8:11:BD:B1:DC:F8:A5:D8:B3:E4 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC G2 2020" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\141\045\126\332\142\224\345\256\263\074\370\021\275\261\334\370 +\245\330\263\344 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\225\320\233\116\332\275\252\035\225\265\242\302\135\337\210\214 +END +CKA_ISSUER MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\105\103\103\040\107\062\040\062\060\062\060 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\014\013\163\050\021\030\164\060\034\357\157\010\204 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Atos TrustedRoot Root CA RSA G2 2020" +# +# Issuer: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE +# Serial Number:47:ba:29:46:55:3e:16:92:97:b0:ab:40 +# Subject: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE +# Not Valid Before: Tue Dec 15 08:41:23 2020 +# Not Valid After : Mon Dec 10 08:41:22 2040 +# Fingerprint (SHA-256): 78:83:3A:78:3B:B2:98:6C:25:4B:93:70:D3:C2:0E:5E:BA:8F:A7:84:0C:BF:63:FE:17:29:7A:0B:01:19:68:5E +# Fingerprint (SHA1): 32:D1:27:FA:93:B1:C1:4C:99:E2:4A:40:BC:7F:94:41:1B:5A:AC:A4 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA G2 2020" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\122\123\101\040\107\062\040\062\060\062\060 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\122\123\101\040\107\062\040\062\060\062\060 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\014\107\272\051\106\125\076\026\222\227\260\253\100 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\177\060\202\003\147\240\003\002\001\002\002\014\107 +\272\051\106\125\076\026\222\227\260\253\100\060\015\006\011\052 +\206\110\206\367\015\001\001\014\005\000\060\113\061\013\060\011 +\006\003\125\004\006\023\002\104\105\061\015\060\013\006\003\125 +\004\012\014\004\101\164\157\163\061\055\060\053\006\003\125\004 +\003\014\044\101\164\157\163\040\124\162\165\163\164\145\144\122 +\157\157\164\040\122\157\157\164\040\103\101\040\122\123\101\040 +\107\062\040\062\060\062\060\060\036\027\015\062\060\061\062\061 +\065\060\070\064\061\062\063\132\027\015\064\060\061\062\061\060 +\060\070\064\061\062\062\132\060\113\061\013\060\011\006\003\125 +\004\006\023\002\104\105\061\015\060\013\006\003\125\004\012\014 +\004\101\164\157\163\061\055\060\053\006\003\125\004\003\014\044 +\101\164\157\163\040\124\162\165\163\164\145\144\122\157\157\164 +\040\122\157\157\164\040\103\101\040\122\123\101\040\107\062\040 +\062\060\062\060\060\202\002\042\060\015\006\011\052\206\110\206 +\367\015\001\001\001\005\000\003\202\002\017\000\060\202\002\012 +\002\202\002\001\000\226\061\205\112\252\017\062\376\171\341\103 +\207\234\373\043\267\216\177\015\124\275\307\142\223\167\344\034 +\065\004\166\243\003\213\042\356\304\204\335\245\223\156\156\262 +\216\011\003\353\121\026\061\027\252\151\025\030\016\147\164\043 +\136\352\232\175\265\071\076\075\202\251\153\341\376\251\034\260 +\255\132\115\114\170\203\101\213\317\362\035\142\232\230\004\234 +\143\351\253\145\376\110\035\044\145\007\107\076\271\221\056\351 +\235\233\177\032\065\251\064\260\267\345\160\063\357\112\162\121 +\266\007\277\140\077\052\237\235\124\337\363\327\224\111\121\003 +\132\100\251\150\335\021\131\134\370\166\246\274\120\122\020\355 +\254\354\225\340\324\203\153\111\332\012\117\231\203\336\062\203 +\110\203\147\225\262\176\347\201\205\075\315\202\367\312\002\355 +\155\210\135\010\215\270\065\277\052\151\060\231\273\113\321\101 +\333\105\240\223\231\121\201\220\066\010\252\212\266\350\217\263 +\313\356\345\106\015\162\165\365\111\154\341\242\177\057\274\355 +\204\246\067\356\336\302\117\071\116\366\236\360\311\321\233\060 +\235\111\155\341\332\377\022\020\214\326\345\231\173\005\266\175 +\260\011\307\244\370\262\034\071\225\071\063\364\065\316\045\142 +\173\260\137\040\363\313\155\370\154\122\024\144\104\217\323\310 +\251\166\007\345\257\161\231\055\055\004\045\110\166\257\303\347 +\314\103\362\007\274\112\044\044\067\335\372\156\224\011\157\114 +\136\001\264\376\124\354\043\226\245\136\335\206\377\351\106\052 +\361\350\334\354\245\075\257\157\252\016\017\264\165\372\076\010 +\271\046\105\117\146\206\114\274\031\270\341\325\065\356\202\204 +\310\323\253\022\347\315\163\063\142\167\364\027\313\275\064\166 +\052\005\316\225\345\170\171\113\236\260\215\371\074\130\070\221 +\352\136\207\070\300\267\102\375\252\114\207\043\255\004\040\261 +\176\166\102\332\273\266\026\272\127\310\216\023\372\165\325\010 +\114\257\070\221\252\357\217\372\237\111\056\124\174\012\126\261 +\172\372\304\116\057\324\243\372\026\212\320\225\345\227\246\377 +\303\374\174\016\107\130\363\177\007\173\022\334\127\077\055\343 +\241\115\133\122\114\063\207\231\250\011\173\154\176\016\362\317 +\126\102\236\353\005\002\003\001\000\001\243\143\060\141\060\017 +\006\003\125\035\023\001\001\377\004\005\060\003\001\001\377\060 +\037\006\003\125\035\043\004\030\060\026\200\024\040\045\363\007 +\375\247\157\361\226\356\221\020\151\314\232\357\175\310\150\170 +\060\035\006\003\125\035\016\004\026\004\024\040\045\363\007\375 +\247\157\361\226\356\221\020\151\314\232\357\175\310\150\170\060 +\016\006\003\125\035\017\001\001\377\004\004\003\002\001\206\060 +\015\006\011\052\206\110\206\367\015\001\001\014\005\000\003\202 +\002\001\000\044\053\116\230\362\035\027\355\331\166\046\266\060 +\063\350\151\105\241\121\113\122\330\172\072\060\266\344\022\352 +\277\237\114\340\004\244\366\065\306\376\241\060\367\123\205\222 +\255\124\005\127\137\222\345\052\336\066\047\236\173\023\107\311 +\152\165\257\374\363\067\347\014\365\075\001\163\265\151\121\370 +\275\131\321\272\013\370\272\272\144\047\103\263\174\203\225\212 +\347\236\023\226\327\157\112\226\101\111\213\016\040\255\026\306 +\367\246\207\133\210\022\211\213\211\312\022\322\126\257\042\001 +\041\106\351\253\230\077\247\210\336\344\313\052\232\165\031\372 +\071\136\011\005\327\003\062\032\270\027\121\010\307\000\100\175 +\364\276\370\014\131\364\151\166\156\323\244\130\133\136\046\163 +\344\102\125\006\136\170\100\017\323\070\237\357\046\121\160\164 +\221\361\167\142\001\350\331\313\353\241\337\071\062\035\273\153 +\375\161\376\353\317\245\346\024\375\000\200\023\306\232\000\110 +\260\231\005\351\256\200\110\373\011\077\121\024\265\271\347\140 +\115\115\312\057\201\041\356\122\014\145\172\334\365\211\111\114 +\060\222\064\130\200\062\131\261\015\377\044\141\017\347\012\102 +\320\173\274\370\216\047\107\077\160\235\047\331\266\006\075\245 +\273\313\136\217\256\016\123\307\234\152\157\073\114\017\243\100 +\160\250\232\007\316\324\156\133\007\242\322\342\124\266\275\157 +\063\162\143\255\121\230\341\217\166\361\152\007\070\045\376\366 +\142\316\137\333\143\302\156\231\357\006\334\271\336\031\032\350 +\124\075\175\322\166\165\331\136\076\062\110\247\214\362\236\162 +\014\370\270\130\270\027\043\245\024\207\165\130\172\000\201\007 +\042\071\152\114\224\240\265\242\333\247\054\301\260\361\243\233 +\300\114\367\155\160\352\061\237\361\256\175\076\163\050\331\241 +\337\372\223\360\233\260\360\342\315\045\040\165\357\342\175\062 +\005\311\233\166\356\313\275\061\036\371\224\230\113\044\130\126 +\110\300\336\006\114\275\246\064\135\355\026\141\143\163\373\031 +\342\372\133\330\227\165\324\155\236\140\071\136\224\213\002\054 +\353\231\316\140\052\156\033\214\247\113\274\375\066\346\230\037 +\145\362\177\361\343\217\114\200\106\066\130\266\241\145\313\316 +\034\104\165 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Atos TrustedRoot Root CA RSA G2 2020" +# Issuer: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE +# Serial Number:47:ba:29:46:55:3e:16:92:97:b0:ab:40 +# Subject: CN=Atos TrustedRoot Root CA RSA G2 2020,O=Atos,C=DE +# Not Valid Before: Tue Dec 15 08:41:23 2020 +# Not Valid After : Mon Dec 10 08:41:22 2040 +# Fingerprint (SHA-256): 78:83:3A:78:3B:B2:98:6C:25:4B:93:70:D3:C2:0E:5E:BA:8F:A7:84:0C:BF:63:FE:17:29:7A:0B:01:19:68:5E +# Fingerprint (SHA1): 32:D1:27:FA:93:B1:C1:4C:99:E2:4A:40:BC:7F:94:41:1B:5A:AC:A4 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA G2 2020" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\062\321\047\372\223\261\301\114\231\342\112\100\274\177\224\101 +\033\132\254\244 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\333\077\351\043\365\264\214\335\350\263\076\250\265\137\146\066 +END +CKA_ISSUER MULTILINE_OCTAL +\060\113\061\013\060\011\006\003\125\004\006\023\002\104\105\061 +\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061\055 +\060\053\006\003\125\004\003\014\044\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\122\123\101\040\107\062\040\062\060\062\060 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\014\107\272\051\106\125\076\026\222\227\260\253\100 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Atos TrustedRoot Root CA ECC TLS 2021" +# +# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 +# Serial Number:3d:98:3b:a6:66:3d:90:63:f7:7e:26:57:38:04:ef:00 +# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 +# Not Valid Before: Thu Apr 22 09:26:23 2021 +# Not Valid After : Wed Apr 17 09:26:22 2041 +# Fingerprint (SHA-256): B2:FA:E5:3E:14:CC:D7:AB:92:12:06:47:01:AE:27:9C:1D:89:88:FA:CB:77:5F:A8:A0:08:91:4E:66:39:88:A8 +# Fingerprint (SHA1): 9E:BC:75:10:42:B3:02:F3:81:F4:F7:30:62:D4:8F:C3:A7:51:B2:DD +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC TLS 2021" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\075\230\073\246\146\075\220\143\367\176\046\127\070\004 +\357\000 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\002\025\060\202\001\233\240\003\002\001\002\002\020\075 +\230\073\246\146\075\220\143\367\176\046\127\070\004\357\000\060 +\012\006\010\052\206\110\316\075\004\003\003\060\114\061\056\060 +\054\006\003\125\004\003\014\045\101\164\157\163\040\124\162\165 +\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103\101 +\040\105\103\103\040\124\114\123\040\062\060\062\061\061\015\060 +\013\006\003\125\004\012\014\004\101\164\157\163\061\013\060\011 +\006\003\125\004\006\023\002\104\105\060\036\027\015\062\061\060 +\064\062\062\060\071\062\066\062\063\132\027\015\064\061\060\064 +\061\067\060\071\062\066\062\062\132\060\114\061\056\060\054\006 +\003\125\004\003\014\045\101\164\157\163\040\124\162\165\163\164 +\145\144\122\157\157\164\040\122\157\157\164\040\103\101\040\105 +\103\103\040\124\114\123\040\062\060\062\061\061\015\060\013\006 +\003\125\004\012\014\004\101\164\157\163\061\013\060\011\006\003 +\125\004\006\023\002\104\105\060\166\060\020\006\007\052\206\110 +\316\075\002\001\006\005\053\201\004\000\042\003\142\000\004\226 +\206\130\050\067\012\147\320\240\336\044\031\031\341\344\005\007 +\037\227\355\350\144\202\271\366\304\161\120\316\212\014\377\327 +\265\166\273\241\154\223\154\203\242\150\156\245\331\276\054\210 +\225\101\315\135\335\261\312\203\143\203\314\300\276\164\331\340 +\235\244\356\112\116\126\340\230\051\101\223\122\020\325\044\070 +\002\062\147\361\224\022\157\357\327\305\336\056\375\031\200\243 +\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005\060 +\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024\166 +\050\045\326\175\340\146\232\172\011\262\152\073\216\063\327\066 +\323\117\242\060\016\006\003\125\035\017\001\001\377\004\004\003 +\002\001\206\060\012\006\010\052\206\110\316\075\004\003\003\003 +\150\000\060\145\002\060\133\231\051\363\234\061\266\211\153\154 +\326\275\167\341\174\347\121\176\270\072\315\243\066\137\174\367 +\074\167\076\344\120\255\250\347\322\131\014\046\216\060\073\156 +\010\052\302\247\132\310\002\061\000\231\343\014\347\243\303\257 +\323\111\056\106\202\043\146\135\311\000\024\022\375\070\364\341 +\230\153\167\051\172\333\044\317\145\100\277\322\334\214\021\350 +\364\175\177\040\204\251\102\344\050 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Atos TrustedRoot Root CA ECC TLS 2021" +# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 +# Serial Number:3d:98:3b:a6:66:3d:90:63:f7:7e:26:57:38:04:ef:00 +# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA ECC TLS 2021 +# Not Valid Before: Thu Apr 22 09:26:23 2021 +# Not Valid After : Wed Apr 17 09:26:22 2041 +# Fingerprint (SHA-256): B2:FA:E5:3E:14:CC:D7:AB:92:12:06:47:01:AE:27:9C:1D:89:88:FA:CB:77:5F:A8:A0:08:91:4E:66:39:88:A8 +# Fingerprint (SHA1): 9E:BC:75:10:42:B3:02:F3:81:F4:F7:30:62:D4:8F:C3:A7:51:B2:DD +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA ECC TLS 2021" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\236\274\165\020\102\263\002\363\201\364\367\060\142\324\217\303 +\247\121\262\335 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\026\237\255\361\160\255\171\326\355\051\264\321\305\171\160\250 +END +CKA_ISSUER MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\105\103\103\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\075\230\073\246\146\075\220\143\367\176\046\127\070\004 +\357\000 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE + +# +# Certificate "Atos TrustedRoot Root CA RSA TLS 2021" +# +# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 +# Serial Number:53:d5:cf:e6:19:93:0b:fb:2b:05:12:d8:c2:2a:a2:a4 +# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 +# Not Valid Before: Thu Apr 22 09:21:10 2021 +# Not Valid After : Wed Apr 17 09:21:09 2041 +# Fingerprint (SHA-256): 81:A9:08:8E:A5:9F:B3:64:C5:48:A6:F8:55:59:09:9B:6F:04:05:EF:BF:18:E5:32:4E:C9:F4:57:BA:00:11:2F +# Fingerprint (SHA1): 18:52:3B:0D:06:37:E4:D6:3A:DF:23:E4:98:FB:5B:16:FB:86:74:48 +CKA_CLASS CK_OBJECT_CLASS CKO_CERTIFICATE +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA TLS 2021" +CKA_CERTIFICATE_TYPE CK_CERTIFICATE_TYPE CKC_X_509 +CKA_SUBJECT MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_ID UTF8 "0" +CKA_ISSUER MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\123\325\317\346\031\223\013\373\053\005\022\330\302\052 +\242\244 +END +CKA_VALUE MULTILINE_OCTAL +\060\202\005\144\060\202\003\114\240\003\002\001\002\002\020\123 +\325\317\346\031\223\013\373\053\005\022\330\302\052\242\244\060 +\015\006\011\052\206\110\206\367\015\001\001\014\005\000\060\114 +\061\056\060\054\006\003\125\004\003\014\045\101\164\157\163\040 +\124\162\165\163\164\145\144\122\157\157\164\040\122\157\157\164 +\040\103\101\040\122\123\101\040\124\114\123\040\062\060\062\061 +\061\015\060\013\006\003\125\004\012\014\004\101\164\157\163\061 +\013\060\011\006\003\125\004\006\023\002\104\105\060\036\027\015 +\062\061\060\064\062\062\060\071\062\061\061\060\132\027\015\064 +\061\060\064\061\067\060\071\062\061\060\071\132\060\114\061\056 +\060\054\006\003\125\004\003\014\045\101\164\157\163\040\124\162 +\165\163\164\145\144\122\157\157\164\040\122\157\157\164\040\103 +\101\040\122\123\101\040\124\114\123\040\062\060\062\061\061\015 +\060\013\006\003\125\004\012\014\004\101\164\157\163\061\013\060 +\011\006\003\125\004\006\023\002\104\105\060\202\002\042\060\015 +\006\011\052\206\110\206\367\015\001\001\001\005\000\003\202\002 +\017\000\060\202\002\012\002\202\002\001\000\266\200\016\304\171 +\275\005\214\175\260\243\235\115\042\115\313\360\101\227\115\131 +\340\321\376\126\214\227\362\327\275\217\154\267\043\217\137\325 +\304\330\101\313\362\002\036\161\345\351\366\136\313\010\052\136 +\060\362\055\146\307\204\033\144\127\070\235\165\055\126\306\057 +\141\357\226\374\040\106\275\353\324\173\077\077\174\107\070\004 +\251\033\252\122\337\023\067\323\025\025\116\275\137\174\257\255 +\143\307\171\334\010\173\325\240\345\367\133\165\254\200\125\231 +\222\141\233\315\052\027\175\333\217\364\265\152\352\027\112\144 +\050\146\025\051\154\002\361\153\325\272\243\063\334\132\147\247 +\005\342\277\145\266\026\260\020\355\315\120\063\311\160\120\354 +\031\216\260\307\362\164\133\153\104\306\175\226\271\230\010\131 +\146\336\051\001\233\364\052\155\323\025\072\220\152\147\361\264 +\153\146\331\041\353\312\331\142\174\106\020\134\336\165\111\147 +\236\102\371\376\165\251\243\255\377\166\012\147\100\343\305\367 +\215\307\205\232\131\236\142\232\152\355\105\207\230\147\262\325 +\112\074\327\264\073\000\015\300\217\037\341\100\304\256\154\041 +\334\111\176\176\312\262\215\155\266\277\223\057\241\134\076\217 +\312\355\200\216\130\341\333\127\317\205\066\070\262\161\244\011 +\214\222\211\010\210\110\361\100\143\030\262\133\214\132\343\303 +\323\027\252\253\031\243\054\033\344\325\306\342\146\172\327\202 +\031\246\073\026\054\057\161\207\137\105\236\225\163\223\302\102 +\201\041\023\226\327\235\273\223\150\025\372\235\244\035\214\362 +\201\340\130\006\275\311\266\343\366\211\135\211\371\254\104\241 +\313\153\372\026\361\307\120\075\044\332\367\303\344\207\325\126 +\361\117\220\060\372\105\011\131\332\064\316\340\023\034\004\174 +\000\324\233\206\244\100\274\331\334\114\127\176\256\267\063\266 +\136\166\341\145\213\146\337\215\312\327\230\257\316\066\230\214 +\234\203\231\003\160\363\257\164\355\306\016\066\347\275\354\301 +\163\247\224\132\313\222\144\202\246\000\301\160\241\156\054\051 +\341\130\127\354\132\174\231\153\045\244\220\072\200\364\040\235 +\232\316\307\055\371\262\113\051\225\203\351\065\215\247\111\110 +\247\017\114\031\221\320\365\277\020\340\161\002\003\001\000\001 +\243\102\060\100\060\017\006\003\125\035\023\001\001\377\004\005 +\060\003\001\001\377\060\035\006\003\125\035\016\004\026\004\024 +\164\111\231\321\377\264\172\150\105\165\303\176\264\334\314\316 +\071\063\332\010\060\016\006\003\125\035\017\001\001\377\004\004 +\003\002\001\206\060\015\006\011\052\206\110\206\367\015\001\001 +\014\005\000\003\202\002\001\000\043\103\123\044\142\134\155\375 +\076\302\317\125\000\154\305\126\210\271\016\335\072\342\045\015 +\225\112\227\312\200\211\356\052\315\145\370\333\026\340\011\222 +\340\030\307\170\230\273\363\354\102\122\373\251\244\202\327\115 +\330\212\374\344\116\375\253\220\304\070\165\062\204\237\377\263 +\260\053\002\063\066\300\020\220\157\035\234\257\341\151\223\354 +\243\105\057\024\237\365\114\052\145\103\162\014\367\303\370\225 +\213\024\363\205\040\142\335\124\123\335\054\334\030\225\151\117 +\203\107\160\100\063\130\167\022\014\242\353\122\061\036\114\311 +\250\316\305\357\303\321\255\340\153\003\000\064\046\264\124\041 +\065\227\001\334\137\033\361\174\347\125\372\055\150\167\173\323 +\151\314\323\016\153\272\115\166\104\326\302\025\232\046\354\260 +\305\365\273\321\172\164\302\154\315\305\265\136\366\114\346\133 +\055\201\333\263\267\072\227\236\355\317\106\262\120\075\204\140 +\231\161\265\063\265\127\105\346\102\107\165\152\016\260\010\014 +\256\275\336\367\273\017\130\075\217\003\061\350\075\202\120\312 +\057\136\014\135\264\227\276\040\064\007\364\304\022\341\356\327 +\260\331\131\055\151\367\061\004\364\362\371\253\371\023\061\370 +\001\167\016\075\102\043\046\314\232\162\147\121\041\172\314\074 +\205\250\352\041\152\073\333\132\074\245\064\236\232\300\054\337 +\200\234\051\340\337\167\224\321\242\200\102\377\152\114\133\021 +\320\365\315\242\276\256\314\121\134\303\325\124\173\014\256\326 +\271\006\167\200\342\357\007\032\150\314\131\121\255\176\134\147 +\153\271\333\342\007\102\133\270\001\005\130\071\115\344\273\230 +\243\261\062\354\331\243\326\157\224\043\377\073\267\051\145\346 +\007\351\357\266\031\352\347\302\070\035\062\210\220\074\023\053 +\156\314\357\253\167\006\064\167\204\117\162\344\201\204\371\271 +\164\064\336\166\117\222\052\123\261\045\071\333\074\377\345\076 +\246\016\345\153\236\377\333\354\057\164\203\337\216\264\263\251 +\336\024\115\377\061\243\105\163\044\372\225\051\314\022\227\004 +\242\070\266\215\260\360\067\374\310\041\177\077\263\044\033\075 +\213\156\314\115\260\026\015\226\035\203\037\106\300\233\275\103 +\231\347\304\226\056\316\137\311 +END +CKA_NSS_MOZILLA_CA_POLICY CK_BBOOL CK_TRUE +CKA_NSS_SERVER_DISTRUST_AFTER CK_BBOOL CK_FALSE +CKA_NSS_EMAIL_DISTRUST_AFTER CK_BBOOL CK_FALSE + +# Trust for "Atos TrustedRoot Root CA RSA TLS 2021" +# Issuer: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 +# Serial Number:53:d5:cf:e6:19:93:0b:fb:2b:05:12:d8:c2:2a:a2:a4 +# Subject: C=DE,O=Atos,CN=Atos TrustedRoot Root CA RSA TLS 2021 +# Not Valid Before: Thu Apr 22 09:21:10 2021 +# Not Valid After : Wed Apr 17 09:21:09 2041 +# Fingerprint (SHA-256): 81:A9:08:8E:A5:9F:B3:64:C5:48:A6:F8:55:59:09:9B:6F:04:05:EF:BF:18:E5:32:4E:C9:F4:57:BA:00:11:2F +# Fingerprint (SHA1): 18:52:3B:0D:06:37:E4:D6:3A:DF:23:E4:98:FB:5B:16:FB:86:74:48 +CKA_CLASS CK_OBJECT_CLASS CKO_NSS_TRUST +CKA_TOKEN CK_BBOOL CK_TRUE +CKA_PRIVATE CK_BBOOL CK_FALSE +CKA_MODIFIABLE CK_BBOOL CK_FALSE +CKA_LABEL UTF8 "Atos TrustedRoot Root CA RSA TLS 2021" +CKA_CERT_SHA1_HASH MULTILINE_OCTAL +\030\122\073\015\006\067\344\326\072\337\043\344\230\373\133\026 +\373\206\164\110 +END +CKA_CERT_MD5_HASH MULTILINE_OCTAL +\324\323\106\270\232\300\234\166\135\236\072\303\271\231\061\322 +END +CKA_ISSUER MULTILINE_OCTAL +\060\114\061\056\060\054\006\003\125\004\003\014\045\101\164\157 +\163\040\124\162\165\163\164\145\144\122\157\157\164\040\122\157 +\157\164\040\103\101\040\122\123\101\040\124\114\123\040\062\060 +\062\061\061\015\060\013\006\003\125\004\012\014\004\101\164\157 +\163\061\013\060\011\006\003\125\004\006\023\002\104\105 +END +CKA_SERIAL_NUMBER MULTILINE_OCTAL +\002\020\123\325\317\346\031\223\013\373\053\005\022\330\302\052 +\242\244 +END +CKA_TRUST_SERVER_AUTH CK_TRUST CKT_NSS_TRUSTED_DELEGATOR +CKA_TRUST_EMAIL_PROTECTION CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_CODE_SIGNING CK_TRUST CKT_NSS_MUST_VERIFY_TRUST +CKA_TRUST_STEP_UP_APPROVED CK_BBOOL CK_FALSE diff --git a/security/nss/lib/ckfw/builtins/nssckbi.h b/security/nss/lib/ckfw/builtins/nssckbi.h index 766e7d7e1c9..e25bdc45742 100644 --- a/security/nss/lib/ckfw/builtins/nssckbi.h +++ b/security/nss/lib/ckfw/builtins/nssckbi.h @@ -46,8 +46,8 @@ * It's recommend to switch back to 0 after having reached version 98/99. */ #define NSS_BUILTINS_LIBRARY_VERSION_MAJOR 2 -#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 60 -#define NSS_BUILTINS_LIBRARY_VERSION "2.60" +#define NSS_BUILTINS_LIBRARY_VERSION_MINOR 62 +#define NSS_BUILTINS_LIBRARY_VERSION "2.62" /* These version numbers detail the semantic changes to the ckfw engine. */ #define NSS_BUILTINS_HARDWARE_VERSION_MAJOR 1 diff --git a/security/nss/lib/dbm/include/mcom_db.h b/security/nss/lib/dbm/include/mcom_db.h index c299728cd05..efe9140fdaf 100644 --- a/security/nss/lib/dbm/include/mcom_db.h +++ b/security/nss/lib/dbm/include/mcom_db.h @@ -111,10 +111,12 @@ typedef PRUint32 uint32; #endif /* __sun */ #if defined(__hpux) || defined(__hppa) +#ifndef BYTE_ORDER #define BYTE_ORDER BIG_ENDIAN #define BIG_ENDIAN 4321 #define LITTLE_ENDIAN 1234 /* LSB first: i386, vax, all NT risc */ #endif +#endif #if defined(AIXV3) || defined(AIX) /* BYTE_ORDER, LITTLE_ENDIAN, BIG_ENDIAN are all defined here */ diff --git a/security/nss/lib/nss/nss.h b/security/nss/lib/nss/nss.h index 1202e4af40a..46cdba96e25 100644 --- a/security/nss/lib/nss/nss.h +++ b/security/nss/lib/nss/nss.h @@ -22,12 +22,12 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define NSS_VERSION "3.91" _NSS_CUSTOMIZED +#define NSS_VERSION "3.92" _NSS_CUSTOMIZED " Beta" #define NSS_VMAJOR 3 -#define NSS_VMINOR 91 +#define NSS_VMINOR 92 #define NSS_VPATCH 0 #define NSS_VBUILD 0 -#define NSS_BETA PR_FALSE +#define NSS_BETA PR_TRUE #ifndef RC_INVOKED diff --git a/security/nss/lib/softoken/softkver.h b/security/nss/lib/softoken/softkver.h index 8575c29a749..1c8242fa564 100644 --- a/security/nss/lib/softoken/softkver.h +++ b/security/nss/lib/softoken/softkver.h @@ -17,11 +17,11 @@ * The format of the version string should be * ".[.[.]][ ][ ]" */ -#define SOFTOKEN_VERSION "3.91" SOFTOKEN_ECC_STRING +#define SOFTOKEN_VERSION "3.92" SOFTOKEN_ECC_STRING " Beta" #define SOFTOKEN_VMAJOR 3 -#define SOFTOKEN_VMINOR 91 +#define SOFTOKEN_VMINOR 92 #define SOFTOKEN_VPATCH 0 #define SOFTOKEN_VBUILD 0 -#define SOFTOKEN_BETA PR_FALSE +#define SOFTOKEN_BETA PR_TRUE #endif /* _SOFTKVER_H_ */ diff --git a/security/nss/lib/util/nssutil.h b/security/nss/lib/util/nssutil.h index ee1f39fa12e..1a90cf41f88 100644 --- a/security/nss/lib/util/nssutil.h +++ b/security/nss/lib/util/nssutil.h @@ -19,12 +19,12 @@ * The format of the version string should be * ".[.[.]][ ]" */ -#define NSSUTIL_VERSION "3.91" +#define NSSUTIL_VERSION "3.92 Beta" #define NSSUTIL_VMAJOR 3 -#define NSSUTIL_VMINOR 91 +#define NSSUTIL_VMINOR 92 #define NSSUTIL_VPATCH 0 #define NSSUTIL_VBUILD 0 -#define NSSUTIL_BETA PR_FALSE +#define NSSUTIL_BETA PR_TRUE SEC_BEGIN_PROTOS diff --git a/services/settings/dumps/security-state/intermediates.json b/services/settings/dumps/security-state/intermediates.json index 9ad0f537f62..c0994e189bb 100644 --- a/services/settings/dumps/security-state/intermediates.json +++ b/services/settings/dumps/security-state/intermediates.json @@ -1,5 +1,77 @@ { "data": [ + { + "schema": 1689778080731, + "derHash": "NIXD3+mMXVQoZTR5u5BidYDuiSiQpi2g2avOOiAC6OQ=", + "subject": "CN=HARICA Qualified Web Authentication Certificates RSA,OU=Hellenic Academic and Research Institutions CA,O=Greek Universities Network (GUnet),C=GR", + "subjectDN": "MIHMMQswCQYDVQQGEwJHUjErMCkGA1UECgwiR3JlZWsgVW5pdmVyc2l0aWVzIE5ldHdvcmsgKEdVbmV0KTEYMBYGA1UEYQwPVkFUR1ItMDk5MDI4MjIwMTcwNQYDVQQLDC5IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENBMT0wOwYDVQQDDDRIQVJJQ0EgUXVhbGlmaWVkIFdlYiBBdXRoZW50aWNhdGlvbiBDZXJ0aWZpY2F0ZXMgUlNB", + "whitelist": false, + "attachment": { + "hash": "71b428ec08883e3b36d19bde0bd55f5e6ed630fde1374b4a314e2c59b2beea94", + "size": 2536, + "filename": "kGxKeLInUl4Q9pvlALRV0c2jCDMtv5OZYa_lU99H6bo=.pem", + "location": "security-state-staging/intermediates/4b3fd075-b2f9-4f70-8d2c-a5227eb9ad5f.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "kGxKeLInUl4Q9pvlALRV0c2jCDMtv5OZYa/lU99H6bo=", + "crlite_enrolled": false, + "id": "ee77bf83-a860-409b-8ad9-fcaec423630a", + "last_modified": 1689778623464 + }, + { + "schema": 1689778081208, + "derHash": "J0F6Cfp0ELkZihsGRc3+woB5716BQ68r22l3MQRQJ84=", + "subject": "CN=HARICA Qualified Web Authentication Certificates ECC,OU=Hellenic Academic and Research Institutions CA,O=Greek Universities Network (GUnet),C=GR", + "subjectDN": "MIHMMQswCQYDVQQGEwJHUjErMCkGA1UECgwiR3JlZWsgVW5pdmVyc2l0aWVzIE5ldHdvcmsgKEdVbmV0KTEYMBYGA1UEYQwPVkFUR1ItMDk5MDI4MjIwMTcwNQYDVQQLDC5IZWxsZW5pYyBBY2FkZW1pYyBhbmQgUmVzZWFyY2ggSW5zdGl0dXRpb25zIENBMT0wOwYDVQQDDDRIQVJJQ0EgUXVhbGlmaWVkIFdlYiBBdXRoZW50aWNhdGlvbiBDZXJ0aWZpY2F0ZXMgRUND", + "whitelist": false, + "attachment": { + "hash": "de7ccd366b8a725ed931973a31321e2c69c977923e50579fbfce98196b48cc09", + "size": 1390, + "filename": "IiSR2mjIu_mybjYwsW8uyrO-e9dRjlyeV1EtKlNv1pA=.pem", + "location": "security-state-staging/intermediates/66dc257b-983f-42e3-b77c-c9c327f2c3b8.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "IiSR2mjIu/mybjYwsW8uyrO+e9dRjlyeV1EtKlNv1pA=", + "crlite_enrolled": false, + "id": "e35b1761-7442-4ac3-9a1a-68be549a244d", + "last_modified": 1689778623461 + }, + { + "schema": 1689691684212, + "derHash": "PAfX78jUWPZowQ1PBvkFA8zSXVnis/HVizKITZ5OOAk=", + "subject": "CN=Xinnet OV SSL,O=北京新网数码信息技术有限公司,C=CN", + "subjectDN": "MFoxCzAJBgNVBAYTAkNOMTMwMQYDVQQKDCrljJfkuqzmlrDnvZHmlbDnoIHkv6Hmga/mioDmnK/mnInpmZDlhazlj7gxFjAUBgNVBAMMDVhpbm5ldCBPViBTU0w=", + "whitelist": false, + "attachment": { + "hash": "5bc56588f2272b5e5fa493aa9f327168ddb2baa263b7064ea695ea8caaa8ba47", + "size": 2040, + "filename": "2KdOGXnlcULkcqXULv7vV5PeeErPEe6FeJY3L8Drx2w=.pem", + "location": "security-state-staging/intermediates/fd1e88e9-bb71-447d-9001-1717eec2f1a7.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "2KdOGXnlcULkcqXULv7vV5PeeErPEe6FeJY3L8Drx2w=", + "crlite_enrolled": false, + "id": "6744d4b9-1635-47c6-be96-76a90b26fbe6", + "last_modified": 1689692223153 + }, + { + "schema": 1689691683738, + "derHash": "nFOQL5UB9tiXZpmdvirRoUNkILZSU1zcLcUcz+L/7mg=", + "subject": "CN=Xinnet DV SSL,O=北京新网数码信息技术有限公司,C=CN", + "subjectDN": "MFoxCzAJBgNVBAYTAkNOMTMwMQYDVQQKDCrljJfkuqzmlrDnvZHmlbDnoIHkv6Hmga/mioDmnK/mnInpmZDlhazlj7gxFjAUBgNVBAMMDVhpbm5ldCBEViBTU0w=", + "whitelist": false, + "attachment": { + "hash": "d04017e5c9db416bd66646d549499c895e65f2db3a17c410dc2a3b2f403bf6be", + "size": 2040, + "filename": "WAY4atziUUIgmtn8Iz3QwpKNcfxhcE26-YjX14s13IA=.pem", + "location": "security-state-staging/intermediates/7b2e5ed3-4e3d-4288-93b5-5ed13256c768.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "WAY4atziUUIgmtn8Iz3QwpKNcfxhcE26+YjX14s13IA=", + "crlite_enrolled": false, + "id": "b612a1b8-6da3-4822-8ecf-f6ae154d1d85", + "last_modified": 1689692223150 + }, { "schema": 1689216551728, "derHash": "BI45u7axXvg1JfFjGSzqDfIdP/q6+rfGOQn7FVPuSWY=", @@ -27595,5 +27667,5 @@ "last_modified": 1559865863642 } ], - "timestamp": 1689217066476 + "timestamp": 1689778623464 } diff --git a/servo/components/style/color/mix.rs b/servo/components/style/color/mix.rs index 455d0252659..7f5d95a33c5 100644 --- a/servo/components/style/color/mix.rs +++ b/servo/components/style/color/mix.rs @@ -6,6 +6,7 @@ use super::{AbsoluteColor, ColorComponents, ColorFlags, ColorSpace}; use crate::parser::{Parse, ParserContext}; +use crate::values::generics::color::ColorMixFlags; use cssparser::Parser; use std::fmt::{self, Write}; use style_traits::{CssWriter, ParseError, ToCss}; @@ -86,7 +87,7 @@ impl ColorInterpolationMethod { // The preferred color space to use for interpolating colors is Oklab. // However, if either of the colors are in legacy rgb(), hsl() or hwb(), // then interpolation is done in sRGB. - if !left.is_legacy_color() || !right.is_legacy_color() { + if !left.is_legacy_syntax() || !right.is_legacy_syntax() { Self::oklab() } else { Self::srgb() @@ -142,11 +143,11 @@ pub fn mix( mut left_weight: f32, right_color: &AbsoluteColor, mut right_weight: f32, - normalize_weights: bool, + flags: ColorMixFlags, ) -> AbsoluteColor { // https://drafts.csswg.org/css-color-5/#color-mix-percent-norm let mut alpha_multiplier = 1.0; - if normalize_weights { + if flags.contains(ColorMixFlags::NORMALIZE_WEIGHTS) { let sum = left_weight + right_weight; if sum != 1.0 { let scale = 1.0 / sum; @@ -158,7 +159,7 @@ pub fn mix( } } - mix_in( + let result = mix_in( interpolation.space, left_color, left_weight, @@ -166,7 +167,13 @@ pub fn mix( right_weight, interpolation.hue, alpha_multiplier, - ) + ); + + if flags.contains(ColorMixFlags::RESULT_IN_MODERN_SYNTAX) && result.is_legacy_syntax() { + result.to_color_space(ColorSpace::Srgb).into_modern_syntax() + } else { + result + } } /// What the outcome of each component should be in a mix result. @@ -254,10 +261,6 @@ fn mix_in( ); result.flags = result_flags; - // If both sides are legacy RGB, then the result stays in legacy RGB. - if !left_color.is_legacy_color() || !right_color.is_legacy_color() { - result.flags.insert(ColorFlags::AS_COLOR_FUNCTION); - } result } diff --git a/servo/components/style/color/mod.rs b/servo/components/style/color/mod.rs index f8ceee9703d..8731a4b14b1 100644 --- a/servo/components/style/color/mod.rs +++ b/servo/components/style/color/mod.rs @@ -211,6 +211,13 @@ impl AbsoluteColor { } } + /// Convert this color to the modern color syntax. + #[inline] + pub fn into_modern_syntax(mut self) -> Self { + self.flags |= ColorFlags::AS_COLOR_FUNCTION; + self + } + /// Create a new [`AbsoluteColor`] from rgba values in the sRGB color space. pub fn srgb(red: f32, green: f32, blue: f32, alpha: f32) -> Self { Self::new(ColorSpace::Srgb, ColorComponents(red, green, blue), alpha) @@ -237,9 +244,9 @@ impl AbsoluteColor { unsafe { color_components_as!(self, [f32; 4]) } } - /// Returns true if this color is in one of the legacy color formats. + /// Returns true if this color is in the legacy color syntax. #[inline] - pub fn is_legacy_color(&self) -> bool { + pub fn is_legacy_syntax(&self) -> bool { // rgb(), rgba(), hsl(), hsla(), hwb(), hwba() match self.color_space { ColorSpace::Srgb => !self.flags.contains(ColorFlags::AS_COLOR_FUNCTION), @@ -262,9 +269,9 @@ impl AbsoluteColor { return self.clone(); } - // We have simplified conversions that do not need to convert to XYZ - // first. This improves performance, because it skips 2 matrix - // multiplications and reduces float rounding errors. + // We have simplified conversions that do not need to convert to XYZ first. This improves + // performance, because it skips at least 2 matrix multiplications and reduces float + // rounding errors. match (self.color_space, color_space) { (Srgb, Hsl) => { return Self::new( @@ -391,16 +398,9 @@ impl ToCss for AbsoluteColor { let maybe_alpha = value_or_none!(self.alpha, ALPHA_IS_NONE); match self.color_space { - ColorSpace::Hsl => { - let rgb = convert::hsl_to_rgb(&self.components); - Self::new(ColorSpace::Srgb, rgb, self.alpha).to_css(dest) - }, + ColorSpace::Hsl => self.to_color_space(ColorSpace::Srgb).to_css(dest), - ColorSpace::Hwb => { - let rgb = convert::hwb_to_rgb(&self.components); - - Self::new(ColorSpace::Srgb, rgb, self.alpha).to_css(dest) - }, + ColorSpace::Hwb => self.to_color_space(ColorSpace::Srgb).to_css(dest), ColorSpace::Srgb if !self.flags.contains(ColorFlags::AS_COLOR_FUNCTION) => { // Althought we are passing Option<_> in here, the to_css fn diff --git a/servo/components/style/properties/longhands/inherited_ui.mako.rs b/servo/components/style/properties/longhands/inherited_ui.mako.rs index b58bde355e1..b091e4b34de 100644 --- a/servo/components/style/properties/longhands/inherited_ui.mako.rs +++ b/servo/components/style/properties/longhands/inherited_ui.mako.rs @@ -87,10 +87,8 @@ ${helpers.predefined_type( "generics::color::ColorOrAuto::Auto", engines="gecko", spec="https://drafts.csswg.org/css-ui-4/#widget-accent", - gecko_pref="layout.css.accent-color.enabled", animation_value_type="ColorOrAuto", ignored_when_colors_disabled=True, - has_effect_on_gecko_scrollbars=False, )} ${helpers.predefined_type( diff --git a/servo/components/style/values/animated/color.rs b/servo/components/style/values/animated/color.rs index 3e05ba724de..d03eb9b3a85 100644 --- a/servo/components/style/values/animated/color.rs +++ b/servo/components/style/values/animated/color.rs @@ -9,7 +9,7 @@ use crate::color::AbsoluteColor; use crate::values::animated::{Animate, Procedure, ToAnimatedZero}; use crate::values::computed::Percentage; use crate::values::distance::{ComputeSquaredDistance, SquaredDistance}; -use crate::values::generics::color::{GenericColor, GenericColorMix}; +use crate::values::generics::color::{ColorMixFlags, GenericColor, GenericColorMix}; impl Animate for AbsoluteColor { #[inline] @@ -21,7 +21,7 @@ impl Animate for AbsoluteColor { left_weight as f32, other, right_weight as f32, - /* normalize_weights = */ false, + ColorMixFlags::empty(), )) } } @@ -66,7 +66,7 @@ impl Animate for Color { right: other.clone(), right_percentage: Percentage(right_weight as f32), // See https://github.com/w3c/csswg-drafts/issues/7324 - normalize_weights: false, + flags: ColorMixFlags::empty(), })) } } diff --git a/servo/components/style/values/animated/mod.rs b/servo/components/style/values/animated/mod.rs index 04a05a81ac4..8306c12b524 100644 --- a/servo/components/style/values/animated/mod.rs +++ b/servo/components/style/values/animated/mod.rs @@ -378,6 +378,7 @@ trivial_to_animated_value!(bool); trivial_to_animated_value!(f32); trivial_to_animated_value!(i32); trivial_to_animated_value!(AbsoluteColor); +trivial_to_animated_value!(crate::values::generics::color::ColorMixFlags); // Note: This implementation is for ToAnimatedValue of ShapeSource. // // SVGPathData uses Box<[T]>. If we want to derive ToAnimatedValue for all the diff --git a/servo/components/style/values/computed/color.rs b/servo/components/style/values/computed/color.rs index 35cfdb9710d..820bcfe5b1b 100644 --- a/servo/components/style/values/computed/color.rs +++ b/servo/components/style/values/computed/color.rs @@ -84,7 +84,7 @@ impl Color { mix.left_percentage.to_percentage(), &right, mix.right_percentage.to_percentage(), - mix.normalize_weights, + mix.flags, ) }, } diff --git a/servo/components/style/values/computed/mod.rs b/servo/components/style/values/computed/mod.rs index 8f9af36c478..489bdafa312 100644 --- a/servo/components/style/values/computed/mod.rs +++ b/servo/components/style/values/computed/mod.rs @@ -671,6 +671,7 @@ trivial_to_computed_value!(String); trivial_to_computed_value!(Box); trivial_to_computed_value!(crate::OwnedStr); trivial_to_computed_value!(style_traits::values::specified::AllowedNumericType); +trivial_to_computed_value!(crate::values::generics::color::ColorMixFlags); #[allow(missing_docs)] #[derive( diff --git a/servo/components/style/values/generics/color.rs b/servo/components/style/values/generics/color.rs index d143e9d3c86..306da07608b 100644 --- a/servo/components/style/values/generics/color.rs +++ b/servo/components/style/values/generics/color.rs @@ -23,6 +23,18 @@ pub enum GenericColor { ColorMix(Box>), } +bitflags! { + /// Flags used to modify the calculation of a color mix result. + #[derive(Clone, Copy, Default, MallocSizeOf, PartialEq, ToShmem)] + #[repr(C)] + pub struct ColorMixFlags : u8 { + /// Normalize the weights of the mix. + const NORMALIZE_WEIGHTS = 1 << 0; + /// The result should always be converted to the modern color syntax. + const RESULT_IN_MODERN_SYNTAX = 1 << 1; + } +} + /// A restricted version of the css `color-mix()` function, which only supports /// percentages. /// @@ -45,7 +57,7 @@ pub struct GenericColorMix { pub left_percentage: Percentage, pub right: Color, pub right_percentage: Percentage, - pub normalize_weights: bool, + pub flags: ColorMixFlags, } pub use self::GenericColorMix as ColorMix; @@ -106,7 +118,7 @@ impl ColorMix, Percentage> { self.left_percentage.to_percentage(), &right, self.right_percentage.to_percentage(), - self.normalize_weights, + self.flags, )) } } diff --git a/servo/components/style/values/resolved/mod.rs b/servo/components/style/values/resolved/mod.rs index 31ef2de44b2..675f3cca68f 100644 --- a/servo/components/style/values/resolved/mod.rs +++ b/servo/components/style/values/resolved/mod.rs @@ -84,6 +84,7 @@ trivial_to_resolved_value!(String); trivial_to_resolved_value!(Box); trivial_to_resolved_value!(crate::OwnedStr); trivial_to_resolved_value!(crate::color::AbsoluteColor); +trivial_to_resolved_value!(crate::values::generics::color::ColorMixFlags); trivial_to_resolved_value!(crate::Atom); trivial_to_resolved_value!(crate::values::AtomIdent); trivial_to_resolved_value!(app_units::Au); diff --git a/servo/components/style/values/specified/box.rs b/servo/components/style/values/specified/box.rs index c1e3949081a..8e900a31100 100644 --- a/servo/components/style/values/specified/box.rs +++ b/servo/components/style/values/specified/box.rs @@ -1460,37 +1460,21 @@ pub enum Appearance { /// A groupbox. #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Groupbox, - /// Menu Bar background - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menubar, /// and appearances #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Menuitem, #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Checkmenuitem, - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Radiomenuitem, /// For text on non-iconic menuitems only - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menuitemtext, /// The text part of a dropdown list, to left of button. #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] MenulistText, /// Menu Popup background. #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Menupopup, - /// menu checkbox/radio appearances - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menucheckbox, - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menuradio, - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menuseparator, + /// Menu item arrow. #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Menuarrow, - /// An image in the menu gutter, like in bookmarks or history. - #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] - Menuimage, /// The meter bar's meter indicator. #[parse(condition = "ParserContext::in_ua_or_chrome_sheet")] Meterchunk, diff --git a/servo/components/style/values/specified/color.rs b/servo/components/style/values/specified/color.rs index 1fc2869109a..311b881f138 100644 --- a/servo/components/style/values/specified/color.rs +++ b/servo/components/style/values/specified/color.rs @@ -10,7 +10,9 @@ use crate::color::{AbsoluteColor, ColorComponents, ColorFlags, ColorSpace}; use crate::media_queries::Device; use crate::parser::{Parse, ParserContext}; use crate::values::computed::{Color as ComputedColor, Context, ToComputedValue}; -use crate::values::generics::color::{GenericCaretColor, GenericColorMix, GenericColorOrAuto}; +use crate::values::generics::color::{ + ColorMixFlags, GenericCaretColor, GenericColorMix, GenericColorOrAuto, +}; use crate::values::specified::calc::CalcNode; use crate::values::specified::Percentage; use crate::values::CustomIdent; @@ -78,13 +80,16 @@ impl ColorMix { return Err(input.new_custom_error(StyleParseErrorKind::UnspecifiedError)); } + // Pass RESULT_IN_MODERN_SYNTAX here, because the result of the color-mix() function + // should always be in the modern color syntax to allow for out of gamut results and + // to preserve floating point precision. Ok(ColorMix { interpolation, left, left_percentage, right, right_percentage, - normalize_weights: true, + flags: ColorMixFlags::NORMALIZE_WEIGHTS | ColorMixFlags::RESULT_IN_MODERN_SYNTAX, }) }) } @@ -874,7 +879,7 @@ impl Color { left_percentage: Percentage(mix.left_percentage.get()), right, right_percentage: Percentage(mix.right_percentage.get()), - normalize_weights: mix.normalize_weights, + flags: mix.flags, }) }, #[cfg(feature = "gecko")] diff --git a/servo/ports/geckolib/glue.rs b/servo/ports/geckolib/glue.rs index 09e334f914d..24899d14f0e 100644 --- a/servo/ports/geckolib/glue.rs +++ b/servo/ports/geckolib/glue.rs @@ -14,6 +14,7 @@ use selectors::matching::IgnoreNthChildForInvalidation; use selectors::NthIndexCache; use servo_arc::{Arc, ArcBorrow}; use smallvec::SmallVec; +use style::values::generics::color::ColorMixFlags; use std::collections::BTreeSet; use std::fmt::Write; use std::iter; @@ -7788,7 +7789,7 @@ pub extern "C" fn Servo_InterpolateColor( progress, right, 1.0 - progress, - /* normalize_weights = */ false, + ColorMixFlags::empty(), ) } diff --git a/taskcluster/docs/parameters.rst b/taskcluster/docs/parameters.rst index 562ed2c54f5..0e0bc9cb3e1 100644 --- a/taskcluster/docs/parameters.rst +++ b/taskcluster/docs/parameters.rst @@ -135,20 +135,25 @@ specified programmatically using one of a variety of methods (e.g., parsing try syntax or reading a project-specific configuration file). ``enable_always_target`` - When ``True``, any task with the ``always_target`` attribute will be - included in the ``target_task_graph`` regardless of whether they were - filtered out by the ``target_tasks_method`` or not. Because they are not - part of the ``target_set``, they will still be eligible for optimization - when the ``optimize_target_tasks`` parameter is ``False``. + Can either be a boolean or a list of kinds. + + When ``True``, any task with the ``always_target`` attribute will be included + in the ``target_task_graph`` regardless of whether they were filtered out by + the ``target_tasks_method`` or not. Because they are not part of the + ``target_set``, they will still be eligible for optimization when the + ``optimize_target_tasks`` parameter is ``False``. + + When specified as a list of kinds, only tasks with a matching kind will be + eligible for addition to the graph. ``filters`` - List of filter functions (from ``taskcluster/gecko_taskgraph/filter_tasks.py``) to - apply. This is usually defined internally, as filters are typically - global. + List of filter functions (from ``taskcluster/gecko_taskgraph/filter_tasks.py``) to + apply. This is usually defined internally, as filters are typically + global. ``target_tasks_method`` - The method to use to determine the target task set. This is the suffix of - one of the functions in ``taskcluster/gecko_taskgraph/target_tasks.py``. + The method to use to determine the target task set. This is the suffix of + one of the functions in ``taskcluster/gecko_taskgraph/target_tasks.py``. ``release_history`` History of recent releases by platform and locale, used when generating diff --git a/taskcluster/gecko_taskgraph/decision.py b/taskcluster/gecko_taskgraph/decision.py index 18497704818..eeab4e509c0 100644 --- a/taskcluster/gecko_taskgraph/decision.py +++ b/taskcluster/gecko_taskgraph/decision.py @@ -345,7 +345,7 @@ def get_decision_parameters(graph_config, options): parameters["filters"] = [ "target_tasks_method", ] - parameters["enable_always_target"] = False + parameters["enable_always_target"] = ["docker-image"] parameters["existing_tasks"] = {} parameters["do_not_optimize"] = [] parameters["build_number"] = 1 diff --git a/taskcluster/gecko_taskgraph/parameters.py b/taskcluster/gecko_taskgraph/parameters.py index e7e5df46056..f6fa2481fcf 100644 --- a/taskcluster/gecko_taskgraph/parameters.py +++ b/taskcluster/gecko_taskgraph/parameters.py @@ -17,7 +17,7 @@ gecko_parameters_schema = { Required("app_version"): str, Required("backstop"): bool, Required("build_number"): int, - Required("enable_always_target"): bool, + Required("enable_always_target"): Any(bool, [str]), Required("hg_branch"): str, Required("message"): str, Required("next_version"): Any(None, str), @@ -65,7 +65,7 @@ def get_defaults(repo_root=None): "backstop": False, "base_repository": "https://hg.mozilla.org/mozilla-unified", "build_number": 1, - "enable_always_target": False, + "enable_always_target": ["docker-image"], "head_repository": "https://hg.mozilla.org/mozilla-central", "hg_branch": "default", "message": "", diff --git a/taskcluster/gecko_taskgraph/transforms/build.py b/taskcluster/gecko_taskgraph/transforms/build.py index 72b5b51cc87..4e73c5aef21 100644 --- a/taskcluster/gecko_taskgraph/transforms/build.py +++ b/taskcluster/gecko_taskgraph/transforms/build.py @@ -32,9 +32,6 @@ def set_defaults(config, jobs): worker = job.setdefault("worker", {}) worker.setdefault("env", {}) worker["chain-of-trust"] = True - if worker_os == "linux": - worker.setdefault("docker-image", {"in-tree": "debian12-amd64-build"}) - yield job diff --git a/taskcluster/gecko_taskgraph/transforms/docker_image.py b/taskcluster/gecko_taskgraph/transforms/docker_image.py index 0ccf83bf387..635573aa782 100644 --- a/taskcluster/gecko_taskgraph/transforms/docker_image.py +++ b/taskcluster/gecko_taskgraph/transforms/docker_image.py @@ -132,6 +132,7 @@ def fill_template(config, tasks): "image_name": image_name, "artifact_prefix": "public", }, + "always-target": True, "expiration-policy": "long", "scopes": [], "treeherder": { diff --git a/taskcluster/gecko_taskgraph/transforms/job/mozharness.py b/taskcluster/gecko_taskgraph/transforms/job/mozharness.py index 3dbcc6e0159..4d7293ec51d 100644 --- a/taskcluster/gecko_taskgraph/transforms/job/mozharness.py +++ b/taskcluster/gecko_taskgraph/transforms/job/mozharness.py @@ -130,9 +130,9 @@ def mozharness_on_docker_worker_setup(config, job, taskdesc): ) # Running via mozharness assumes an image that contains build.sh: - # by default, debian11-amd64-build, but it could be another image (like + # by default, debian12-amd64-build, but it could be another image (like # android-build). - worker.setdefault("docker-image", {"in-tree": "debian11-amd64-build"}) + worker.setdefault("docker-image", {"in-tree": "debian12-amd64-build"}) worker.setdefault("artifacts", []).append( { diff --git a/taskcluster/gecko_taskgraph/transforms/repackage_partner.py b/taskcluster/gecko_taskgraph/transforms/repackage_partner.py index 582a86dfad9..a02a2f71e5f 100644 --- a/taskcluster/gecko_taskgraph/transforms/repackage_partner.py +++ b/taskcluster/gecko_taskgraph/transforms/repackage_partner.py @@ -173,7 +173,6 @@ def make_job_description(config, jobs): } worker_type = "b-linux-gcp" - worker["docker-image"] = {"in-tree": "debian11-amd64-build"} worker["artifacts"] = _generate_task_output_files( dep_job, diff --git a/taskcluster/gecko_taskgraph/util/chunking.py b/taskcluster/gecko_taskgraph/util/chunking.py index 0443a75194b..726f7ca72af 100644 --- a/taskcluster/gecko_taskgraph/util/chunking.py +++ b/taskcluster/gecko_taskgraph/util/chunking.py @@ -14,6 +14,7 @@ from manifestparser import TestManifest from manifestparser.filters import chunk_by_runtime, tags from mozbuild.util import memoize from moztest.resolve import TEST_SUITES, TestManifestLoader, TestResolver +from taskgraph.util.yaml import load_yaml from gecko_taskgraph import GECKO from gecko_taskgraph.util.bugbug import CT_LOW, BugbugTimeoutException, push_schedules @@ -45,22 +46,11 @@ def guess_mozinfo_from_task(task, repo=""): "bits": 32 if "32" in arch else 64, "ccov": setting["build"].get("ccov", False), "debug": setting["build"]["type"] in ("debug", "debug-isolated-process"), - "e10s": not setting["runtime"].get("1proc", False), - "no-fission": "no-fission" in setting["runtime"].keys(), - "fission": any( - "1proc" not in key or "no-fission" not in key - for key in setting["runtime"].keys() - ), "headless": "-headless" in task["test-name"], - "condprof": "conditioned_profile" in setting["runtime"].keys(), "tsan": setting["build"].get("tsan", False), - "xorigin": any("xorigin" in key for key in setting["runtime"].keys()), - "socketprocess_networking": "socketprocess_networking" - in setting["runtime"].keys(), "nightly_build": repo in ["mozilla-central", "autoland", "try", ""], # trunk - "http3": "http3" in setting["runtime"].keys(), - "wmfme": "wmf-media-engine" in setting["runtime"].keys(), } + for platform in ("android", "linux", "mac", "win"): if p_os["name"].startswith(platform): info["os"] = platform @@ -109,6 +99,25 @@ def guess_mozinfo_from_task(task, repo=""): info["os_version"] = new_ver break + test_variants = load_yaml(GECKO, "taskcluster", "ci", "test", "variants.yml") + for variant in test_variants: + tag = test_variants[variant]["suffix"] + value = variant in setting["runtime"].keys() + + if tag == "1proc": + tag = "e10s" + value = not value + if tag == "fis": + tag = "fission" + value = any( + "1proc" not in key or "no-fission" not in key + for key in setting["runtime"].keys() + ) + if tag == "xorigin": + value = any("xorigin" in key for key in setting["runtime"].keys()) + + info[tag] = value + return info diff --git a/taskcluster/scripts/misc/build-xar-linux.sh b/taskcluster/scripts/misc/build-xar-linux.sh index 5c1706b10ee..497e18217ef 100755 --- a/taskcluster/scripts/misc/build-xar-linux.sh +++ b/taskcluster/scripts/misc/build-xar-linux.sh @@ -8,6 +8,13 @@ export PATH=$PATH:$MOZ_FETCHES_DIR/clang/bin cd $MOZ_FETCHES_DIR/xar/xar ./autogen.sh --prefix=/builds/worker --enable-static + +# Force statically-linking to libcrypto. pkg-config --static will tell +# us the extra flags that are needed (in practice, -ldl -pthread), +# and -lcrypto, which we need to change to actually link statically. +CRYPTO=$(pkg-config --static --libs libcrypto | sed 's/-lcrypto/-l:libcrypto.a/') +sed -i "s/-lcrypto/$CRYPTO/" src/Makefile.inc + make_flags="-j$(nproc)" make $make_flags diff --git a/testing/mozbase/mozproxy/mozproxy/backends/mitm/scripts/alt-serverplayback.py b/testing/mozbase/mozproxy/mozproxy/backends/mitm/scripts/alt-serverplayback.py index 0c0a09e753c..8d47b43e5b2 100644 --- a/testing/mozbase/mozproxy/mozproxy/backends/mitm/scripts/alt-serverplayback.py +++ b/testing/mozbase/mozproxy/mozproxy/backends/mitm/scripts/alt-serverplayback.py @@ -13,6 +13,7 @@ # see Bug 1739418: https://bugzilla.mozilla.org/show_bug.cgi?id=1739418 import hashlib +import traceback import urllib from collections.abc import Hashable, Sequence from typing import Any, Optional @@ -232,9 +233,11 @@ class AltServerPlayback: if not self.configured and ctx.options.alt_server_replay: self.configured = True try: - flows = io.read_flows_from_paths(ctx.options.alt_server_replay) - except exceptions.FlowReadException as e: - raise exceptions.OptionsError(str(e)) + flows = io.read_flows_from_paths( + ctx.options.alt_server_replay[0].split(",") + ) + except exceptions.FlowReadException: + raise exceptions.OptionsError(str(traceback.print_exc())) self.load_flows(flows) def request(self, f: http.HTTPFlow) -> None: diff --git a/testing/mozharness/mozharness/mozilla/building/buildbase.py b/testing/mozharness/mozharness/mozilla/building/buildbase.py index be21b7dcc56..3f71fdef87e 100755 --- a/testing/mozharness/mozharness/mozilla/building/buildbase.py +++ b/testing/mozharness/mozharness/mozilla/building/buildbase.py @@ -1035,11 +1035,17 @@ items from that key's value." def _load_sccache_stats(self): stats_file = os.path.join( - self.query_abs_dirs()["base_work_dir"], "cidata", "sccache-stats.json" + self.query_abs_dirs()["base_work_dir"], "artifacts", "sccache-stats.json" ) if not os.path.exists(stats_file): - self.info("%s does not exist; not loading sccache stats" % stats_file) - return + msg = "%s does not exist; not loading sccache stats" % stats_file + if os.environ.get("USE_SCCACHE") == "1": + # We know we use sccache but we didn't find it. + # Fails to make sure the dev knows it + self.fatal(msg) + else: + self.info(msg) + return with open(stats_file, "r") as fh: stats = json.load(fh) diff --git a/testing/mozharness/scripts/web_platform_tests.py b/testing/mozharness/scripts/web_platform_tests.py index e95701c8982..04e02bf7abd 100755 --- a/testing/mozharness/scripts/web_platform_tests.py +++ b/testing/mozharness/scripts/web_platform_tests.py @@ -365,6 +365,9 @@ class WebPlatformTest(TestingMixin, MercurialScript, CodeCoverageMixin, AndroidM % os.path.join( dirs["abs_test_extensions_dir"], "specialpowers@mozilla.org.xpi" ), + # Ensure that we don't get a Python traceback from handlers that will be + # added to the log summary + "--suppress-handler-traceback", ] is_windows_7 = ( diff --git a/testing/raptor/raptor/perftest.py b/testing/raptor/raptor/perftest.py index 944972d4d39..576addceccf 100644 --- a/testing/raptor/raptor/perftest.py +++ b/testing/raptor/raptor/perftest.py @@ -560,13 +560,16 @@ class Perftest(object): # creating the playback tool playback_dir = os.path.join(here, "tooltool-manifests", "playback") + playback_manifest = test.get("playback_pageset_manifest") + playback_manifests = playback_manifest.split(",") self.config.update( { "playback_tool": test.get("playback"), "playback_version": test.get("playback_version", "8.1.1"), "playback_files": [ - os.path.join(playback_dir, test.get("playback_pageset_manifest")) + os.path.join(playback_dir, manifest) + for manifest in playback_manifests ], } ) diff --git a/testing/web-platform/meta/css/css-color/a98rgb-001.html.ini b/testing/web-platform/meta/css/css-color/a98rgb-001.html.ini deleted file mode 100644 index ca3faa7732c..00000000000 --- a/testing/web-platform/meta/css/css-color/a98rgb-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[a98rgb-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/a98rgb-002.html.ini b/testing/web-platform/meta/css/css-color/a98rgb-002.html.ini deleted file mode 100644 index 3d3f27f6b42..00000000000 --- a/testing/web-platform/meta/css/css-color/a98rgb-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[a98rgb-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/a98rgb-003.html.ini b/testing/web-platform/meta/css/css-color/a98rgb-003.html.ini deleted file mode 100644 index 1a904b9b016..00000000000 --- a/testing/web-platform/meta/css/css-color/a98rgb-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[a98rgb-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/a98rgb-004.html.ini b/testing/web-platform/meta/css/css-color/a98rgb-004.html.ini deleted file mode 100644 index 64587d31cdd..00000000000 --- a/testing/web-platform/meta/css/css-color/a98rgb-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[a98rgb-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-001.html.ini b/testing/web-platform/meta/css/css-color/display-p3-001.html.ini deleted file mode 100644 index a36675c2d86..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-002.html.ini b/testing/web-platform/meta/css/css-color/display-p3-002.html.ini deleted file mode 100644 index ab5eea2b983..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-003.html.ini b/testing/web-platform/meta/css/css-color/display-p3-003.html.ini deleted file mode 100644 index d3f2916cbc1..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-004.html.ini b/testing/web-platform/meta/css/css-color/display-p3-004.html.ini deleted file mode 100644 index 15b81547c96..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-005.html.ini b/testing/web-platform/meta/css/css-color/display-p3-005.html.ini deleted file mode 100644 index 4b756aa22c0..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/display-p3-006.html.ini b/testing/web-platform/meta/css/css-color/display-p3-006.html.ini deleted file mode 100644 index 19155d77b0b..00000000000 --- a/testing/web-platform/meta/css/css-color/display-p3-006.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[display-p3-006.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/lab-008.html.ini b/testing/web-platform/meta/css/css-color/lab-008.html.ini deleted file mode 100644 index 8aeffa3949a..00000000000 --- a/testing/web-platform/meta/css/css-color/lab-008.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[lab-008.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/lch-008.html.ini b/testing/web-platform/meta/css/css-color/lch-008.html.ini deleted file mode 100644 index 26166e922b3..00000000000 --- a/testing/web-platform/meta/css/css-color/lch-008.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[lch-008.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/oklab-008.html.ini b/testing/web-platform/meta/css/css-color/oklab-008.html.ini deleted file mode 100644 index e698aa44778..00000000000 --- a/testing/web-platform/meta/css/css-color/oklab-008.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[oklab-008.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/oklch-008.html.ini b/testing/web-platform/meta/css/css-color/oklch-008.html.ini deleted file mode 100644 index af637dc2036..00000000000 --- a/testing/web-platform/meta/css/css-color/oklch-008.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[oklch-008.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-computed-color-mix-function.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-computed-color-mix-function.html.ini index 55a77b6bcc9..7e1df353c3e 100644 --- a/testing/web-platform/meta/css/css-color/parsing/color-computed-color-mix-function.html.ini +++ b/testing/web-platform/meta/css/css-color/parsing/color-computed-color-mix-function.html.ini @@ -11,368 +11,14 @@ [Property color value 'color-mix(in oklch, transparent 10%, oklch(30 40 30deg))'] expected: FAIL - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, transparent, hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, transparent 10%, hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / 0), hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 10% 20% / 0) 10%, hsl(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl shorter hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl longer hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl increasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(40deg 50% 50%), hsl(60deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(60deg 50% 50%), hsl(40deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(50deg 50% 50%), hsl(330deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(330deg 50% 50%), hsl(50deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(20deg 50% 50%), hsl(320deg 50% 50%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl decreasing hue, hsl(320deg 50% 50%), hsl(20deg 50% 50%))'] - expected: FAIL - [Property color value 'color-mix(in hsl, hsl(none none none), hsl(none none none))'] expected: FAIL - [Property color value 'color-mix(in hsl, hsl(none none none), hsl(30deg 40% 80%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(none none none))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 20% none), hsl(30deg 40% 60%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 20% 40%), hsl(30deg 20% none))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(none 20% 40%), hsl(30deg none 80%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))'] - expected: FAIL - [Property color value 'color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))'] expected: FAIL - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, transparent, hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, transparent 10%, hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / 0), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / 0) 10%, hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb shorter hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb longer hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb increasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(40deg 30% 40%), hwb(60deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(60deg 30% 40%), hwb(40deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(50deg 30% 40%), hwb(330deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(330deg 30% 40%), hwb(50deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(20deg 30% 40%), hwb(320deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb decreasing hue, hwb(320deg 30% 40%), hwb(20deg 30% 40%))'] - expected: FAIL - [Property color value 'color-mix(in hwb, hwb(none none none), hwb(none none none))'] expected: FAIL - [Property color value 'color-mix(in hwb, hwb(none none none), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(none none none))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% none), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% none))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(none 10% 20%), hwb(30deg none 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40%))'] - expected: FAIL - - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))'] - expected: FAIL - [Property color value 'color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))'] expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/parsing/color-computed-hex-color.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-computed-hex-color.html.ini deleted file mode 100644 index 9b2131afec4..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-computed-hex-color.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-computed-hex-color.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-computed.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-computed.html.ini deleted file mode 100644 index 06f298f878a..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-computed.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-computed.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-color-contrast-function.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-color-contrast-function.html.ini deleted file mode 100644 index b64f837f8f8..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-color-contrast-function.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-color-contrast-function.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hex-color.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-hex-color.html.ini deleted file mode 100644 index 970d4912969..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hex-color.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-hex-color.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hsl.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-hsl.html.ini deleted file mode 100644 index cd8b9862b28..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hsl.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-hsl.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hwb.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-hwb.html.ini deleted file mode 100644 index 4f4159326c8..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-hwb.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-hwb.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-lab.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-lab.html.ini deleted file mode 100644 index 7d1064d4a4c..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-lab.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-lab.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-named-color.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-named-color.html.ini deleted file mode 100644 index 6a318788233..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-named-color.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-named-color.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-relative-color.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-relative-color.html.ini deleted file mode 100644 index acd908568e0..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-relative-color.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-relative-color.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid-rgb.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid-rgb.html.ini deleted file mode 100644 index eead68a9e11..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid-rgb.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid-rgb.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-invalid.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-invalid.html.ini deleted file mode 100644 index 77ef89cb894..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-invalid.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-invalid.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-mix-out-of-gamut.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-mix-out-of-gamut.html.ini index f1ebf996f5f..ccd8426a81a 100644 --- a/testing/web-platform/meta/css/css-color/parsing/color-mix-out-of-gamut.html.ini +++ b/testing/web-platform/meta/css/css-color/parsing/color-mix-out-of-gamut.html.ini @@ -5,50 +5,26 @@ [Property color value 'color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hsl, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hsl, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL [Property color value 'color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hwb, oklab(1 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - [Property color value 'color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL - [Property color value 'color-mix(in hwb, oklch(1 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] expected: FAIL - - [Property color value 'color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)'] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-contrast-function.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-valid-color-contrast-function.html.ini index 15a9d34b193..6c759d11a0e 100644 --- a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-contrast-function.html.ini +++ b/testing/web-platform/meta/css/css-color/parsing/color-valid-color-contrast-function.html.ini @@ -1,6 +1,4 @@ [color-valid-color-contrast-function.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] [e.style['color'\] = "color-contrast(white vs red, blue)" should set the property value] expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-function.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-valid-color-function.html.ini index cc5ee98cc72..0a4b8418b75 100644 --- a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-function.html.ini +++ b/testing/web-platform/meta/css/css-color/parsing/color-valid-color-function.html.ini @@ -1,1066 +1,4 @@ [color-valid-color-function.html] - [e.style['color'\] = "color(srgb 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0.1 0.1 0.1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 .2 .2 .25)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 50% -160 160)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 50% -160 160)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 10 10 10)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 50% -200 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 200 200 200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 1 1 1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 10 10 10)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 1 1 1 / 1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 50% -200 200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 1 1 1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz .20 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 50% -160 160)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 1 1 1 / 1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 200 200 200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 .20 0 10/50%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 50% -160 160)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 50% -200 200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 200 200 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 10 10 10)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 50% -200 200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz .2 .2 .25)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 50% -200 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 0% 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 200 200 200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 .2 .2 .25)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 .20 0 10/50%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 50% -160 160)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz -1 -1 -1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 1 1 1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 1 1 1 / 1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 50% -160 160)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb calc(50% * 3) calc(-150% / 3) calc(50%) / calc(-50% * 3))" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 .20 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 400% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 -1 -1 -1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 200 200 200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 -200 -200 -200)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 -1 -1 -1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 10% 10% 10%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb calc(0.5 + 1) calc(0.5 - 1) calc(0.5) / calc(-0.5 + 1))" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 50% -200 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 200% 200% 200% / 200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(prophoto-rgb 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear .2 .2 25%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0 0 0 / 1)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d65 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0 / 0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 .20 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0.1 0.1 0.1)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 20% 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 200 200 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 -200 -200 -200 / -200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0 / 110%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz 0 0 0 / 300%)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 0% 0% 0%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb -200% -200% -200% / -200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz-d50 0.1 0.1 0.1)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - - [e.style['color'\] = "color(xyz .20 0 10/0.5)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(srgb-linear 20% 0 10/50%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(display-p3 200 200 200 / 200)" should set the property value] - expected: - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - - [e.style['color'\] = "color(rec2020 0 0 0 / -10%)" should set the property value] - expected: - if not debug and (os == "android"): [PASS, FAIL] - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - - [e.style['color'\] = "color(a98-rgb 200% 200% 200%)" should set the property value] - expected: - if not debug and (os == "mac"): [PASS, FAIL] - if not debug and (os == "linux"): [PASS, FAIL] - if not debug and (os == "android"): [PASS, FAIL] - [e.style['color'\] = "color(srgb 0 calc(infinity) 0)" should set the property value] expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/parsing/color-valid-system-color.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-valid-system-color.html.ini deleted file mode 100644 index 7f4c0de3c2e..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-valid-system-color.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-valid-system-color.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/color-valid.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-valid.html.ini deleted file mode 100644 index b919f6aba02..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-valid.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[color-valid.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/opacity-computed.html.ini b/testing/web-platform/meta/css/css-color/parsing/opacity-computed.html.ini deleted file mode 100644 index 2493de0b089..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/opacity-computed.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[opacity-computed.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/opacity-invalid.html.ini b/testing/web-platform/meta/css/css-color/parsing/opacity-invalid.html.ini deleted file mode 100644 index 458cec9b300..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/opacity-invalid.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[opacity-invalid.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/parsing/opacity-valid.html.ini b/testing/web-platform/meta/css/css-color/parsing/opacity-valid.html.ini deleted file mode 100644 index b69c4a8d6bb..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/opacity-valid.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[opacity-valid.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/predefined-001.html.ini b/testing/web-platform/meta/css/css-color/predefined-001.html.ini deleted file mode 100644 index 38811edfc27..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-002.html.ini b/testing/web-platform/meta/css/css-color/predefined-002.html.ini deleted file mode 100644 index dbe4c6ab496..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-005.html.ini b/testing/web-platform/meta/css/css-color/predefined-005.html.ini deleted file mode 100644 index a5e856636b4..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-006.html.ini b/testing/web-platform/meta/css/css-color/predefined-006.html.ini deleted file mode 100644 index 8f4c7f3473c..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-006.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-006.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-007.html.ini b/testing/web-platform/meta/css/css-color/predefined-007.html.ini deleted file mode 100644 index 69870f15a49..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-007.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-007.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-008.html.ini b/testing/web-platform/meta/css/css-color/predefined-008.html.ini deleted file mode 100644 index c4836fd5aa9..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-008.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-008.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-009.html.ini b/testing/web-platform/meta/css/css-color/predefined-009.html.ini deleted file mode 100644 index 635760d1522..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-009.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-009.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-010.html.ini b/testing/web-platform/meta/css/css-color/predefined-010.html.ini deleted file mode 100644 index c7f11d52e12..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-010.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-010.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-011.html.ini b/testing/web-platform/meta/css/css-color/predefined-011.html.ini deleted file mode 100644 index b44ca79ac78..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-011.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-011.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-012.html.ini b/testing/web-platform/meta/css/css-color/predefined-012.html.ini deleted file mode 100644 index 486575b9d75..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-012.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-012.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/predefined-016.html.ini b/testing/web-platform/meta/css/css-color/predefined-016.html.ini deleted file mode 100644 index 4339dc5c8c6..00000000000 --- a/testing/web-platform/meta/css/css-color/predefined-016.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[predefined-016.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/prophoto-rgb-001.html.ini b/testing/web-platform/meta/css/css-color/prophoto-rgb-001.html.ini deleted file mode 100644 index 1fabf746300..00000000000 --- a/testing/web-platform/meta/css/css-color/prophoto-rgb-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[prophoto-rgb-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/prophoto-rgb-002.html.ini b/testing/web-platform/meta/css/css-color/prophoto-rgb-002.html.ini deleted file mode 100644 index a0b35aee888..00000000000 --- a/testing/web-platform/meta/css/css-color/prophoto-rgb-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[prophoto-rgb-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/prophoto-rgb-003.html.ini b/testing/web-platform/meta/css/css-color/prophoto-rgb-003.html.ini deleted file mode 100644 index 34ad922100d..00000000000 --- a/testing/web-platform/meta/css/css-color/prophoto-rgb-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[prophoto-rgb-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/prophoto-rgb-004.html.ini b/testing/web-platform/meta/css/css-color/prophoto-rgb-004.html.ini deleted file mode 100644 index bff1af860dd..00000000000 --- a/testing/web-platform/meta/css/css-color/prophoto-rgb-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[prophoto-rgb-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/prophoto-rgb-005.html.ini b/testing/web-platform/meta/css/css-color/prophoto-rgb-005.html.ini deleted file mode 100644 index 4a291ddce54..00000000000 --- a/testing/web-platform/meta/css/css-color/prophoto-rgb-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[prophoto-rgb-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/rec2020-001.html.ini b/testing/web-platform/meta/css/css-color/rec2020-001.html.ini deleted file mode 100644 index 3ec1f21d802..00000000000 --- a/testing/web-platform/meta/css/css-color/rec2020-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[rec2020-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/rec2020-002.html.ini b/testing/web-platform/meta/css/css-color/rec2020-002.html.ini deleted file mode 100644 index 2f46a7178f0..00000000000 --- a/testing/web-platform/meta/css/css-color/rec2020-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[rec2020-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/rec2020-003.html.ini b/testing/web-platform/meta/css/css-color/rec2020-003.html.ini deleted file mode 100644 index 91571affb02..00000000000 --- a/testing/web-platform/meta/css/css-color/rec2020-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[rec2020-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/rec2020-004.html.ini b/testing/web-platform/meta/css/css-color/rec2020-004.html.ini deleted file mode 100644 index 88b4caa5e06..00000000000 --- a/testing/web-platform/meta/css/css-color/rec2020-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[rec2020-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/rec2020-005.html.ini b/testing/web-platform/meta/css/css-color/rec2020-005.html.ini deleted file mode 100644 index bf02eadb889..00000000000 --- a/testing/web-platform/meta/css/css-color/rec2020-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[rec2020-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/srgb-linear-001.html.ini b/testing/web-platform/meta/css/css-color/srgb-linear-001.html.ini deleted file mode 100644 index aa5cbee5eb1..00000000000 --- a/testing/web-platform/meta/css/css-color/srgb-linear-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[srgb-linear-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/srgb-linear-002.html.ini b/testing/web-platform/meta/css/css-color/srgb-linear-002.html.ini deleted file mode 100644 index 6089be06719..00000000000 --- a/testing/web-platform/meta/css/css-color/srgb-linear-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[srgb-linear-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/srgb-linear-003.html.ini b/testing/web-platform/meta/css/css-color/srgb-linear-003.html.ini deleted file mode 100644 index 47ed44e766b..00000000000 --- a/testing/web-platform/meta/css/css-color/srgb-linear-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[srgb-linear-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/srgb-linear-004.html.ini b/testing/web-platform/meta/css/css-color/srgb-linear-004.html.ini deleted file mode 100644 index 64fa4899022..00000000000 --- a/testing/web-platform/meta/css/css-color/srgb-linear-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[srgb-linear-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/system-color-compute.html.ini b/testing/web-platform/meta/css/css-color/system-color-compute.html.ini index 2438d912fe4..e9309608cd0 100644 --- a/testing/web-platform/meta/css/css-color/system-color-compute.html.ini +++ b/testing/web-platform/meta/css/css-color/system-color-compute.html.ini @@ -1,8 +1,7 @@ [system-color-compute.html] prefs: [layout.css.color-scheme.enabled:true] bug: https://github.com/w3c/csswg-drafts/issues/6773 - expected: - if (os == "android") and fission: [OK, TIMEOUT] + [Inherited system color keyword is observable on text-shadow] expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/system-color-consistency.html.ini b/testing/web-platform/meta/css/css-color/system-color-consistency.html.ini deleted file mode 100644 index d0b0676b47e..00000000000 --- a/testing/web-platform/meta/css/css-color/system-color-consistency.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[system-color-consistency.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] diff --git a/testing/web-platform/meta/css/css-color/xyz-001.html.ini b/testing/web-platform/meta/css/css-color/xyz-001.html.ini deleted file mode 100644 index a4d03961a7f..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-002.html.ini b/testing/web-platform/meta/css/css-color/xyz-002.html.ini deleted file mode 100644 index 2dfdaabc6c2..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-003.html.ini b/testing/web-platform/meta/css/css-color/xyz-003.html.ini deleted file mode 100644 index ebf2d7973cc..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-004.html.ini b/testing/web-platform/meta/css/css-color/xyz-004.html.ini deleted file mode 100644 index ff8557b23c0..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-005.html.ini b/testing/web-platform/meta/css/css-color/xyz-005.html.ini deleted file mode 100644 index 8cca78f1b24..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d50-001.html.ini b/testing/web-platform/meta/css/css-color/xyz-d50-001.html.ini deleted file mode 100644 index c405e0b88e1..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d50-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d50-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d50-002.html.ini b/testing/web-platform/meta/css/css-color/xyz-d50-002.html.ini deleted file mode 100644 index 6735e1d3296..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d50-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d50-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d50-003.html.ini b/testing/web-platform/meta/css/css-color/xyz-d50-003.html.ini deleted file mode 100644 index 2ffc294162d..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d50-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d50-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d50-004.html.ini b/testing/web-platform/meta/css/css-color/xyz-d50-004.html.ini deleted file mode 100644 index c663631025d..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d50-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d50-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d50-005.html.ini b/testing/web-platform/meta/css/css-color/xyz-d50-005.html.ini deleted file mode 100644 index 598f77ad048..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d50-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d50-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d65-001.html.ini b/testing/web-platform/meta/css/css-color/xyz-d65-001.html.ini deleted file mode 100644 index ed07174f5f8..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d65-001.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d65-001.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d65-002.html.ini b/testing/web-platform/meta/css/css-color/xyz-d65-002.html.ini deleted file mode 100644 index f7692565c25..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d65-002.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d65-002.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d65-003.html.ini b/testing/web-platform/meta/css/css-color/xyz-d65-003.html.ini deleted file mode 100644 index f3036c61a79..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d65-003.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d65-003.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d65-004.html.ini b/testing/web-platform/meta/css/css-color/xyz-d65-004.html.ini deleted file mode 100644 index 6c4fec2d859..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d65-004.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d65-004.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-color/xyz-d65-005.html.ini b/testing/web-platform/meta/css/css-color/xyz-d65-005.html.ini deleted file mode 100644 index a23e4f7f8c3..00000000000 --- a/testing/web-platform/meta/css/css-color/xyz-d65-005.html.ini +++ /dev/null @@ -1,5 +0,0 @@ -[xyz-d65-005.html] - expected: - if not debug and (os == "win"): PASS - if debug: PASS - [PASS, FAIL] diff --git a/testing/web-platform/meta/css/css-ui/__dir__.ini b/testing/web-platform/meta/css/css-ui/__dir__.ini deleted file mode 100644 index 2470a8b4edb..00000000000 --- a/testing/web-platform/meta/css/css-ui/__dir__.ini +++ /dev/null @@ -1 +0,0 @@ -prefs: [layout.css.accent-color.enabled:true] diff --git a/testing/web-platform/meta/webcodecs/chunk-serialization.any.js.ini b/testing/web-platform/meta/webcodecs/chunk-serialization.any.js.ini index c5d8e623170..d04ac2c3c7a 100644 --- a/testing/web-platform/meta/webcodecs/chunk-serialization.any.js.ini +++ b/testing/web-platform/meta/webcodecs/chunk-serialization.any.js.ini @@ -4,5 +4,3 @@ prefs: [dom.media.webcodecs.enabled:true] [Verify EncodedAudioChunk is serializable.] expected: FAIL - [Verify EncodedVideoChunk is serializable.] - expected: FAIL diff --git a/testing/web-platform/meta/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html.ini b/testing/web-platform/meta/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html.ini new file mode 100644 index 00000000000..fd315ddd647 --- /dev/null +++ b/testing/web-platform/meta/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html.ini @@ -0,0 +1,2 @@ +[encodedVideoChunk-serialization.crossAgentCluster.https.html] + prefs: [dom.media.webcodecs.enabled:true] diff --git a/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/fragment_navigated.py.ini b/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/fragment_navigated.py.ini index cf6a046d46e..7eb3ca0ed76 100644 --- a/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/fragment_navigated.py.ini +++ b/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/fragment_navigated.py.ini @@ -1,51 +1,8 @@ [fragment_navigated.py] - [test_unsubscribe] - expected: FAIL - - [test_subscribe] - expected: FAIL - - [test_timestamp] - expected: FAIL - - [test_navigation_id] - expected: FAIL - - [test_url_with_base_tag] - expected: FAIL - - [test_iframe] - expected: FAIL - - [test_document_location[-#foo\]] - expected: FAIL - - [test_document_location[#foo-#bar\]] - expected: FAIL - - [test_document_location[#foo-#foo\]] - expected: FAIL - - [test_browsing_context_navigate[-#foo\]] - expected: FAIL - - [test_browsing_context_navigate[#foo-#bar\]] - expected: FAIL - - [test_browsing_context_navigate[#foo-#foo\]] - expected: FAIL - - [test_new_context[tab\]] - expected: FAIL - [test_new_context[window\]] - expected: FAIL + disabled: + if os == "android": Not supported [test_document_write] expected: FAIL - - [test_regular_navigation[-?foo\]] - expected: FAIL - - [test_regular_navigation[#foo-\]] - expected: FAIL + bug: 1844517 diff --git a/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/history_api.py.ini b/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/history_api.py.ini deleted file mode 100644 index d3a878cf46c..00000000000 --- a/testing/web-platform/meta/webdriver/tests/bidi/browsing_context/fragment_navigated/history_api.py.ini +++ /dev/null @@ -1,12 +0,0 @@ -[history_api.py] - [test_history_push_state[-#foo\]] - expected: FAIL - - [test_history_push_state[#foo-#bar\]] - expected: FAIL - - [test_history_push_state[#foo-#foo\]] - expected: FAIL - - [test_history_push_state[#bar-\]] - expected: FAIL diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-clone.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-clone.https.html.ini new file mode 100644 index 00000000000..20f0c27925f --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-clone.https.html.ini @@ -0,0 +1,2 @@ +[RTCEncodedAudioFrame-clone.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-serviceworker-failure.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-serviceworker-failure.https.html.ini new file mode 100644 index 00000000000..6e7a13e6b34 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedAudioFrame-serviceworker-failure.https.html.ini @@ -0,0 +1,2 @@ +[RTCEncodedAudioFrame-serviceworker-failure.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-clone.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-clone.https.html.ini new file mode 100644 index 00000000000..01788d61a3d --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-clone.https.html.ini @@ -0,0 +1,2 @@ +[RTCEncodedVideoFrame-clone.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-serviceworker-failure.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-serviceworker-failure.https.html.ini new file mode 100644 index 00000000000..0a0e3ba50a3 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCEncodedVideoFrame-serviceworker-failure.https.html.ini @@ -0,0 +1,2 @@ +[RTCEncodedVideoFrame-serviceworker-failure.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-audio.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-audio.https.html.ini new file mode 100644 index 00000000000..2f0a206465a --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-audio.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-audio.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-errors.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-errors.https.html.ini new file mode 100644 index 00000000000..501c49b2590 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-errors.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-errors.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html.ini new file mode 100644 index 00000000000..48803d887b2 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-simulcast.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-simulcast.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video-frames.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video-frames.https.html.ini new file mode 100644 index 00000000000..26d0d286c06 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video-frames.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-video-frames.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html.ini new file mode 100644 index 00000000000..bdbb7c96110 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-video.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-video.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-worker.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-worker.https.html.ini new file mode 100644 index 00000000000..3b236672650 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/RTCPeerConnection-insertable-streams-worker.https.html.ini @@ -0,0 +1,2 @@ +[RTCPeerConnection-insertable-streams-worker.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/__dir__.ini b/testing/web-platform/meta/webrtc-encoded-transform/__dir__.ini index 6fabbde6f4b..42b09949ad5 100644 --- a/testing/web-platform/meta/webrtc-encoded-transform/__dir__.ini +++ b/testing/web-platform/meta/webrtc-encoded-transform/__dir__.ini @@ -1,2 +1 @@ lsan-allowed: [NS_NewRunnableFunction, mozilla::MediaPacket::Copy, mozilla::MediaPipeline::MediaPipeline] -disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1804949 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/codec-specific-metadata.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/codec-specific-metadata.https.html.ini new file mode 100644 index 00000000000..d9d41fb417b --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/codec-specific-metadata.https.html.ini @@ -0,0 +1,2 @@ +[codec-specific-metadata.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/idlharness.https.window.js.ini b/testing/web-platform/meta/webrtc-encoded-transform/idlharness.https.window.js.ini new file mode 100644 index 00000000000..41af1df2940 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/idlharness.https.window.js.ini @@ -0,0 +1,80 @@ +[idlharness.https.window.html] + [SFrameTransform interface object name] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: existence and properties of interface object] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface object length] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: existence and properties of interface prototype object] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: operation setEncryptionKey(CryptoKey, optional CryptoKeyID)] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransform interface: attribute onerror] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: existence and properties of interface object] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface object length] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface object name] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: existence and properties of interface prototype object] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: existence and properties of interface prototype object's "constructor" property] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: existence and properties of interface prototype object's @@unscopables property] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: attribute errorType] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: attribute keyID] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [SFrameTransformErrorEvent interface: attribute frame] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 + + [RTCRtpSender interface: operation generateKeyFrame(optional sequence)] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1631263 + + [RTCRtpSender interface: calling generateKeyFrame(optional sequence) on new RTCPeerConnection().addTransceiver('audio').sender with too few arguments must throw TypeError] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1631263 + + [RTCRtpSender interface: new RTCPeerConnection().addTransceiver('audio').sender must inherit property "generateKeyFrame(optional sequence)" with the proper type] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1631263 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/script-late-transform.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/script-late-transform.https.html.ini new file mode 100644 index 00000000000..7f4d3fb0392 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/script-late-transform.https.html.ini @@ -0,0 +1,2 @@ +[script-late-transform.https.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/script-metadata-transform.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/script-metadata-transform.https.html.ini new file mode 100644 index 00000000000..b4473b48853 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/script-metadata-transform.https.html.ini @@ -0,0 +1,8 @@ +[script-metadata-transform.https.html] + [audio metadata: contributingSources] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1835077 + + [video metadata: frameId] + expected: FAIL + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1836306 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html.ini new file mode 100644 index 00000000000..139fd7371cf --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html.ini @@ -0,0 +1,18 @@ +[script-transform-generateKeyFrame.https.html] + expected: + if (os == "android"): [OK, TIMEOUT] + + [generateKeyFrame works with simulcast rids] + expected: + if (os == "android"): [PASS, TIMEOUT] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1837641 + + [generateKeyFrame for rid that was negotiated away fails] + expected: + if (os == "android"): [PASS, TIMEOUT, NOTRUN] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1837641 + + [generateKeyFrame with rid after simulcast->unicast negotiation fails] + expected: + if (os == "android"): [PASS, TIMEOUT, NOTRUN] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1837641 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/set-metadata.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/set-metadata.https.html.ini new file mode 100644 index 00000000000..b0e4d3c5189 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/set-metadata.https.html.ini @@ -0,0 +1,2 @@ +[set-metadata.https.html] + disabled: true diff --git a/testing/web-platform/meta/webrtc-encoded-transform/sframe-keys.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/sframe-keys.https.html.ini new file mode 100644 index 00000000000..39fa156a7c9 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/sframe-keys.https.html.ini @@ -0,0 +1,2 @@ +[sframe-keys.https.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-buffer-source.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-buffer-source.html.ini new file mode 100644 index 00000000000..bf1b852d3ec --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-buffer-source.html.ini @@ -0,0 +1,2 @@ +[sframe-transform-buffer-source.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-in-worker.https.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-in-worker.https.html.ini new file mode 100644 index 00000000000..0905add2464 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-in-worker.https.html.ini @@ -0,0 +1,2 @@ +[sframe-transform-in-worker.https.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-readable.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-readable.html.ini new file mode 100644 index 00000000000..2c73ff18f43 --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform-readable.html.ini @@ -0,0 +1,2 @@ +[sframe-transform-readable.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform.html.ini b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform.html.ini new file mode 100644 index 00000000000..f4cb05db3aa --- /dev/null +++ b/testing/web-platform/meta/webrtc-encoded-transform/sframe-transform.html.ini @@ -0,0 +1,2 @@ +[sframe-transform.html] + disabled: https://bugzilla.mozilla.org/show_bug.cgi?id=1715625 diff --git a/testing/web-platform/meta/xhr/response-body-errors.any.js.ini b/testing/web-platform/meta/xhr/response-body-errors.any.js.ini index f2313875bdd..aba81dcc361 100644 --- a/testing/web-platform/meta/xhr/response-body-errors.any.js.ini +++ b/testing/web-platform/meta/xhr/response-body-errors.any.js.ini @@ -1,15 +1,8 @@ [response-body-errors.any.html] expected: if (os == "android") and fission: [OK, TIMEOUT] - [Asynchronous XMLHttpRequest should clear response on bad chunk] - expected: FAIL [response-body-errors.any.worker.html] expected: if (os == "android") and fission: [OK, TIMEOUT] - [Synchronous XMLHttpRequest should throw on bad chunk] - expected: FAIL - - [Asynchronous XMLHttpRequest should clear response on bad chunk] - expected: FAIL diff --git a/testing/web-platform/mozilla/meta/webgpu/chunked/1/cts.https.html.ini b/testing/web-platform/mozilla/meta/webgpu/chunked/1/cts.https.html.ini index 804a97bd2ef..5f2ea9e58a3 100644 --- a/testing/web-platform/mozilla/meta/webgpu/chunked/1/cts.https.html.ini +++ b/testing/web-platform/mozilla/meta/webgpu/chunked/1/cts.https.html.ini @@ -91,87 +91,9 @@ [cts.https.html?q=webgpu:api,operation,adapter,requestDevice:limit,worse_than_default:*] - [:limit="maxTextureDimension1D"] - expected: FAIL - - [:limit="maxTextureDimension2D"] - expected: FAIL - - [:limit="maxTextureDimension3D"] - expected: FAIL - - [:limit="maxTextureArrayLayers"] - expected: FAIL - - [:limit="maxBindGroups"] - expected: FAIL - - [:limit="maxDynamicUniformBuffersPerPipelineLayout"] - expected: FAIL - - [:limit="maxDynamicStorageBuffersPerPipelineLayout"] - expected: FAIL - - [:limit="maxSampledTexturesPerShaderStage"] - expected: FAIL - - [:limit="maxSamplersPerShaderStage"] - expected: FAIL - - [:limit="maxStorageBuffersPerShaderStage"] - expected: FAIL - - [:limit="maxStorageTexturesPerShaderStage"] - expected: FAIL - - [:limit="maxUniformBuffersPerShaderStage"] - expected: FAIL - - [:limit="maxUniformBufferBindingSize"] - expected: FAIL - - [:limit="maxStorageBufferBindingSize"] - expected: FAIL - - [:limit="minUniformBufferOffsetAlignment"] - expected: FAIL - - [:limit="minStorageBufferOffsetAlignment"] - expected: FAIL - - [:limit="maxVertexBuffers"] - expected: FAIL - - [:limit="maxBufferSize"] - expected: FAIL - - [:limit="maxVertexAttributes"] - expected: FAIL - - [:limit="maxVertexBufferArrayStride"] - expected: FAIL - - [:limit="maxInterStageShaderComponents"] - expected: FAIL - - [:limit="maxComputeWorkgroupStorageSize"] - expected: FAIL - - [:limit="maxComputeInvocationsPerWorkgroup"] - expected: FAIL - - [:limit="maxComputeWorkgroupSizeX"] - expected: FAIL - - [:limit="maxComputeWorkgroupSizeY"] - expected: FAIL - - [:limit="maxComputeWorkgroupSizeZ"] - expected: FAIL - - [:limit="maxComputeWorkgroupsPerDimension"] - expected: FAIL - + # See . + [:limit="maxBindingsPerBindGroup"] + disabled: true [cts.https.html?q=webgpu:api,operation,buffers,map:mapAsync,read,typedArrayAccess:*] [:mapAsyncRegionLeft="default-expand";mapAsyncRegionRight="default-expand"] diff --git a/testing/web-platform/tests/lint.ignore b/testing/web-platform/tests/lint.ignore index 457c93c2149..255a50e0d1c 100644 --- a/testing/web-platform/tests/lint.ignore +++ b/testing/web-platform/tests/lint.ignore @@ -252,6 +252,9 @@ SET TIMEOUT: webaudio/the-audio-api/the-mediaelementaudiosourcenode-interface/me SET TIMEOUT: webauthn/*timeout.https.html SET TIMEOUT: webdriver/* SET TIMEOUT: webmessaging/* +SET TIMEOUT: webrtc-encoded-transform/script-metadata-transform-worker.js +SET TIMEOUT: webrtc-encoded-transform/script-transform-generateKeyFrame.js +SET TIMEOUT: webrtc-encoded-transform/script-transform-sendKeyFrameRequest.js SET TIMEOUT: webstorage/eventTestHarness.js SET TIMEOUT: webvtt/* SET TIMEOUT: workers/* diff --git a/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.helper.html b/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.helper.html new file mode 100644 index 00000000000..424ce927f9a --- /dev/null +++ b/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.helper.html @@ -0,0 +1,23 @@ + + + +

+
+ + + diff --git a/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html b/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html new file mode 100644 index 00000000000..fb104a3a1b1 --- /dev/null +++ b/testing/web-platform/tests/webcodecs/encodedVideoChunk-serialization.crossAgentCluster.https.html @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + diff --git a/testing/web-platform/tests/webcodecs/serialization.crossAgentCluster.serviceworker.js b/testing/web-platform/tests/webcodecs/serialization.crossAgentCluster.serviceworker.js new file mode 100644 index 00000000000..bb3ec0df5b7 --- /dev/null +++ b/testing/web-platform/tests/webcodecs/serialization.crossAgentCluster.serviceworker.js @@ -0,0 +1,61 @@ +let videoFrameMap = new Map(); +let encodedVideoChunkMap = new Map(); + +self.onmessage = (e) => { + if (e.data == 'create-VideoFrame') { + let frameOrError = null; + try { + frameOrError = new VideoFrame( + new Uint8Array([ + 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 16, + ]), { + timestamp: 0, + codedWidth: 2, + codedHeight: 2, + format: 'RGBA', + }); + } catch (error) { + frameOrError = error + } + e.source.postMessage(frameOrError); + return; + } + + if (e.data == 'create-EncodedVideoChunk') { + let chunkOrError = null; + try { + chunkOrError = new EncodedVideoChunk({ + type: 'key', + timestamp: 0, + duration: 1, + data: new Uint8Array([2, 3, 4, 5]) + }); + } catch (error) { + chunkOrError = error + } + e.source.postMessage(chunkOrError); + return; + } + + if (e.data.hasOwnProperty('videoFrameId')) { + e.source.postMessage( + videoFrameMap.get(e.data.videoFrameId) ? 'RECEIVED' : 'NOT_RECEIVED'); + return; + } + + if (e.data.hasOwnProperty('encodedVideoChunkId')) { + e.source.postMessage( + encodedVideoChunkMap.get(e.data.encodedVideoChunkId) ? 'RECEIVED' : 'NOT_RECEIVED'); + return; + } + + if (e.data.toString() == '[object VideoFrame]') { + videoFrameMap.set(e.data.timestamp, e.data); + return; + } + + if (e.data.toString() == '[object EncodedVideoChunk]') { + encodedVideoChunkMap.set(e.data.timestamp, e.data); + } +}; diff --git a/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html b/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html index 27f624a8449..11b5e23124e 100644 --- a/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html +++ b/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.https.html @@ -58,7 +58,7 @@ const SAMEORIGIN_BASE = get_host_info().HTTPS_ORIGIN; const CROSSORIGIN_BASE = get_host_info().HTTPS_NOTSAMESITE_ORIGIN; const SAMEORIGIN_HELPER = SAMEORIGIN_BASE + HELPER; const CROSSORIGIN_HELPER = CROSSORIGIN_BASE + HELPER; -const SERVICE_WORKER = 'videoFrame-serialization.crossAgentCluster.serviceworker.js'; +const SERVICE_WORKER = 'serialization.crossAgentCluster.serviceworker.js'; promise_test(async () => { const target = (await appendIframe(SAMEORIGIN_HELPER)).contentWindow; @@ -118,7 +118,7 @@ promise_test(async () => { navigator.serviceWorker.ready.then((registration) => { let frame = createVideoFrame(60); registration.active.postMessage(frame); - registration.active.postMessage({'id': 60}); + registration.active.postMessage({'videoFrameId': 60}); }); const received = await new Promise(resolve => navigator.serviceWorker.onmessage = (e) => { resolve(e.data); @@ -185,7 +185,7 @@ promise_test(async () => { navigator.serviceWorker.ready.then((registration) => { let frame = createVideoFrame(120); registration.active.postMessage(frame, [frame]); - registration.active.postMessage({'id': 120}); + registration.active.postMessage({'videoFrameId': 120}); }); const received = await new Promise(resolve => navigator.serviceWorker.onmessage = (e) => { resolve(e.data); @@ -208,7 +208,7 @@ promise_test(async () => { promise_test(async () => { navigator.serviceWorker.register(SERVICE_WORKER); let registration = await navigator.serviceWorker.ready; - registration.active.postMessage('create-frame'); + registration.active.postMessage('create-VideoFrame'); const received = await new Promise(resolve => navigator.serviceWorker.onmessage = (e) => { resolve(e.data); }); diff --git a/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.serviceworker.js b/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.serviceworker.js deleted file mode 100644 index 9b963610bef..00000000000 --- a/testing/web-platform/tests/webcodecs/videoFrame-serialization.crossAgentCluster.serviceworker.js +++ /dev/null @@ -1,30 +0,0 @@ -const data = new Uint8Array([ - 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 13, 14, 15, 16, -]); -let received = new Map(); -self.onmessage = (e) => { - if (e.data == 'create-frame') { - let frameOrError = null; - try { - frameOrError = new VideoFrame(data, { - timestamp: 0, - codedWidth: 2, - codedHeight: 2, - format: 'RGBA', - }); - } catch (error) { - frameOrError = error - } - e.source.postMessage(frameOrError); - return; - } - if (e.data.hasOwnProperty('id')) { - e.source.postMessage( - received.get(e.data.id) ? 'RECEIVED' : 'NOT_RECEIVED'); - return; - } - if (e.data.toString() == '[object VideoFrame]') { - received.set(e.data.timestamp, e.data); - } -}; diff --git a/testing/web-platform/tests/webrtc-encoded-transform/routines.js b/testing/web-platform/tests/webrtc-encoded-transform/routines.js index 4db7f39621c..0d3e2b9b286 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/routines.js +++ b/testing/web-platform/tests/webrtc-encoded-transform/routines.js @@ -1,3 +1,64 @@ +async function getNextMessage(portOrWorker) { + return new Promise(resolve => { + const resolveWithData = event => resolve(event.data); + const rejectWithData = event => reject(event.data); + portOrWorker.addEventListener('message', resolveWithData, {once: true}); + portOrWorker.addEventListener('messageerror', rejectWithData, {once: true}); + }); +} + + +async function postMethod(port, method, options) { + port.postMessage(Object.assign({method}, options)); + return await getNextMessage(port); +} + +async function createWorker(script) { + const worker = new Worker(script); + const data = await getNextMessage(worker); + assert_equals(data, "registered"); + return worker; +} + +async function createTransform(worker) { + const channel = new MessageChannel; + const transform = new RTCRtpScriptTransform(worker, {name:'MockRTCRtpTransform', port: channel.port2}, [channel.port2]); + transform.port = channel.port1; + channel.port1.start(); + assert_equals(await getNextMessage(channel.port1), "started"); + return transform; +} + +async function createTransforms(script) { + const worker = await createWorker(script) + return Promise.all([createTransform(worker), createTransform(worker)]); +} + +async function createConnectionWithTransform(test, script, gumOptions) { + const [senderTransform, receiverTransform] = await createTransforms(script); + + const localStream = await navigator.mediaDevices.getUserMedia(gumOptions); + + let senderPc, receiverPc, sender, receiver; + + await createConnections(test, (firstConnection) => { + senderPc = firstConnection; + sender = firstConnection.addTrack(localStream.getTracks()[0], localStream); + sender.transform = senderTransform; + }, (secondConnection) => { + receiverPc = secondConnection; + secondConnection.ontrack = (trackEvent) => { + receiver = trackEvent.receiver; + receiver.transform = receiverTransform; + }; + }); + + assert_true(!!sender, "sender should be set"); + assert_true(!!receiver, "receiver should be set"); + + return {sender, receiver, senderPc, receiverPc}; +} + async function createConnections(test, setupLocalConnection, setupRemoteConnection, doNotCloseAutmoatically) { const localConnection = new RTCPeerConnection(); const remoteConnection = new RTCPeerConnection(); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-change-transform.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-change-transform.https.html index 9ec82a9484f..1bb0398dc5a 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/script-change-transform.https.html +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-change-transform.https.html @@ -37,7 +37,6 @@ promise_test(async (test) => { const stream = await new Promise((resolve, reject) => { createConnections(test, (firstConnection) => { sender = firstConnection.addTrack(localStream.getVideoTracks()[0], localStream); - firstConnection.getTransceivers()[0].setCodecPreferences([{mimeType: "video/VP8", clockRate: 90000}]); sender.transform = senderTransform1; }, (secondConnection) => { secondConnection.ontrack = (trackEvent) => { diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform-worker.js b/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform-worker.js index 03ba1f4ee6e..40f7e547d79 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform-worker.js +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform-worker.js @@ -4,6 +4,21 @@ onrtctransform = (event) => { transformer.reader = transformer.readable.getReader(); transformer.writer = transformer.writable.getWriter(); + async function waitForDetachAndPostMetadata(frame) { + while (true) { + if (frame.data.byteLength == 0) { + // frame.data has been detached! Verify metadata is still there. + self.postMessage({ + name: `${transformer.options.name} after write`, + timestamp: frame.timestamp, type: frame.type, + metadata: frame.getMetadata() + }); + return; + } + await new Promise(r => setTimeout(r, 100)); + } + } + let isFirstFrame = true; function process(transformer) { @@ -13,7 +28,13 @@ onrtctransform = (event) => { if (isFirstFrame) { isFirstFrame = false; - self.postMessage({ name: transformer.options.name, timestamp: chunk.value.timestamp, metadata: chunk.value.getMetadata() }); + self.postMessage({ + name: transformer.options.name, + timestamp: chunk.value.timestamp, + type: chunk.value.type, + metadata: chunk.value.getMetadata() + }); + waitForDetachAndPostMetadata(chunk.value); } transformer.writer.write(chunk.value); process(transformer); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform.https.html index c565caba7d4..11c88b46936 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform.https.html +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-metadata-transform.https.html @@ -1,16 +1,17 @@ - - - + + + + - - + + diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame-simulcast.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame-simulcast.https.html new file mode 100644 index 00000000000..4174aaf24a1 --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame-simulcast.https.html @@ -0,0 +1,136 @@ + + + + + RTCRtpScriptTransformer.generateKeyFrame simulcast tests + + + + + + + + + + + + + + + + + + + diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html new file mode 100644 index 00000000000..348902ea36c --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.https.html @@ -0,0 +1,229 @@ + + + + + RTCRtpScriptTransformer.generateKeyFrame tests + + + + + + + + + + + + + + + + + + diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js new file mode 100644 index 00000000000..5e68ee1fb9b --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-generateKeyFrame.js @@ -0,0 +1,70 @@ +onrtctransform = event => { + const transformer = event.transformer; + let keyFrameCount = 0; + let gotFrame; + + transformer.options.port.onmessage = event => { + const {method, rid} = event.data; + // Maybe refactor to have transaction ids? + if (method == 'generateKeyFrame') { + generateKeyFrame(rid); + } else if (method == 'waitForFrame') { + waitForFrame(); + } + } + + async function rejectInMs(timeout) { + return new Promise((_, reject) => { + const rejectWithTimeout = () => { + reject(new DOMException(`Timed out after waiting for ${timeout} ms`, + 'TimeoutError')); + }; + setTimeout(rejectWithTimeout, timeout); + }); + } + + async function generateKeyFrame(rid) { + try { + const timestamp = await Promise.race([transformer.generateKeyFrame(rid), rejectInMs(8000)]); + transformer.options.port.postMessage({result: 'success', value: timestamp, count: keyFrameCount}); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); + } + } + + async function waitForFrame() { + try { + await Promise.race([new Promise(r => gotFrameCallback = r), rejectInMs(8000)]); + transformer.options.port.postMessage('got frame'); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); + } + } + + transformer.options.port.postMessage('started'); + transformer.reader = transformer.readable.getReader(); + transformer.writer = transformer.writable.getWriter(); + + function process(transformer) + { + transformer.reader.read().then(chunk => { + if (chunk.done) + return; + if (chunk.value instanceof RTCEncodedVideoFrame) { + if (chunk.value.type == 'key') { + keyFrameCount++; + } + } + if (gotFrameCallback) { + gotFrameCallback(); + } + transformer.writer.write(chunk.value); + process(transformer); + }); + } + + process(transformer); +}; +self.postMessage('registered'); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.https.html new file mode 100644 index 00000000000..51b797eb683 --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.https.html @@ -0,0 +1,110 @@ + + + + + RTCRtpScriptTransformer.sendKeyFrameRequest tests + + + + + + + + + + + + + + diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.js b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.js new file mode 100644 index 00000000000..361d7ce0235 --- /dev/null +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-sendKeyFrameRequest.js @@ -0,0 +1,63 @@ +onrtctransform = event => { + const transformer = event.transformer; + let gotFrame; + + transformer.options.port.onmessage = event => { + const {method} = event.data; + if (method == 'sendKeyFrameRequest') { + sendKeyFrameRequest(); + } else if (method == 'waitForFrame') { + waitForFrame(); + } + } + + async function rejectInMs(timeout) { + return new Promise((_, reject) => { + const rejectWithTimeout = () => { + reject(new DOMException(`Timed out after waiting for ${timeout} ms`, + 'TimeoutError')); + }; + setTimeout(rejectWithTimeout, timeout); + }); + } + + async function sendKeyFrameRequest() { + try { + await Promise.race([transformer.sendKeyFrameRequest(), rejectInMs(8000)]);; + transformer.options.port.postMessage('success'); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage(`failure: ${e.name}`); + } + } + + async function waitForFrame() { + try { + await Promise.race([new Promise(r => gotFrameCallback = r), rejectInMs(8000)]); + transformer.options.port.postMessage('got frame'); + } catch (e) { + // TODO: This does not work if we send e.name, why? + transformer.options.port.postMessage({result: 'failure', value: `${e.name}`, message: `${e.message}`}); + } + } + + transformer.options.port.postMessage('started'); + transformer.reader = transformer.readable.getReader(); + transformer.writer = transformer.writable.getWriter(); + + function process(transformer) + { + transformer.reader.read().then(chunk => { + if (chunk.done) + return; + if (gotFrameCallback) { + gotFrameCallback(); + } + transformer.writer.write(chunk.value); + process(transformer); + }); + } + + process(transformer); +}; +self.postMessage('registered'); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-worker.js b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-worker.js index 5ea99cd2bf7..88efb9c6a38 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/script-transform-worker.js +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform-worker.js @@ -1,8 +1,12 @@ onrtctransform = (event) => { const transformer = event.transformer; - transformer.options.port.onmessage = (event) => transformer.options.port.postMessage(event.data); + transformer.options.port.onmessage = (event) => { + if (event.data == "ping") { + transformer.options.port.postMessage("pong"); + } + }; - self.postMessage("started"); + transformer.options.port.postMessage("started"); transformer.reader = transformer.readable.getReader(); transformer.writer = transformer.writable.getWriter(); @@ -11,10 +15,14 @@ onrtctransform = (event) => { transformer.reader.read().then(chunk => { if (chunk.done) return; - if (chunk.value instanceof RTCEncodedVideoFrame) - self.postMessage("video chunk"); + if (chunk.value instanceof RTCEncodedVideoFrame) { + transformer.options.port.postMessage("video chunk"); + if (chunk.value.type == "key") { + transformer.options.port.postMessage("video keyframe"); + } + } else if (chunk.value instanceof RTCEncodedAudioFrame) - self.postMessage("audio chunk"); + transformer.options.port.postMessage("audio chunk"); transformer.writer.write(chunk.value); process(transformer); }); diff --git a/testing/web-platform/tests/webrtc-encoded-transform/script-transform.https.html b/testing/web-platform/tests/webrtc-encoded-transform/script-transform.https.html index e02982f4703..491e917e861 100644 --- a/testing/web-platform/tests/webrtc-encoded-transform/script-transform.https.html +++ b/testing/web-platform/tests/webrtc-encoded-transform/script-transform.https.html @@ -13,140 +13,47 @@ diff --git a/testing/web-platform/tests/webrtc/simulcast/setParameters-active.https.html b/testing/web-platform/tests/webrtc/simulcast/setParameters-active.https.html index dbe162c610e..54191059a06 100644 --- a/testing/web-platform/tests/webrtc/simulcast/setParameters-active.https.html +++ b/testing/web-platform/tests/webrtc/simulcast/setParameters-active.https.html @@ -12,14 +12,16 @@