From 7deff43da8fff79ffb9f78c836f76d551b64efcb Mon Sep 17 00:00:00 2001 From: "github-action[bot]" Date: Sat, 25 Mar 2023 19:47:49 +0100 Subject: [PATCH] Update On Sat Mar 25 19:47:48 CET 2023 --- Cargo.lock | 47 +- Cargo.toml | 3 - accessible/base/EventQueue.cpp | 20 +- accessible/base/EventQueue.h | 2 +- accessible/base/NotificationController.cpp | 4 +- accessible/base/RoleMap.h | 2 +- accessible/mac/AccessibleWrap.mm | 3 + accessible/mac/mozActionElements.h | 7 + accessible/mac/mozActionElements.mm | 8 + .../browser/mac/browser_roles_elements.js | 9 + .../mochitest/events/test_namechange.html | 12 +- browser/actors/AboutReaderChild.sys.mjs | 20 +- browser/actors/AboutReaderParent.sys.mjs | 6 +- .../actors/SearchSERPTelemetryChild.sys.mjs | 445 ++++- .../actors/SearchSERPTelemetryParent.sys.mjs | 11 +- browser/base/content/browser-addons.js | 12 +- browser/base/content/browser.js | 5 +- browser/base/content/browser.xhtml | 1 + .../base/content/navigator-toolbox.inc.xhtml | 8 + browser/base/content/popup-notifications.inc | 7 +- browser/base/content/tabbrowser.js | 46 +- .../performance/browser_startup_content.js | 2 +- .../performance/browser_startup_images.js | 7 - browser/base/content/test/tabs/browser.ini | 36 + ..._tab_title_and_url_prefilled_blank_page.js | 139 ++ ..._tab_title_and_url_prefilled_new_window.js | 54 + ..._url_prefilled_normal_page_blank_target.js | 180 ++ ...and_url_prefilled_normal_page_by_script.js | 75 + ...and_url_prefilled_normal_page_no_target.js | 77 + ..._url_prefilled_normal_page_other_target.js | 138 ++ ...mon_link_in_tab_title_and_url_prefilled.js | 195 ++ .../link_in_tab_title_and_url_prefilled.html | 30 + .../content/test/tabs/request-timeout.sjs | 8 + browser/base/content/test/tabs/wait-a-bit.sjs | 23 + browser/base/content/webext-panels.js | 2 - .../browser/browser_originattrs_reopenin.js | 2 +- .../downloads/DownloadsViewUI.sys.mjs | 2 +- .../components/downloads/content/downloads.js | 42 +- .../downloads/test/browser/browser.ini | 57 +- ...rowser_downloads_context_menu_selection.js | 115 ++ .../browser_downloads_panel_context_menu.js | 7 +- .../components/extensions/ExtensionPopups.jsm | 2 - .../extensions/test/browser/browser.ini | 2 + ...wser_ext_optionsPage_links_open_in_tabs.js | 68 + .../browser_ext_popup_links_open_in_tabs.js | 56 + .../firefox-view-tabs-setup-manager.sys.mjs | 157 +- .../firefoxview/tab-pickup-container.mjs | 25 +- .../browser/FirefoxViewTestUtils.sys.mjs | 5 + .../firefoxview/tests/browser/browser.ini | 2 + ...rowser_firefoxview_feature_callout_a11y.js | 12 +- .../browser/browser_setup_primary_password.js | 6 +- .../browser_setup_synced_tabs_loading.js | 2 +- ...owser_tab_pickup_device_added_telemetry.js | 278 +++ .../tests/browser/browser_tab_pickup_list.js | 65 +- .../browser/browser_tab_pickup_visibility.js | 149 ++ .../firefoxview/tests/browser/head.js | 16 + browser/components/migration/.eslintrc.js | 2 +- .../migration/MigrationWizardParent.sys.mjs | 8 +- .../tests/browser/browser_do_migration.js | 36 +- .../content/aboutwelcome.bundle.js | 3 +- .../components/MultiStageProtonScreen.jsx | 2 +- .../CustomizeMenu/_CustomizeMenu.scss | 5 +- .../newtab/css/activity-stream-linux.css | 6 +- .../newtab/css/activity-stream-mac.css | 6 +- .../newtab/css/activity-stream-windows.css | 6 +- browser/components/pagedata/.eslintrc.js | 2 +- browser/components/places/.eslintrc.js | 2 +- browser/components/pocket/content/pktUI.js | 6 +- .../components/preferences/privacy.inc.xhtml | 2 +- browser/components/preferences/sync.inc.xhtml | 3 +- .../test/test_registerHandler.html | 2 +- .../test/mochitest/test_animation_api.html | 2 +- .../mochitest/test_device_sensor_event.html | 2 +- .../test/mochitest/test_geolocation.html | 4 +- .../test/mochitest/test_keyboard_event.html | 2 +- .../test/mochitest/test_pointer_event.html | 2 +- .../test/mochitest/test_speech_synthesis.html | 2 +- browser/components/search/.eslintrc.js | 2 +- .../search/SearchSERPTelemetry.sys.mjs | 51 + browser/components/search/metrics.yaml | 38 + .../search/test/browser/browser.ini | 10 + ...search_telemetry_adImpression_component.js | 272 +++ .../components/search/test/browser/head.js | 25 + ...searchTelemetryAd_components_carousel.html | 115 ++ ...Ad_components_carousel_below_the_fold.html | 83 + ...lemetryAd_components_carousel_doubled.html | 182 ++ ...ts_carousel_first_element_non_visible.html | 85 + ...elemetryAd_components_carousel_hidden.html | 67 + ...d_components_carousel_outer_container.html | 83 + .../components/search/test/browser/serp.css | 164 ++ .../sessionstore/ContentSessionStore.sys.mjs | 2 +- .../sessionstore/SessionStore.sys.mjs | 2 +- browser/components/shell/ShellService.jsm | 2 +- .../components/shell/nsMacShellService.cpp | 3 +- browser/components/touchbar/MacTouchBar.jsm | 6 + browser/components/urlbar/.eslintrc.js | 2 +- browser/components/urlbar/UrlbarInput.sys.mjs | 5 +- browser/extensions/formautofill/.eslintrc.js | 2 - .../extensions/report-site-issue/.eslintrc.js | 2 - .../js/bug1448747-fastclick-shim.js | 2 +- .../js/bug1818818-fastclick-legacy-shim.js | 2 +- browser/locales-preview/migrationWizard.ftl | 10 +- browser/locales-preview/translations.ftl | 7 + browser/locales/en-US/browser/browser.ftl | 4 + .../en-US/chrome/browser/browser.properties | 1 - browser/locales/jar.mn | 1 + browser/locales/l10n-changesets.json | 182 +- browser/modules/FeatureCallout.sys.mjs | 6 +- browser/themes/BuiltInThemeConfig.sys.mjs | 1 + browser/themes/shared/browser-shared.css | 11 +- browser/themes/shared/icons/translations.svg | 6 + browser/themes/shared/jar.inc.mn | 1 + .../shared/migration/migration-wizard.css | 11 +- browser/themes/shared/urlbar-searchbar.css | 11 + build/debian-packages/mercurial-timeout.diff | 38 + build/moz.configure/android-ndk.configure | 48 +- build/rust/nom/Cargo.toml | 15 - build/rust/nom/lib.rs | 26 - build/unix/build-binutils/build-binutils.sh | 2 +- caps/tests/mochitest/test_addonMayLoad.html | 2 +- caps/tests/mochitest/test_bug246699.html | 6 +- caps/tests/mochitest/test_bug292789.html | 20 +- caps/tests/mochitest/test_bug423375.html | 6 +- caps/tests/mochitest/test_bug470804.html | 2 +- caps/tests/mochitest/test_bug995943.xhtml | 2 +- caps/tests/mochitest/test_disableScript.xhtml | 2 +- .../test_disallowInheritPrincipal.html | 2 +- config/external/icu/data/icudt72l.dat | Bin 14970448 -> 14970464 bytes config/makefiles/rust.mk | 22 +- .../src/actions/debug-targets.js | 7 +- .../TemporaryExtensionAdditionalActions.js | 17 +- .../src/modules/client-wrapper.js | 9 + .../src/modules/extensions-helper.js | 14 - ...er_aboutdebugging_addons_remote_runtime.js | 24 +- .../mocks/helper-client-wrapper-mock.js | 2 + .../debugger/test/mochitest/browser.ini | 1 + .../mochitest/browser_dbg-worker-module.js | 19 + .../mochitest/examples/doc-module-worker.html | 10 + devtools/client/themes/rules.css | 7 +- devtools/server/actors/addon/addons.js | 12 +- devtools/server/actors/root.js | 3 + .../server/tests/xpcshell/test_webext_apis.js | 31 +- devtools/shared/specs/addon/addons.js | 7 + .../processes/fixing-security-bugs.rst | 10 +- docs/conf.py | 2 + docshell/test/browser/browser.ini | 1 + docshell/test/browser/browser_bug655273.js | 2 +- docshell/test/chrome/bug113934_window.xhtml | 2 +- docshell/test/chrome/bug449778_window.xhtml | 2 +- docshell/test/chrome/bug449780_window.xhtml | 2 +- docshell/test/chrome/test_bug112564.xhtml | 2 +- docshell/test/chrome/test_bug215405.xhtml | 2 +- docshell/test/chrome/test_bug293235.xhtml | 2 +- docshell/test/chrome/test_bug294258.xhtml | 2 +- docshell/test/chrome/test_bug298622.xhtml | 2 +- docshell/test/chrome/test_bug301397.xhtml | 2 +- docshell/test/chrome/test_bug303267.xhtml | 2 +- docshell/test/chrome/test_bug311007.xhtml | 2 +- docshell/test/chrome/test_bug321671.xhtml | 2 +- docshell/test/chrome/test_bug360511.xhtml | 2 +- docshell/test/chrome/test_bug364461.xhtml | 2 +- docshell/test/chrome/test_bug396519.xhtml | 2 +- docshell/test/chrome/test_bug396649.xhtml | 2 +- docshell/test/chrome/test_bug428288.html | 2 +- docshell/test/chrome/test_bug453650.xhtml | 2 +- docshell/test/chrome/test_bug454235.xhtml | 2 +- docshell/test/chrome/test_bug565388.xhtml | 2 +- docshell/test/chrome/test_bug582176.xhtml | 2 +- docshell/test/chrome/test_bug608669.xhtml | 2 +- docshell/test/chrome/test_bug662200.xhtml | 2 +- docshell/test/chrome/test_bug690056.xhtml | 2 +- docshell/test/chrome/test_bug846906.xhtml | 2 +- docshell/test/chrome/test_bug89419.xhtml | 2 +- docshell/test/chrome/test_bug92598.xhtml | 2 +- docshell/test/chrome/test_mozFrameType.xhtml | 2 +- docshell/test/mochitest/historyframes.html | 2 +- ...est_anchor_scroll_after_document_open.html | 2 +- .../mochitest/test_bfcache_plus_hash.html | 2 +- docshell/test/mochitest/test_bug1045096.html | 2 +- docshell/test/mochitest/test_bug1121701.html | 2 +- docshell/test/mochitest/test_bug1151421.html | 2 +- docshell/test/mochitest/test_bug1186774.html | 2 +- docshell/test/mochitest/test_bug1450164.html | 2 +- docshell/test/mochitest/test_bug385434.html | 2 +- docshell/test/mochitest/test_bug387979.html | 2 +- docshell/test/mochitest/test_bug404548.html | 2 +- docshell/test/mochitest/test_bug413310.html | 2 +- docshell/test/mochitest/test_bug509055.html | 2 +- docshell/test/mochitest/test_bug511449.html | 2 +- docshell/test/mochitest/test_bug540462.html | 2 +- docshell/test/mochitest/test_bug551225.html | 2 +- docshell/test/mochitest/test_bug598895.html | 2 +- docshell/test/mochitest/test_bug637644.html | 2 +- docshell/test/mochitest/test_bug653741.html | 2 +- docshell/test/mochitest/test_bug660404.html | 2 +- docshell/test/mochitest/test_bug662170.html | 2 +- docshell/test/mochitest/test_bug669671.html | 4 +- docshell/test/mochitest/test_bug675587.html | 2 +- docshell/test/mochitest/test_bug694612.html | 2 +- docshell/test/mochitest/test_bug703855.html | 2 +- docshell/test/mochitest/test_bug797909.html | 2 +- .../mochitest/test_compressed_multipart.html | 2 +- .../mochitest/test_framedhistoryframes.html | 2 +- .../test_pushState_after_document_open.html | 2 +- .../mochitest/test_windowedhistoryframes.html | 2 +- docshell/test/navigation/test_bug1364364.html | 2 +- docshell/test/navigation/test_bug344861.html | 2 +- docshell/test/navigation/test_bug386782.html | 2 +- docshell/test/navigation/test_bug430624.html | 2 +- docshell/test/navigation/test_bug430723.html | 2 +- .../test_rate_limit_location_change.html | 2 +- dom/base/Document.cpp | 20 +- dom/base/nsContentAreaDragDrop.cpp | 6 +- dom/base/nsFocusManager.cpp | 2 +- dom/base/nsLineBreaker.cpp | 59 +- dom/events/EventNameList.h | 1 + dom/fs/api/FileSystemManager.cpp | 35 +- dom/fs/api/FileSystemWritableFileStream.cpp | 25 +- dom/fs/child/FileSystemManagerChild.cpp | 40 +- dom/fs/child/FileSystemManagerChild.h | 8 +- dom/fs/child/FileSystemShutdownBlocker.cpp | 167 ++ dom/fs/child/moz.build | 1 + dom/fs/include/fs/FileSystemShutdownBlocker.h | 33 + dom/fs/test/crashtests/1816710.html | 8 + dom/fs/test/crashtests/crashtests.list | 1 + .../child/TestFileSystemRequestHandler.cpp | 82 +- dom/html/nsGenericHTMLElement.cpp | 91 +- dom/html/nsGenericHTMLElement.h | 28 +- dom/ipc/ContentParent.h | 6 - dom/ipc/ProcessIsolation.cpp | 2 + dom/ipc/WindowGlobalParent.cpp | 17 +- dom/ipc/WindowGlobalParent.h | 9 +- .../fuzztest/content_parent_ipc_libfuzz.cpp | 33 - dom/ipc/fuzztest/moz.build | 20 - dom/ipc/jsactor/JSWindowActorChild.cpp | 22 +- dom/ipc/moz.build | 3 - dom/ipc/tests/browser_CrashService_crash.js | 2 +- .../accessibility/mac/accessible.properties | 2 + dom/media/ExternalEngineStateMachine.h | 2 + dom/media/MediaDataDemuxer.h | 2 +- dom/media/MediaDecoder.cpp | 23 +- dom/media/MediaDecoderStateMachineBase.h | 2 + dom/media/MediaFormatReader.cpp | 12 +- dom/media/webrtc/jsapi/PeerConnectionImpl.cpp | 15 +- .../fast-forward-libwebrtc.sh | 22 +- .../third_party_build/filter_git_changes.py | 72 + dom/media/webrtc/third_party_build/loop-ff.sh | 8 +- .../third_party_build/vendor-libwebrtc.py | 260 ++- dom/streams/ReadableStream.cpp | 41 +- dom/streams/ReadableStream.h | 15 +- dom/streams/Transferable.cpp | 6 +- dom/svg/test/mochitest.ini | 36 +- dom/tests/mochitest/webcomponents/chrome.ini | 1 + ..._custom_element_ensure_custom_element.html | 55 + dom/webauthn/WebAuthnController.cpp | 4 +- .../nsIWebBrowserPersist.idl | 25 +- dom/webbrowserpersist/nsWebBrowserPersist.cpp | 15 +- dom/webgpu/ipc/WebGPUParent.cpp | 30 +- dom/webidl/EventHandler.webidl | 2 + dom/webidl/HTMLButtonElement.webidl | 2 + dom/webidl/HTMLInputElement.webidl | 2 + dom/webidl/PopoverInvokerElement.webidl | 13 + dom/webidl/moz.build | 4 + .../api/WebTransportReceiveStream.cpp | 18 +- .../api/WebTransportReceiveStream.h | 15 +- .../api/WebTransportSendStream.cpp | 17 +- dom/webtransport/api/WebTransportSendStream.h | 14 +- dom/workers/ScriptLoader.cpp | 4 +- .../loader/ScriptResponseHeaderProcessor.cpp | 14 + .../loader/ScriptResponseHeaderProcessor.h | 22 +- dom/workers/loader/WorkerModuleLoader.cpp | 3 +- dom/workers/test/importScripts_worker.js | 2 +- .../tests/mochitest/test_bug1170484.html | 2 +- .../tests/mochitest/test_bug1272623.html | 2 +- .../tests/test_bug1071816-1.html | 2 +- .../tests/test_bug1071816-2.html | 2 +- .../tests/test_bug1071816-3.html | 2 +- .../tests/test_bug1071816-4.html | 2 +- .../tests/test_bug306272.html | 2 +- .../tests/test_bug426271-euc-jp.html | 2 +- .../tests/test_bug426271-utf-8.html | 2 +- .../tests/test_bug431054-japanese.html | 2 +- .../tests/test_bug431054.html | 2 +- .../tests/test_bug631751be.html | 2 +- .../tests/test_bug631751le.html | 2 +- .../tests/test_bug638318.html | 2 +- .../tests/test_bug811363-1-1.html | 2 +- .../tests/test_bug811363-1-5.html | 2 +- .../tests/test_bug811363-2-1.html | 2 +- .../tests/test_bug811363-2-2.html | 2 +- .../tests/test_bug811363-2-3.html | 2 +- .../tests/test_bug811363-2-4.html | 2 +- .../tests/test_bug811363-2-5.html | 2 +- .../tests/test_bug811363-2-6.html | 2 +- .../tests/test_bug811363-2-7.html | 2 +- .../tests/test_bug811363-2-8.html | 2 +- .../tests/test_bug811363-2-9.html | 2 +- gfx/gl/GLBlitHelperD3D.cpp | 2 + gfx/gl/GLContextProviderWGL.cpp | 1 + gfx/gl/SharedSurfaceD3D11Interop.cpp | 4 + gfx/gl/SharedSurfaceD3D11Interop.h | 1 + gfx/gl/moz.build | 1 - gfx/layers/SurfacePoolCA.h | 1 + gfx/layers/SurfacePoolCA.mm | 1 + .../apz/test/mochitest/helper_bug1299195.html | 2 +- .../apz/test/mochitest/helper_bug1414336.html | 2 +- gfx/layers/ipc/CompositorBridgeParent.h | 6 - .../compositor_manager_parent_ipc_libfuzz.cpp | 37 - gfx/layers/ipc/fuzztest/moz.build | 16 - gfx/layers/moz.build | 4 - gfx/tests/mochitest/test_bug509244.html | 2 +- gfx/tests/mochitest/test_bug513439.html | 2 +- gfx/tests/mochitest/test_font_whitelist.html | 2 +- gfx/thebes/gfxDWriteFontList.cpp | 4 + gfx/thebes/gfxFont.cpp | 7 +- gfx/thebes/gfxFontMissingGlyphs.cpp | 16 +- gfx/thebes/gfxFontMissingGlyphs.h | 3 - gfx/thebes/gfxPlatformGtk.cpp | 8 +- gfx/thebes/moz.build | 1 - .../RenderCompositorD3D11SWGL.cpp | 36 +- .../RenderCompositorD3D11SWGL.h | 7 +- .../RenderD3D11TextureHost.cpp | 6 +- .../RenderD3D11TextureHost.h | 2 + gfx/webrender_bindings/moz.build | 1 - gfx/wgpu_bindings/Cargo.toml | 1 + gfx/wgpu_bindings/src/server.rs | 12 +- gfx/wr/webrender/res/prim_shared.glsl | 3 +- image/decoders/nsJPEGDecoder.cpp | 19 + image/decoders/nsJPEGDecoder.h | 1 + image/test/crashtests/1277397-2.jpg | Bin 0 -> 1407 bytes image/test/crashtests/crashtests.list | 1 + .../jpeg/jpg-progressive-1000-ref.html | 1 + .../reftest/jpeg/jpg-progressive-1000.html | 1 + .../reftest/jpeg/jpg-progressive-1000.jpg | Bin 0 -> 34409 bytes image/test/reftest/jpeg/reftest.list | 3 + intl/components/moz.build | 1 + intl/components/src/GeneralCategory.h | 52 + intl/components/src/UnicodeProperties.h | 8 +- intl/icu-patches/bug-1818103-CLDR-16399.diff | 39 + intl/icu/source/data/locales/en_CA.txt | 10 +- intl/unicharutil/util/nsUnicodeProperties.h | 5 +- intl/update-icu.sh | 1 + ipc/chromium/src/base/pickle.cc | 60 +- ipc/chromium/src/base/pickle.h | 3 - .../src/chrome/common/ipc_channel_posix.cc | 12 - .../src/chrome/common/ipc_channel_win.cc | 9 - ipc/chromium/src/chrome/common/ipc_message.h | 10 - ipc/glue/MessageChannel.h | 3 - ipc/glue/ProtocolUtils.h | 8 - ipc/glue/Shmem.h | 10 - .../browser_audio_telemetry_content.js | 7 +- .../browser/browser_audio_telemetry_rdd.js | 5 +- .../browser_utility_hard_kill_delayed.js | 4 + ipc/glue/test/browser/head-telemetry.js | 39 +- ipc/glue/test/browser/head.js | 8 + .../UtilityProcessTest.cpp | 7 + .../nsIUtilityProcessTest.idl | 7 + js/examples/jorendb.js | 6 +- js/loader/ModuleLoaderBase.cpp | 8 +- js/public/friend/StackLimits.h | 2 +- js/src/builtin/Array.cpp | 26 +- js/src/builtin/RegExp.cpp | 2 + js/src/devtools/rootAnalysis/CFG.js | 46 +- js/src/devtools/rootAnalysis/analyze.py | 14 +- js/src/devtools/rootAnalysis/analyzeRoots.js | 122 +- js/src/devtools/rootAnalysis/callgraph.js | 31 +- .../devtools/rootAnalysis/computeCallgraph.js | 23 +- js/src/devtools/rootAnalysis/dumpCFG.js | 14 +- js/src/devtools/rootAnalysis/loadCallgraph.js | 6 +- js/src/devtools/rootAnalysis/mach_commands.py | 212 +- js/src/devtools/rootAnalysis/utility.js | 11 +- js/src/doc/HazardAnalysis/running.md | 8 +- js/src/gc/GCAPI.cpp | 2 +- js/src/gc/HashUtil.h | 5 +- js/src/gc/Zone.cpp | 2 - js/src/gc/Zone.h | 4 - js/src/irregexp/RegExpShim.h | 2 +- js/src/jit-test/jit_test.py | 16 - .../jit-test/lib/adhoc-multiplatform-test.js | 2 +- js/src/jit-test/lib/codegen-x64-test.js | 2 +- js/src/jit-test/tests/basic/bug1822962.js | 2 + .../tests/cacheir/construct-bound-realm.js | 10 + .../tests/wasm/binop-x64-ion-codegen.js | 14 +- .../tests/wasm/binop-x64-ion-folding.js | 40 +- .../function-references/non-nullable-table.js | 79 + .../wasm/function-references/non-nullable.js | 4 +- .../wasm/function-references/reftype-parse.js | 51 + .../tests/wasm/ion-adhoc-multiplatform.js | 78 +- .../wasm/ref-types/externref-global-object.js | 2 +- js/src/jit/BaselineCacheIRCompiler.cpp | 113 +- js/src/jit/BaselineCacheIRCompiler.h | 15 +- js/src/jit/JitOptions.cpp | 1 + js/src/jit/JitOptions.h | 1 + js/src/jit/LIR.cpp | 3 + js/src/jit/VMFunctionList-inl.h | 1 - js/src/jit/arm64/Lowering-arm64.cpp | 6 +- js/src/jit/x64/BaseAssembler-x64.h | 2 +- js/src/shell/js.cpp | 19 +- js/src/tests/lib/jittests.py | 17 - js/src/tests/lib/progressbar.py | 12 +- js/src/vm/StringType.h | 4 - js/src/wasm/AsmJS.cpp | 1 + js/src/wasm/WasmConstants.h | 3 + js/src/wasm/WasmInstance.cpp | 37 +- js/src/wasm/WasmJS.cpp | 86 +- js/src/wasm/WasmJS.h | 3 - js/src/wasm/WasmModule.cpp | 2 +- js/src/wasm/WasmModuleTypes.h | 14 +- js/src/wasm/WasmSerialize.cpp | 7 +- js/src/wasm/WasmTable.cpp | 58 +- js/src/wasm/WasmTable.h | 7 + js/src/wasm/WasmValType.cpp | 169 +- js/src/wasm/WasmValType.h | 3 +- js/src/wasm/WasmValidate.cpp | 54 +- layout/base/nsLayoutUtils.cpp | 6 +- layout/base/tests/mochitest.ini | 1 + layout/forms/nsCheckboxRadioFrame.cpp | 4 + layout/forms/nsHTMLButtonControlFrame.cpp | 4 +- layout/generic/nsBlockFrame.cpp | 4 +- layout/generic/nsGfxScrollFrame.cpp | 122 +- layout/generic/nsGfxScrollFrame.h | 10 +- layout/generic/nsIFrame.cpp | 3 + layout/generic/nsImageFrame.cpp | 291 ++- layout/generic/nsImageFrame.h | 18 - layout/generic/nsLineLayout.cpp | 26 +- layout/generic/nsTextFrame.cpp | 41 +- .../backplate-force-color-adjust-ref.html | 15 + .../backplate-force-color-adjust.html | 16 + layout/reftests/high-contrast/reftest.list | 3 + .../svg-integration/clip-path/reftest.list | 2 +- .../text-transform/capitalize-9-ref.html | 9 + .../reftests/text-transform/capitalize-9.html | 9 + layout/reftests/text-transform/reftest.list | 1 + layout/style/ServoStyleConstsInlines.h | 4 +- layout/style/URLExtraData.cpp | 20 +- layout/style/test/mochitest.ini | 108 +- layout/style/test/property_database.js | 4 +- .../test_non_content_accessible_env_vars.html | 25 +- ...est_non_content_accessible_properties.html | 47 +- layout/style/test/test_revert.html | 2 - layout/tables/nsTableFrame.cpp | 19 +- layout/tables/nsTableRowFrame.cpp | 10 +- layout/tables/nsTableRowFrame.h | 2 +- layout/tables/nsTableWrapperFrame.cpp | 5 +- media/libcubeb/src/moz.build | 1 + .../web_extensions/test-support/background.js | 6 + .../web_extensions/test-support/test-api.js | 50 +- .../test-support/test-schema.json | 26 + .../mozilla/geckoview/test/BaseSessionTest.kt | 6 + .../geckoview/test/ContentDelegateTest.kt | 47 + .../test/rule/GeckoSessionTestRule.java | 8 + .../java/org/mozilla/gecko/GeckoAppShell.java | 8 +- modules/libpref/init/StaticPrefList.yaml | 52 +- modules/libpref/init/all.js | 8 +- .../libpref/init/generate_static_pref_list.py | 56 +- modules/libpref/init/static_prefs/Cargo.toml | 1 + .../test/test_generate_static_pref_list.py | 22 + .../core/shared-libraries-win32.cc | 213 +- .../public/BaseProfilerSharedLibraries.h | 9 + netwerk/base/nsNetUtil.cpp | 13 +- netwerk/protocol/about/nsAboutProtocolUtils.h | 15 +- netwerk/protocol/http/Http3Session.cpp | 9 +- netwerk/protocol/http/HttpBaseChannel.cpp | 3 +- ...g_1813077_popup_notification_learn_more.py | 22 + python/mozboot/mozboot/android.py | 11 +- .../mozbuild/action/file_generate_wrapper.py | 6 +- .../mozbuild/mozbuild/vendor/vendor_rust.py | 2 + .../mozperftest/mozperftest/system/android.py | 25 +- .../mozperftest/system/android_startup.py | 9 +- .../mozperftest/tests/test_android.py | 79 +- .../mozperftest/tests/test_android_startup.py | 60 +- python/sites/docs.txt | 36 +- remote/cdp/test/browser/head.js | 8 +- .../network/browser_setCacheDisabled.js | 6 +- .../runtime/browser_consoleAPICalled.js | 8 +- remote/marionette/driver.sys.mjs | 13 +- remote/shared/PDF.sys.mjs | 4 - security/.eslintrc.js | 2 - security/manager/ssl/StaticHPKPins.h | 2 +- .../sandbox/win/src/sandbox_nt_util.cc | 15 + .../dumps/main/cookie-banner-rules-list.json | 29 +- .../dumps/security-state/intermediates.json | 164 +- services/sync/modules/engines/tabs.sys.mjs | 2 +- .../style/properties/longhands/ui.mako.rs | 2 +- servo/components/style/values/computed/ui.rs | 13 - servo/components/style/values/generics/ui.rs | 9 + supply-chain/audits.toml | 46 + supply-chain/config.toml | 24 - supply-chain/imports.lock | 60 +- taskcluster/ci/build-fat-aar/kind.yml | 1 + taskcluster/ci/build/android.yml | 1 + taskcluster/ci/fetch/toolchains.yml | 2 +- taskcluster/ci/packages/debian.yml | 1 + taskcluster/ci/packages/ubuntu.yml | 2 + taskcluster/ci/test/browsertime-desktop.yml | 24 + taskcluster/ci/test/kind.yml | 1 - taskcluster/ci/test/mochitest.yml | 4 +- taskcluster/ci/test/raptor.yml | 90 - taskcluster/ci/test/test-platforms.yml | 1 - taskcluster/ci/test/test-sets.yml | 7 +- taskcluster/ci/test/web-platform.yml | 1 - taskcluster/ci/toolchain/rust.yml | 20 - taskcluster/ci/webrender/kind.yml | 4 +- taskcluster/docker/decision/VERSION | 2 +- taskcluster/docker/partner-repack/known_hosts | 5 +- .../docker/periodic-updates/.eslintrc.js | 2 - .../test/test_optimize_strategies.py | 2 +- .../scripts/builder/build-haz-linux.sh | 10 +- taskcluster/scripts/misc/fetch-content | 4 +- testing/condprofile/condprof/creator.py | 5 + testing/mochitest/ignorePrefs.json | 23 +- .../external_tools/robustcheckout.py | 67 +- .../mozharness/mozilla/testing/raptor.py | 13 +- testing/perfdocs/generated/raptor.rst | 936 ++++++++- testing/profiles/reftest/user.js | 3 + testing/raptor/raptor/output.py | 96 +- testing/raptor/raptor/results.py | 23 +- .../tests/benchmarks/youtube-playback.ini | 16 + ...ble-inline-block-baseline-vert-rl.html.ini | 2 - .../color-valid-color-mix-function.html.ini | 381 ---- .../negative-overflow-002.html.ini | 20 +- ...id-content-alignment-overflow-002.html.ini | 3 +- .../baseline-source-first-002.html.ini | 11 +- .../baseline-source-first-003.html.ini | 12 - .../baseline-source-last-002.html.ini | 13 +- .../baseline-source-last-003.html.ini | 9 - .../mask-image/mask-image-2.html.ini | 2 - .../scrollable-overflow-padding.html.ini | 30 +- ...rollable-overflow-self-collapsing.html.ini | 2 +- ...scrollable-overflow-transform-001.html.ini | 4 +- ...scrollable-overflow-transform-002.html.ini | 4 +- ...scrollable-overflow-transform-003.html.ini | 4 +- ...scrollable-overflow-zero-one-axis.html.ini | 10 +- .../inline-block-alignment-002.xht.ini | 3 - .../inline-block-alignment-003.xht.ini | 3 - .../inline-block-alignment-004.xht.ini | 3 - .../inline-block-alignment-005.xht.ini | 3 - .../inline-table-alignment-002.xht.ini | 3 - .../inline-table-alignment-003.xht.ini | 3 - .../inline-table-alignment-004.xht.ini | 3 - .../inline-table-alignment-005.xht.ini | 3 - .../popovers/popover-attribute-basic.html.ini | 6 - ...opover-beforetoggle-opening-event.html.ini | 3 - .../popovers/popover-focus-2.html.ini | 3 + .../popover-focus-child-dialog.html.ini | 5 +- .../popovers/popover-light-dismiss.html.ini | 8 +- .../popover-not-keyboard-focusable.html.ini | 3 - .../popovers/popover-shadow-dom.html.ini | 3 - .../popover-top-layer-interactions.html.ini | 22 +- .../meta/infrastructure/server/__dir__.ini | 1 + .../webtransport-h3.https.sub.any.js.ini | 27 +- ...mation-timeline-ignored.tentative.html.ini | 2 +- .../meta/webtransport/__dir__.ini | 4 + .../meta/webtransport/close.https.any.js.ini | 57 +- .../webtransport/connect.https.any.js.ini | 100 +- .../webtransport/constructor.https.any.js.ini | 209 +- .../webtransport/csp-fail.https.window.js.ini | 3 +- .../webtransport/csp-pass.https.window.js.ini | 6 +- .../datagram-cancel-crash.https.window.js.ini | 5 +- .../webtransport/datagrams.https.any.js.ini | 88 +- .../webtransport/idlharness.https.any.js.ini | 938 --------- .../in-removed-iframe.https.html.ini | 7 +- .../streams-close.https.any.js.ini | 52 +- .../streams-echo.https.any.js.ini | 120 +- .../importscripts_mime_local.any.js.ini | 216 +- .../color-valid-color-mix-function.html | 94 +- .../css-masking/mask-image/mask-image-2.html | 1 + .../css/view-timeline-inset-computed.html | 6 +- .../tests/tools/serve/commands.json | 3 +- testing/web-platform/tests/tools/wpt/run.py | 2 + .../tests/tools/wptrunner/requirements.txt | 4 + .../wptrunner/wptrunner/wptcommandline.py | 4 +- .../webdriver/tests/print/orientation.py | 44 + .../tests/webtransport/datagrams.https.any.js | 103 +- .../webtransport-test-helpers.sub.js | 17 + .../webtransport/streams-echo.https.any.js | 62 + .../libwebrtc/sdk/android/AndroidManifest.xml | 14 - third_party/libwebrtc/sdk/android/BUILD.gn | 1743 ----------------- third_party/libwebrtc/sdk/android/OWNERS | 9 - third_party/libwebrtc/sdk/android/README | 21 - .../sdk/android/api/org/webrtc/OWNERS | 3 - .../instrumentationtests/AndroidManifest.xml | 38 - .../instrumentationtests/ant.properties | 18 - .../android/instrumentationtests/build.xml | 92 - .../instrumentationtests/loggable_test.cc | 31 - .../instrumentationtests/project.properties | 16 - ...ndroidVideoDecoderInstrumentationTest.java | 200 -- .../BuiltinAudioCodecsFactoryFactoryTest.java | 54 - .../Camera1CapturerUsingByteBufferTest.java | 205 -- .../Camera1CapturerUsingTextureTest.java | 208 -- .../src/org/webrtc/Camera2CapturerTest.java | 334 ---- .../CameraVideoCapturerTestFixtures.java | 793 -------- .../DefaultVideoEncoderFactoryTest.java | 77 - .../src/org/webrtc/EglRendererTest.java | 366 ---- .../src/org/webrtc/FileVideoCapturerTest.java | 129 -- .../src/org/webrtc/GlRectDrawerTest.java | 318 --- .../org/webrtc/HardwareVideoEncoderTest.java | 507 ----- .../src/org/webrtc/LoggableTest.java | 161 -- .../src/org/webrtc/NetworkMonitorTest.java | 411 ---- .../webrtc/PeerConnectionEndToEndTest.java | 1658 ---------------- .../org/webrtc/PeerConnectionFactoryTest.java | 65 - .../src/org/webrtc/PeerConnectionTest.java | 215 -- .../src/org/webrtc/RendererCommonTest.java | 150 -- .../src/org/webrtc/RtcCertificatePemTest.java | 70 - .../src/org/webrtc/RtpSenderTest.java | 77 - .../src/org/webrtc/RtpTransceiverTest.java | 67 - .../SoftwareVideoDecoderFactoryTest.java | 62 - .../SoftwareVideoEncoderFactoryTest.java | 59 - .../org/webrtc/SurfaceTextureHelperTest.java | 518 ----- .../SurfaceViewRendererOnMeasureTest.java | 241 --- .../src/org/webrtc/TestConstants.java | 15 - .../src/org/webrtc/TimestampAlignerTest.java | 43 - .../src/org/webrtc/VideoFileRendererTest.java | 88 - .../src/org/webrtc/VideoFrameBufferTest.java | 530 ----- .../src/org/webrtc/VideoTrackTest.java | 112 -- .../src/org/webrtc/WebRtcJniBootTest.java | 31 - .../src/org/webrtc/YuvHelperTest.java | 207 -- .../src/org/webrtc/capturetestvideo.y4m | 5 - .../video_frame_buffer_test.cc | 45 - .../libwebrtc/sdk/android/native_api/DEPS | 4 - .../audio_device_android.cc | 155 -- .../audio_device_android.h | 40 - .../sdk/android/native_api/base/init.cc | 24 - .../sdk/android/native_api/base/init.h | 23 - .../sdk/android/native_api/codecs/wrapper.cc | 49 - .../sdk/android/native_api/codecs/wrapper.h | 48 - .../android/native_api/jni/class_loader.cc | 80 - .../sdk/android/native_api/jni/class_loader.h | 40 - .../sdk/android/native_api/jni/java_types.cc | 355 ---- .../sdk/android/native_api/jni/java_types.h | 366 ---- .../android/native_api/jni/jni_int_wrapper.h | 63 - .../sdk/android/native_api/jni/jvm.cc | 21 - .../sdk/android/native_api/jni/jvm.h | 21 - .../android/native_api/jni/scoped_java_ref.h | 226 --- .../network_monitor/network_monitor.cc | 31 - .../network_monitor/network_monitor.h | 36 - .../peerconnection/peer_connection_factory.cc | 33 - .../peerconnection/peer_connection_factory.h | 34 - .../native_api/stacktrace/stacktrace.cc | 286 --- .../native_api/stacktrace/stacktrace.h | 45 - .../android/native_api/video/video_source.cc | 115 -- .../android/native_api/video/video_source.h | 41 - .../sdk/android/native_api/video/wrapper.cc | 33 - .../sdk/android/native_api/video/wrapper.h | 36 - .../sdk/android/native_unittests/DEPS | 5 - .../android_network_monitor_unittest.cc | 330 ---- .../application_context_provider.cc | 24 - .../application_context_provider.h | 23 - .../audio_device/audio_device_unittest.cc | 1159 ----------- .../sdk/android/native_unittests/codecs/DEPS | 3 - .../codecs/wrapper_unittest.cc | 57 - .../native_unittests/java_types_unittest.cc | 76 - .../webrtc/ApplicationContextProvider.java | 20 - .../org/webrtc/BuildInfo.java | 59 - .../org/webrtc/CodecsWrapperTestHelper.java | 31 - .../org/webrtc/FakeVideoEncoder.java | 60 - .../org/webrtc/JavaTypesTestHelper.java | 25 - .../org/webrtc/JavaVideoSourceTestHelper.java | 30 - ...ConnectionFactoryInitializationHelper.java | 33 - .../native_unittests/peerconnection/DEPS | 6 - .../peer_connection_factory_unittest.cc | 115 -- .../stacktrace/stacktrace_unittest.cc | 275 --- .../native_unittests/test_jni_onload.cc | 23 - .../video/video_source_unittest.cc | 175 -- .../libwebrtc/sdk/android/src/jni/DEPS | 15 - .../libwebrtc/sdk/android/src/jni/OWNERS | 4 - .../sdk/android/src/jni/android_histogram.cc | 50 - .../sdk/android/src/jni/android_metrics.cc | 53 - .../src/jni/android_network_monitor.cc | 686 ------- .../android/src/jni/android_network_monitor.h | 198 -- .../src/jni/android_video_track_source.cc | 167 -- .../src/jni/android_video_track_source.h | 98 - .../sdk/android/src/jni/audio_device/DEPS | 4 - .../sdk/android/src/jni/audio_device/OWNERS | 1 - .../src/jni/audio_device/aaudio_player.cc | 235 --- .../src/jni/audio_device/aaudio_player.h | 150 -- .../src/jni/audio_device/aaudio_recorder.cc | 218 --- .../src/jni/audio_device/aaudio_recorder.h | 128 -- .../src/jni/audio_device/aaudio_wrapper.cc | 501 ----- .../src/jni/audio_device/aaudio_wrapper.h | 129 -- .../src/jni/audio_device/audio_common.h | 32 - .../jni/audio_device/audio_device_module.cc | 650 ------ .../jni/audio_device/audio_device_module.h | 102 - .../src/jni/audio_device/audio_record_jni.cc | 267 --- .../src/jni/audio_device/audio_record_jni.h | 140 -- .../src/jni/audio_device/audio_track_jni.cc | 271 --- .../src/jni/audio_device/audio_track_jni.h | 129 -- .../audio_device/java_audio_device_module.cc | 51 - .../src/jni/audio_device/opensles_common.cc | 144 -- .../src/jni/audio_device/opensles_common.h | 92 - .../src/jni/audio_device/opensles_player.cc | 446 ----- .../src/jni/audio_device/opensles_player.h | 199 -- .../src/jni/audio_device/opensles_recorder.cc | 445 ----- .../src/jni/audio_device/opensles_recorder.h | 193 -- .../builtin_audio_decoder_factory_factory.cc | 27 - .../builtin_audio_encoder_factory_factory.cc | 27 - .../sdk/android/src/jni/dav1d_codec.cc | 25 - .../sdk/android/src/jni/egl_base_10_impl.cc | 23 - .../sdk/android/src/jni/encoded_image.cc | 117 -- .../sdk/android/src/jni/encoded_image.h | 45 - .../sdk/android/src/jni/h264_utils.cc | 27 - .../sdk/android/src/jni/java_i420_buffer.cc | 63 - .../sdk/android/src/jni/jni_common.cc | 45 - .../android/src/jni/jni_generator_helper.cc | 80 - .../android/src/jni/jni_generator_helper.h | 168 -- .../sdk/android/src/jni/jni_helpers.cc | 51 - .../sdk/android/src/jni/jni_helpers.h | 80 - .../sdk/android/src/jni/jni_onload.cc | 39 - .../libwebrtc/sdk/android/src/jni/jvm.cc | 133 -- .../libwebrtc/sdk/android/src/jni/jvm.h | 32 - .../sdk/android/src/jni/libaom_av1_encoder.cc | 25 - .../sdk/android/src/jni/logging/log_sink.cc | 42 - .../sdk/android/src/jni/logging/log_sink.h | 43 - .../src/jni/native_capturer_observer.cc | 29 - .../src/jni/native_capturer_observer.h | 29 - .../sdk/android/src/jni/nv12_buffer.cc | 80 - .../sdk/android/src/jni/nv21_buffer.cc | 72 - .../src/jni/pc/add_ice_candidate_observer.cc | 39 - .../src/jni/pc/add_ice_candidate_observer.h | 38 - .../src/jni/pc/android_network_monitor.h | 12 - .../libwebrtc/sdk/android/src/jni/pc/audio.cc | 23 - .../libwebrtc/sdk/android/src/jni/pc/audio.h | 25 - .../sdk/android/src/jni/pc/audio_track.cc | 26 - .../pc/call_session_file_rotating_log_sink.cc | 73 - .../sdk/android/src/jni/pc/crypto_options.cc | 43 - .../sdk/android/src/jni/pc/crypto_options.h | 30 - .../sdk/android/src/jni/pc/data_channel.cc | 155 -- .../sdk/android/src/jni/pc/data_channel.h | 27 - .../sdk/android/src/jni/pc/dtmf_sender.cc | 55 - .../sdk/android/src/jni/pc/ice_candidate.cc | 259 --- .../sdk/android/src/jni/pc/ice_candidate.h | 89 - .../sdk/android/src/jni/pc/logging.cc | 59 - .../android/src/jni/pc/media_constraints.cc | 51 - .../android/src/jni/pc/media_constraints.h | 30 - .../sdk/android/src/jni/pc/media_source.cc | 24 - .../sdk/android/src/jni/pc/media_stream.cc | 152 -- .../sdk/android/src/jni/pc/media_stream.h | 54 - .../android/src/jni/pc/media_stream_track.cc | 67 - .../android/src/jni/pc/media_stream_track.h | 31 - .../src/jni/pc/owned_factory_and_threads.cc | 31 - .../src/jni/pc/owned_factory_and_threads.h | 60 - .../sdk/android/src/jni/pc/peer_connection.cc | 941 --------- .../sdk/android/src/jni/pc/peer_connection.h | 141 -- .../src/jni/pc/peer_connection_factory.cc | 531 ----- .../src/jni/pc/peer_connection_factory.h | 33 - .../sdk/android/src/jni/pc/rtc_certificate.cc | 59 - .../sdk/android/src/jni/pc/rtc_certificate.h | 33 - .../rtc_stats_collector_callback_wrapper.cc | 161 -- .../pc/rtc_stats_collector_callback_wrapper.h | 41 - .../sdk/android/src/jni/pc/rtp_parameters.cc | 211 -- .../sdk/android/src/jni/pc/rtp_parameters.h | 35 - .../sdk/android/src/jni/pc/rtp_receiver.cc | 127 -- .../sdk/android/src/jni/pc/rtp_receiver.h | 41 - .../sdk/android/src/jni/pc/rtp_sender.cc | 114 -- .../sdk/android/src/jni/pc/rtp_sender.h | 29 - .../sdk/android/src/jni/pc/rtp_transceiver.cc | 176 -- .../sdk/android/src/jni/pc/rtp_transceiver.h | 46 - .../sdk/android/src/jni/pc/sdp_observer.cc | 81 - .../sdk/android/src/jni/pc/sdp_observer.h | 69 - .../android/src/jni/pc/session_description.cc | 48 - .../android/src/jni/pc/session_description.h | 36 - .../pc/ssl_certificate_verifier_wrapper.cc | 44 - .../jni/pc/ssl_certificate_verifier_wrapper.h | 41 - .../sdk/android/src/jni/pc/stats_observer.cc | 74 - .../sdk/android/src/jni/pc/stats_observer.h | 36 - .../sdk/android/src/jni/pc/turn_customizer.cc | 35 - .../sdk/android/src/jni/pc/turn_customizer.h | 27 - .../libwebrtc/sdk/android/src/jni/pc/video.cc | 55 - .../libwebrtc/sdk/android/src/jni/pc/video.h | 45 - .../src/jni/scoped_java_ref_counted.cc | 38 - .../android/src/jni/scoped_java_ref_counted.h | 49 - .../src/jni/software_video_decoder_factory.cc | 53 - .../src/jni/software_video_encoder_factory.cc | 53 - .../sdk/android/src/jni/timestamp_aligner.cc | 46 - .../sdk/android/src/jni/video_codec_info.cc | 37 - .../sdk/android/src/jni/video_codec_info.h | 31 - .../sdk/android/src/jni/video_codec_status.cc | 25 - .../sdk/android/src/jni/video_codec_status.h | 27 - .../src/jni/video_decoder_factory_wrapper.cc | 51 - .../src/jni/video_decoder_factory_wrapper.h | 41 - .../android/src/jni/video_decoder_fallback.cc | 39 - .../android/src/jni/video_decoder_wrapper.cc | 273 --- .../android/src/jni/video_decoder_wrapper.h | 117 -- .../src/jni/video_encoder_factory_wrapper.cc | 130 -- .../src/jni/video_encoder_factory_wrapper.h | 51 - .../android/src/jni/video_encoder_fallback.cc | 39 - .../android/src/jni/video_encoder_wrapper.cc | 490 ----- .../android/src/jni/video_encoder_wrapper.h | 133 -- .../sdk/android/src/jni/video_frame.cc | 319 --- .../sdk/android/src/jni/video_frame.h | 43 - .../sdk/android/src/jni/video_sink.cc | 32 - .../sdk/android/src/jni/video_sink.h | 36 - .../sdk/android/src/jni/video_track.cc | 49 - .../sdk/android/src/jni/vp8_codec.cc | 30 - .../sdk/android/src/jni/vp9_codec.cc | 38 - .../src/jni/wrapped_native_i420_buffer.cc | 40 - .../src/jni/wrapped_native_i420_buffer.h | 31 - .../sdk/android/src/jni/yuv_helper.cc | 158 -- .../tests/resources/robolectric.properties | 1 - .../org/webrtc/AndroidVideoDecoderTest.java | 432 ---- .../src/org/webrtc/CameraEnumerationTest.java | 48 - .../tests/src/org/webrtc/CodecTestHelper.java | 62 - .../src/org/webrtc/CryptoOptionsTest.java | 74 - .../src/org/webrtc/FakeMediaCodecWrapper.java | 321 --- .../webrtc/FramerateBitrateAdjusterTest.java | 46 - .../src/org/webrtc/GlGenericDrawerTest.java | 160 -- .../org/webrtc/HardwareVideoEncoderTest.java | 370 ---- .../src/org/webrtc/IceCandidateTest.java | 52 - .../src/org/webrtc/RefCountDelegateTest.java | 83 - .../src/org/webrtc/ScalingSettingsTest.java | 29 - .../LowLatencyAudioBufferManagerTest.java | 104 - .../audioipc2-client/.cargo-checksum.json | 2 +- .../rust/audioipc2-client/src/context.rs | 24 +- .../rust/audioipc2-client/src/stream.rs | 25 +- .../audioipc2-server/.cargo-checksum.json | 2 +- third_party/rust/audioipc2-server/src/lib.rs | 2 +- .../rust/audioipc2-server/src/server.rs | 8 +- .../rust/audioipc2/.cargo-checksum.json | 2 +- third_party/rust/audioipc2/Cargo.toml | 2 +- third_party/rust/audioipc2/src/codec.rs | 5 + third_party/rust/audioipc2/src/ipccore.rs | 35 +- third_party/rust/audioipc2/src/rpccore.rs | 442 +++-- .../rust/audioipc2/src/sys/unix/cmsg.rs | 1 + .../rust/audioipc2/src/sys/unix/msg.rs | 1 + .../rust/audioipc2/src/sys/windows/mod.rs | 2 +- .../.cargo-checksum.json | 1 + .../rust/crossbeam-queue-0.1.2/CHANGELOG.md | 11 + .../rust/crossbeam-queue-0.1.2/Cargo.toml | 28 + .../rust/crossbeam-queue-0.1.2/LICENSE-APACHE | 201 ++ .../rust/crossbeam-queue-0.1.2/LICENSE-MIT | 23 + .../LICENSE-THIRD-PARTY | 0 .../rust/crossbeam-queue-0.1.2/README.md | 66 + .../crossbeam-queue-0.1.2/src/array_queue.rs | 425 ++++ .../src/err.rs | 0 .../rust/crossbeam-queue-0.1.2/src/lib.rs | 22 + .../crossbeam-queue-0.1.2/src/seg_queue.rs | 481 +++++ .../tests/array_queue.rs | 249 +++ .../crossbeam-queue-0.1.2/tests/seg_queue.rs | 164 ++ .../rust/crossbeam-queue/.cargo-checksum.json | 2 +- third_party/rust/crossbeam-queue/CHANGELOG.md | 57 + third_party/rust/crossbeam-queue/Cargo.toml | 52 +- third_party/rust/crossbeam-queue/LICENSE-MIT | 4 + third_party/rust/crossbeam-queue/README.md | 38 +- .../rust/crossbeam-queue/build-common.rs | 13 + third_party/rust/crossbeam-queue/build.rs | 41 + third_party/rust/crossbeam-queue/no_atomic.rs | 82 + .../rust/crossbeam-queue/src/array_queue.rs | 331 ++-- third_party/rust/crossbeam-queue/src/lib.rs | 36 +- .../rust/crossbeam-queue/src/seg_queue.rs | 188 +- .../rust/crossbeam-queue/tests/array_queue.rs | 191 +- .../rust/crossbeam-queue/tests/seg_queue.rs | 71 +- third_party/rust/glsl/.cargo-checksum.json | 2 +- third_party/rust/glsl/CHANGELOG.md | 67 +- third_party/rust/glsl/Cargo.toml | 26 +- third_party/rust/glsl/src/parsers.rs | 24 +- .../rust/glsl/src/parsers/nom_helpers.rs | 2 +- toolkit/actors/NetErrorChild.sys.mjs | 6 + toolkit/actors/PrintingChild.sys.mjs | 7 +- .../content/aboutThirdParty.js | 4 +- .../antitracking/URLQueryStringStripper.cpp | 16 +- .../antitracking/URLQueryStringStripper.h | 5 +- toolkit/components/browser/nsWebBrowser.cpp | 21 +- ...Manager.in.jsm => CrashManager.in.sys.mjs} | 37 +- ...nagerTest.jsm => CrashManagerTest.sys.mjs} | 23 +- ...{CrashService.jsm => CrashService.sys.mjs} | 14 +- toolkit/components/crashes/components.conf | 4 +- toolkit/components/crashes/docs/index.rst | 2 +- toolkit/components/crashes/moz.build | 10 +- .../tests/xpcshell/test_crash_manager.js | 8 +- .../tests/xpcshell/test_crash_service.js | 4 +- .../tests/xpcshell/test_crash_store.js | 4 +- .../components/downloads/test/unit/head.js | 2 +- toolkit/components/extensions/.eslintrc.js | 2 - .../components/extensions/ExtensionCommon.jsm | 398 ++-- .../components/extensions/ExtensionParent.jsm | 4 - .../extensions/ExtensionTestCommon.jsm | 19 +- .../xpcshell/test_ext_persistent_events.js | 375 +++- ...t_ext_runtime_onInstalled_and_onStartup.js | 2 +- .../find/test/mochitest/test_bug499115.html | 2 +- .../forgetaboutsite/ForgetAboutSite.sys.mjs | 1 + toolkit/components/formautofill/.eslintrc.js | 2 - .../passwordmgr/LoginAutoComplete.jsm | 23 +- .../passwordmgr/LoginManagerParent.jsm | 12 +- .../passwordmgr/PasswordGenerator.jsm | 4 + .../passwordmgr/PasswordRulesManager.jsm | 9 +- ...LoginManagerParent_getGeneratedPassword.js | 47 +- ...nagerParent_onPasswordEditedOrGenerated.js | 2 +- .../pictureinpicture/PictureInPicture.sys.mjs | 7 +- .../pictureinpicture/content/player.xhtml | 52 +- .../pictureinpicture/tests/browser.ini | 1 + .../{AboutReader.jsm => AboutReader.sys.mjs} | 18 +- .../{ReaderMode.jsm => ReaderMode.sys.mjs} | 21 +- ...{ReaderWorker.jsm => ReaderWorker.sys.mjs} | 6 +- toolkit/components/reader/Readerable.js | 12 +- .../{Readerable.jsm => Readerable.sys.mjs} | 5 +- toolkit/components/reader/moz.build | 8 +- .../reader/test/browser_readerMode.js | 4 +- ...rowser_fingerprinting_randomization_key.js | 6 +- toolkit/components/satchel/.eslintrc.js | 2 - toolkit/components/search/.eslintrc.js | 2 +- toolkit/components/telemetry/Events.yaml | 14 + toolkit/components/telemetry/Histograms.json | 6 +- .../other/UntrustedModulesDataSerializer.cpp | 20 + .../actors/AboutTranslationsChild.sys.mjs | 18 +- .../actors/TranslationsChild.sys.mjs | 216 +- .../actors/TranslationsParent.sys.mjs | 123 +- .../content/translations-engine-worker.js | 28 +- .../translations/content/translations.css | 23 + .../translations/content/translations.html | 6 +- .../translations/content/translations.mjs | 53 +- .../browser/browser_about_translations.js | 3 +- .../tests/browser/browser_full_page.js | 2 + .../translations/tests/browser/head.js | 34 +- .../components/translations/translations.d.ts | 10 +- toolkit/components/utils/moz.build | 1 - .../components/utils/test/browser/browser.ini | 2 - .../test/browser/browser_ClientEnvironment.js | 50 - .../utils/test/unit/test_ClientEnvironment.js | 66 +- .../test_JsonSchemaValidator.js} | 0 .../components/utils/test/unit/xpcshell.ini | 1 + .../viewsource/content/viewSourceUtils.js | 2 +- .../windowcreator/test/test_bug449141.html | 2 +- toolkit/content/aboutNetError.mjs | 9 + toolkit/content/aboutNetError.xhtml | 1 + toolkit/content/contentAreaUtils.js | 6 +- toolkit/content/customElements.js | 30 + toolkit/content/tests/browser/browser.ini | 1 + ...r_moz_support_link_open_links_in_chrome.js | 85 + .../moz-support-link/moz-support-link.mjs | 18 + toolkit/library/rust/shared/Cargo.toml | 4 +- toolkit/locales-preview/aboutTranslations.ftl | 2 + .../en-US/toolkit/global/browser-utils.ftl | 5 + .../en-US/toolkit/neterror/netError.ftl | 1 + toolkit/modules/ActorManagerParent.sys.mjs | 3 + toolkit/modules/BrowserUtils.sys.mjs | 11 +- .../modules/RemotePageAccessManager.sys.mjs | 1 + .../test_BrowserUtils_urlFormatting.js | 102 +- .../mozapps/extensions/content/aboutaddons.js | 2 - .../extensions/internal/XPIInstall.jsm | 6 + toolkit/themes/shared/aboutReader.css | 2 +- toolkit/themes/shared/global-shared.css | 9 +- .../tests/gtest/TestUntrustedModules.cpp | 3 + tools/esmify/mach_commands.py | 2 +- tools/fuzzing/faulty/Faulty.cpp | 778 -------- tools/fuzzing/faulty/Faulty.h | 136 -- tools/fuzzing/faulty/moz.build | 13 - tools/fuzzing/ipc/ProtocolFuzzer.cpp | 36 - tools/fuzzing/ipc/ProtocolFuzzer.h | 112 -- tools/fuzzing/ipc/moz.build | 15 +- tools/fuzzing/moz.build | 3 +- .../lib/environments/remote-page.js | 1 + tools/lint/rejected-words.yml | 6 - tools/lint/rst/requirements.in | 15 +- tools/lint/rst/requirements.txt | 56 +- tools/lint/spell/codespell_requirements.in | 2 +- tools/lint/spell/codespell_requirements.txt | 10 +- tools/profiler/core/shared-libraries-win32.cc | 206 +- tools/profiler/public/shared-libraries.h | 4 + tools/tryselect/selectors/perf.py | 123 ++ tools/tryselect/test/test_perf.py | 38 + widget/EventMessageList.h | 2 + widget/cocoa/nsClipboard.mm | 9 +- widget/gtk/gtk3drawing.cpp | 71 +- widget/gtk/nsWindow.cpp | 2 + widget/tests/test_bug343416.xhtml | 2 +- widget/tests/test_bug466599.xhtml | 2 +- widget/tests/test_bug565392.html | 2 +- widget/tests/test_clipboard.xhtml | 2 +- widget/windows/WinUtils.cpp | 7 +- xpcom/base/IntentionalCrash.h | 9 +- xpcom/ds/StaticAtoms.py | 2 + xpcom/io/nsPipe3.cpp | 2 +- xpcom/io/nsSegmentedBuffer.cpp | 24 +- xpcom/io/nsSegmentedBuffer.h | 6 +- xpcom/io/nsStorageStream.cpp | 9 +- xpcom/io/nsStorageStream.h | 2 + xpcom/tests/gtest/TestSegmentedBuffer.cpp | 2 +- 977 files changed, 14892 insertions(+), 37853 deletions(-) create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_blank_page.js create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_new_window.js create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_blank_target.js create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_by_script.js create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_no_target.js create mode 100644 browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_other_target.js create mode 100644 browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js create mode 100644 browser/base/content/test/tabs/link_in_tab_title_and_url_prefilled.html create mode 100644 browser/base/content/test/tabs/request-timeout.sjs create mode 100644 browser/base/content/test/tabs/wait-a-bit.sjs create mode 100644 browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js create mode 100644 browser/components/extensions/test/browser/browser_ext_optionsPage_links_open_in_tabs.js create mode 100644 browser/components/extensions/test/browser/browser_ext_popup_links_open_in_tabs.js create mode 100644 browser/components/firefoxview/tests/browser/browser_tab_pickup_device_added_telemetry.js create mode 100644 browser/components/firefoxview/tests/browser/browser_tab_pickup_visibility.js create mode 100644 browser/components/search/test/browser/browser_search_telemetry_adImpression_component.js create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel.html create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel_below_the_fold.html create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel_doubled.html create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel_first_element_non_visible.html create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel_hidden.html create mode 100644 browser/components/search/test/browser/searchTelemetryAd_components_carousel_outer_container.html create mode 100644 browser/components/search/test/browser/serp.css create mode 100644 browser/locales-preview/translations.ftl create mode 100644 browser/themes/shared/icons/translations.svg create mode 100644 build/debian-packages/mercurial-timeout.diff delete mode 100644 build/rust/nom/Cargo.toml delete mode 100644 build/rust/nom/lib.rs create mode 100644 devtools/client/debugger/test/mochitest/browser_dbg-worker-module.js create mode 100644 devtools/client/debugger/test/mochitest/examples/doc-module-worker.html create mode 100644 dom/fs/child/FileSystemShutdownBlocker.cpp create mode 100644 dom/fs/include/fs/FileSystemShutdownBlocker.h create mode 100644 dom/fs/test/crashtests/1816710.html delete mode 100644 dom/ipc/fuzztest/content_parent_ipc_libfuzz.cpp delete mode 100644 dom/ipc/fuzztest/moz.build create mode 100644 dom/media/webrtc/third_party_build/filter_git_changes.py create mode 100644 dom/tests/mochitest/webcomponents/test_custom_element_ensure_custom_element.html create mode 100644 dom/webidl/PopoverInvokerElement.webidl delete mode 100644 gfx/layers/ipc/fuzztest/compositor_manager_parent_ipc_libfuzz.cpp delete mode 100644 gfx/layers/ipc/fuzztest/moz.build create mode 100644 image/test/crashtests/1277397-2.jpg create mode 100644 image/test/reftest/jpeg/jpg-progressive-1000-ref.html create mode 100644 image/test/reftest/jpeg/jpg-progressive-1000.html create mode 100644 image/test/reftest/jpeg/jpg-progressive-1000.jpg create mode 100644 intl/components/src/GeneralCategory.h create mode 100644 intl/icu-patches/bug-1818103-CLDR-16399.diff create mode 100644 js/src/jit-test/tests/basic/bug1822962.js create mode 100644 js/src/jit-test/tests/cacheir/construct-bound-realm.js create mode 100644 js/src/jit-test/tests/wasm/function-references/non-nullable-table.js create mode 100644 js/src/jit-test/tests/wasm/function-references/reftype-parse.js create mode 100644 layout/reftests/high-contrast/backplate-force-color-adjust-ref.html create mode 100644 layout/reftests/high-contrast/backplate-force-color-adjust.html create mode 100644 layout/reftests/text-transform/capitalize-9-ref.html create mode 100644 layout/reftests/text-transform/capitalize-9.html create mode 100644 python/l10n/fluent_migrations/bug_1813077_popup_notification_learn_more.py delete mode 100644 taskcluster/ci/test/raptor.yml delete mode 100644 testing/web-platform/meta/css/css-align/baseline-rules/inline-table-inline-block-baseline-vert-rl.html.ini delete mode 100644 testing/web-platform/meta/css/css-color/parsing/color-valid-color-mix-function.html.ini delete mode 100644 testing/web-platform/meta/css/css-masking/mask-image/mask-image-2.html.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-002.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-003.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-004.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-005.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-002.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-003.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-004.xht.ini delete mode 100644 testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-005.xht.ini delete mode 100644 testing/web-platform/meta/html/semantics/popovers/popover-beforetoggle-opening-event.html.ini delete mode 100644 testing/web-platform/meta/html/semantics/popovers/popover-not-keyboard-focusable.html.ini create mode 100644 testing/web-platform/meta/webtransport/__dir__.ini delete mode 100644 testing/web-platform/meta/webtransport/idlharness.https.any.js.ini create mode 100644 testing/web-platform/tests/webdriver/tests/print/orientation.py delete mode 100644 third_party/libwebrtc/sdk/android/AndroidManifest.xml delete mode 100644 third_party/libwebrtc/sdk/android/BUILD.gn delete mode 100644 third_party/libwebrtc/sdk/android/OWNERS delete mode 100644 third_party/libwebrtc/sdk/android/README delete mode 100644 third_party/libwebrtc/sdk/android/api/org/webrtc/OWNERS delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/AndroidManifest.xml delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/ant.properties delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/build.xml delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/loggable_test.cc delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/project.properties delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/AndroidVideoDecoderInstrumentationTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/BuiltinAudioCodecsFactoryFactoryTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingByteBufferTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/Camera1CapturerUsingTextureTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/Camera2CapturerTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/CameraVideoCapturerTestFixtures.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/DefaultVideoEncoderFactoryTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/EglRendererTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/FileVideoCapturerTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/GlRectDrawerTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/HardwareVideoEncoderTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/LoggableTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/NetworkMonitorTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionEndToEndTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionFactoryTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/PeerConnectionTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/RendererCommonTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/RtcCertificatePemTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/RtpSenderTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/RtpTransceiverTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/SoftwareVideoDecoderFactoryTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/SoftwareVideoEncoderFactoryTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/SurfaceTextureHelperTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/SurfaceViewRendererOnMeasureTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/TestConstants.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/TimestampAlignerTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/VideoFileRendererTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/VideoFrameBufferTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/VideoTrackTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/WebRtcJniBootTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/YuvHelperTest.java delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/src/org/webrtc/capturetestvideo.y4m delete mode 100644 third_party/libwebrtc/sdk/android/instrumentationtests/video_frame_buffer_test.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/native_api/audio_device_module/audio_device_android.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/audio_device_module/audio_device_android.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/base/init.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/base/init.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/codecs/wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/codecs/wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/class_loader.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/class_loader.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/java_types.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/java_types.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/jni_int_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/jvm.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/jvm.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/jni/scoped_java_ref.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/network_monitor/network_monitor.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/network_monitor/network_monitor.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/peerconnection/peer_connection_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/peerconnection/peer_connection_factory.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/stacktrace/stacktrace.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/stacktrace/stacktrace.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/video/video_source.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/video/video_source.h delete mode 100644 third_party/libwebrtc/sdk/android/native_api/video/wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_api/video/wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/android_network_monitor_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/application_context_provider.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/application_context_provider.h delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/audio_device/audio_device_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/codecs/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/codecs/wrapper_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/java_types_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/ApplicationContextProvider.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/BuildInfo.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/CodecsWrapperTestHelper.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/FakeVideoEncoder.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/JavaTypesTestHelper.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/JavaVideoSourceTestHelper.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/org/webrtc/PeerConnectionFactoryInitializationHelper.java delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/peerconnection/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/peerconnection/peer_connection_factory_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/stacktrace/stacktrace_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/test_jni_onload.cc delete mode 100644 third_party/libwebrtc/sdk/android/native_unittests/video/video_source_unittest.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/OWNERS delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_histogram.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_metrics.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_network_monitor.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_network_monitor.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_video_track_source.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/android_video_track_source.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/DEPS delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/OWNERS delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_player.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_player.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_recorder.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_recorder.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/aaudio_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_common.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_device_module.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_device_module.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_record_jni.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_record_jni.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_track_jni.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/audio_track_jni.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/java_audio_device_module.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_common.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_common.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_player.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_player.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_recorder.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/audio_device/opensles_recorder.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/builtin_audio_decoder_factory_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/builtin_audio_encoder_factory_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/dav1d_codec.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/egl_base_10_impl.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/encoded_image.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/encoded_image.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/h264_utils.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/java_i420_buffer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_common.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_generator_helper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_generator_helper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_helpers.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_helpers.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jni_onload.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jvm.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/jvm.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/libaom_av1_encoder.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/logging/log_sink.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/logging/log_sink.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/native_capturer_observer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/native_capturer_observer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/nv12_buffer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/nv21_buffer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/add_ice_candidate_observer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/add_ice_candidate_observer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/android_network_monitor.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/audio.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/audio.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/audio_track.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/call_session_file_rotating_log_sink.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/crypto_options.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/crypto_options.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/data_channel.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/data_channel.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/dtmf_sender.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/ice_candidate.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/ice_candidate.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/logging.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_constraints.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_constraints.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_source.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_stream.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_stream.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_stream_track.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/media_stream_track.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/owned_factory_and_threads.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/owned_factory_and_threads.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/peer_connection.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/peer_connection.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/peer_connection_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/peer_connection_factory.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtc_certificate.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtc_certificate.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtc_stats_collector_callback_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtc_stats_collector_callback_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_parameters.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_parameters.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_receiver.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_receiver.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_sender.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_sender.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_transceiver.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/rtp_transceiver.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/sdp_observer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/sdp_observer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/session_description.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/session_description.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/ssl_certificate_verifier_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/stats_observer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/stats_observer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/turn_customizer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/turn_customizer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/video.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/pc/video.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/scoped_java_ref_counted.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/scoped_java_ref_counted.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/software_video_decoder_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/software_video_encoder_factory.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/timestamp_aligner.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_codec_info.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_codec_info.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_codec_status.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_codec_status.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_decoder_factory_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_decoder_factory_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_decoder_fallback.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_decoder_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_decoder_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_encoder_factory_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_encoder_factory_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_encoder_fallback.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_encoder_wrapper.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_encoder_wrapper.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_frame.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_frame.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_sink.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_sink.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/video_track.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/vp8_codec.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/vp9_codec.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/wrapped_native_i420_buffer.cc delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/wrapped_native_i420_buffer.h delete mode 100644 third_party/libwebrtc/sdk/android/src/jni/yuv_helper.cc delete mode 100644 third_party/libwebrtc/sdk/android/tests/resources/robolectric.properties delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/AndroidVideoDecoderTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/CameraEnumerationTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/CodecTestHelper.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/CryptoOptionsTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/FakeMediaCodecWrapper.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/FramerateBitrateAdjusterTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/GlGenericDrawerTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/HardwareVideoEncoderTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/IceCandidateTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/RefCountDelegateTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/ScalingSettingsTest.java delete mode 100644 third_party/libwebrtc/sdk/android/tests/src/org/webrtc/audio/LowLatencyAudioBufferManagerTest.java create mode 100644 third_party/rust/crossbeam-queue-0.1.2/.cargo-checksum.json create mode 100644 third_party/rust/crossbeam-queue-0.1.2/CHANGELOG.md create mode 100644 third_party/rust/crossbeam-queue-0.1.2/Cargo.toml create mode 100644 third_party/rust/crossbeam-queue-0.1.2/LICENSE-APACHE create mode 100644 third_party/rust/crossbeam-queue-0.1.2/LICENSE-MIT rename third_party/rust/{crossbeam-queue => crossbeam-queue-0.1.2}/LICENSE-THIRD-PARTY (100%) create mode 100644 third_party/rust/crossbeam-queue-0.1.2/README.md create mode 100644 third_party/rust/crossbeam-queue-0.1.2/src/array_queue.rs rename third_party/rust/{crossbeam-queue => crossbeam-queue-0.1.2}/src/err.rs (100%) create mode 100644 third_party/rust/crossbeam-queue-0.1.2/src/lib.rs create mode 100644 third_party/rust/crossbeam-queue-0.1.2/src/seg_queue.rs create mode 100644 third_party/rust/crossbeam-queue-0.1.2/tests/array_queue.rs create mode 100644 third_party/rust/crossbeam-queue-0.1.2/tests/seg_queue.rs create mode 100644 third_party/rust/crossbeam-queue/build-common.rs create mode 100644 third_party/rust/crossbeam-queue/build.rs create mode 100644 third_party/rust/crossbeam-queue/no_atomic.rs rename toolkit/components/crashes/{CrashManager.in.jsm => CrashManager.in.sys.mjs} (98%) rename toolkit/components/crashes/{CrashManagerTest.jsm => CrashManagerTest.sys.mjs} (92%) rename toolkit/components/crashes/{CrashService.jsm => CrashService.sys.mjs} (95%) rename toolkit/components/reader/{AboutReader.jsm => AboutReader.sys.mjs} (99%) rename toolkit/components/reader/{ReaderMode.jsm => ReaderMode.sys.mjs} (97%) rename toolkit/components/reader/{ReaderWorker.jsm => ReaderWorker.sys.mjs} (81%) rename toolkit/components/reader/{Readerable.jsm => Readerable.sys.mjs} (85%) delete mode 100644 toolkit/components/utils/test/browser/browser.ini delete mode 100644 toolkit/components/utils/test/browser/browser_ClientEnvironment.js rename toolkit/components/utils/test/{browser/browser_JsonSchemaValidator.js => unit/test_JsonSchemaValidator.js} (100%) create mode 100644 toolkit/content/tests/browser/browser_moz_support_link_open_links_in_chrome.js delete mode 100644 tools/fuzzing/faulty/Faulty.cpp delete mode 100644 tools/fuzzing/faulty/Faulty.h delete mode 100644 tools/fuzzing/faulty/moz.build delete mode 100644 tools/fuzzing/ipc/ProtocolFuzzer.cpp delete mode 100644 tools/fuzzing/ipc/ProtocolFuzzer.h diff --git a/Cargo.lock b/Cargo.lock index 9c3fa3c5003..1ce68908950 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -194,7 +194,7 @@ dependencies = [ "askama_escape", "mime", "mime_guess", - "nom 7.1.3", + "nom", "proc-macro2", "quote", "serde", @@ -327,7 +327,7 @@ dependencies = [ [[package]] name = "audioipc2" version = "0.5.0" -source = "git+https://github.com/kinetiknz/audioipc-2?rev=73c8a02da8f2ff022723307bfafa3a58a61448da#73c8a02da8f2ff022723307bfafa3a58a61448da" +source = "git+https://github.com/kinetiknz/audioipc-2?rev=916f65cc92f6f2484183ff4681b0e9a2bfd60fe7#916f65cc92f6f2484183ff4681b0e9a2bfd60fe7" dependencies = [ "arrayvec", "ashmem", @@ -336,7 +336,7 @@ dependencies = [ "byteorder", "bytes 1.4.0", "cc", - "crossbeam-channel", + "crossbeam-queue 0.3.8", "cubeb", "error-chain", "iovec", @@ -355,7 +355,7 @@ dependencies = [ [[package]] name = "audioipc2-client" version = "0.5.0" -source = "git+https://github.com/kinetiknz/audioipc-2?rev=73c8a02da8f2ff022723307bfafa3a58a61448da#73c8a02da8f2ff022723307bfafa3a58a61448da" +source = "git+https://github.com/kinetiknz/audioipc-2?rev=916f65cc92f6f2484183ff4681b0e9a2bfd60fe7#916f65cc92f6f2484183ff4681b0e9a2bfd60fe7" dependencies = [ "audio_thread_priority", "audioipc2", @@ -366,7 +366,7 @@ dependencies = [ [[package]] name = "audioipc2-server" version = "0.5.0" -source = "git+https://github.com/kinetiknz/audioipc-2?rev=73c8a02da8f2ff022723307bfafa3a58a61448da#73c8a02da8f2ff022723307bfafa3a58a61448da" +source = "git+https://github.com/kinetiknz/audioipc-2?rev=916f65cc92f6f2484183ff4681b0e9a2bfd60fe7#916f65cc92f6f2484183ff4681b0e9a2bfd60fe7" dependencies = [ "audio_thread_priority", "audioipc2", @@ -392,7 +392,7 @@ dependencies = [ "libudev", "log", "memoffset 0.6.99", - "nom 7.1.3", + "nom", "nss-gk-api", "pkcs11-bindings", "rand 0.8.5", @@ -613,7 +613,7 @@ name = "builtins-static" version = "0.1.0" dependencies = [ "bindgen 0.63.0", - "nom 7.1.3", + "nom", "pkcs11-bindings", "smallvec", ] @@ -730,7 +730,7 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" dependencies = [ - "nom 7.1.3", + "nom", ] [[package]] @@ -1075,6 +1075,16 @@ dependencies = [ "crossbeam-utils 0.6.6", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.14", +] + [[package]] name = "crossbeam-utils" version = "0.6.6" @@ -1404,7 +1414,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9313f104b590510b46fc01c0a324fc76505c13871454d3c48490468d04c8d395" dependencies = [ "libc", - "nom 7.1.3", + "nom", ] [[package]] @@ -2371,11 +2381,11 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "glsl" -version = "6.0.1" +version = "6.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd49bbe5e12dd5aed9d66a84899af422f3d4fcfdd20b2294c8b4ade11500b05" +checksum = "65c80dbf169ac31dbe6e0a69a7cef0b09ec9805f955da206ff1ee2e47895f836" dependencies = [ - "nom 6.99.99", + "nom", ] [[package]] @@ -3812,13 +3822,6 @@ dependencies = [ "libc", ] -[[package]] -name = "nom" -version = "6.99.99" -dependencies = [ - "nom 7.1.3", -] - [[package]] name = "nom" version = "7.1.3" @@ -5102,6 +5105,7 @@ name = "static_prefs" version = "0.1.0" dependencies = [ "mozbuild", + "nsstring", ] [[package]] @@ -5577,7 +5581,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0c32ffea4827978e9aa392d2f743d973c1dfa3730a2ed3f22ce1e6984da848c" dependencies = [ "crossbeam-deque 0.7.4", - "crossbeam-queue", + "crossbeam-queue 0.1.2", "crossbeam-utils 0.6.6", "futures 0.1.31", "lazy_static", @@ -6383,7 +6387,7 @@ version = "4.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e79c5206e1f43a2306fd64bdb95025ee4228960f2e6c5a8b173f3caaf807741" dependencies = [ - "nom 7.1.3", + "nom", ] [[package]] @@ -6466,6 +6470,7 @@ dependencies = [ "nsstring", "parking_lot 0.11.2", "serde", + "static_prefs", "wgpu-core", "wgpu-hal", "wgpu-types", diff --git a/Cargo.toml b/Cargo.toml index 78bc78b4869..2f3c90363db 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -127,9 +127,6 @@ bindgen = { path = "build/rust/bindgen" } # Patch memoffset 0.6 to 0.7 memoffset = { path = "build/rust/memoffset" } -# Patch nom 6 to 7 -nom = { path = "build/rust/nom" } - # Patch nix 0.24 to 0.25 nix = { path = "build/rust/nix" } diff --git a/accessible/base/EventQueue.cpp b/accessible/base/EventQueue.cpp index f5f681f3ffe..0fb37e68104 100644 --- a/accessible/base/EventQueue.cpp +++ b/accessible/base/EventQueue.cpp @@ -49,18 +49,26 @@ bool EventQueue::PushEvent(AccEvent* aEvent) { (aEvent->mEventType == nsIAccessibleEvent::EVENT_NAME_CHANGE || aEvent->mEventType == nsIAccessibleEvent::EVENT_TEXT_REMOVED || aEvent->mEventType == nsIAccessibleEvent::EVENT_TEXT_INSERTED)) { - PushNameOrDescriptionChange(aEvent->mAccessible); + PushNameOrDescriptionChange(aEvent); } return true; } -bool EventQueue::PushNameOrDescriptionChange(LocalAccessible* aTarget) { +bool EventQueue::PushNameOrDescriptionChange(AccEvent* aOrigEvent) { // Fire name/description change event on parent or related LocalAccessible // being labelled/described given that this event hasn't been coalesced, the // dependent's name/description was calculated from this subtree, and the // subtree was changed. - const bool doName = aTarget->HasNameDependent(); - const bool doDesc = aTarget->HasDescriptionDependent(); + LocalAccessible* target = aOrigEvent->mAccessible; + // If the text of a text leaf changed without replacing the leaf, the only + // event we get is text inserted on the container. In this case, we might + // need to fire a name change event on the target itself. + const bool maybeTargetNameChanged = + (aOrigEvent->mEventType == nsIAccessibleEvent::EVENT_TEXT_REMOVED || + aOrigEvent->mEventType == nsIAccessibleEvent::EVENT_TEXT_INSERTED) && + nsTextEquivUtils::HasNameRule(target, eNameFromSubtreeRule); + const bool doName = target->HasNameDependent() || maybeTargetNameChanged; + const bool doDesc = target->HasDescriptionDependent(); if (!doName && !doDesc) { return false; } @@ -69,11 +77,11 @@ bool EventQueue::PushNameOrDescriptionChange(LocalAccessible* aTarget) { // Only continue traversing up the tree if it's possible that the parent // LocalAccessible's name (or a LocalAccessible being labelled by this // LocalAccessible or an ancestor) can depend on this LocalAccessible's name. - LocalAccessible* parent = aTarget; + LocalAccessible* parent = target; do { // Test possible name dependent parent. if (doName) { - if (nameCheckAncestor && parent != aTarget && + if (nameCheckAncestor && (maybeTargetNameChanged || parent != target) && nsTextEquivUtils::HasNameRule(parent, eNameFromSubtreeRule)) { nsAutoString name; ENameValueFlag nameFlag = parent->Name(name); diff --git a/accessible/base/EventQueue.h b/accessible/base/EventQueue.h index 900b8beaab4..434acd3c09c 100644 --- a/accessible/base/EventQueue.h +++ b/accessible/base/EventQueue.h @@ -28,7 +28,7 @@ class EventQueue { /** * Puts name and/or description change events into the queue, if needed. */ - bool PushNameOrDescriptionChange(LocalAccessible* aTarget); + bool PushNameOrDescriptionChange(AccEvent* aOrigEvent); /** * Process events from the queue and fires events. diff --git a/accessible/base/NotificationController.cpp b/accessible/base/NotificationController.cpp index 8cf4366721c..838f2d04742 100644 --- a/accessible/base/NotificationController.cpp +++ b/accessible/base/NotificationController.cpp @@ -185,7 +185,6 @@ bool NotificationController::QueueMutationEvent(AccTreeMutationEvent* aEvent) { // or hidden children of a container. So either queue a new one, or move an // existing one to the end of the queue if the container already has a // reorder event. - LocalAccessible* target = aEvent->GetAccessible(); LocalAccessible* container = aEvent->GetAccessible()->LocalParent(); RefPtr reorder; if (!container->ReorderEventTarget()) { @@ -195,7 +194,7 @@ bool NotificationController::QueueMutationEvent(AccTreeMutationEvent* aEvent) { // Since this is the first child of container that is changing, the name // and/or description of dependent Accessibles may be changing. - if (PushNameOrDescriptionChange(target)) { + if (PushNameOrDescriptionChange(aEvent)) { ScheduleProcessing(); } } else { @@ -231,6 +230,7 @@ bool NotificationController::QueueMutationEvent(AccTreeMutationEvent* aEvent) { return true; } + LocalAccessible* target = aEvent->GetAccessible(); int32_t offset = container->AsHyperText()->GetChildOffset(target); AccTreeMutationEvent* prevEvent = aEvent->PrevEvent(); while (prevEvent && diff --git a/accessible/base/RoleMap.h b/accessible/base/RoleMap.h index e1d409f2cab..e9d527e0177 100644 --- a/accessible/base/RoleMap.h +++ b/accessible/base/RoleMap.h @@ -711,7 +711,7 @@ ROLE(COLOR_CHOOSER, ROLE(DATE_EDITOR, "date editor", ATK_ROLE_DATE_EDITOR, - @"AXDateField", + @"AXGroup", NSAccessibilityUnknownSubrole, USE_ROLE_STRING, IA2_ROLE_DATE_EDITOR, diff --git a/accessible/mac/AccessibleWrap.mm b/accessible/mac/AccessibleWrap.mm index 944e8bd059a..82342efb0a8 100644 --- a/accessible/mac/AccessibleWrap.mm +++ b/accessible/mac/AccessibleWrap.mm @@ -313,6 +313,9 @@ Class a11y::GetTypeFromRole(roles::Role aRole) { case roles::PAGETAB: return [mozTabAccessible class]; + case roles::DATE_EDITOR: + return [mozDatePickerAccessible class]; + case roles::CHECKBUTTON: case roles::TOGGLE_BUTTON: case roles::SWITCH: diff --git a/accessible/mac/mozActionElements.h b/accessible/mac/mozActionElements.h index 4c116b1bd06..f9940c793a4 100644 --- a/accessible/mac/mozActionElements.h +++ b/accessible/mac/mozActionElements.h @@ -99,3 +99,10 @@ - (void)changeValueBySteps:(int)factor; @end + +@interface mozDatePickerAccessible : mozAccessible + +// override +- (NSString*)moxTitle; + +@end diff --git a/accessible/mac/mozActionElements.mm b/accessible/mac/mozActionElements.mm index 6d8df140ac2..f1dd5f9922a 100644 --- a/accessible/mac/mozActionElements.mm +++ b/accessible/mac/mozActionElements.mm @@ -229,3 +229,11 @@ using namespace mozilla::a11y; } @end + +@implementation mozDatePickerAccessible + +- (NSString*)moxTitle { + return utils::LocalizedString(u"dateField"_ns); +} + +@end diff --git a/accessible/tests/browser/mac/browser_roles_elements.js b/accessible/tests/browser/mac/browser_roles_elements.js index 9436474aab5..be9b27367ef 100644 --- a/accessible/tests/browser/mac/browser_roles_elements.js +++ b/accessible/tests/browser/mac/browser_roles_elements.js @@ -74,6 +74,7 @@ addAccessibleTask( +
@@ -187,6 +188,14 @@ addAccessibleTask( testRoleAndSubRole(accDoc, "tooltip", "AXGroup", "AXUserInterfaceTooltip"); testRoleAndSubRole(accDoc, "menuitemradio", "AXMenuItem", null); testRoleAndSubRole(accDoc, "menuitemcheckbox", "AXMenuItem", null); + testRoleAndSubRole(accDoc, "datetime", "AXGroup", null); + // XXX for datetime elements, we spoof the role via the title, since + // providing the correct role results in the internal elements being + // unreachable by VO + is( + getNativeInterface(accDoc, "datetime").getAttributeValue("AXTitle"), + "date field" + ); // Text boxes testRoleAndSubRole(accDoc, "textbox_multiline", "AXTextArea"); diff --git a/accessible/tests/mochitest/events/test_namechange.html b/accessible/tests/mochitest/events/test_namechange.html index 238d93793c7..840e2dfb4f1 100644 --- a/accessible/tests/mochitest/events/test_namechange.html +++ b/accessible/tests/mochitest/events/test_namechange.html @@ -132,10 +132,18 @@ await nameChanged; nameChanged = PromEvents.waitForEvent(EVENT_NAME_CHANGE, "listitem"); - info("Changing text of listitem child"); + info("Changing textContent of listitem child"); + // Changing textContent replaces the text leaf with a new one. getNode("listitem").textContent = "world"; await nameChanged; + nameChanged = PromEvents.waitForEvent(EVENT_NAME_CHANGE, "button"); + info("Changing text of button's text leaf"); + // Changing the text node's data changes the text without replacing the + // leaf. + getNode("button").firstChild.data = "after"; + await nameChanged; + SimpleTest.finish(); } @@ -170,6 +178,8 @@ + +
diff --git a/browser/actors/AboutReaderChild.sys.mjs b/browser/actors/AboutReaderChild.sys.mjs index eea50dca2df..b92078aaece 100644 --- a/browser/actors/AboutReaderChild.sys.mjs +++ b/browser/actors/AboutReaderChild.sys.mjs @@ -5,21 +5,11 @@ const lazy = {}; -ChromeUtils.defineModuleGetter( - lazy, - "AboutReader", - "resource://gre/modules/AboutReader.jsm" -); -ChromeUtils.defineModuleGetter( - lazy, - "ReaderMode", - "resource://gre/modules/ReaderMode.jsm" -); -ChromeUtils.defineModuleGetter( - lazy, - "Readerable", - "resource://gre/modules/Readerable.jsm" -); +ChromeUtils.defineESModuleGetters(lazy, { + AboutReader: "resource://gre/modules/AboutReader.sys.mjs", + ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs", + Readerable: "resource://gre/modules/Readerable.sys.mjs", +}); var gUrlsToDocContentType = new Map(); var gUrlsToDocTitle = new Map(); diff --git a/browser/actors/AboutReaderParent.sys.mjs b/browser/actors/AboutReaderParent.sys.mjs index 8ffc2ce0aaa..033bf1d41c9 100644 --- a/browser/actors/AboutReaderParent.sys.mjs +++ b/browser/actors/AboutReaderParent.sys.mjs @@ -7,12 +7,8 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", + ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs", }); -ChromeUtils.defineModuleGetter( - lazy, - "ReaderMode", - "resource://gre/modules/ReaderMode.jsm" -); ChromeUtils.defineModuleGetter( lazy, "pktApi", diff --git a/browser/actors/SearchSERPTelemetryChild.sys.mjs b/browser/actors/SearchSERPTelemetryChild.sys.mjs index 53900b2a54f..139c6b9d7a7 100644 --- a/browser/actors/SearchSERPTelemetryChild.sys.mjs +++ b/browser/actors/SearchSERPTelemetryChild.sys.mjs @@ -2,6 +2,8 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ +import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs"; + const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { @@ -9,6 +11,13 @@ ChromeUtils.defineESModuleGetters(lazy, { setTimeout: "resource://gre/modules/Timer.sys.mjs", }); +XPCOMUtils.defineLazyPreferenceGetter( + lazy, + "serpEventsEnabled", + "browser.search.serpEventTelemetry.enabled", + false +); + const SHARED_DATA_KEY = "SearchTelemetry:ProviderInfo"; export const ADLINK_CHECK_TIMEOUT_MS = 1000; @@ -78,7 +87,413 @@ class SearchProviders { } } +/** + * Scans SERPs for ad components. + */ +class SearchAdImpression { + /** + * A reference to ad component information that is used if an anchor + * element could not be categorized to a specific ad component. + * + * @type {object} + */ + #defaultComponent = null; + + /** + * Maps DOM elements to AdData. + * + * @type {Map} + * + * @typedef AdData + * @type {object} + * @property {string} type + * The type of ad component. + * @property {number} adsLoaded + * The number of ads counted as loaded for the component. + * @property {boolean} countChildren + * Whether all the children were counted for the component. + */ + #elementToAdDataMap = new Map(); + + /** + * Height of the inner window in the browser. + */ + #innerWindowHeight = 0; + + set innerWindowHeight(height) { + this.#innerWindowHeight = height; + } + + /** + * A reference the providerInfo for this SERP. + * + * @type {object} + */ + #providerInfo = null; + + set providerInfo(providerInfo) { + if (this.#providerInfo?.telemetryId == providerInfo.telemetryId) { + return; + } + + this.#providerInfo = providerInfo; + for (let component of this.#providerInfo.components) { + if (component.included?.default) { + this.#defaultComponent = component; + break; + } + } + } + + /** + * How far from the top the page has been scrolled. + */ + #scrollFromTop = 0; + + set scrollFromTop(distance) { + this.#scrollFromTop = distance; + } + + /** + * Given a list of anchor elements, group them into ad components + * and count the number of loaded, visible, and hidden ads. + * + * The first step in the process is to check if the anchor should be + * inspected. This is based on whether it contains an href or a + * data-attribute values that matches an ad link. + * + * If it looks like an ad link, determine which ad component it belongs to + * and the number of ads for the component. The heuristic is described in + * findAdDataForAnchor. If there was a result and we haven't seen it before, + * save in elementToAdDataMap. + * + * Once all the links have been parsed, go through each component + * in elementToAdDataMap and check if the ad was visible to the user. + * + * @param {HTMLCollectionOf} anchors + * Anchors to inspect. + * @returns {Map} + * A map where the key is a string containing the type of ad component + * and the value is an object containing the number of adsLoaded, + * adsVisible, and adsHidden within the component. + */ + resultFromAnchors(anchors) { + for (let anchor of anchors) { + if (this.#shouldInspectAnchor(anchor)) { + let result = this.#findAdDataForAnchor(anchor); + if (result) { + this.#recordElementData(result.element, { + type: result.type, + count: result.count, + countChildren: result.countChildren, + childElements: result.childElements, + }); + } + } + } + + let componentToVisibilityMap = new Map(); + // Count the number of visible and hidden ads within each cached + // element and save the results according to the component they + // belonged to. + for (let [element, data] of this.#elementToAdDataMap.entries()) { + let count = this.#countVisibleAndHiddenAds( + element, + data.adsLoaded, + data.childElements + ); + if (componentToVisibilityMap.has(data.type)) { + let componentInfo = componentToVisibilityMap.get(data.type); + componentInfo.adsLoaded += data.adsLoaded; + componentInfo.adsVisible += count.adsVisible; + componentInfo.adsHidden += count.adsHidden; + } else { + componentToVisibilityMap.set(data.type, { + adsLoaded: data.adsLoaded, + adsVisible: count.adsVisible, + adsHidden: count.adsHidden, + }); + } + } + + // Release the DOM elements from the Map. + this.#elementToAdDataMap.clear(); + + return componentToVisibilityMap; + } + + /** + * Evaluates whether an anchor should be inspected based on matching + * regular expressions on either its href or specified data-attribute values. + * + * @param {HTMLAnchorElement} anchor + * @returns {boolean} + */ + #shouldInspectAnchor(anchor) { + if (!anchor.href) { + return false; + } + let adServerAttributes = this.#providerInfo.adServerAttributes ?? []; + let regexps = this.#providerInfo.extraAdServersRegexps; + // Anchors can contain ad links in a data-attribute. + for (let name of adServerAttributes) { + if ( + anchor.dataset[name] && + regexps.some(regexp => regexp.test(anchor.dataset[name])) + ) { + return true; + } + } + // Anchors can contain ad links in a specific href. + if (regexps.some(regexp => regexp.test(anchor.href))) { + return true; + } + return false; + } + + /** + * Find the ad data for an anchor. + * + * To categorize the anchor, we iterate over the list of possible components + * the anchor could be categorized. If the component is default, we skip + * checking because the fallback option for all anchor links is the default. + * + * First, get the "parent" of the anchor which best represents the DOM element + * that contains the anchor links for the component and no other component. + * This parent will be cached so that other anchors that share the same + * parent can be counted together. + * + * The check for a parent is a loop because we can define more than one best + * parent since on certain SERPs, it's possible for a "better" DOM element + * parent to appear occassionally. + * + * If no parent is found, skip this component. + * + * If a parent was found, check for specific child elements. + * + * Finding child DOM elements of a parent is optional. One reason to do so is + * to use child elements instead of anchor links to count the number of ads for + * a component via the `countChildren` property. This is provided because some ads + * (i.e. carousels) have multiple ad links in a single child element that go to the + * same location. In this scenario, all instances of the child are recorded as ads. + * Subsequent anchor elements that map to the same parent are ignored. + * + * Whether or not a child was found, return the information that was found, + * including whether or not all child elements were counted instead of anchors. + * + * If another anchor belonging to a parent that was previously recorded is the input + * for this function, we either increment the ad count by 1 or don't increment the ad + * count because the parent used `countChildren` completed the calculation in a + * previous step. + * + * + * @param {HTMLAnchorElement} anchor + * The anchor to be inspected. + * @returns {object} + * An object containing the element representing the root DOM element for + * the component, the type of component, how many ads were counted, + * and whether or not the count was of all the children. + */ + #findAdDataForAnchor(anchor) { + for (let component of this.#providerInfo.components) { + // First, check various conditions for skipping a component. + + // A component should always have at least one included statement, + // and a included statement with a parent. + if (!component.included || !component.included.parent) { + continue; + } + + // The default component doesn't need to be checked, + // as it will be the fallback option. + if (component.included.default) { + continue; + } + + // Find the parent of the anchor. + let parent = anchor.closest(component.included.parent.selector); + + // If no parent was found, this wasn't the right component. + if (!parent) { + continue; + } + + // If we've already inspected the parent, either: + // Increment the number of ads seen for this element, + // or if its child elements have already been counted, return null. + if (this.#elementToAdDataMap.has(parent)) { + return !this.#childElementsCounted(parent) + ? { element: parent, count: 1, childElements: [anchor] } + : null; + } + + // If the component has no defined children, return the parent element. + if (component.included.children) { + // Look for the first instance of a matching child selector. + for (let child of component.included.children) { + // If counting by child, get all of them at once. + if (child.countChildren) { + let childElements = parent.querySelectorAll(child.selector); + if (childElements.length) { + return { + element: parent, + type: component.type, + count: childElements.length, + countChildren: child.countChildren, + childElements, + }; + } + } else if (parent.querySelector(child.selector)) { + return { + element: parent, + type: component.type, + count: 1, + childElements: [anchor], + }; + } + } + } + // If no children were defined for this component, or none were found + // in the DOM, use the default definition. + return { + element: parent, + type: component.type, + count: 1, + childElements: [anchor], + }; + } + // If no component was found, use default values. + return { + element: anchor, + type: this.#defaultComponent.type, + count: 1, + childElements: [anchor], + }; + } + + /** + * Determines whether or not an ad was visible or hidden. + * + * An ad is considered visible if it has non-zero dimensions, and is in + * the possible viewing area of the users window at the time the ad + * impression is recorded. + * + * @param {Element} element + * Element to be inspected + * @param {number} adsLoaded + * Number of ads initially determined to be loaded for this element. + * @param {NodeListOf} childElements + * List of children belonging to element. + * @returns {object} + * Contains adsVisible which is the number of ads shown for the element + * and adsHidden, the number of ads not visible to the user. + */ + #countVisibleAndHiddenAds(element, adsLoaded, childElements) { + let elementRect = element.getBoundingClientRect(); + + // If the element lacks a dimension, assume all ads that + // were contained within it are hidden. + if (elementRect.width == 0 || elementRect.height == 0) { + return { + adsVisible: 0, + adsHidden: adsLoaded, + }; + } + + let adsVisible = 0; + let adsHidden = 0; + for (let child of childElements) { + let itemRect = child.getBoundingClientRect(); + + // If the element we're inspecting has no dimension, it is hidden. + if (itemRect.height == 0 || itemRect.width == 0) { + adsHidden += 1; + continue; + } + + // If the element is to the left of the containing element, or to the + // right of the containing element, skip it. + if ( + itemRect.x < elementRect.x || + itemRect.x + itemRect.width > elementRect.x + elementRect.width + ) { + continue; + } + + // If the element is too far down, skip it. + if (this.#scrollFromTop + this.#innerWindowHeight < elementRect.y) { + continue; + } + ++adsVisible; + } + + return { + adsVisible, + adsHidden, + }; + } + + /** + * Caches ad data for a DOM element. The key of the map is by Element rather + * than Component for fast lookup on whether an Element has been already been + * categorized as a component. + * + * @param {Element} element + * The element considered to be the root for the component. + * @param {object} params + * Various parameters that can be recorded. Whether the input values exist + * or not depends on which component was found, which heuristic should be used + * to determine whether an ad was visible, and whether we've already seen this + * element. + * @param {string | null} params.type + * The type of component. + * @param {number} params.count + * The number of ads found for a component. The number represents either + * the number of elements that match an ad expression or the number of DOM + * elements containing an ad link. + * @param {boolean | null} params.countChildren + * Whether all the children were counted for the element. + * @param {Array | null} params.childElements + * An array of DOM elements to inspect. + */ + #recordElementData( + element, + { type, count = 0, countChildren = false, childElements = null } = {} + ) { + if (this.#elementToAdDataMap.has(element)) { + let recordedValues = this.#elementToAdDataMap.get(element); + recordedValues.adsLoaded = recordedValues.adsLoaded + count; + if (childElements) { + recordedValues.childElements = recordedValues.childElements.concat( + childElements + ); + } + } else { + this.#elementToAdDataMap.set(element, { + type, + adsLoaded: count, + countChildren, + childElements, + }); + } + } + + /** + * Given a DOM element, return whether or not this element was counted + * by specific child elements rather than the number of anchor links. + * + * @param {Element} domElement + * The element to lookup. + * @returns {boolean} + * Returns true if child elements were counted, false otherwise. + */ + #childElementsCounted(domElement) { + return !!this.#elementToAdDataMap.get(domElement)?.countChildren; + } +} + const searchProviders = new SearchProviders(); +const searchAdImpression = new SearchAdImpression(); /** * SearchTelemetryChild monitors for pages that are partner searches, and @@ -106,7 +521,7 @@ export class SearchSERPTelemetryChild extends JSWindowActorChild { * Checks to see if the page is a partner and has an ad link within it. If so, * it will notify SearchTelemetry. */ - _checkForAdLink() { + _checkForAdLink(eventType) { try { if (!this.contentWindow) { return; @@ -144,11 +559,27 @@ export class SearchSERPTelemetryChild extends JSWindowActorChild { break; } } + if (hasAds) { this.sendAsyncMessage("SearchTelemetry:PageInfo", { - hasAds: true, + hasAds, url, }); + + if ( + lazy.serpEventsEnabled && + providerInfo?.components && + (eventType == "load" || eventType == "pageshow") + ) { + searchAdImpression.providerInfo = providerInfo; + searchAdImpression.scrollFromTop = this.contentWindow.scrollY; + searchAdImpression.innerWindowHeight = this.contentWindow.innerHeight; + let adImpressions = searchAdImpression.resultFromAnchors(anchors); + this.sendAsyncMessage("SearchTelemetry:AdImpressions", { + adImpressions, + url, + }); + } } } @@ -164,10 +595,10 @@ export class SearchSERPTelemetryChild extends JSWindowActorChild { } }; - const check = () => { + const check = eventType => { cancelCheck(); this._waitForContentTimeout = lazy.setTimeout(() => { - this._checkForAdLink(); + this._checkForAdLink(eventType); }, ADLINK_CHECK_TIMEOUT_MS); }; @@ -178,12 +609,12 @@ export class SearchSERPTelemetryChild extends JSWindowActorChild { // so that we remain consistent with the *.in-content:sap* count for the // SEARCH_COUNTS histogram. if (event.persisted) { - check(); + check(event.type); } break; } case "DOMContentLoaded": { - check(); + check(event.type); break; } case "load": { @@ -192,7 +623,7 @@ export class SearchSERPTelemetryChild extends JSWindowActorChild { // We still check at DOMContentLoaded because if the page hasn't // finished loading and the user navigates away, we still want to know // if there were ads on the page or not at that time. - check(); + check(event.type); break; } case "unload": { diff --git a/browser/actors/SearchSERPTelemetryParent.sys.mjs b/browser/actors/SearchSERPTelemetryParent.sys.mjs index b74046d21c8..4ece1ba3b17 100644 --- a/browser/actors/SearchSERPTelemetryParent.sys.mjs +++ b/browser/actors/SearchSERPTelemetryParent.sys.mjs @@ -12,8 +12,15 @@ export class SearchSERPTelemetryParent extends JSWindowActorParent { receiveMessage(msg) { let browser = this.browsingContext.top.embedderElement; - if (msg.name == "SearchTelemetry:PageInfo") { - lazy.SearchSERPTelemetry.reportPageWithAds(msg.data, browser); + switch (msg.name) { + case "SearchTelemetry:PageInfo": { + lazy.SearchSERPTelemetry.reportPageWithAds(msg.data, browser); + break; + } + case "SearchTelemetry:AdImpressions": { + lazy.SearchSERPTelemetry.reportPageWithAdImpressions(msg.data, browser); + break; + } } } } diff --git a/browser/base/content/browser-addons.js b/browser/base/content/browser-addons.js index 61ead476981..0f3f1f7f029 100644 --- a/browser/base/content/browser-addons.js +++ b/browser/base/content/browser-addons.js @@ -500,7 +500,7 @@ var gXPInstallObserver = { Services.console.logMessage(consoleMsg); }, - observe(aSubject, aTopic, aData) { + async observe(aSubject, aTopic, aData) { var brandBundle = document.getElementById("bundle_brand"); var installInfo = aSubject.wrappedJSObject; var browser = installInfo.browser; @@ -622,6 +622,7 @@ var gXPInstallObserver = { break; } case "addon-install-blocked": { + await window.ensureCustomElements("moz-support-link"); // Dismiss the progress notification. Note that this is bad if // there are multiple simultaneous installs happening, see // bug 1329884 for a longer explanation. @@ -694,13 +695,7 @@ var gXPInstallObserver = { ? "site-permission-addons" : "unlisted-extensions-risks"; let learnMore = doc.getElementById("addon-install-blocked-info"); - learnMore.textContent = gNavigatorBundle.getString( - "xpinstallPromptMessage.learnMore" - ); - learnMore.setAttribute( - "href", - Services.urlFormatter.formatURLPref("app.support.baseURL") + article - ); + learnMore.setAttribute("support-page", article); }; let secHistogram = Services.telemetry.getHistogramById("SECURITY_UI"); @@ -788,6 +783,7 @@ var gXPInstallObserver = { // from product about how to approach this for extensions. declineActions.push(neverAllowAndReportAction); } + let popup = PopupNotifications.show( browser, notificationID, diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js index 16a6bc06e4a..e79d5c93932 100644 --- a/browser/base/content/browser.js +++ b/browser/base/content/browser.js @@ -40,6 +40,7 @@ ChromeUtils.defineESModuleGetters(this, { PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", PromiseUtils: "resource://gre/modules/PromiseUtils.sys.mjs", PromptUtils: "resource://gre/modules/PromptUtils.sys.mjs", + ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs", Sanitizer: "resource:///modules/Sanitizer.sys.mjs", ScreenshotsUtils: "resource:///modules/ScreenshotsUtils.sys.mjs", SearchUIUtils: "resource:///modules/SearchUIUtils.sys.mjs", @@ -52,6 +53,7 @@ ChromeUtils.defineESModuleGetters(this, { TabsSetupFlowManager: "resource:///modules/firefox-view-tabs-setup-manager.sys.mjs", TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs", + TranslationsParent: "resource://gre/actors/TranslationsParent.sys.mjs", UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs", UrlbarInput: "resource:///modules/UrlbarInput.sys.mjs", UrlbarPrefs: "resource:///modules/UrlbarPrefs.sys.mjs", @@ -88,8 +90,6 @@ XPCOMUtils.defineLazyModuleGetters(this, { PanelView: "resource:///modules/PanelMultiView.jsm", Pocket: "chrome://pocket/content/Pocket.jsm", ProcessHangMonitor: "resource:///modules/ProcessHangMonitor.jsm", - // TODO (Bug 1529552): Remove once old urlbar code goes away. - ReaderMode: "resource://gre/modules/ReaderMode.jsm", SafeBrowsing: "resource://gre/modules/SafeBrowsing.jsm", SaveToPocket: "chrome://pocket/content/SaveToPocket.jsm", SiteDataManager: "resource:///modules/SiteDataManager.jsm", @@ -5364,6 +5364,7 @@ var XULBrowserWindow = { CFRPageActions.updatePageActions(gBrowser.selectedBrowser); AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser); + TranslationsParent.updateButtonFromLocationChange(gBrowser.selectedBrowser); PictureInPicture.updateUrlbarToggle(gBrowser.selectedBrowser); diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml index c85703947b6..0014fd6b959 100644 --- a/browser/base/content/browser.xhtml +++ b/browser/base/content/browser.xhtml @@ -81,6 +81,7 @@ + diff --git a/browser/base/content/navigator-toolbox.inc.xhtml b/browser/base/content/navigator-toolbox.inc.xhtml index e46b9581f05..29f6b50e454 100644 --- a/browser/base/content/navigator-toolbox.inc.xhtml +++ b/browser/base/content/navigator-toolbox.inc.xhtml @@ -374,6 +374,14 @@ + - diff --git a/browser/base/content/tabbrowser.js b/browser/base/content/tabbrowser.js index d705b48567f..6e4fee4c138 100644 --- a/browser/base/content/tabbrowser.js +++ b/browser/base/content/tabbrowser.js @@ -2619,7 +2619,7 @@ userContextId, csp, skipLoad = createLazyBrowser, - batchInsertingTabs, + insertTab = true, globalHistoryOptions, triggeringRemoteType, } = {} @@ -2701,8 +2701,7 @@ noInitialLabel, skipBackgroundNotify, }); - if (!batchInsertingTabs) { - // When we are not restoring a session, we need to know + if (insertTab) { // insert the tab into the tab container in the correct position this._insertTabAtIndex(t, { index, @@ -2745,10 +2744,11 @@ ); b.registeredOpenURI = lazyBrowserURI; } - // If we're batch inserting, we can't set the tab state meaningfully - // because the tab won't be in the DOM yet. The consumer (normally - // session restore) will have to do this work itself. - if (!batchInsertingTabs) { + // If we're not inserting the tab into the DOM, we can't set the tab + // state meaningfully. Session restore (the only caller who does this) + // will have to do this work itself later, when the tabs have been + // inserted. + if (insertTab) { SessionStore.setTabState(t, { entries: [ { @@ -2788,7 +2788,7 @@ return null; } - if (!batchInsertingTabs) { + if (insertTab) { // Fire a TabOpen event this._fireTabOpen(t, eventDetail); @@ -3119,7 +3119,7 @@ } }, - addMultipleTabs(restoreTabsLazily, selectTab, aPropertiesTabs) { + createTabsForSessionRestore(restoreTabsLazily, selectTab, tabDataList) { let tabs = []; let tabsFragment = document.createDocumentFragment(); let tabToSelect = null; @@ -3130,8 +3130,8 @@ // into a document fragment so that we can insert them all // together. This prevents synch reflow for each tab // insertion. - for (var i = 0; i < aPropertiesTabs.length; i++) { - let tabData = aPropertiesTabs[i]; + for (var i = 0; i < tabDataList.length; i++) { + let tabData = tabDataList[i]; let userContextId = tabData.userContextId; let select = i == selectTab - 1; @@ -3191,7 +3191,7 @@ userContextId, skipBackgroundNotify: true, bulkOrderedOpen: true, - batchInsertingTabs: true, + insertTab: false, skipLoad: true, preferredRemoteType, }); @@ -6635,6 +6635,28 @@ // created or re-created browser, e.g. because it just switched // remoteness or is a new tab/window). this.mBrowser.urlbarChangeTracker.startedLoad(); + + // To improve the user experience and perceived performance when + // opening links in new tabs, we show the url and tab title sooner, + // but only if it's safe (from a phishing point of view) to do so, + // thus there's no session history and the load starts from a + // non-web-controlled blank page. + if ( + this.mBrowser.browsingContext.sessionHistory?.count === 0 && + BrowserUIUtils.checkEmptyPageOrigin( + this.mBrowser, + originalLocation + ) + ) { + gBrowser.setInitialTabTitle(this.mTab, originalLocation.spec, { + isURL: true, + }); + + this.mBrowser._initialURI = originalLocation; + if (this.mTab.selected && !gBrowser.userTypedValue) { + gURLBar.setURI(); + } + } } delete this.mBrowser.initialPageLoadedFromUserAction; // If the browser is loading it must not be crashed anymore diff --git a/browser/base/content/test/performance/browser_startup_content.js b/browser/base/content/test/performance/browser_startup_content.js index ca25789c46b..861ba22dd71 100644 --- a/browser/base/content/test/performance/browser_startup_content.js +++ b/browser/base/content/test/performance/browser_startup_content.js @@ -35,7 +35,7 @@ const known_scripts = { "resource:///actors/LinkHandlerChild.sys.mjs", "resource:///actors/SearchSERPTelemetryChild.sys.mjs", "resource://gre/actors/ContentMetaChild.sys.mjs", - "resource://gre/modules/Readerable.jsm", + "resource://gre/modules/Readerable.sys.mjs", // Telemetry "resource://gre/modules/TelemetryControllerBase.sys.mjs", // bug 1470339 diff --git a/browser/base/content/test/performance/browser_startup_images.js b/browser/base/content/test/performance/browser_startup_images.js index 9ca808ca307..e0c7560e9ad 100644 --- a/browser/base/content/test/performance/browser_startup_images.js +++ b/browser/base/content/test/performance/browser_startup_images.js @@ -40,13 +40,6 @@ const knownUnshownImages = [ platforms: ["linux", "win", "macosx"], }, - { - // bug 1817360 fixes this. - file: "resource://gre-resources/broken-image.png", - platforms: ["linux", "win", "macosx"], - intermittentNotLoaded: ["linux", "win", "macosx"], - }, - { file: "chrome://global/skin/icons/chevron.svg", platforms: ["win", "linux", "macosx"], diff --git a/browser/base/content/test/tabs/browser.ini b/browser/base/content/test/tabs/browser.ini index 986f577a2b9..764ebf336a4 100644 --- a/browser/base/content/test/tabs/browser.ini +++ b/browser/base/content/test/tabs/browser.ini @@ -48,6 +48,42 @@ skip-if = debug # Bug 1444565, Bug 1457887 support-files = tab_that_closes.html [browser_hiddentab_contextmenu.js] [browser_lazy_tab_browser_events.js] +[browser_link_in_tab_title_and_url_prefilled_blank_page.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs +[browser_link_in_tab_title_and_url_prefilled_new_window.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs +[browser_link_in_tab_title_and_url_prefilled_normal_page_blank_target.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs +[browser_link_in_tab_title_and_url_prefilled_normal_page_by_script.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs +[browser_link_in_tab_title_and_url_prefilled_normal_page_no_target.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs +[browser_link_in_tab_title_and_url_prefilled_normal_page_other_target.js] +support-files = + common_link_in_tab_title_and_url_prefilled.js + link_in_tab_title_and_url_prefilled.html + request-timeout.sjs + wait-a-bit.sjs [browser_long_data_url_label_truncation.js] [browser_multiselect_tabs_active_tab_selected_by_default.js] [browser_multiselect_tabs_bookmark.js] diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_blank_page.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_blank_page.js new file mode 100644 index 00000000000..b5731134819 --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_blank_page.js @@ -0,0 +1,139 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar when opening about:blank by clicking link. + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function blank_target__foreground() { + await doTestInSameWindow({ + link: "blank-page--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: "", + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: "", + history: [BLANK_URL], + }, + }); +}); + +add_task(async function blank_target__background() { + await doTestInSameWindow({ + link: "blank-page--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: HOME_URL, + history: [BLANK_URL], + }, + }); +}); + +add_task(async function other_target__foreground() { + await doTestInSameWindow({ + link: "blank-page--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + history: [BLANK_URL], + }, + }); +}); + +add_task(async function other_target__background() { + await doTestInSameWindow({ + link: "blank-page--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: HOME_URL, + history: [BLANK_URL], + }, + }); +}); + +add_task(async function by_script() { + await doTestInSameWindow({ + link: "blank-page--by-script", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + history: [BLANK_URL], + }, + }); +}); + +add_task(async function no_target() { + await doTestInSameWindow({ + link: "blank-page--no-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + // Inherit the title and URL until finishing loading a new link when the + // link is opened in same tab. + tab: HOME_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + history: [HOME_URL, BLANK_URL], + }, + }); +}); diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_new_window.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_new_window.js new file mode 100644 index 00000000000..6d18887941f --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_new_window.js @@ -0,0 +1,54 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar on new window opened by clicking +// link. + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function normal_page__blank_target() { + await doTestWithNewWindow({ + link: "wait-a-bit--blank-target", + expectedSetURICalled: true, + }); +}); + +add_task(async function normal_page__other_target() { + await doTestWithNewWindow({ + link: "wait-a-bit--other-target", + expectedSetURICalled: false, + }); +}); + +add_task(async function normal_page__by_script() { + await doTestWithNewWindow({ + link: "wait-a-bit--by-script", + expectedSetURICalled: false, + }); +}); + +add_task(async function blank_page__blank_target() { + await doTestWithNewWindow({ + link: "blank-page--blank-target", + expectedSetURICalled: false, + }); +}); + +add_task(async function blank_page__other_target() { + await doTestWithNewWindow({ + link: "blank-page--other-target", + expectedSetURICalled: false, + }); +}); + +add_task(async function blank_page__by_script() { + await doTestWithNewWindow({ + link: "blank-page--by-script", + expectedSetURICalled: false, + }); +}); diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_blank_target.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_blank_target.js new file mode 100644 index 00000000000..b7559a7d391 --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_blank_target.js @@ -0,0 +1,180 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar when opening normal web page by +// clicking link that the target is "_blank". + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function normal_page__foreground__click() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: WAIT_A_BIT_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__foreground__contextmenu() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CONTEXT_MENU, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: WAIT_A_BIT_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__foreground__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: WAIT_A_BIT_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [], + }, + }); +}); + +add_task(async function normal_page__foreground__timeout() { + await doTestInSameWindow({ + link: "request-timeout--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: REQUEST_TIMEOUT_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: REQUEST_TIMEOUT_URL, + history: [REQUEST_TIMEOUT_URL], + }, + }); +}); + +add_task(async function normal_page__background__click() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: HOME_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__background__contextmenu() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CONTEXT_MENU, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: HOME_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__background__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + history: [], + }, + }); +}); + +add_task(async function normal_page__background__timeout() { + await doTestInSameWindow({ + link: "request-timeout--blank-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: HOME_URL, + history: [REQUEST_TIMEOUT_URL], + }, + }); +}); diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_by_script.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_by_script.js new file mode 100644 index 00000000000..a3bc922278a --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_by_script.js @@ -0,0 +1,75 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar when opening normal web page by +// clicking link that opens by script. + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function normal_page__by_script() { + await doTestInSameWindow({ + link: "wait-a-bit--by-script", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__by_script__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--by-script", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + history: [], + }, + }); +}); + +add_task(async function normal_page__by_script__timeout() { + await doTestInSameWindow({ + link: "request-timeout--by-script", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: REQUEST_TIMEOUT_URL, + history: [REQUEST_TIMEOUT_URL], + }, + }); +}); diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_no_target.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_no_target.js new file mode 100644 index 00000000000..a835211d8a8 --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_no_target.js @@ -0,0 +1,77 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar when opening normal web page by +// clicking link that has no target. + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function normal_page__no_target() { + await doTestInSameWindow({ + link: "wait-a-bit--no-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + // Inherit the title and URL until finishing loading a new link when the + // link is opened in same tab. + tab: HOME_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [HOME_URL, WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__no_target__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--no-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: HOME_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: HOME_TITLE, + urlbar: HOME_URL, + history: [HOME_URL], + }, + }); +}); + +add_task(async function normal_page__no_target__timeout() { + await doTestInSameWindow({ + link: "request-timeout--no-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: HOME_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: REQUEST_TIMEOUT_URL, + history: [HOME_URL, REQUEST_TIMEOUT_URL], + }, + }); +}); diff --git a/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_other_target.js b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_other_target.js new file mode 100644 index 00000000000..293253b8070 --- /dev/null +++ b/browser/base/content/test/tabs/browser_link_in_tab_title_and_url_prefilled_normal_page_other_target.js @@ -0,0 +1,138 @@ +/* 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/. */ + +// Test the behavior of the tab and the urlbar when opening normal web page by +// clicking link that the target is "other". + +/* import-globals-from common_link_in_tab_title_and_url_prefilled.js */ +Services.scriptloader.loadSubScript( + "chrome://mochitests/content/browser/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js", + this +); + +add_task(async function normal_page__other_target__foreground() { + await doTestInSameWindow({ + link: "wait-a-bit--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: WAIT_A_BIT_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__other_target__foreground__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + history: [], + }, + }); +}); + +add_task(async function normal_page__other_target__foreground__timeout() { + await doTestInSameWindow({ + link: "request-timeout--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.FOREGROUND, + loadingState: { + tab: BLANK_TITLE, + urlbar: BLANK_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: REQUEST_TIMEOUT_URL, + history: [REQUEST_TIMEOUT_URL], + }, + }); +}); + +add_task(async function normal_page__other_target__background() { + await doTestInSameWindow({ + link: "wait-a-bit--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: WAIT_A_BIT_PAGE_TITLE, + urlbar: HOME_URL, + history: [WAIT_A_BIT_URL], + }, + }); +}); + +add_task(async function normal_page__other_target__background__abort() { + await doTestInSameWindow({ + link: "wait-a-bit--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Abort loading"); + document.getElementById("stop-button").click(); + }, + finalState: { + tab: WAIT_A_BIT_LOADING_TITLE, + urlbar: HOME_URL, + history: [], + }, + }); +}); + +add_task(async function normal_page__other_target__background__timeout() { + await doTestInSameWindow({ + link: "request-timeout--other-target", + openBy: OPEN_BY.CLICK, + openAs: OPEN_AS.BACKGROUND, + loadingState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: HOME_URL, + }, + async actionWhileLoading(onTabLoaded) { + info("Wait until loading the link target"); + await onTabLoaded; + }, + finalState: { + tab: REQUEST_TIMEOUT_LOADING_TITLE, + urlbar: HOME_URL, + history: [REQUEST_TIMEOUT_URL], + }, + }); +}); diff --git a/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js b/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js new file mode 100644 index 00000000000..c5a69d86288 --- /dev/null +++ b/browser/base/content/test/tabs/common_link_in_tab_title_and_url_prefilled.js @@ -0,0 +1,195 @@ +/* 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 { sinon } = ChromeUtils.import("resource://testing-common/Sinon.jsm"); + +const TEST_ROOT = getRootDirectory(gTestPath).replace( + "chrome://mochitests/content", + "https://example.com" +); +const HOME_URL = `${TEST_ROOT}link_in_tab_title_and_url_prefilled.html`; +const HOME_TITLE = HOME_URL.substring("https://".length); +const WAIT_A_BIT_URL = `${TEST_ROOT}wait-a-bit.sjs`; +const WAIT_A_BIT_LOADING_TITLE = WAIT_A_BIT_URL.substring("https://".length); +const WAIT_A_BIT_PAGE_TITLE = "wait a bit"; +const REQUEST_TIMEOUT_URL = `${TEST_ROOT}request-timeout.sjs`; +const REQUEST_TIMEOUT_LOADING_TITLE = REQUEST_TIMEOUT_URL.substring( + "https://".length +); +const BLANK_URL = "about:blank"; +const BLANK_TITLE = "New Tab"; + +const OPEN_BY = { + CLICK: "click", + CONTEXT_MENU: "context_menu", +}; + +const OPEN_AS = { + FOREGROUND: "foreground", + BACKGROUND: "background", +}; + +async function doTestInSameWindow({ + link, + openBy, + openAs, + loadingState, + actionWhileLoading, + finalState, +}) { + await BrowserTestUtils.withNewTab("about:blank", async browser => { + // NOTE: The behavior after the click link + // (no target) is different when the URL is opened directly with + // BrowserTestUtils.withNewTab() and when it is loaded later. + // Specifically, if we load `about:blank`, expect to see `New Tab` as the + // title of the tab, but the former will continue to display the URL that + // was previously displayed. Therefore, use the latter way. + BrowserTestUtils.loadURIString(browser, HOME_URL); + await BrowserTestUtils.browserLoaded( + gBrowser.selectedBrowser, + false, + HOME_URL + ); + + const onLoadStarted = new Promise(resolve => + gBrowser.addTabsProgressListener({ + onStateChange(aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) { + if (aStateFlags & Ci.nsIWebProgressListener.STATE_START) { + gBrowser.removeTabsProgressListener(this); + resolve(gBrowser.getTabForBrowser(aBrowser)); + } + }, + }) + ); + + info(`Open link for ${link} by ${openBy} as ${openAs}`); + const href = await openLink(browser, link, openBy, openAs); + + info("Wait until starting to load in the target tab"); + const target = await onLoadStarted; + Assert.equal(target.selected, openAs === OPEN_AS.FOREGROUND); + Assert.equal(gURLBar.value, loadingState.urlbar); + Assert.equal(target.textLabel.textContent, loadingState.tab); + + await actionWhileLoading( + BrowserTestUtils.browserLoaded(target.linkedBrowser, false, href) + ); + + info("Check the final result"); + Assert.equal(gURLBar.value, finalState.urlbar); + Assert.equal(target.textLabel.textContent, finalState.tab); + const sessionHistory = await new Promise(r => + SessionStore.getSessionHistory(target, r) + ); + Assert.deepEqual( + sessionHistory.entries.map(e => e.url), + finalState.history + ); + + BrowserTestUtils.removeTab(target); + }); +} + +async function doTestWithNewWindow({ link, expectedSetURICalled }) { + await SpecialPowers.pushPrefEnv({ + set: [["browser.link.open_newwindow", 2]], + }); + + await BrowserTestUtils.withNewTab(HOME_URL, async browser => { + const onNewWindowOpened = BrowserTestUtils.domWindowOpenedAndLoaded(); + + info(`Open link for ${link}`); + const href = await openLink( + browser, + link, + OPEN_BY.CLICK, + OPEN_AS.FOREGROUND + ); + + info("Wait until opening a new window"); + const win = await onNewWindowOpened; + + info("Check whether gURLBar.setURI is called while loading the page"); + const sandbox = sinon.createSandbox(); + registerCleanupFunction(() => { + sandbox.restore(); + }); + let isSetURIWhileLoading = false; + sandbox.stub(win.gURLBar, "setURI").callsFake(uri => { + if (!uri && win.gBrowser.selectedBrowser._initialURI) { + isSetURIWhileLoading = true; + } + }); + await BrowserTestUtils.browserLoaded( + win.gBrowser.selectedBrowser, + false, + href + ); + sandbox.restore(); + + Assert.equal(isSetURIWhileLoading, expectedSetURICalled); + Assert.equal( + !!win.gBrowser.selectedBrowser._initialURI, + expectedSetURICalled + ); + + await BrowserTestUtils.closeWindow(win); + }); + + await SpecialPowers.popPrefEnv(); +} + +async function openLink(browser, link, openBy, openAs) { + let href; + const openAsBackground = openAs === OPEN_AS.BACKGROUND; + if (openBy === OPEN_BY.CLICK) { + href = await synthesizeMouse(browser, link, { + ctrlKey: openAsBackground, + metaKey: openAsBackground, + }); + } else if (openBy === OPEN_BY.CONTEXT_MENU) { + await SpecialPowers.pushPrefEnv({ + set: [["browser.tabs.loadInBackground", openAsBackground]], + }); + + const contextMenu = document.getElementById("contentAreaContextMenu"); + const onPopupShown = BrowserTestUtils.waitForEvent( + contextMenu, + "popupshown" + ); + + href = await synthesizeMouse(browser, link, { + type: "contextmenu", + button: 2, + }); + + await onPopupShown; + + const openLinkMenuItem = contextMenu.querySelector( + "#context-openlinkintab" + ); + contextMenu.activateItem(openLinkMenuItem); + + await SpecialPowers.popPrefEnv(); + } else { + throw new Error("Invalid openBy"); + } + + return href; +} + +async function synthesizeMouse(browser, link, event) { + return SpecialPowers.spawn( + browser, + [link, event], + (linkInContent, eventInContent) => { + const { EventUtils } = ChromeUtils.importESModule( + "resource://specialpowers/SpecialPowersEventUtils.sys.mjs" + ); + const target = content.document.getElementById(linkInContent); + EventUtils.synthesizeMouseAtCenter(target, eventInContent, content); + return target.href; + } + ); +} diff --git a/browser/base/content/test/tabs/link_in_tab_title_and_url_prefilled.html b/browser/base/content/test/tabs/link_in_tab_title_and_url_prefilled.html new file mode 100644 index 00000000000..a7561f40997 --- /dev/null +++ b/browser/base/content/test/tabs/link_in_tab_title_and_url_prefilled.html @@ -0,0 +1,30 @@ + + +wait-a-bit - _blank target +wait-a-bit - other target +wait-a-bit - script +wait-a-bit - no target + +request-timeout - _blank target +request-timeout - other target +request-timeout - script +request-timeout - no target + +about:blank - _blank target +about:blank - other target +blank - script +about:blank - no target + + diff --git a/browser/base/content/test/tabs/request-timeout.sjs b/browser/base/content/test/tabs/request-timeout.sjs new file mode 100644 index 00000000000..00e95ca4c06 --- /dev/null +++ b/browser/base/content/test/tabs/request-timeout.sjs @@ -0,0 +1,8 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +async function handleRequest(request, response) { + response.setStatusLine("1.1", 408, "Request Timeout"); +} diff --git a/browser/base/content/test/tabs/wait-a-bit.sjs b/browser/base/content/test/tabs/wait-a-bit.sjs new file mode 100644 index 00000000000..e90133d7528 --- /dev/null +++ b/browser/base/content/test/tabs/wait-a-bit.sjs @@ -0,0 +1,23 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +// eslint-disable-next-line mozilla/no-redeclare-with-import-autofix +const { setTimeout } = ChromeUtils.importESModule( + "resource://gre/modules/Timer.sys.mjs" +); + +async function handleRequest(request, response) { + response.seizePower(); + + await new Promise(r => setTimeout(r, 2000)); + + response.write("HTTP/1.1 200 OK\r\n"); + const body = "wait a bitok"; + response.write("Content-Type: text/html\r\n"); + response.write(`Content-Length: ${body.length}\r\n`); + response.write("\r\n"); + response.write(body); + response.finish(); +} diff --git a/browser/base/content/webext-panels.js b/browser/base/content/webext-panels.js index c1927512f08..22a5c0b4b63 100644 --- a/browser/base/content/webext-panels.js +++ b/browser/base/content/webext-panels.js @@ -124,8 +124,6 @@ function getBrowser(panel) { }; browser.addEventListener("DidChangeBrowserRemoteness", initBrowser); - // Potentially unnecessary: bug 1822037 will evaluate further. - browser.browsingContext.isAppTab = true; return readyPromise.then(initBrowser); } diff --git a/browser/components/contextualidentity/test/browser/browser_originattrs_reopenin.js b/browser/components/contextualidentity/test/browser/browser_originattrs_reopenin.js index 656586d749f..1372f1ff782 100644 --- a/browser/components/contextualidentity/test/browser/browser_originattrs_reopenin.js +++ b/browser/components/contextualidentity/test/browser/browser_originattrs_reopenin.js @@ -94,7 +94,7 @@ add_task(async function testReopen() { * reopen container tab in regular tab * Close all the tabs * This tests that behaviour of reopening tabs is correct - * */ + */ let regularPage = await openURIInRegularTab("about:blank"); var currRemoteType; diff --git a/browser/components/downloads/DownloadsViewUI.sys.mjs b/browser/components/downloads/DownloadsViewUI.sys.mjs index 575709eacc8..d3cd428892d 100644 --- a/browser/components/downloads/DownloadsViewUI.sys.mjs +++ b/browser/components/downloads/DownloadsViewUI.sys.mjs @@ -1031,7 +1031,7 @@ DownloadsViewUI.DownloadElementShell.prototype = { isCommandEnabled(aCommand) { switch (aCommand) { case "downloadsCmd_retry": - return this.download.canceled || this.download.error; + return this.download.canceled || !!this.download.error; case "downloadsCmd_pauseResume": return this.download.hasPartialData && !this.download.error; case "downloadsCmd_openReferrer": diff --git a/browser/components/downloads/content/downloads.js b/browser/components/downloads/content/downloads.js index cc605dd152f..41903719ca6 100644 --- a/browser/components/downloads/content/downloads.js +++ b/browser/components/downloads/content/downloads.js @@ -446,10 +446,11 @@ var DownloadsPanel = { // If the last element in the list is selected, or the footer is already // focused, focus the footer. if ( - richListBox.selectedItem === richListBox.lastElementChild || - document - .getElementById("downloadsFooter") - .contains(document.activeElement) + DownloadsView.canChangeSelectedItem && + (richListBox.selectedItem === richListBox.lastElementChild || + document + .getElementById("downloadsFooter") + .contains(document.activeElement)) ) { richListBox.selectedIndex = -1; DownloadsFooter.focus(); @@ -513,7 +514,11 @@ var DownloadsPanel = { return; } - if (document.activeElement && this.panel.contains(document.activeElement)) { + if ( + document.activeElement && + (this.panel.contains(document.activeElement) || + this.panel.shadowRoot.contains(document.activeElement)) + ) { return; } let focusOptions = {}; @@ -521,7 +526,9 @@ var DownloadsPanel = { focusOptions.focusVisible = false; } if (DownloadsView.richListBox.itemCount > 0) { - DownloadsView.richListBox.selectedIndex = 0; + if (DownloadsView.canChangeSelectedItem) { + DownloadsView.richListBox.selectedIndex = 0; + } DownloadsView.richListBox.focus(focusOptions); } else { DownloadsFooter.focus(focusOptions); @@ -960,6 +967,15 @@ var DownloadsView = { return this.contextMenu.state != "closed"; }, + /** + * Whether it's possible to change the currently selected item. + */ + get canChangeSelectedItem() { + // When the context menu or a subview are open, the selected item should + // not change. + return !this.contextMenuOpen && !this.subViewOpen; + }, + /** * Mouse listeners to handle selection on hover. */ @@ -978,7 +994,7 @@ var DownloadsView = { aEvent.target.closest(".downloadMainArea") ); - if (!this.contextMenuOpen && !this.subViewOpen) { + if (this.canChangeSelectedItem) { this.richListBox.selectedItem = item; } }, @@ -995,21 +1011,19 @@ var DownloadsView = { // If the destination element is outside of the richlistitem, clear the // selection. - if ( - !this.contextMenuOpen && - !this.subViewOpen && - !item.contains(aEvent.relatedTarget) - ) { + if (this.canChangeSelectedItem && !item.contains(aEvent.relatedTarget)) { this.richListBox.selectedIndex = -1; } }, onDownloadContextMenu(aEvent) { - let element = this.richListBox.selectedItem; + let element = aEvent.originalTarget.closest("richlistitem"); if (!element) { return; } - + // Ensure the selected item is the expected one, so commands and the + // context menu are updated appropriately. + this.richListBox.selectedItem = element; DownloadsViewController.updateCommands(); DownloadsViewUI.updateContextMenuForElement(this.contextMenu, element); diff --git a/browser/components/downloads/test/browser/browser.ini b/browser/components/downloads/test/browser/browser.ini index 6c5c0ec1d0a..b7f4acb542a 100644 --- a/browser/components/downloads/test/browser/browser.ini +++ b/browser/components/downloads/test/browser/browser.ini @@ -3,51 +3,38 @@ support-files = head.js [browser_about_downloads.js] [browser_basic_functionality.js] +[browser_confirm_unblock_download.js] +[browser_download_is_clickable.js] +[browser_download_opens_on_click.js] +[browser_download_opens_policy.js] [browser_download_overwrite.js] support-files = foo.txt foo.txt^headers^ !/toolkit/content/tests/browser/common/mockTransfer.js -[browser_download_starts_in_tmp.js] -[browser_first_download_panel.js] -skip-if = - os == "linux" # Bug 949434 -[browser_image_mimetype_issues.js] -https_first_disabled = true -support-files = - not-really-a-jpeg.jpeg - not-really-a-jpeg.jpeg^headers^ - blank.JPG -[browser_library_select_all.js] -[browser_overflow_anchor.js] -skip-if = os == "linux" # Bug 952422 -[browser_confirm_unblock_download.js] -[browser_iframe_gone_mid_download.js] -[browser_indicatorDrop.js] -[browser_libraryDrop.js] -skip-if = (os == 'win' && os_version == '10.0' && ccov) # Bug 1306510 -[browser_library_clearall.js] -[browser_download_opens_on_click.js] -[browser_download_opens_policy.js] [browser_download_spam_protection.js] skip-if = os == "linux" && bits == 64 # bug 1743263 & Bug 1742678 os == "win" && os_version == "6.1" # Skip on Azure - frequent failure support-files = test_spammy_page.html -[browser_download_is_clickable.js] +[browser_download_starts_in_tmp.js] +[browser_downloads_autohide.js] +[browser_downloads_context_menu_always_open_similar_files.js] +[browser_downloads_context_menu_delete_file.js] +[browser_downloads_context_menu_selection.js] [browser_downloads_keynav.js] [browser_downloads_panel_block.js] [browser_downloads_panel_context_menu.js] skip-if = os == "win" && os_version == "10.0" && bits == 64 && !debug # Bug 1719949 win10_2004 && bits == 32 && debug # Bug 1727925 -[browser_downloads_context_menu_always_open_similar_files.js] [browser_downloads_panel_ctrl_click.js] [browser_downloads_panel_disable_items.js] support-files = foo.txt foo.txt^headers^ [browser_downloads_panel_dontshow.js] +[browser_downloads_panel_focus.js] [browser_downloads_panel_height.js] [browser_downloads_panel_opens.js] skip-if = @@ -55,10 +42,24 @@ skip-if = support-files = foo.txt foo.txt^headers^ -[browser_downloads_autohide.js] -[browser_go_to_download_page.js] -[browser_pdfjs_preview.js] [browser_downloads_pauseResume.js] -[browser_downloads_panel_focus.js] -[browser_downloads_context_menu_delete_file.js] +[browser_first_download_panel.js] +skip-if = + os == "linux" # Bug 949434 +[browser_go_to_download_page.js] +[browser_iframe_gone_mid_download.js] +[browser_image_mimetype_issues.js] +https_first_disabled = true +support-files = + not-really-a-jpeg.jpeg + not-really-a-jpeg.jpeg^headers^ + blank.JPG +[browser_indicatorDrop.js] +[browser_libraryDrop.js] +skip-if = (os == 'win' && os_version == '10.0' && ccov) # Bug 1306510 +[browser_library_clearall.js] +[browser_library_select_all.js] +[browser_overflow_anchor.js] +skip-if = os == "linux" # Bug 952422 +[browser_pdfjs_preview.js] [browser_tempfilename.js] diff --git a/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js b/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js new file mode 100644 index 00000000000..cd2eb3e229b --- /dev/null +++ b/browser/components/downloads/test/browser/browser_downloads_context_menu_selection.js @@ -0,0 +1,115 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +/** + * Test that the context menu refers to the triggering item, even if the + * selection was not set preemptively. + */ + +async function createDownloadFiles() { + let dir = await setDownloadDir(); + let downloads = []; + downloads.push({ + state: DownloadsCommon.DOWNLOAD_FAILED, + contentType: "text/plain", + target: new FileUtils.File(PathUtils.join(dir, "does-not-exist.txt")), + }); + downloads.push({ + state: DownloadsCommon.DOWNLOAD_FINISHED, + contentType: "text/plain", + target: await createDownloadedFile(PathUtils.join(dir, "file.txt"), "file"), + }); + return downloads; +} + +add_setup(async function setup() { + await PlacesUtils.history.clear(); + await startServer(); + + registerCleanupFunction(async function() { + await task_resetState(); + await PlacesUtils.history.clear(); + }); +}); + +add_task(async function test() { + // remove download files, empty out collections + let downloadList = await Downloads.getList(Downloads.ALL); + let downloadCount = (await downloadList.getAll()).length; + Assert.equal(downloadCount, 0, "There should be 0 downloads"); + await task_resetState(); + let downloads = await createDownloadFiles(); + await task_addDownloads(downloads); + await task_openPanel(); + let downloadsListBox = document.getElementById("downloadsListBox"); + await TestUtils.waitForCondition(() => { + downloadsListBox.removeAttribute("disabled"); + return downloadsListBox.childElementCount == downloads.length; + }); + + // Note we're not doing anything to set the selectedItem here, exactly to + // check the context menu doesn't depend on some selection prerequisite. + + let first = downloadsListBox.querySelector("richlistitem"); + let second = downloadsListBox.querySelector("richlistitem:nth-child(2)"); + + info("Check first item"); + let firstDownload = DownloadsView.itemForElement(first).download; + is( + DownloadsCommon.stateOfDownload(firstDownload), + DownloadsCommon.DOWNLOAD_FINISHED, + "Download states match up" + ); + // mousemove to the _other_ download, to ensure it doesn't confuse code. + EventUtils.synthesizeMouse(second, -5, -5, { type: "mousemove" }); + await checkCommandsWithContextMenu(first, { + downloadsCmd_show: true, + cmd_delete: true, + }); + + info("Check second item"); + let secondDownload = DownloadsView.itemForElement(second).download; + is( + DownloadsCommon.stateOfDownload(secondDownload), + DownloadsCommon.DOWNLOAD_FAILED, + "Download states match up" + ); + // mousemove to the _other_ download, to ensure it doesn't confuse code. + EventUtils.synthesizeMouse(first, -5, -5, { type: "mousemove" }); + await checkCommandsWithContextMenu(second, { + downloadsCmd_show: false, + cmd_delete: true, + }); + + let hiddenPromise = BrowserTestUtils.waitForEvent( + DownloadsPanel.panel, + "popuphidden" + ); + DownloadsPanel.hidePanel(); + await hiddenPromise; +}); + +async function checkCommandsWithContextMenu(element, commands) { + let contextMenu = await openContextMenu(element); + for (let command in commands) { + let enabled = commands[command]; + let commandStatus = enabled ? "enabled" : "disabled"; + info(`Checking command ${command} is ${commandStatus}`); + + let commandElt = contextMenu.querySelector(`[command="${command}"]`); + Assert.equal( + !BrowserTestUtils.is_hidden(commandElt), + enabled, + `${command} should be ${enabled ? "visible" : "hidden"}` + ); + + Assert.strictEqual( + DownloadsView.richListBox.selectedItem._shell.isCommandEnabled(command), + enabled, + `${command} should be ${commandStatus}` + ); + } + contextMenu.hidePopup(); +} diff --git a/browser/components/downloads/test/browser/browser_downloads_panel_context_menu.js b/browser/components/downloads/test/browser/browser_downloads_panel_context_menu.js index c5deb992a9d..6ae0ec1fd76 100644 --- a/browser/components/downloads/test/browser/browser_downloads_panel_context_menu.js +++ b/browser/components/downloads/test/browser/browser_downloads_panel_context_menu.js @@ -591,5 +591,10 @@ async function prepareDownloads(downloads, overrideExtension = null) { } ok(props.target instanceof Ci.nsIFile, "download target is a nsIFile"); } - await task_addDownloads(downloads); + // If we'd just insert downloads as defined in the test case, they would + // appear reversed in the panel, because they will be in descending insertion + // order (newest at the top). The problem is we define an itemIndex based on + // the downloads array, and it would be weird to define it based on a + // reversed order. Short, we just reverse the array to preserve the order. + await task_addDownloads(downloads.reverse()); } diff --git a/browser/components/extensions/ExtensionPopups.jsm b/browser/components/extensions/ExtensionPopups.jsm index e98b9bf4d75..5738c44cf25 100644 --- a/browser/components/extensions/ExtensionPopups.jsm +++ b/browser/components/extensions/ExtensionPopups.jsm @@ -403,8 +403,6 @@ class BasePopup { }; browser.addEventListener("DidChangeBrowserRemoteness", initBrowser); // eslint-disable-line mozilla/balanced-listeners - // Potentially unnecessary: bug 1822037 will evaluate further. - browser.browsingContext.isAppTab = true; if (!popupURL) { // For remote browsers, we can't do any setup until the frame loader is diff --git a/browser/components/extensions/test/browser/browser.ini b/browser/components/extensions/test/browser/browser.ini index eac62993f31..12fd6d25b6c 100644 --- a/browser/components/extensions/test/browser/browser.ini +++ b/browser/components/extensions/test/browser/browser.ini @@ -199,6 +199,7 @@ skip-if = os == "mac" && !debug # Bug 1775565 win11_2009 # Bug 1775565 [browser_ext_optionsPage_browser_style.js] +[browser_ext_optionsPage_links_open_in_tabs.js] [browser_ext_optionsPage_modals.js] [browser_ext_optionsPage_popups.js] [browser_ext_optionsPage_privileges.js] @@ -225,6 +226,7 @@ https_first_disabled = true [browser_ext_popup_background.js] [browser_ext_popup_corners.js] [browser_ext_popup_focus.js] +[browser_ext_popup_links_open_in_tabs.js] [browser_ext_popup_requestPermission.js] [browser_ext_popup_select.js] skip-if = diff --git a/browser/components/extensions/test/browser/browser_ext_optionsPage_links_open_in_tabs.js b/browser/components/extensions/test/browser/browser_ext_optionsPage_links_open_in_tabs.js new file mode 100644 index 00000000000..147754b3443 --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_optionsPage_links_open_in_tabs.js @@ -0,0 +1,68 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +add_task(async function test_options_links() { + async function backgroundScript() { + browser.runtime.openOptionsPage(); + } + + function optionsScript() { + browser.test.sendMessage("options-page:loaded", document.documentURI); + } + + let extension = ExtensionTestUtils.loadExtension({ + useAddonManager: "temporary", + + manifest: { + options_ui: { + page: "options.html", + }, + }, + files: { + "options.html": ` + + + + + + +

Extensions Options

+ options page link + + `, + "options.js": optionsScript, + }, + background: backgroundScript, + }); + + const aboutAddonsTab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "about:addons" + ); + + await extension.startup(); + + await extension.awaitMessage("options-page:loaded"); + + const optionsBrowser = getInlineOptionsBrowser(gBrowser.selectedBrowser); + + const promiseNewTabOpened = BrowserTestUtils.waitForNewTab( + gBrowser, + "https://example.com/options-page-link" + ); + await SpecialPowers.spawn(optionsBrowser, [], () => + content.document.querySelector("a").click() + ); + info( + "Expect a new tab to be opened when a link is clicked in the options_page embedded inside about:addons" + ); + const newTab = await promiseNewTabOpened; + ok(newTab, "Got a new tab created on the expected url"); + BrowserTestUtils.removeTab(newTab); + + BrowserTestUtils.removeTab(aboutAddonsTab); + + await extension.unload(); +}); diff --git a/browser/components/extensions/test/browser/browser_ext_popup_links_open_in_tabs.js b/browser/components/extensions/test/browser/browser_ext_popup_links_open_in_tabs.js new file mode 100644 index 00000000000..b7d8cb18ecf --- /dev/null +++ b/browser/components/extensions/test/browser/browser_ext_popup_links_open_in_tabs.js @@ -0,0 +1,56 @@ +/* Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ */ + +"use strict"; + +add_task(async function test_popup_links_open_tabs() { + let extension = ExtensionTestUtils.loadExtension({ + manifest: { + browser_action: { + default_popup: "popup.html", + }, + }, + + files: { + "popup.html": ` + + + + + + +

Extension Popup

+ popup page link + + `, + "popup.js": function() { + window.onload = () => { + browser.test.sendMessage("from-popup", "popup-a"); + }; + }, + }, + }); + + await extension.startup(); + + let widget = getBrowserActionWidget(extension); + CustomizableUI.addWidgetToArea(widget.id, CustomizableUI.AREA_NAVBAR, 0); + + let promiseActionPopupBrowser = awaitExtensionPanel(extension); + clickBrowserAction(extension); + await extension.awaitMessage("from-popup"); + let popupBrowser = await promiseActionPopupBrowser; + const promiseNewTabOpened = BrowserTestUtils.waitForNewTab( + gBrowser, + "https://example.com/popup-page-link" + ); + await SpecialPowers.spawn(popupBrowser, [], () => + content.document.querySelector("a").click() + ); + const newTab = await promiseNewTabOpened; + ok(newTab, "Got a new tab created on the expected url"); + BrowserTestUtils.removeTab(newTab); + + await closeBrowserAction(extension); + await extension.unload(); +}); diff --git a/browser/components/firefoxview/firefox-view-tabs-setup-manager.sys.mjs b/browser/components/firefoxview/firefox-view-tabs-setup-manager.sys.mjs index 3b6135beea3..72132a79295 100644 --- a/browser/components/firefoxview/firefox-view-tabs-setup-manager.sys.mjs +++ b/browser/components/firefoxview/firefox-view-tabs-setup-manager.sys.mjs @@ -169,7 +169,7 @@ export const TabsSetupFlowManager = new (class { this._currentSetupStateName = "not-signed-in"; this._shouldShowSuccessConfirmation = false; this._didShowMobilePromo = false; - this._waitingForTabs = false; + this.abortWaitingForTabs(); this.syncHasWorked = false; @@ -178,6 +178,8 @@ export const TabsSetupFlowManager = new (class { mobileDeviceConnected: this.mobileDeviceConnected, secondaryDeviceConnected: this.secondaryDeviceConnected, }; + // keep track of tab-pickup-container instance visibilities + this._viewVisibilityStates = new Map(); } get isPrimaryPasswordLocked() { @@ -215,6 +217,14 @@ export const TabsSetupFlowManager = new (class { Services.obs.removeObserver(this, FXA_DEVICE_CONNECTED); Services.obs.removeObserver(this, FXA_DEVICE_DISCONNECTED); } + get hasVisibleViews() { + return Array.from(this._viewVisibilityStates.values()).reduce( + (hasVisible, visibility) => { + return hasVisible || visibility == "visible"; + }, + false + ); + } get currentSetupState() { return this.setupState.get(this._currentSetupStateName); } @@ -296,12 +306,17 @@ export const TabsSetupFlowManager = new (class { break; case TOPIC_DEVICELIST_UPDATED: this.logger.debug("Handling observer notification:", topic, data); - if (await this.refreshDevices()) { - this.logger.debug( - "refreshDevices made changes, calling maybeUpdateUI" - ); + const { deviceStateChanged, deviceAdded } = await this.refreshDevices(); + if (deviceStateChanged) { this.maybeUpdateUI(true); } + if (deviceAdded && this.secondaryDeviceConnected) { + this.logger.debug("device was added"); + this._deviceAddedResultsNeverSeen = true; + if (this.hasVisibleViews) { + this.startWaitingForNewDeviceTabs(); + } + } break; case FXA_DEVICE_CONNECTED: case FXA_DEVICE_DISCONNECTED: @@ -311,19 +326,21 @@ export const TabsSetupFlowManager = new (class { case SYNC_SERVICE_ERROR: this.logger.debug(`Handling ${SYNC_SERVICE_ERROR}`); if (lazy.UIState.get().status == lazy.UIState.STATUS_SIGNED_IN) { - this._waitingForTabs = false; + this.abortWaitingForTabs(); this.syncIsWorking = false; this.maybeUpdateUI(true); } break; case NETWORK_STATUS_CHANGED: this.networkIsOnline = data == "online"; - this._waitingForTabs = false; + this.abortWaitingForTabs(); this.maybeUpdateUI(true); break; case SYNC_SERVICE_FINISHED: this.logger.debug(`Handling ${SYNC_SERVICE_FINISHED}`); - this._waitingForTabs = false; + // We intentionally leave any empty-tabs timestamp + // as we may be still waiting for a sync that delivers some tabs + this._waitingForNextTabSync = false; if (!this.syncIsWorking) { this.syncIsWorking = true; this.syncHasWorked = true; @@ -340,25 +357,67 @@ export const TabsSetupFlowManager = new (class { } } + updateViewVisibility(instanceId, visibility) { + const wasVisible = this.hasVisibleViews; + this.logger.debug( + `updateViewVisibility for instance: ${instanceId}, visibility: ${visibility}` + ); + if (visibility == "unloaded") { + this._viewVisibilityStates.delete(instanceId); + } else { + this._viewVisibilityStates.set(instanceId, visibility); + } + const isVisible = this.hasVisibleViews; + if (isVisible && !wasVisible) { + // If we're already timing waiting for tabs from a newly-added device + // we might be able to stop + if (this._noTabsVisibleFromAddedDeviceTimestamp) { + return this.stopWaitingForNewDeviceTabs(); + } + if (this._deviceAddedResultsNeverSeen) { + // If this is the first time a view has been visible since a device was added + // we may want to start the empty-tabs visible timer + return this.startWaitingForNewDeviceTabs(); + } + } + if (!isVisible) { + this.logger.debug( + "Resetting timestamp and tabs pending flags as there are no visible views" + ); + // if there's no view visible, we're not really waiting anymore + this.abortWaitingForTabs(); + } + return null; + } + get waitingForTabs() { return ( - // signed in & at least 1 other device is sycning indicates there's something to wait for - this.secondaryDeviceConnected && - // last recent tabs request came back empty and we've not had a sync finish (or error) yet - this._waitingForTabs + // signed in & at least 1 other device is syncing indicates there's something to wait for + this.secondaryDeviceConnected && this._waitingForNextTabSync ); } + abortWaitingForTabs() { + this._waitingForNextTabSync = false; + // also clear out the device-added / tabs pending flags + this._noTabsVisibleFromAddedDeviceTimestamp = 0; + this._deviceAddedResultsNeverSeen = false; + } + startWaitingForTabs() { - if (!this._waitingForTabs) { - this._waitingForTabs = true; + if (!this._waitingForNextTabSync) { + this._waitingForNextTabSync = true; Services.obs.notifyObservers(null, TOPIC_SETUPSTATE_CHANGED); } } - stopWaitingForTabs() { - if (this._waitingForTabs) { - this._waitingForTabs = false; + async stopWaitingForTabs() { + const wasWaiting = this.waitingForTabs; + if (this.hasVisibleViews && this._deviceAddedResultsNeverSeen) { + await this.stopWaitingForNewDeviceTabs(); + } + this._waitingForNextTabSync = false; + if (wasWaiting) { Services.obs.notifyObservers(null, TOPIC_SETUPSTATE_CHANGED); } } @@ -369,7 +428,7 @@ export const TabsSetupFlowManager = new (class { this.maybeUpdateUI(true); if (!this.fxaSignedIn) { // As we just signed out, ensure the waiting flag is reset for next time around - this._waitingForTabs = false; + this.abortWaitingForTabs(); return; } @@ -388,7 +447,8 @@ export const TabsSetupFlowManager = new (class { // When SyncedTabs has resolved the getRecentTabs promise, // we also know we can update devices-related internal state - if (await this.refreshDevices()) { + const { deviceStateChanged } = await this.refreshDevices(); + if (deviceStateChanged) { this.logger.debug( "onSignedInChange, after refreshDevices, calling maybeUpdateUI" ); @@ -424,6 +484,53 @@ export const TabsSetupFlowManager = new (class { } } + async startWaitingForNewDeviceTabs() { + // if we're already waiting for tabs, don't reset + if (this._noTabsVisibleFromAddedDeviceTimestamp) { + return; + } + + // take a timestamp whenever the latest device is added and we have 0 tabs to show, + // allowing us to track how long we show an empty list after a new device is added + const hasRecentTabs = (await lazy.SyncedTabs.getRecentTabs(1)).length; + if (this.hasVisibleViews && !hasRecentTabs) { + this._noTabsVisibleFromAddedDeviceTimestamp = Date.now(); + this.logger.debug( + "New device added with 0 synced tabs to show, storing timestamp:", + this._noTabsVisibleFromAddedDeviceTimestamp + ); + } + } + + async stopWaitingForNewDeviceTabs() { + if (!this._noTabsVisibleFromAddedDeviceTimestamp) { + return; + } + const recentTabs = await lazy.SyncedTabs.getRecentTabs(1); + if (recentTabs.length) { + // We have been waiting for > 0 tabs after a newly-added device, record + // the time elapsed + const elapsed = Date.now() - this._noTabsVisibleFromAddedDeviceTimestamp; + this.logger.debug( + "stopWaitingForTabs, resetting _noTabsVisibleFromAddedDeviceTimestamp and recording telemetry:", + Math.round(elapsed / 1000) + ); + this._noTabsVisibleFromAddedDeviceTimestamp = 0; + this._deviceAddedResultsNeverSeen = false; + Services.telemetry.recordEvent( + "firefoxview", + "synced_tabs_empty", + "since_device_added", + Math.round(elapsed / 1000).toString() + ); + } else { + // we are still waiting for some tabs to show... + this.logger.debug( + "stopWaitingForTabs: Still no recent tabs, we are still waiting" + ); + } + } + async refreshDevices() { // If current device not found in recent device list, refresh device list if ( @@ -437,13 +544,15 @@ export const TabsSetupFlowManager = new (class { // compare new values to the previous values const mobileDeviceConnected = this.mobileDeviceConnected; const secondaryDeviceConnected = this.secondaryDeviceConnected; + const oldDevicesCount = this._deviceStateSnapshot?.devicesCount ?? 0; + const devicesCount = lazy.fxAccounts.device?.recentDeviceList?.length ?? 0; this.logger.debug( `refreshDevices, mobileDeviceConnected: ${mobileDeviceConnected}, `, `secondaryDeviceConnected: ${secondaryDeviceConnected}` ); - let didDeviceStateChange = + let deviceStateChanged = this._deviceStateSnapshot.mobileDeviceConnected != mobileDeviceConnected || this._deviceStateSnapshot.secondaryDeviceConnected != @@ -465,8 +574,9 @@ export const TabsSetupFlowManager = new (class { this._deviceStateSnapshot = { mobileDeviceConnected, secondaryDeviceConnected, + devicesCount, }; - if (didDeviceStateChange) { + if (deviceStateChanged) { this.logger.debug("refreshDevices: device state did change"); if (!secondaryDeviceConnected) { this.logger.debug( @@ -477,7 +587,10 @@ export const TabsSetupFlowManager = new (class { } else { this.logger.debug("refreshDevices: no device state change"); } - return didDeviceStateChange; + return { + deviceStateChanged, + deviceAdded: oldDevicesCount < devicesCount, + }; } maybeUpdateUI(forceUpdate = false) { diff --git a/browser/components/firefoxview/tab-pickup-container.mjs b/browser/components/firefoxview/tab-pickup-container.mjs index 9d4db331b9a..5128ab79b61 100644 --- a/browser/components/firefoxview/tab-pickup-container.mjs +++ b/browser/components/firefoxview/tab-pickup-container.mjs @@ -20,6 +20,7 @@ class TabPickupContainer extends HTMLDetailsElement { this._currentSetupStateIndex = -1; this.errorState = null; this.tabListAdded = null; + this._id = Math.floor(Math.random() * 10e6); } get setupContainerElem() { return this.querySelector(".sync-setup-container"); @@ -41,7 +42,7 @@ class TabPickupContainer extends HTMLDetailsElement { connectedCallback() { this.addEventListener("click", this); this.addEventListener("toggle", this); - this.addEventListener("visibilitychange", this); + this.ownerDocument.addEventListener("visibilitychange", this); Services.obs.addObserver(this.boundObserve, TOPIC_SETUPSTATE_CHANGED); for (let elem of this.querySelectorAll("a[data-support-url]")) { @@ -54,6 +55,7 @@ class TabPickupContainer extends HTMLDetailsElement { // when its safe to assume the custom-element's methods will be available this.tabListAdded = this.promiseChildAdded(); this.update(); + this.onVisibilityChange(); } promiseChildAdded() { @@ -73,6 +75,8 @@ class TabPickupContainer extends HTMLDetailsElement { } cleanup() { + TabsSetupFlowManager.updateViewVisibility(this._id, "unloaded"); + this.ownerDocument?.removeEventListener("visibilitychange", this); Services.obs.removeObserver(this.boundObserve, TOPIC_SETUPSTATE_CHANGED); } @@ -83,6 +87,7 @@ class TabPickupContainer extends HTMLDetailsElement { handleEvent(event) { if (event.type == "toggle") { onToggleContainer(this); + this.onVisibilityChange(); return; } if (event.type == "click" && event.target.dataset.action) { @@ -130,11 +135,21 @@ class TabPickupContainer extends HTMLDetailsElement { } } // Returning to fxview seems like a likely time for a device check - if ( - event.type == "visibilitychange" && - document.visibilityState === "visible" - ) { + if (event.type == "visibilitychange") { + this.onVisibilityChange(); + } + } + onVisibilityChange() { + const isVisible = document.visibilityState == "visible"; + const isOpen = this.open; + if (isVisible && isOpen) { this.update(); + TabsSetupFlowManager.updateViewVisibility(this._id, "visible"); + } else { + TabsSetupFlowManager.updateViewVisibility( + this._id, + isVisible ? "closed" : "hidden" + ); } } diff --git a/browser/components/firefoxview/tests/browser/FirefoxViewTestUtils.sys.mjs b/browser/components/firefoxview/tests/browser/FirefoxViewTestUtils.sys.mjs index bcb2411aec9..f47bbc24361 100644 --- a/browser/components/firefoxview/tests/browser/FirefoxViewTestUtils.sys.mjs +++ b/browser/components/firefoxview/tests/browser/FirefoxViewTestUtils.sys.mjs @@ -108,10 +108,15 @@ async function withFirefoxView( return result; } +function isFirefoxViewTabSelectedInWindow(win) { + return win.gBrowser.selectedBrowser.currentURI.spec == "about:firefoxview"; +} + export { withFirefoxView, assertFirefoxViewTab, assertFirefoxViewTabSelected, openFirefoxViewTab, closeFirefoxViewTab, + isFirefoxViewTabSelectedInWindow, }; diff --git a/browser/components/firefoxview/tests/browser/browser.ini b/browser/components/firefoxview/tests/browser/browser.ini index 908d4ed9ac2..30633773e07 100644 --- a/browser/components/firefoxview/tests/browser/browser.ini +++ b/browser/components/firefoxview/tests/browser/browser.ini @@ -27,5 +27,7 @@ skip-if = true # Bug 1783684 [browser_sync_admin_disabled.js] [browser_tab_close_last_tab.js] [browser_tab_on_close_warning.js] +[browser_tab_pickup_device_added_telemetry.js] [browser_tab_pickup_list.js] +[browser_tab_pickup_visibility.js] [browser_ui_state.js] diff --git a/browser/components/firefoxview/tests/browser/browser_firefoxview_feature_callout_a11y.js b/browser/components/firefoxview/tests/browser/browser_firefoxview_feature_callout_a11y.js index 17485e54e1e..7386f109f5b 100644 --- a/browser/components/firefoxview/tests/browser/browser_firefoxview_feature_callout_a11y.js +++ b/browser/components/firefoxview/tests/browser/browser_firefoxview_feature_callout_a11y.js @@ -26,10 +26,10 @@ add_task(async function feature_callout_is_accessible() { await waitForCalloutScreen(document, "FEATURE_CALLOUT_1"); await BrowserTestUtils.waitForCondition( - () => document.activeElement.id === calloutId, - "Feature Callout is focused on page load" + () => document.activeElement.value === "primary_button", + `Feature Callout primary button is focused on page load}` ); - ok(true, "Feature Callout was focused on page load"); + ok(true, "Feature Callout primary button was focused on page load"); await BrowserTestUtils.waitForCondition( () => @@ -46,10 +46,10 @@ add_task(async function feature_callout_is_accessible() { ok(true, "FEATURE_CALLOUT_2 was successfully displayed"); await BrowserTestUtils.waitForCondition( - () => document.activeElement.id === calloutId, - "Feature Callout is focused after advancing screens" + () => document.activeElement.value == "primary_button", + "Feature Callout primary button is focused after advancing screens" ); - ok(true, "Feature Callout was successfully focused"); + ok(true, "Feature Callout primary button was successfully focused"); } ); }); diff --git a/browser/components/firefoxview/tests/browser/browser_setup_primary_password.js b/browser/components/firefoxview/tests/browser/browser_setup_primary_password.js index 81b023007c9..36cd8b429e5 100644 --- a/browser/components/firefoxview/tests/browser/browser_setup_primary_password.js +++ b/browser/components/firefoxview/tests/browser/browser_setup_primary_password.js @@ -32,9 +32,9 @@ add_task(async function test_primary_password_locked() { const sandbox = setupMocks(); await withFirefoxView({}, async browser => { - sandbox - .stub(TabsSetupFlowManager, "syncTabs") - .returns(Promise.resolve(null)); + sandbox.stub(TabsSetupFlowManager, "syncTabs").resolves(null); + const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); + syncedTabsMock.resolves(getMockTabData(syncedTabsData1)); const { document } = browser.contentWindow; Services.obs.notifyObservers(null, UIState.ON_UPDATE); diff --git a/browser/components/firefoxview/tests/browser/browser_setup_synced_tabs_loading.js b/browser/components/firefoxview/tests/browser/browser_setup_synced_tabs_loading.js index cfca8254d42..15c0b87d96b 100644 --- a/browser/components/firefoxview/tests/browser/browser_setup_synced_tabs_loading.js +++ b/browser/components/firefoxview/tests/browser/browser_setup_synced_tabs_loading.js @@ -132,7 +132,7 @@ add_task(async function test_tab_sync_loading() { add_task(async function test_tab_no_sync() { // Ensure we take down the waiting message if SyncedTabs determines it doesnt need to sync - const recentTabsData = []; + const recentTabsData = structuredClone(syncedTabsData1[0].tabs); const sandbox = setupMocks(recentTabsData); // stub syncTabs so it resolves to false - meaning it will not trigger a sync, which is the case // we want to cover in this test. diff --git a/browser/components/firefoxview/tests/browser/browser_tab_pickup_device_added_telemetry.js b/browser/components/firefoxview/tests/browser/browser_tab_pickup_device_added_telemetry.js new file mode 100644 index 00000000000..a4e0f23978a --- /dev/null +++ b/browser/components/firefoxview/tests/browser/browser_tab_pickup_device_added_telemetry.js @@ -0,0 +1,278 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +registerCleanupFunction(async function() { + await clearAllParentTelemetryEvents(); + cleanup_tab_pickup(); +}); + +function setupWithFxaDevices() { + const sandbox = (gSandbox = setupSyncFxAMocks({ + state: UIState.STATUS_SIGNED_IN, + fxaDevices: [ + { + id: 1, + name: "My desktop", + isCurrentDevice: true, + type: "desktop", + }, + { + id: 2, + name: "Other device", + isCurrentDevice: false, + type: "mobile", + }, + ], + })); + return sandbox; +} + +const mockDesktopTab1 = { + client: "6c12bonqXZh8", + device: "My desktop", + deviceType: "desktop", + type: "tab", + title: "Example2", + url: "https://example.com", + icon: "https://example/favicon.png", + lastUsed: Math.floor((Date.now() - 1000 * 60) / 1000), // This is one minute from now, which is below the threshold for 'Just now' +}; + +const mockDesktopTab2 = { + client: "6c12bonqXZh8", + device: "My desktop", + deviceType: "desktop", + type: "tab", + title: "Sandboxes - Sinon.JS", + url: "https://sinonjs.org/releases/latest/sandbox/", + icon: "https://sinonjs.org/assets/images/favicon.png", + lastUsed: 1655391592, // Thu Jun 16 2022 14:59:52 GMT+0000 +}; + +const mockMobileTab1 = { + client: "9d0y686hBXel", + device: "My phone", + deviceType: "mobile", + type: "tab", + title: "Element", + url: "https://chat.mozilla.org/#room:mozilla.org", + icon: "https://chat.mozilla.org/vector-icons/favicon.ico", + lastUsed: 1664571288, +}; + +const NO_TABS_EVENTS = [ + ["firefoxview", "entered", "firefoxview", undefined], + ["firefoxview", "synced_tabs", "tabs", undefined, { count: "0" }], +]; +const SINGLE_TAB_EVENTS = [ + ["firefoxview", "entered", "firefoxview", undefined], + ["firefoxview", "synced_tabs", "tabs", undefined, { count: "1" }], +]; +const DEVICE_ADDED_NO_TABS_EVENTS = [ + ["firefoxview", "synced_tabs", "tabs", undefined, undefined], + ["firefoxview", "synced_tabs_empty", "since_device_added", undefined], +]; +const DEVICE_ADDED_TABS_EVENTS = [ + ["firefoxview", "synced_tabs", "tabs", undefined, undefined], +]; + +async function whenResolved(functionSpy, functionLabel) { + info(`Waiting for ${functionLabel} to be called`); + await TestUtils.waitForCondition( + () => functionSpy.called, + `Waiting for ${functionLabel} to be called` + ); + is( + functionSpy.getCall(0).returnValue.constructor.name, + "Promise", + `${functionLabel} returned a promise` + ); + info(`Waiting for the promise returned by ${functionLabel} to be resolved`); + await functionSpy.getCall(0).returnValue; + info(`${functionLabel} promise resolved`); +} + +async function test_device_added({ + initialRecentTabsResult, + expectedInitialTelementryEvents, + expectedDeviceAddedTelementryEvents, +}) { + const recentTabsResult = initialRecentTabsResult; + await clearAllParentTelemetryEvents(); + const sandbox = setupWithFxaDevices(); + const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); + + syncedTabsMock.callsFake(() => { + info( + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${recentTabsResult.length} tabs\n` + ); + return Promise.resolve(recentTabsResult); + }); + + ok( + !isFirefoxViewTabSelected(), + "Before we call withFirefoxView, about:firefoxview tab is not selected" + ); + ok( + !TabsSetupFlowManager.hasVisibleViews, + "Initially hasVisibleViews is false" + ); + + await withFirefoxView({}, async browser => { + info("inside withFirefoxView taskFn, waiting for setupListState"); + const { document } = browser.contentWindow; + const stopWaitingSpy = sandbox.spy( + TabsSetupFlowManager, + "stopWaitingForTabs" + ); + const signedInChangeSpy = sandbox.spy( + TabsSetupFlowManager, + "onSignedInChange" + ); + + await setupListState(browser); + info("setupListState finished"); + + // ensure any tab syncs triggered by Fxa sign-in are complete before proceeding + await whenResolved(signedInChangeSpy, "onSignedInChange"); + if (!recentTabsResult.length) { + info("No synced tabs so we wait for the result of the sync we trigger"); + await whenResolved(stopWaitingSpy, "stopWaitingForTabs"); + info("stopWaitingForTabs finished"); + } + + const isTablistVisible = !!initialRecentTabsResult.length; + testVisibility(browser, { + expectedVisible: { + "ol.synced-tabs-list": isTablistVisible, + "#synced-tabs-placeholder": !isTablistVisible, + }, + }); + const syncedTabsItems = document.querySelectorAll( + "ol.synced-tabs-list > li:not(.synced-tab-li-placeholder)" + ); + info( + "list items: " + + Array.from(syncedTabsItems) + .map(li => `li.${li.className}`) + .join(", ") + ); + is( + syncedTabsItems.length, + initialRecentTabsResult.length, + `synced-tabs-list should have initial count of ${initialRecentTabsResult.length} non-placeholder list items` + ); + + // confirm telemetry is in expected state? + info( + "Checking telemetry against expectedInitialTelementryEvents: " + + JSON.stringify(expectedInitialTelementryEvents, null, 2) + ); + TelemetryTestUtils.assertEvents( + expectedInitialTelementryEvents, + { category: "firefoxview" }, + { clear: true, process: "parent" } + ); + + // add a new mock device + info("Adding a new mock fxa dedvice"); + gMockFxaDevices.push({ + id: 1, + name: "My primary phone", + isCurrentDevice: false, + type: "mobile", + }); + + const startWaitingSpy = sandbox.spy( + TabsSetupFlowManager, + "startWaitingForNewDeviceTabs" + ); + // Notify of the newly added device + info("Notifying devicelist_updated with the new mobile device"); + Services.obs.notifyObservers(null, "fxaccounts:devicelist_updated"); + + // Some time passes here waiting for sync to get data from that device + // we expect new-device handling to kick in. If there are 0 tabs we'll signal we're waiting, + // create a timestamp and only clear it when there are > 0 tabs. + // If there are already > 0 tabs, we'll basically do nothing, showing any new tabs when they arrive + await whenResolved(startWaitingSpy, "startWaitingForNewDeviceTabs"); + + info( + "Initial tabs count: " + + recentTabsResult.length + + ", assert on _noTabsVisibleFromAddedDeviceTimestamp: " + + TabsSetupFlowManager._noTabsVisibleFromAddedDeviceTimestamp + ); + if (recentTabsResult.length) { + ok( + !TabsSetupFlowManager._noTabsVisibleFromAddedDeviceTimestamp, + "Should not be waiting if there were > 0 tabs initially" + ); + } else { + ok( + TabsSetupFlowManager._noTabsVisibleFromAddedDeviceTimestamp, + "Should be waiting if there were 0 tabs initially" + ); + } + + // Add tab data from this new device and notify of the changed data + recentTabsResult.push(mockMobileTab1); + stopWaitingSpy.resetHistory(); + + info("Notifying tabs.changed with the new mobile device's tabs"); + Services.obs.notifyObservers(null, "services.sync.tabs.changed"); + + // handling the tab.change and clearing the timestamp is necessarily async + // as counting synced tabs via getRecentTabs() is async. + // There may not be any outcome depending on the tab state, so we just wait + // for stopWaitingForTabs to get called and its promise to resolve + info("Waiting for the stopWaitingSpy to be called"); + await whenResolved(stopWaitingSpy, "stopWaitingForTabs"); + await TestUtils.waitForTick(); // allow time for the telemetry event to get recorded + + info( + "We've added a synced tab and updated the tab list, got snapshotEvents:" + + JSON.stringify( + Services.telemetry.snapshotEvents( + Ci.nsITelemetry.DATASET_PRERELEASE_CHANNELS, + false + ), + null, + 2 + ) + ); + // confirm no telemetry was recorded for tabs from the newly-added device + // as the tab list was never empty + info( + "Checking telemetry against expectedDeviceAddedTelementryEvents: " + + JSON.stringify(expectedDeviceAddedTelementryEvents, null, 2) + ); + TelemetryTestUtils.assertEvents( + expectedDeviceAddedTelementryEvents, + { category: "firefoxview" }, + { clear: true, process: "parent" } + ); + }); + sandbox.restore(); + cleanup_tab_pickup(); +} + +add_task(async function test_device_added_with_existing_tabs() { + /* Confirm that no telemetry is recorded when a new device is added while the synced tabs list has tabs */ + await test_device_added({ + initialRecentTabsResult: [mockDesktopTab1], + expectedInitialTelementryEvents: SINGLE_TAB_EVENTS, + expectedDeviceAddedTelementryEvents: DEVICE_ADDED_TABS_EVENTS, + }); +}); + +add_task(async function test_device_added_with_empty_list() { + /* Confirm that telemetry is recorded when a device is added and the synced tabs list + is empty until its tabs get synced + */ + await test_device_added({ + initialRecentTabsResult: [], + expectedInitialTelementryEvents: NO_TABS_EVENTS, + expectedDeviceAddedTelementryEvents: DEVICE_ADDED_NO_TABS_EVENTS, + }); +}); diff --git a/browser/components/firefoxview/tests/browser/browser_tab_pickup_list.js b/browser/components/firefoxview/tests/browser/browser_tab_pickup_list.js index 0b3754126f3..7b759c760a7 100644 --- a/browser/components/firefoxview/tests/browser/browser_tab_pickup_list.js +++ b/browser/components/firefoxview/tests/browser/browser_tab_pickup_list.js @@ -152,11 +152,12 @@ add_task(async function test_tab_list_ordering() { const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData1); let mockTabs2 = getMockTabData(syncedTabsData2); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -189,7 +190,7 @@ add_task(async function test_tab_list_ordering() { "Last list item in synced-tabs-list is in the correct order" ); - syncedTabsMock.returns(mockTabs2); + getRecentTabsResult = mockTabs2; // Initiate a synced tabs update Services.obs.notifyObservers(null, "services.sync.tabs.changed"); @@ -230,11 +231,12 @@ add_task(async function test_empty_list_items() { const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData3); let mockTabs2 = getMockTabData(syncedTabsData4); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -274,7 +276,7 @@ add_task(async function test_empty_list_items() { "Last list item in synced-tabs-list should be a placeholder" ); - syncedTabsMock.returns(mockTabs2); + getRecentTabsResult = mockTabs2; // Initiate a synced tabs update Services.obs.notifyObservers(null, "services.sync.tabs.changed"); @@ -312,11 +314,12 @@ add_task(async function test_empty_list() { const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData([]); let mockTabs2 = getMockTabData(syncedTabsData4); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -357,12 +360,7 @@ add_task(async function test_empty_list() { { clear: true, process: "parent" } ); - syncedTabsMock.callsFake(() => { - info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs2.length} tabs\n` - ); - return Promise.resolve(mockTabs2); - }); + getRecentTabsResult = mockTabs2; // Initiate a synced tabs update Services.obs.notifyObservers(null, "services.sync.tabs.changed"); @@ -394,11 +392,12 @@ add_task(async function test_time_updates_correctly() { const sandbox = setupRecentDeviceListMocks(); const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData5); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -504,11 +503,12 @@ add_task(async function test_tabs_sync_on_user_page_reload() { const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData1); let expectedTabsAfterReload = getMockTabData(syncedTabsData3); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -525,9 +525,12 @@ add_task(async function test_tabs_sync_on_user_page_reload() { ok(true, "Firefox View has been reloaded"); ok(TabsSetupFlowManager.waitingForTabs, "waitingForTabs is true"); - syncedTabsMock.returns(expectedTabsAfterReload); + let waitedForTabs = TestUtils.waitForCondition(() => { + return !TabsSetupFlowManager.waitingForTabs; + }); + + getRecentTabsResult = expectedTabsAfterReload; Services.obs.notifyObservers(null, "services.sync.tabs.changed"); - ok(!TabsSetupFlowManager.waitingForTabs, "waitingForTabs is false"); const syncedTabsList = document.querySelector("ol.synced-tabs-list"); // The tab pickup list has been updated @@ -537,6 +540,7 @@ add_task(async function test_tabs_sync_on_user_page_reload() { () => syncedTabsList.firstChild.textContent.includes("Sandboxes - Sinon.JS") ); + await waitedForTabs; sandbox.restore(); cleanup_tab_pickup(); @@ -549,11 +553,12 @@ add_task(async function test_keyboard_navigation() { const sandbox = setupRecentDeviceListMocks(); const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData1); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -660,11 +665,12 @@ add_task(async function test_duplicate_tab_filter() { const sandbox = setupRecentDeviceListMocks(); const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs6 = getMockTabData(syncedTabsData6); + let getRecentTabsResult = mockTabs6; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs6.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs6); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -715,11 +721,12 @@ add_task(async function test_tabs_dont_update_unnecessarily() { const sandbox = setupRecentDeviceListMocks(); const syncedTabsMock = sandbox.stub(SyncedTabs, "getRecentTabs"); let mockTabs1 = getMockTabData(syncedTabsData1); + let getRecentTabsResult = mockTabs1; syncedTabsMock.callsFake(() => { info( - `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${mockTabs1.length} tabs\n` + `Stubbed SyncedTabs.getRecentTabs returning a promise that resolves to ${getRecentTabsResult.length} tabs\n` ); - return Promise.resolve(mockTabs1); + return Promise.resolve(getRecentTabsResult); }); await withFirefoxView({}, async browser => { @@ -772,13 +779,15 @@ add_task(async function test_tabs_dont_update_unnecessarily() { observer.observe(syncedTabsList, { childList: true, subtree: true }); - syncedTabsMock.returns(mockTabs1); + getRecentTabsResult = mockTabs1; const tabPickupList = document.querySelector("tab-pickup-list"); const updateTabsListSpy = sandbox.spy(tabPickupList, "updateTabsList"); // Initiate a synced tabs update Services.obs.notifyObservers(null, "services.sync.tabs.changed"); - + await TestUtils.waitForCondition(() => { + return !TabsSetupFlowManager.waitingForTabs; + }); await TestUtils.waitForCondition(() => updateTabsListSpy.called); Assert.ok(!wasMutated, "The synced tabs list was not mutated"); diff --git a/browser/components/firefoxview/tests/browser/browser_tab_pickup_visibility.js b/browser/components/firefoxview/tests/browser/browser_tab_pickup_visibility.js new file mode 100644 index 00000000000..bab8d912991 --- /dev/null +++ b/browser/components/firefoxview/tests/browser/browser_tab_pickup_visibility.js @@ -0,0 +1,149 @@ +/* Any copyright is dedicated to the Public Domain. + * http://creativecommons.org/publicdomain/zero/1.0/ */ + +registerCleanupFunction(async function() { + Services.prefs.clearUserPref(TAB_PICKUP_STATE_PREF); +}); + +async function setup({ open } = {}) { + TabsSetupFlowManager.resetInternalState(); + // sanity check initial values + ok( + !TabsSetupFlowManager.hasVisibleViews, + "Initially hasVisibleViews is false" + ); + is( + TabsSetupFlowManager._viewVisibilityStates.size, + 0, + "Initially, there are no visible views" + ); + ok( + !isFirefoxViewTabSelected(), + "During setup, the about:firefoxview tab is not selected" + ); + + if (typeof open == "undefined") { + Services.prefs.clearUserPref(TAB_PICKUP_STATE_PREF); + } else { + await SpecialPowers.pushPrefEnv({ + set: [[TAB_PICKUP_STATE_PREF, open]], + }); + } + const sandbox = sinon.createSandbox(); + sandbox.stub(TabsSetupFlowManager, "isTabSyncSetupComplete").get(() => true); + return sandbox; +} + +add_task(async function test_tab_pickup_visibility() { + /* Confirm the correct number of tab-pickup views are registered as visible */ + const sandbox = await setup(); + + await withFirefoxView({ win: window }, async function(browser) { + const { document } = browser.contentWindow; + let tabPickupContainer = document.querySelector("#tab-pickup-container"); + + ok(tabPickupContainer.open, "Tab Pickup container should be open"); + ok(isFirefoxViewTabSelected(), "The firefox view tab is selected"); + ok(TabsSetupFlowManager.hasVisibleViews, "hasVisibleViews"); + is(TabsSetupFlowManager._viewVisibilityStates.size, 1, "One view"); + + info("Opening and switching to different tab to background fx-view"); + let newTab = await BrowserTestUtils.openNewForegroundTab( + gBrowser, + "about:mozilla" + ); + ok(!isFirefoxViewTabSelected(), "The firefox view tab is not selected"); + ok( + !TabsSetupFlowManager.hasVisibleViews, + "no view visible when fx-view is not active" + ); + let newWin = await BrowserTestUtils.openNewBrowserWindow(); + await openFirefoxViewTab(newWin); + + ok( + isFirefoxViewTabSelected(newWin), + "The firefox view tab in the new window is selected" + ); + ok( + TabsSetupFlowManager.hasVisibleViews, + "view registered as visible when fx-view is opened in a new window" + ); + is(TabsSetupFlowManager._viewVisibilityStates.size, 2, "2 tracked views"); + + await BrowserTestUtils.closeWindow(newWin); + + ok( + !isFirefoxViewTabSelected(), + "The firefox view tab in the original window is not selected" + ); + ok( + !TabsSetupFlowManager.hasVisibleViews, + "no visible views when fx-view is not the active tab in the remaining window" + ); + is( + TabsSetupFlowManager._viewVisibilityStates.size, + 1, + "Back to one tracked view" + ); + + // Switch back to FxView: + await BrowserTestUtils.switchTab( + gBrowser, + gBrowser.getTabForBrowser(browser) + ); + + ok( + isFirefoxViewTabSelected(), + "The firefox view tab in the original window is now selected" + ); + ok( + TabsSetupFlowManager.hasVisibleViews, + "View visibility updated when we switch tab" + ); + BrowserTestUtils.removeTab(newTab); + }); + sandbox.restore(); + await SpecialPowers.popPrefEnv(); + ok( + !TabsSetupFlowManager.hasVisibleViews, + "View visibility updated after withFirefoxView" + ); +}); + +add_task(async function test_instance_closed() { + /* Confirm tab-pickup views are correctly accounted for when toggled closed */ + const sandbox = await setup({ open: false }); + await withFirefoxView({ win: window }, async function(browser) { + const { document } = browser.contentWindow; + info( + "tab-pickup.open pref: " + + Services.prefs.getBoolPref( + "browser.tabs.firefox-view.ui-state.tab-pickup.open" + ) + ); + info( + "isTabSyncSetupComplete: " + TabsSetupFlowManager.isTabSyncSetupComplete + ); + let tabPickupContainer = document.querySelector("#tab-pickup-container"); + ok(!tabPickupContainer.open, "Tab Pickup container should be closed"); + info( + "_viewVisibilityStates" + + JSON.stringify( + Array.from(TabsSetupFlowManager._viewVisibilityStates.values()), + null, + 2 + ) + ); + ok(!TabsSetupFlowManager.hasVisibleViews, "no visible views"); + is( + TabsSetupFlowManager._viewVisibilityStates.size, + 1, + "One registered view" + ); + + tabPickupContainer.open = true; + await TestUtils.waitForTick(); + ok(TabsSetupFlowManager.hasVisibleViews, "view visible"); + }); + sandbox.restore(); +}); diff --git a/browser/components/firefoxview/tests/browser/head.js b/browser/components/firefoxview/tests/browser/head.js index 19ec9926e28..ea5a612cf0d 100644 --- a/browser/components/firefoxview/tests/browser/head.js +++ b/browser/components/firefoxview/tests/browser/head.js @@ -7,6 +7,7 @@ const { assertFirefoxViewTabSelected, openFirefoxViewTab, closeFirefoxViewTab, + isFirefoxViewTabSelectedInWindow, } = ChromeUtils.importESModule( "resource://testing-common/FirefoxViewTestUtils.sys.mjs" ); @@ -527,3 +528,18 @@ function cleanup_tab_pickup() { Services.prefs.clearUserPref("services.sync.lastTabFetch"); Services.prefs.clearUserPref(TAB_PICKUP_STATE_PREF); } + +function isFirefoxViewTabSelected(win = window) { + return isFirefoxViewTabSelectedInWindow(win); +} + +registerCleanupFunction(() => { + is( + typeof SyncedTabs._internal?._createRecentTabsList, + "function", + "in firefoxview/head.js, SyncedTabs._internal._createRecentTabsList is a function" + ); + // ensure all the stubs are restored, regardless of any exceptions + // that might have prevented it + gSandbox?.restore(); +}); diff --git a/browser/components/migration/.eslintrc.js b/browser/components/migration/.eslintrc.js index 053eb6ade77..236a559d13f 100644 --- a/browser/components/migration/.eslintrc.js +++ b/browser/components/migration/.eslintrc.js @@ -5,7 +5,7 @@ "use strict"; module.exports = { - extends: ["plugin:mozilla/require-jsdoc", "plugin:mozilla/valid-jsdoc"], + extends: ["plugin:mozilla/require-jsdoc"], rules: { "block-scoped-var": "error", complexity: ["error", { max: 22 }], diff --git a/browser/components/migration/MigrationWizardParent.sys.mjs b/browser/components/migration/MigrationWizardParent.sys.mjs index 1344dd584a1..e708bbbf334 100644 --- a/browser/components/migration/MigrationWizardParent.sys.mjs +++ b/browser/components/migration/MigrationWizardParent.sys.mjs @@ -291,11 +291,10 @@ export class MigrationWizardParent extends JSWindowActorParent { ); } case lazy.MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.HISTORY: { - let quantity = MigrationUtils.getImportedCount("history"); return lazy.gFluentStrings.formatValue( "migration-wizard-progress-success-history", { - quantity, + maxAgeInDays: MigrationUtils.HISTORY_MAX_AGE_IN_DAYS, } ); } @@ -308,6 +307,11 @@ export class MigrationWizardParent extends JSWindowActorParent { } ); } + case lazy.MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.FORMDATA: { + return lazy.gFluentStrings.formatValue( + "migration-wizard-progress-success-formdata" + ); + } default: { return ""; } diff --git a/browser/components/migration/tests/browser/browser_do_migration.js b/browser/components/migration/tests/browser/browser_do_migration.js index 81375f5260b..ecf35daf989 100644 --- a/browser/components/migration/tests/browser/browser_do_migration.js +++ b/browser/components/migration/tests/browser/browser_do_migration.js @@ -16,6 +16,7 @@ const RESOURCE_TYPES_WITH_QUANTITIES = [ MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.BOOKMARKS, MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.HISTORY, MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.PASSWORDS, + MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.FORMDATA, ]; /** @@ -209,11 +210,36 @@ function assertQuantitiesShown(wizard, expectedResourceTypes) { progressGroup.dataset.resourceType ) ) { - Assert.notEqual( - successText.indexOf(EXPECTED_QUANTITY), - -1, - `Found expected quantity in success string: ${successText}` - ); + if ( + progressGroup.dataset.resourceType == + MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.HISTORY + ) { + // HISTORY is a special case that doesn't show the number of imported + // history entries, but instead shows the maximum number of days of history + // that might have been imported. + Assert.notEqual( + successText.indexOf(MigrationUtils.HISTORY_MAX_AGE_IN_DAYS), + -1, + `Found expected maximum number of days of history: ${successText}` + ); + } else if ( + progressGroup.dataset.resourceType == + MigrationWizardConstants.DISPLAYED_RESOURCE_TYPES.FORMDATA + ) { + // FORMDATA is another special case, because we simply show "Form history" as + // the success string, rather than a particular quantity. + Assert.equal( + successText, + "Form history", + `Found expected form data string: ${successText}` + ); + } else { + Assert.notEqual( + successText.indexOf(EXPECTED_QUANTITY), + -1, + `Found expected quantity in success string: ${successText}` + ); + } } else { // If you've found yourself here, and this is failing, it's probably because you've // updated MigrationWizardParent.#getStringForImportQuantity to return a string for diff --git a/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js b/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js index 0b5885d266e..469e9a71eac 100644 --- a/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js +++ b/browser/components/newtab/aboutwelcome/content/aboutwelcome.bundle.js @@ -987,7 +987,8 @@ class ProtonScreen extends (react__WEBPACK_IMPORTED_MODULE_0___default().PureCom this.mainContentHeader = input; } }, isCenterPosition ? null : this.renderSecondarySection(content), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement("div", { - className: "section-main" + className: "section-main", + role: "document" }, content.secondary_button_top ? /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0___default().createElement(_MultiStageAboutWelcome__WEBPACK_IMPORTED_MODULE_6__.SecondaryCTA, { content: content, handleAction: this.props.handleAction, diff --git a/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx b/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx index c9dd75b39d7..501defa096b 100644 --- a/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx +++ b/browser/components/newtab/content-src/aboutwelcome/components/MultiStageProtonScreen.jsx @@ -382,7 +382,7 @@ export class ProtonScreen extends React.PureComponent { }} > {isCenterPosition ? null : this.renderSecondarySection(content)} -
+
{content.secondary_button_top ? ( - + diff --git a/browser/components/preferences/sync.inc.xhtml b/browser/components/preferences/sync.inc.xhtml index 633ca2b5f1c..49d220e1520 100644 --- a/browser/components/preferences/sync.inc.xhtml +++ b/browser/components/preferences/sync.inc.xhtml @@ -234,9 +234,10 @@ - diff --git a/browser/components/protocolhandler/test/test_registerHandler.html b/browser/components/protocolhandler/test/test_registerHandler.html index d61dd2687ec..2eb4f7dbdcb 100644 --- a/browser/components/protocolhandler/test/test_registerHandler.html +++ b/browser/components/protocolhandler/test/test_registerHandler.html @@ -17,7 +17,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=402788
 
+
+Hello World!
+
+
+
diff --git a/devtools/client/themes/rules.css b/devtools/client/themes/rules.css
index fd0e30d5b6e..14c3bd1ab06 100644
--- a/devtools/client/themes/rules.css
+++ b/devtools/client/themes/rules.css
@@ -60,9 +60,9 @@
 
 .ruleview-reveal-panel {
   border-bottom: 1px solid var(--theme-splitter-color);
-  display: flex;
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(100px, max-content));
   overflow: hidden;
-  flex-wrap: wrap;
   margin: 2px;
 }
 
@@ -77,9 +77,6 @@
 
 .ruleview-reveal-panel label {
   user-select: none;
-  flex-grow: 1;
-  width: 30%;
-  min-width: 100px;
   display: flex;
   align-items: center;
 }
diff --git a/devtools/server/actors/addon/addons.js b/devtools/server/actors/addon/addons.js
index 0066f7f9011..f31b3855453 100644
--- a/devtools/server/actors/addon/addons.js
+++ b/devtools/server/actors/addon/addons.js
@@ -16,8 +16,8 @@ const { FileUtils } = ChromeUtils.importESModule(
   "resource://gre/modules/FileUtils.sys.mjs"
 );
 
-// This actor is not used by DevTools, but is relied on externally by
-// webext-run and the Firefox VS-Code plugin. see bug #1578108
+// This actor is used by DevTools as well as external tools such as webext-run
+// and the Firefox VS-Code plugin. see bug #1578108
 class AddonsActor extends Actor {
   constructor(conn) {
     super(conn, addonsSpec);
@@ -65,6 +65,14 @@ class AddonsActor extends Actor {
     // gets upgraded to a real actor object.
     return { id: addon.id, actor: false };
   }
+
+  async uninstallAddon(addonId) {
+    const addon = await AddonManager.getAddonByID(addonId);
+
+    if (addon) {
+      await addon.uninstall();
+    }
+  }
 }
 
 exports.AddonsActor = AddonsActor;
diff --git a/devtools/server/actors/root.js b/devtools/server/actors/root.js
index dfced9faf3d..fb332680043 100644
--- a/devtools/server/actors/root.js
+++ b/devtools/server/actors/root.js
@@ -141,6 +141,9 @@ class RootActor extends Actor {
       supportsJavascriptTracing: true,
       // @backward-compat { version 112 } Checks if the server supports override
       isOverridesSupported: true,
+      // @backward-compat { version 113 } Fx 113 added support for uninstalling
+      // add-ons via the Addons actor.
+      supportsAddonsUninstall: true,
     };
   }
 
diff --git a/devtools/server/tests/xpcshell/test_webext_apis.js b/devtools/server/tests/xpcshell/test_webext_apis.js
index f794c10d782..bc9a3da03b7 100644
--- a/devtools/server/tests/xpcshell/test_webext_apis.js
+++ b/devtools/server/tests/xpcshell/test_webext_apis.js
@@ -3,6 +3,10 @@ http://creativecommons.org/publicdomain/zero/1.0/ */
 
 "use strict";
 
+const { AddonManager } = ChromeUtils.import(
+  "resource://gre/modules/AddonManager.jsm"
+);
+
 // The `AddonsManager` test helper can only be called once per test script.
 // This `setup` task will run first.
 add_task(async function setup() {
@@ -73,11 +77,12 @@ add_task(async function test_webext_run_apis() {
   equal(addon.actor, false, "temporary add-on does not have an actor");
 
   // listAddons
-  const { addons } = await sendRequest(transport, {
+  let { addons } = await sendRequest(transport, {
     to: "root",
     type: "listAddons",
   });
   ok(Array.isArray(addons), "listAddons() returns a list of add-ons");
+  equal(addons.length, 1, "expected an add-on installed");
 
   const installedAddon = addons[0];
   equal(installedAddon.id, addonId, "installed add-on is the expected one");
@@ -92,5 +97,29 @@ add_task(async function test_webext_run_apis() {
   });
   await Promise.all([promiseReloaded, promiseRestarted]);
 
+  // uninstallAddon
+  const promiseUninstalled = new Promise(resolve => {
+    const listener = {};
+    listener.onUninstalled = uninstalledAddon => {
+      if (uninstalledAddon.id == addonId) {
+        AddonManager.removeAddonListener(listener);
+        resolve();
+      }
+    };
+    AddonManager.addAddonListener(listener);
+  });
+  await sendRequest(transport, {
+    to: getRootResponse.addonsActor,
+    type: "uninstallAddon",
+    addonId,
+  });
+  await promiseUninstalled;
+
+  ({ addons } = await sendRequest(transport, {
+    to: "root",
+    type: "listAddons",
+  }));
+  equal(addons.length, 0, "expected no add-on installed");
+
   transport.close();
 });
diff --git a/devtools/shared/specs/addon/addons.js b/devtools/shared/specs/addon/addons.js
index e0dc45c88a6..309a7acdf5e 100644
--- a/devtools/shared/specs/addon/addons.js
+++ b/devtools/shared/specs/addon/addons.js
@@ -20,6 +20,13 @@ const addonsSpec = generateActorSpec({
       },
       response: { addon: RetVal("json") },
     },
+
+    uninstallAddon: {
+      request: {
+        addonId: Arg(0, "string"),
+      },
+      response: {},
+    },
   },
 });
 
diff --git a/docs/bug-mgmt/processes/fixing-security-bugs.rst b/docs/bug-mgmt/processes/fixing-security-bugs.rst
index d0021015625..e07853ac790 100644
--- a/docs/bug-mgmt/processes/fixing-security-bugs.rst
+++ b/docs/bug-mgmt/processes/fixing-security-bugs.rst
@@ -70,14 +70,14 @@ In Bugzilla and other public channels
 In addition to commits, you’ll need to be mindful of not disclosing
 sensitive information about the bug in public places, such as Bugzilla:
 
--  **Do not add public bugs in the “duplicate”, “depends on”, “blocks”,
-   “regression”, “regressed by”, or “see also” section if these bugs
-   could give hints about the nature of the security issue.**
-
-   -  Mention the bugs in comment of the private bug instead.
+-  Mention the bugs in comment of the private bug instead.
 -  Do not comment sensitive information in public related bugs.
 -  Also be careful about who you give bug access to: **double check
    before CC’ing the wrong person or alias**.
+-  As of recently, you may now add public bugs in the “duplicate”,
+   “depends on”, “blocks”, “regression”, “regressed by”, or “see also” section.
+   Bugzilla will only reveal those relationships to people with ``editbugs``
+   permission or access to the security bug.
 
 On IRC, Slack channels, GitHub issues, mailing lists: If you need to
 discuss about a security bug, use a private channel (protected with a
diff --git a/docs/conf.py b/docs/conf.py
index 3781a2d3cf6..bb3a6381d38 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -51,6 +51,8 @@ extensions = [
 
 # JSDoc must run successfully for dirs specified, so running
 # tree-wide (the default) will not work currently.
+# When adding more paths to this list, please ensure that they are not
+# excluded from valid-jsdoc in the top-level .eslintrc.js.
 js_source_path = [
     "../browser/components/extensions",
     "../browser/components/migration",
diff --git a/docshell/test/browser/browser.ini b/docshell/test/browser/browser.ini
index 6d0613974ef..eda748f86cd 100644
--- a/docshell/test/browser/browser.ini
+++ b/docshell/test/browser/browser.ini
@@ -139,6 +139,7 @@ skip-if = verify
 [browser_bug655270.js]
 [browser_bug655273.js]
 [browser_bug670318.js]
+skip-if = os == "linux" && (debug || asan || tsan)  # Bug 1717403
 [browser_bug673087-1.js]
 [browser_bug673087-2.js]
 [browser_bug673467.js]
diff --git a/docshell/test/browser/browser_bug655273.js b/docshell/test/browser/browser_bug655273.js
index 3974d2d86a8..8f602da792c 100644
--- a/docshell/test/browser/browser_bug655273.js
+++ b/docshell/test/browser/browser_bug655273.js
@@ -6,7 +6,7 @@
  * Test for Bug 655273.  Make sure that after changing the URI via
  * history.pushState, the resulting SHEntry has the same title as our old
  * SHEntry.
- **/
+ */
 
 add_task(async function test() {
   waitForExplicitFinish();
diff --git a/docshell/test/chrome/bug113934_window.xhtml b/docshell/test/chrome/bug113934_window.xhtml
index 915948320b8..794b8b28363 100644
--- a/docshell/test/chrome/bug113934_window.xhtml
+++ b/docshell/test/chrome/bug113934_window.xhtml
@@ -40,7 +40,7 @@
     addBrowser("box1", "f2", 300, 200);
     addBrowser("box2", "f3", 30, 200);
 
-    /** Test for Bug 113934 **/
+    /** Test for Bug 113934 */
     var doc1 =
     "data:text/html,This is a test";
     var doc2 = "data:text/html,This is a second test";
diff --git a/docshell/test/chrome/bug449778_window.xhtml b/docshell/test/chrome/bug449778_window.xhtml
index 1bbb8d4b2b2..3197b7acf4a 100644
--- a/docshell/test/chrome/bug449778_window.xhtml
+++ b/docshell/test/chrome/bug449778_window.xhtml
@@ -30,7 +30,7 @@
     addBrowser("parent", "f1", 300, 200);
     addBrowser("parent", "f2", 300, 200);
 
-    /** Test for Bug 449778 **/
+    /** Test for Bug 449778 */
     var doc1 = "data:text/html,This is a test";
     var doc2 = "data:text/html,This is a second test";
     var doc3 = "data:text/html,This is a third test";
diff --git a/docshell/test/chrome/bug449780_window.xhtml b/docshell/test/chrome/bug449780_window.xhtml
index 50d92326d40..c37bc096b2e 100644
--- a/docshell/test/chrome/bug449780_window.xhtml
+++ b/docshell/test/chrome/bug449780_window.xhtml
@@ -27,7 +27,7 @@
 
     let f1 = addBrowser("parent", 300, 200);
 
-    /** Test for Bug 449780 **/
+    /** Test for Bug 449780 */
     var doc1 = "data:text/html,This is a test";
     var doc2 = "data:text/html,This is a second test";
 
diff --git a/docshell/test/chrome/test_bug112564.xhtml b/docshell/test/chrome/test_bug112564.xhtml
index 33fd187eb2c..83a087b6d97 100644
--- a/docshell/test/chrome/test_bug112564.xhtml
+++ b/docshell/test/chrome/test_bug112564.xhtml
@@ -25,7 +25,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=112564
 
diff --git a/dom/fs/test/crashtests/crashtests.list b/dom/fs/test/crashtests/crashtests.list
index a2e0c23d3d3..bc61dcdaed6 100644
--- a/dom/fs/test/crashtests/crashtests.list
+++ b/dom/fs/test/crashtests/crashtests.list
@@ -4,3 +4,4 @@ defaults skip-if(Android) pref(dom.fs.enabled,true) pref(dom.fs.writable_file_st
 load 1798773.html
 load 1800470.html
 load 1809759.html
+load 1816710.html
diff --git a/dom/fs/test/gtest/child/TestFileSystemRequestHandler.cpp b/dom/fs/test/gtest/child/TestFileSystemRequestHandler.cpp
index 32702a430d0..0d285955610 100644
--- a/dom/fs/test/gtest/child/TestFileSystemRequestHandler.cpp
+++ b/dom/fs/test/gtest/child/TestFileSystemRequestHandler.cpp
@@ -32,18 +32,6 @@ namespace mozilla::dom::fs::test {
 
 class TestFileSystemRequestHandler : public ::testing::Test {
  protected:
-  struct FileSystemManagerChildShutdown {
-    explicit FileSystemManagerChildShutdown(
-        TestFileSystemManagerChild* aFileSystemManagerChild)
-        : mFileSystemManagerChild(aFileSystemManagerChild) {}
-
-    void operator()() const {
-      mFileSystemManagerChild->FileSystemManagerChild::Shutdown();
-    }
-
-    TestFileSystemManagerChild* mFileSystemManagerChild;
-  };
-
   void SetUp() override {
     mListener = MakeAndAddRef();
 
@@ -60,14 +48,8 @@ class TestFileSystemRequestHandler : public ::testing::Test {
 
   void TearDown() override {
     if (!mManager->IsShutdown()) {
-      EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-          .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-      mManager->Shutdown();
+      EXPECT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
     }
-
-    EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-        .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
   }
 
   already_AddRefed GetDefaultPromise() {
@@ -86,10 +68,30 @@ class TestFileSystemRequestHandler : public ::testing::Test {
     return result.forget();
   }
 
+  already_AddRefed GetShutdownPromise() {
+    RefPtr promise = GetDefaultPromise();
+    EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
+        .WillOnce(Invoke([promise]() { promise->MaybeResolveWithUndefined(); }))
+        .WillOnce(Return());
+    EXPECT_CALL(mListener->GetSuccessHandler(), InvokeMe());
+
+    return promise.forget();
+  }
+
   UniquePtr GetFileSystemRequestHandler() {
     return MakeUnique();
   }
 
+  void ShutdownFileSystemManager() {
+    RefPtr promise = GetShutdownPromise();
+
+    mManager->Shutdown();
+
+    SpinEventLoopUntil("Promise is fulfilled or timeout"_ns,
+                       [this]() { return mListener->IsDone(); });
+    ASSERT_TRUE(mManager->IsShutdown());
+  }
+
   nsIGlobalObject* mGlobal = GetGlobal();
   RefPtr mListener;
 
@@ -119,10 +121,7 @@ TEST_F(TestFileSystemRequestHandler, isGetRootHandleSuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetRootHandleBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetRootHandle(mManager, GetSimplePromise(),
@@ -154,10 +153,7 @@ TEST_F(TestFileSystemRequestHandler, isGetDirectoryHandleSuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetDirectoryHandleBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetDirectoryHandle(
@@ -188,10 +184,7 @@ TEST_F(TestFileSystemRequestHandler, isGetFileHandleSuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetFileHandleBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetFileHandle(
@@ -244,10 +237,7 @@ TEST_F(TestFileSystemRequestHandler, isGetFileSuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetFileBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetFile(mManager, mEntry, GetSimplePromise(),
@@ -258,11 +248,14 @@ TEST_F(TestFileSystemRequestHandler, isGetFileBlockedAfterShutdown) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetAccessHandleBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
+  RefPtr promise = GetShutdownPromise();
 
   mManager->Shutdown();
 
+  SpinEventLoopUntil("Promise is fulfilled or timeout"_ns,
+                     [this]() { return mListener->IsDone(); });
+  ASSERT_TRUE(mManager->IsShutdown());
+
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetAccessHandle(mManager, mEntry,
                                                  GetSimplePromise(), error);
@@ -272,10 +265,7 @@ TEST_F(TestFileSystemRequestHandler, isGetAccessHandleBlockedAfterShutdown) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetWritableBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->GetWritable(
@@ -316,10 +306,7 @@ TEST_F(TestFileSystemRequestHandler, isGetEntriesSuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isGetEntriesBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   RefPtr sink;
 
@@ -352,10 +339,7 @@ TEST_F(TestFileSystemRequestHandler, isRemoveEntrySuccessful) {
 }
 
 TEST_F(TestFileSystemRequestHandler, isRemoveEntryBlockedAfterShutdown) {
-  EXPECT_CALL(*mFileSystemManagerChild, Shutdown())
-      .WillOnce(FileSystemManagerChildShutdown(mFileSystemManagerChild));
-
-  mManager->Shutdown();
+  ASSERT_NO_FATAL_FAILURE(ShutdownFileSystemManager());
 
   IgnoredErrorResult error;
   GetFileSystemRequestHandler()->RemoveEntry(
diff --git a/dom/html/nsGenericHTMLElement.cpp b/dom/html/nsGenericHTMLElement.cpp
index 7fe950d6ea2..0f7dc8ce0c7 100644
--- a/dom/html/nsGenericHTMLElement.cpp
+++ b/dom/html/nsGenericHTMLElement.cpp
@@ -92,6 +92,7 @@
 #include "nsTextFragment.h"
 #include "mozilla/dom/BindingUtils.h"
 #include "mozilla/dom/MouseEventBinding.h"
+#include "mozilla/dom/ToggleEvent.h"
 #include "mozilla/dom/TouchEvent.h"
 #include "mozilla/ErrorResult.h"
 #include "nsHTMLDocument.h"
@@ -673,14 +674,17 @@ nsresult nsGenericHTMLElement::AfterSetAttr(
         // The missing value default is the no popover state.
         newState = PopoverState::None;
       }
-      if (newState != GetPopoverState()) {
-        if (PopoverOpen()) {
-          HidePopover(IgnoreErrors());
+      PopoverState oldState = GetPopoverState();
+      if (newState != oldState) {
+        if (oldState != PopoverState::None) {
+          HidePopoverInternal(/* aFireEvents = */ false, IgnoreErrors());
         }
-        if (newState == PopoverState::None) {
-          ClearPopoverData();
-        } else {
+        if (newState != PopoverState::None) {
           EnsurePopoverData().SetPopoverState(newState);
+          PopoverPseudoStateUpdate(false, true);
+        } else {
+          ClearPopoverData();
+          RemoveStates(ElementState::OPEN | ElementState::CLOSED);
         }
       }
     } else if (aName == nsGkAtoms::dir) {
@@ -2749,6 +2753,15 @@ bool nsGenericHTMLFormControlElement::IsAutocapitalizeInheriting() const {
 
 //----------------------------------------------------------------------
 
+static const nsAttrValue::EnumTable kPopoverTargetActionTable[] = {
+    {"toggle", PopoverTargetAction::Toggle},
+    {"show", PopoverTargetAction::Show},
+    {"hide", PopoverTargetAction::Hide},
+    {nullptr, 0}};
+
+static const nsAttrValue::EnumTable* kPopoverTargetActionDefault =
+    &kPopoverTargetActionTable[0];
+
 nsGenericHTMLFormControlElementWithState::
     nsGenericHTMLFormControlElementWithState(
         already_AddRefed&& aNodeInfo,
@@ -2760,6 +2773,33 @@ nsGenericHTMLFormControlElementWithState::
   mStateKey.SetIsVoid(true);
 }
 
+bool nsGenericHTMLFormControlElementWithState::ParseAttribute(
+    int32_t aNamespaceID, nsAtom* aAttribute, const nsAString& aValue,
+    nsIPrincipal* aMaybeScriptedPrincipal, nsAttrValue& aResult) {
+  if (aNamespaceID == kNameSpaceID_None &&
+      aAttribute == nsGkAtoms::popovertargetaction &&
+      StaticPrefs::dom_element_popover_enabled()) {
+    return aResult.ParseEnumValue(aValue, kPopoverTargetActionTable, false,
+                                  kPopoverTargetActionDefault);
+  }
+
+  return nsGenericHTMLFormControlElement::ParseAttribute(
+      aNamespaceID, aAttribute, aValue, aMaybeScriptedPrincipal, aResult);
+}
+
+mozilla::dom::Element*
+nsGenericHTMLFormControlElementWithState::GetPopoverTargetElement() const {
+  // TODO: implement attr-associated element algorithm, see
+  // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#attr-associated-element
+  return nullptr;
+}
+
+void nsGenericHTMLFormControlElementWithState::SetPopoverTargetElement(
+    mozilla::dom::Element*) {
+  // TODO: implement attr-associated element algorithm, see setter steps at
+  // https://html.spec.whatwg.org/multipage/common-dom-interfaces.html#attr-associated-element
+}
+
 void nsGenericHTMLFormControlElementWithState::GenerateStateKey() {
   // Keep the key if already computed
   if (!mStateKey.IsVoid()) {
@@ -3146,24 +3186,57 @@ void nsGenericHTMLElement::PopoverPseudoStateUpdate(bool aOpen, bool aNotify) {
   ToggleStates(changedStates, aNotify);
 }
 
+bool nsGenericHTMLElement::FireBeforeToggle(bool aIsOpen) {
+  ToggleEventInit init;
+  init.mBubbles = false;
+  if (aIsOpen) {
+    init.mCancelable = false;
+    init.mOldState = u"open"_ns;
+    init.mNewState = u"closed"_ns;
+  } else {
+    init.mCancelable = true;
+    init.mOldState = u"closed"_ns;
+    init.mNewState = u"open"_ns;
+  }
+  RefPtr event =
+      ToggleEvent::Constructor(this, u"beforetoggle"_ns, init);
+  event->SetTrusted(true);
+
+  EventDispatcher::DispatchDOMEvent(MOZ_KnownLive(ToSupports(this)), nullptr,
+                                    event, nullptr, nullptr);
+  return event->DefaultPrevented();
+}
+
 // https://html.spec.whatwg.org/#dom-showpopover
 void nsGenericHTMLElement::ShowPopover(ErrorResult& aRv) {
   if (!CheckPopoverValidity(PopoverVisibilityState::Hidden, aRv)) {
     return;
   }
-  // TODO: Fire beforetoggle event and re-check popover validity.
+  // Fire beforetoggle event and re-check popover validity.
+  if (FireBeforeToggle(false)) {
+    return;
+  }
+  if (!CheckPopoverValidity(PopoverVisibilityState::Hidden, aRv)) {
+    return;
+  }
   // TODO: Run auto popover steps.
   // TODO: Add to Top Layer.
-  GetPopoverData()->SetPopoverVisibilityState(PopoverVisibilityState::Showing);
 
   PopoverPseudoStateUpdate(true, true);
+  GetPopoverData()->SetPopoverVisibilityState(PopoverVisibilityState::Showing);
 
+  // TODO: Handle popover focusing.
   // TODO: Queue popover toggle event task.
 }
 
 // https://html.spec.whatwg.org/#dom-hidepopover
 void nsGenericHTMLElement::HidePopover(ErrorResult& aRv) {
-  OwnerDoc()->HidePopover(*this, true, true, aRv);
+  HidePopoverInternal(true, aRv);
+}
+
+void nsGenericHTMLElement::HidePopoverInternal(bool aFireEvents,
+                                               ErrorResult& aRv) {
+  OwnerDoc()->HidePopover(*this, true, aFireEvents, aRv);
 }
 
 // https://html.spec.whatwg.org/multipage/popover.html#dom-togglepopover
diff --git a/dom/html/nsGenericHTMLElement.h b/dom/html/nsGenericHTMLElement.h
index ec880e57035..5e7d47e6b0e 100644
--- a/dom/html/nsGenericHTMLElement.h
+++ b/dom/html/nsGenericHTMLElement.h
@@ -155,7 +155,11 @@ class nsGenericHTMLElement : public nsGenericHTMLElementBase {
   bool PopoverOpen() const;
   bool CheckPopoverValidity(mozilla::dom::PopoverVisibilityState aExpectedState,
                             ErrorResult& aRv);
-  void ShowPopover(ErrorResult& aRv);
+  /** Returns true if the event has been cancelled. */
+  MOZ_CAN_RUN_SCRIPT bool FireBeforeToggle(bool aIsOpen);
+  MOZ_CAN_RUN_SCRIPT void ShowPopover(ErrorResult& aRv);
+  MOZ_CAN_RUN_SCRIPT void HidePopoverInternal(bool aFireEvents,
+                                              ErrorResult& aRv);
   MOZ_CAN_RUN_SCRIPT void HidePopover(ErrorResult& aRv);
   MOZ_CAN_RUN_SCRIPT void TogglePopover(bool force, ErrorResult& aRv);
 
@@ -1205,6 +1209,12 @@ class nsGenericHTMLFormControlElement : public nsGenericHTMLFormElement,
   mozilla::dom::HTMLFieldSetElement* mFieldSet;
 };
 
+enum class PopoverTargetAction : uint8_t {
+  Toggle,
+  Show,
+  Hide,
+};
+
 class nsGenericHTMLFormControlElementWithState
     : public nsGenericHTMLFormControlElement {
  public:
@@ -1212,6 +1222,22 @@ class nsGenericHTMLFormControlElementWithState
       already_AddRefed&& aNodeInfo,
       mozilla::dom::FromParser aFromParser, FormControlType);
 
+  // nsIContent
+  bool ParseAttribute(int32_t aNamespaceID, nsAtom* aAttribute,
+                      const nsAString& aValue,
+                      nsIPrincipal* aMaybeScriptedPrincipal,
+                      nsAttrValue& aResult) override;
+
+  // PopoverInvokerElement
+  mozilla::dom::Element* GetPopoverTargetElement() const;
+  void SetPopoverTargetElement(mozilla::dom::Element*);
+  void GetPopoverTargetAction(nsAString& aValue) const {
+    GetHTMLEnumAttr(nsGkAtoms::popovertargetaction, aValue);
+  }
+  void SetPopoverTargetAction(const nsAString& aValue) {
+    SetHTMLAttr(nsGkAtoms::popovertargetaction, aValue);
+  }
+
   /**
    * Get the presentation state for a piece of content, or create it if it does
    * not exist.  Generally used by SaveState().
diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h
index db56156f789..90e4ec3f292 100644
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -78,9 +78,6 @@ using mozilla::loader::PScriptCacheParent;
 namespace ipc {
 class CrashReporterHost;
 class TestShellParent;
-#ifdef FUZZING
-class ProtocolFuzzerHelper;
-#endif
 class SharedPreferenceSerializer;
 }  // namespace ipc
 
@@ -132,9 +129,6 @@ class ContentParent final : public PContentParent,
   friend class mozilla::PreallocatedProcessManagerImpl;
   friend class PContentParent;
   friend class mozilla::dom::RemoteWorkerManager;
-#ifdef FUZZING
-  friend class mozilla::ipc::ProtocolFuzzerHelper;
-#endif
 
  public:
   using LaunchError = mozilla::ipc::LaunchError;
diff --git a/dom/ipc/ProcessIsolation.cpp b/dom/ipc/ProcessIsolation.cpp
index 1b6fd9ab7d3..cd223e647f1 100644
--- a/dom/ipc/ProcessIsolation.cpp
+++ b/dom/ipc/ProcessIsolation.cpp
@@ -224,9 +224,11 @@ static IsolationBehavior IsolationBehaviorForURI(nsIURI* aURI, bool aIsSubframe,
     // content, and should be allocated processes based on their simple content
     // principals.
     if (path == "blank"_ns || path == "srcdoc"_ns) {
+      MOZ_ASSERT(NS_IsContentAccessibleAboutURI(aURI));
       return IsolationBehavior::WebContent;
     }
 
+    MOZ_ASSERT(!NS_IsContentAccessibleAboutURI(aURI));
     // If we're loading an `about:reader` URI, perform isolation based on the
     // principal of the URI being loaded.
     if (path == "reader"_ns && aForChannelCreationURI) {
diff --git a/dom/ipc/WindowGlobalParent.cpp b/dom/ipc/WindowGlobalParent.cpp
index 4e2cdc33bc9..cd12c09a899 100644
--- a/dom/ipc/WindowGlobalParent.cpp
+++ b/dom/ipc/WindowGlobalParent.cpp
@@ -1376,7 +1376,7 @@ IPCResult WindowGlobalParent::RecvDiscoverIdentityCredentialFromExternalSource(
 void WindowGlobalParent::ActorDestroy(ActorDestroyReason aWhy) {
   if (GetBrowsingContext()->IsTopContent()) {
     Telemetry::Accumulate(Telemetry::ORB_DID_EVER_BLOCK_RESPONSE,
-                          mHasBlockedOpaqueResponse);
+                          mShouldReportHasBlockedOpaqueResponse);
   }
 
   if (mPageUseCountersWindow) {
@@ -1566,6 +1566,21 @@ void WindowGlobalParent::ExitTopChromeDocumentFullscreen() {
   }
 }
 
+void WindowGlobalParent::SetShouldReportHasBlockedOpaqueResponse(
+    nsContentPolicyType aContentPolicy) {
+  // It's always okay to block TYPE_BEACON, TYPE_PING and TYPE_CSP_REPORT in
+  // the parent process because content processes can do nothing to their
+  // responses. Hence excluding them from the telemetry as blocking
+  // them have no webcompat concerns.
+  if (aContentPolicy != nsIContentPolicy::TYPE_BEACON &&
+      aContentPolicy != nsIContentPolicy::TYPE_PING &&
+      aContentPolicy != nsIContentPolicy::TYPE_CSP_REPORT) {
+    if (IsTop()) {
+      mShouldReportHasBlockedOpaqueResponse = true;
+    }
+  }
+}
+
 NS_IMPL_CYCLE_COLLECTION_INHERITED(WindowGlobalParent, WindowContext,
                                    mPageUseCountersWindow)
 
diff --git a/dom/ipc/WindowGlobalParent.h b/dom/ipc/WindowGlobalParent.h
index a9696524912..de96207d0cd 100644
--- a/dom/ipc/WindowGlobalParent.h
+++ b/dom/ipc/WindowGlobalParent.h
@@ -225,11 +225,8 @@ class WindowGlobalParent final : public WindowContext,
 
   void ExitTopChromeDocumentFullscreen();
 
-  void SetHasBlockedOpaqueResponse() {
-    if (IsTop()) {
-      mHasBlockedOpaqueResponse = true;
-    }
-  }
+  void SetShouldReportHasBlockedOpaqueResponse(
+      nsContentPolicyType aContentPolicy);
 
  protected:
   already_AddRefed InitJSActor(JS::Handle aMaybeActor,
@@ -414,7 +411,7 @@ class WindowGlobalParent final : public WindowContext,
   // True if the current loaded document is in fullscreen.
   bool mFullscreen = false;
 
-  bool mHasBlockedOpaqueResponse = false;
+  bool mShouldReportHasBlockedOpaqueResponse = false;
 };
 
 }  // namespace dom
diff --git a/dom/ipc/fuzztest/content_parent_ipc_libfuzz.cpp b/dom/ipc/fuzztest/content_parent_ipc_libfuzz.cpp
deleted file mode 100644
index a5067057023..00000000000
--- a/dom/ipc/fuzztest/content_parent_ipc_libfuzz.cpp
+++ /dev/null
@@ -1,33 +0,0 @@
-/* -*- Mode: C++; tab-width: 8; 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 http://mozilla.org/MPL/2.0/. */
-
-#include "gtest/gtest.h"
-
-#include "FuzzingInterface.h"
-#include "ProtocolFuzzer.h"
-
-#include "mozilla/RefPtr.h"
-#include "mozilla/devtools/PHeapSnapshotTempFileHelper.h"
-#include "mozilla/dom/ContentParent.h"
-#include "mozilla/gfx/gfxVars.h"
-
-int FuzzingInitContentParentIPC(int* argc, char*** argv) { return 0; }
-
-static int RunContentParentIPCFuzzing(const uint8_t* data, size_t size) {
-  static mozilla::dom::ContentParent* p =
-      mozilla::ipc::ProtocolFuzzerHelper::CreateContentParent(
-          DEFAULT_REMOTE_TYPE);
-
-  static nsTArray ignored = mozilla::ipc::LoadIPCMessageBlacklist(
-      getenv("MOZ_IPC_MESSAGE_FUZZ_BLACKLIST"));
-
-  mozilla::ipc::FuzzProtocol(p, data, size, ignored);
-
-  return 0;
-}
-
-MOZ_FUZZING_INTERFACE_RAW(FuzzingInitContentParentIPC,
-                          RunContentParentIPCFuzzing, ContentParentIPC);
diff --git a/dom/ipc/fuzztest/moz.build b/dom/ipc/fuzztest/moz.build
deleted file mode 100644
index 831c9fd9a9c..00000000000
--- a/dom/ipc/fuzztest/moz.build
+++ /dev/null
@@ -1,20 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# vim: set filetype=python:
-# 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/.
-
-Library("FuzzingContentParentIPC")
-
-LOCAL_INCLUDES += [
-    "/dom/base",
-]
-
-SOURCES += ["content_parent_ipc_libfuzz.cpp"]
-
-include("/ipc/chromium/chromium-config.mozbuild")
-
-FINAL_LIBRARY = "xul-gtest"
-
-# Add libFuzzer configuration directives
-include("/tools/fuzzing/libfuzzer-config.mozbuild")
diff --git a/dom/ipc/jsactor/JSWindowActorChild.cpp b/dom/ipc/jsactor/JSWindowActorChild.cpp
index a36c0650282..15a14719e97 100644
--- a/dom/ipc/jsactor/JSWindowActorChild.cpp
+++ b/dom/ipc/jsactor/JSWindowActorChild.cpp
@@ -38,10 +38,23 @@ void JSWindowActorChild::Init(const nsACString& aName,
   InvokeCallback(CallbackFunction::ActorCreated);
 }
 
+#define WARN_MESSAGE_UNSENT(aMeta, aWarning)                          \
+  NS_DebugBreak(                                                      \
+      NS_DEBUG_WARNING,                                               \
+      nsPrintfCString(                                                \
+          "JSWindowActorChild::SendRawMessage (%s, %s) not sent: %s", \
+          (aMeta).actorName().get(),                                  \
+          NS_LossyConvertUTF16toASCII((aMeta).messageName()).get(),   \
+          (aWarning))                                                 \
+          .get(),                                                     \
+      nullptr, __FILE__, __LINE__)
+
 void JSWindowActorChild::SendRawMessage(
     const JSActorMessageMeta& aMeta, Maybe&& aData,
     Maybe&& aStack, ErrorResult& aRv) {
-  if (NS_WARN_IF(!CanSend() || !mManager || !mManager->CanSend())) {
+  if (!CanSend() || !mManager || !mManager->CanSend()) {
+    WARN_MESSAGE_UNSENT(aMeta,
+                        "!CanSend() || !mManager || !mManager->CanSend()");
     aRv.ThrowInvalidStateError("JSWindowActorChild cannot send at the moment");
     return;
   }
@@ -57,7 +70,8 @@ void JSWindowActorChild::SendRawMessage(
   Maybe msgData;
   if (aData) {
     msgData.emplace();
-    if (NS_WARN_IF(!aData->BuildClonedMessageData(*msgData))) {
+    if (!aData->BuildClonedMessageData(*msgData)) {
+      WARN_MESSAGE_UNSENT(aMeta, "!aData->BuildClonedMessageData(*msgData)");
       aRv.ThrowDataCloneError(
           nsPrintfCString("JSWindowActorChild serialization error: cannot "
                           "clone, in actor '%s'",
@@ -74,7 +88,9 @@ void JSWindowActorChild::SendRawMessage(
     }
   }
 
-  if (NS_WARN_IF(!mManager->SendRawMessage(aMeta, msgData, stackData))) {
+  if (!mManager->SendRawMessage(aMeta, msgData, stackData)) {
+    WARN_MESSAGE_UNSENT(aMeta,
+                        "!mManager->SendRawMessage(aMeta, msgData, stackData)");
     aRv.ThrowOperationError(
         nsPrintfCString("JSWindowActorChild send error in actor '%s'",
                         PromiseFlatCString(aMeta.actorName()).get()));
diff --git a/dom/ipc/moz.build b/dom/ipc/moz.build
index 3c6ce5dc775..6bccd1000f6 100644
--- a/dom/ipc/moz.build
+++ b/dom/ipc/moz.build
@@ -269,8 +269,5 @@ XPCSHELL_TESTS_MANIFESTS += ["tests/xpcshell.ini"]
 if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
     CXXFLAGS += CONFIG["MOZ_GTK3_CFLAGS"]
 
-if CONFIG["FUZZING"] and CONFIG["FUZZING_INTERFACES"]:
-    TEST_DIRS += ["fuzztest"]
-
 # Add libFuzzer configuration directives
 include("/tools/fuzzing/libfuzzer-config.mozbuild")
diff --git a/dom/ipc/tests/browser_CrashService_crash.js b/dom/ipc/tests/browser_CrashService_crash.js
index be635cdeffd..ba6e2aee8f3 100644
--- a/dom/ipc/tests/browser_CrashService_crash.js
+++ b/dom/ipc/tests/browser_CrashService_crash.js
@@ -3,7 +3,7 @@
 "use strict";
 
 // Ensures that content crashes are reported to the crash service
-// (nsICrashService and CrashManager.jsm).
+// (nsICrashService and CrashManager.sys.mjs).
 
 /* eslint-disable mozilla/no-arbitrary-setTimeout */
 SimpleTest.requestFlakyTimeout("untriaged");
diff --git a/dom/locales/en-US/chrome/accessibility/mac/accessible.properties b/dom/locales/en-US/chrome/accessibility/mac/accessible.properties
index ea817ab0f85..ff7d3167e7c 100644
--- a/dom/locales/en-US/chrome/accessibility/mac/accessible.properties
+++ b/dom/locales/en-US/chrome/accessibility/mac/accessible.properties
@@ -31,6 +31,8 @@ term    =       term
 definition =    definition
 # The Role Description for an input type="search" text field
 searchTextField = search text field
+# Role Description (exposed as AXTitle) for datepickers
+dateField =     date field
 # The Role Description for WAI-ARIA Landmarks
 application =   application
 search  =       search
diff --git a/dom/media/ExternalEngineStateMachine.h b/dom/media/ExternalEngineStateMachine.h
index d601c202d7e..3a0b8024020 100644
--- a/dom/media/ExternalEngineStateMachine.h
+++ b/dom/media/ExternalEngineStateMachine.h
@@ -92,6 +92,8 @@ class ExternalEngineStateMachine final
 
   RefPtr SetCDMProxy(CDMProxy* aProxy) override;
 
+  bool IsExternalStateMachine() const override { return true; }
+
  private:
   ~ExternalEngineStateMachine() = default;
 
diff --git a/dom/media/MediaDataDemuxer.h b/dom/media/MediaDataDemuxer.h
index aa9bf6e674b..79ef5f5f0a0 100644
--- a/dom/media/MediaDataDemuxer.h
+++ b/dom/media/MediaDataDemuxer.h
@@ -35,7 +35,7 @@ class MediaDataDemuxer : public DecoderDoctorLifeLogger {
  public:
   NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaDataDemuxer)
 
-  typedef MozPromise
+  typedef MozPromise
       InitPromise;
 
   // Initializes the demuxer. Other methods cannot be called unless
diff --git a/dom/media/MediaDecoder.cpp b/dom/media/MediaDecoder.cpp
index 7f2b2b0970b..397854406cf 100644
--- a/dom/media/MediaDecoder.cpp
+++ b/dom/media/MediaDecoder.cpp
@@ -436,12 +436,13 @@ void MediaDecoder::OnPlaybackErrorEvent(const MediaResult& aError) {
     return;
   }
 
-  // External engine can't play the resource, try to use our own state machine
-  // again. Here we will create a new state machine immediately and asynchrously
-  // shutdown the old one because we don't want to dispatch any task to the old
-  // state machine. Therefore, we will disconnect anything related with the old
-  // state machine, create a new state machine and setup events/mirror/etc, then
-  // shutdown the old one and release its reference once it finishes shutdown.
+  // External engine can't play the resource or we intentionally disable it, try
+  // to use our own state machine again. Here we will create a new state machine
+  // immediately and asynchrously shutdown the old one because we don't want to
+  // dispatch any task to the old state machine. Therefore, we will disconnect
+  // anything related with the old state machine, create a new state machine and
+  // setup events/mirror/etc, then shutdown the old one and release its
+  // reference once it finishes shutdown.
   MOZ_ASSERT(aError == NS_ERROR_DOM_MEDIA_EXTERNAL_ENGINE_NOT_SUPPORTED_ERR);
   RefPtr discardStateMachine =
       mDecoderStateMachine;
@@ -1369,6 +1370,16 @@ bool MediaDecoder::CanPlayThrough() {
 
 RefPtr MediaDecoder::SetCDMProxy(CDMProxy* aProxy) {
   MOZ_ASSERT(NS_IsMainThread());
+#ifdef MOZ_WMF_MEDIA_ENGINE
+  // DRM playback via the media engine is disabled, switch back to the state
+  // machine using Gecko's media pipeline.
+  if (GetStateMachine()->IsExternalStateMachine() &&
+      !StaticPrefs::media_wmf_media_engine_drm_playback()) {
+    LOG("Disable external state machine due to DRM playback not allowed");
+    OnPlaybackErrorEvent(
+        MediaResult{NS_ERROR_DOM_MEDIA_EXTERNAL_ENGINE_NOT_SUPPORTED_ERR});
+  }
+#endif
   return GetStateMachine()->SetCDMProxy(aProxy);
 }
 
diff --git a/dom/media/MediaDecoderStateMachineBase.h b/dom/media/MediaDecoderStateMachineBase.h
index c520739488a..6d766764c46 100644
--- a/dom/media/MediaDecoderStateMachineBase.h
+++ b/dom/media/MediaDecoderStateMachineBase.h
@@ -158,6 +158,8 @@ class MediaDecoderStateMachineBase {
 
   virtual RefPtr SetCDMProxy(CDMProxy* aProxy);
 
+  virtual bool IsExternalStateMachine() const { return false; }
+
  protected:
   virtual ~MediaDecoderStateMachineBase() = default;
 
diff --git a/dom/media/MediaFormatReader.cpp b/dom/media/MediaFormatReader.cpp
index a8834a888bf..b183dd6bb91 100644
--- a/dom/media/MediaFormatReader.cpp
+++ b/dom/media/MediaFormatReader.cpp
@@ -477,9 +477,17 @@ void MediaFormatReader::DecoderFactory::DoInitDecoder(Data& aData) {
                   ownerData.GetCurrentInfo()->mMimeType);
             }
             if (aTrack == TrackInfo::kAudioTrack) {
+              nsCString processName = ownerData.mDecoder->GetProcessName();
               nsCString audioProcessPerCodecName(
-                  ownerData.mDecoder->GetProcessName() + ","_ns +
-                  ownerData.mDecoder->GetCodecName());
+                  processName + ","_ns + ownerData.mDecoder->GetCodecName());
+              if (processName != "utility"_ns) {
+                if (!StaticPrefs::media_rdd_process_enabled()) {
+                  audioProcessPerCodecName += ",rdd-disabled"_ns;
+                }
+                if (!StaticPrefs::media_utility_process_enabled()) {
+                  audioProcessPerCodecName += ",utility-disabled"_ns;
+                }
+              }
               Telemetry::ScalarAdd(
                   Telemetry::ScalarID::MEDIA_AUDIO_PROCESS_PER_CODEC_NAME,
                   NS_ConvertUTF8toUTF16(audioProcessPerCodecName), 1);
diff --git a/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp b/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp
index e0d2b0d01e9..d29e1f1eb1a 100644
--- a/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp
+++ b/dom/media/webrtc/jsapi/PeerConnectionImpl.cpp
@@ -366,6 +366,11 @@ PeerConnectionImpl::PeerConnectionImpl(const GlobalObject* aGlobal)
         !HostnameInPref("media.peerconnection.video.use_rtx.blocklist",
                         mWindow->GetDocumentURI());
   }
+
+  if (!mUuidGen->Generate(&mHandle)) {
+    MOZ_CRASH();
+  }
+
   CSFLogInfo(LOGTAG, "%s: PeerConnectionImpl constructor for %s", __FUNCTION__,
              mHandle.c_str());
   STAMP_TIMECARD(mTimeCard, "Constructor Completed");
@@ -433,8 +438,9 @@ nsresult PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver,
   NS_ENSURE_STATE(mWindow);
 
   PRTime timestamp = PR_Now();
-  // Ok if we truncate this.
-  char temp[128];
+  // Ok if we truncate this, but we want it to be large enough to reliably
+  // contain the location on the tests we run in CI.
+  char temp[256];
 
   nsAutoCString locationCStr;
 
@@ -445,11 +451,6 @@ nsresult PeerConnectionImpl::Initialize(PeerConnectionObserver& aObserver,
 
   CopyUTF16toUTF8(locationAStr, locationCStr);
 
-  if (!mUuidGen->Generate(&mHandle)) {
-    MOZ_CRASH();
-    return NS_ERROR_UNEXPECTED;
-  }
-
   SprintfLiteral(temp, "%s %" PRIu64 " (id=%" PRIu64 " url=%s)",
                  mHandle.c_str(), static_cast(timestamp),
                  static_cast(mWindow ? mWindow->WindowID() : 0),
diff --git a/dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh b/dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
index 2d67134913a..9ef40a41acd 100644
--- a/dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
+++ b/dom/media/webrtc/third_party_build/fast-forward-libwebrtc.sh
@@ -82,6 +82,10 @@ fi
 
 UPSTREAM_ADDED_FILES=""
 
+# Grab the filtered changes from git based on what we vendor.
+FILTERED_GIT_CHANGES=`./mach python $SCRIPT_DIR/filter_git_changes.py \
+   --repo-path $MOZ_LIBWEBRTC_SRC --commit-sha $MOZ_LIBWEBRTC_NEXT_BASE`
+
 # After this point:
 # * eE: All commands should succeed.
 # * u: All variables should be defined before use.
@@ -154,10 +158,8 @@ function add_new_upstream_files {
   if [ "x$HANDLE_NOOP_COMMIT" == "x1" ]; then
     return
   fi
-  UPSTREAM_ADDED_FILES=`cd $MOZ_LIBWEBRTC_SRC && \
-    git diff -r $MOZ_LIBWEBRTC_BASE -r $MOZ_LIBWEBRTC_NEXT_BASE \
-        --name-status --diff-filter=A \
-        | awk '{print $2;}'`
+  UPSTREAM_ADDED_FILES=`echo "$FILTERED_GIT_CHANGES" | grep "^A" \
+      | awk '{print $2;}' || true`
   if [ "x$UPSTREAM_ADDED_FILES" != "x" ]; then
     echo "-------"
     echo "------- Add new upstream files"
@@ -171,10 +173,8 @@ function remove_deleted_upstream_files {
   if [ "x$HANDLE_NOOP_COMMIT" == "x1" ]; then
     return
   fi
-  UPSTREAM_DELETED_FILES=`cd $MOZ_LIBWEBRTC_SRC && \
-    git diff -r $MOZ_LIBWEBRTC_BASE -r $MOZ_LIBWEBRTC_NEXT_BASE \
-        --name-status --diff-filter=D \
-        | awk '{print $2;}'`
+  UPSTREAM_DELETED_FILES=`echo "$FILTERED_GIT_CHANGES" | grep "^D" \
+      | awk '{print $2;}' || true`
   if [ "x$UPSTREAM_DELETED_FILES" != "x" ]; then
     echo "-------"
     echo "------- Remove deleted upstream files"
@@ -188,10 +188,8 @@ function handle_renamed_upstream_files {
   if [ "x$HANDLE_NOOP_COMMIT" == "x1" ]; then
     return
   fi
-  UPSTREAM_RENAMED_FILES=`cd $MOZ_LIBWEBRTC_SRC && \
-    git diff -r $MOZ_LIBWEBRTC_BASE -r $MOZ_LIBWEBRTC_NEXT_BASE \
-        --name-status --diff-filter=R \
-        | awk '{print $2 " " $3;}'`
+  UPSTREAM_RENAMED_FILES=`echo "$FILTERED_GIT_CHANGES" | grep "^R" \
+      | awk '{print $2 " " $3;}' || true`
   if [ "x$UPSTREAM_RENAMED_FILES" != "x" ]; then
     echo "-------"
     echo "------- Handle renamed upstream files"
diff --git a/dom/media/webrtc/third_party_build/filter_git_changes.py b/dom/media/webrtc/third_party_build/filter_git_changes.py
new file mode 100644
index 00000000000..f8964e145b2
--- /dev/null
+++ b/dom/media/webrtc/third_party_build/filter_git_changes.py
@@ -0,0 +1,72 @@
+# 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 argparse
+import importlib
+import re
+import subprocess
+import sys
+
+sys.path.insert(0, "./dom/media/webrtc/third_party_build")
+vendor_libwebrtc = importlib.import_module("vendor-libwebrtc")
+
+if __name__ == "__main__":
+    parser = argparse.ArgumentParser(
+        description="Get relevant change count from an upstream git commit"
+    )
+    parser.add_argument(
+        "--repo-path",
+        required=True,
+        help="path to libwebrtc repo",
+    )
+    parser.add_argument("--commit-sha", required=True, help="sha of commit to examine")
+    parser.add_argument("--diff-filter", choices=("A", "D", "R"))
+    args = parser.parse_args()
+
+    command = [
+        "git",
+        "show",
+        "--oneline",
+        "--name-status",
+        "--pretty=format:",
+        None if not args.diff_filter else "--diff-filter={}".format(args.diff_filter),
+        args.commit_sha,
+    ]
+    # strip possible empty elements from command list
+    command = [x for x in command if x is not None]
+
+    # Get the list of changes in the upstream commit.
+    res = subprocess.run(
+        command,
+        capture_output=True,
+        text=True,
+        cwd=args.repo_path,
+    )
+    if res.returncode != 0:
+        sys.exit("error: {}".format(res.stderr.strip()))
+
+    changed_files = [line.strip() for line in res.stdout.strip().split("\n")]
+    changed_files = [line for line in changed_files if line != ""]
+
+    # Fetch the list of excludes and includes used in the vendoring script.
+    exclude_list = vendor_libwebrtc.get_excluded_paths()
+    include_list = vendor_libwebrtc.get_included_path_overrides()
+
+    # First, search for changes in files that are specifically included.
+    # Do this first, because some of these files might be filtered out
+    # by the exclude list.
+    regex_includes = "|".join(["^.\t{}".format(i) for i in include_list])
+    included_files = [
+        path for path in changed_files if re.findall(regex_includes, path)
+    ]
+
+    # Convert the exclude list to a regex string.
+    regex_excludes = "|".join(["^.\t{}".format(i) for i in exclude_list])
+
+    # Filter out the excluded files/paths.
+    files_not_excluded = [
+        path for path in changed_files if not re.findall(regex_excludes, path)
+    ]
+
+    for path in included_files + files_not_excluded:
+        print(path)
diff --git a/dom/media/webrtc/third_party_build/loop-ff.sh b/dom/media/webrtc/third_party_build/loop-ff.sh
index c58d0b58c5b..669106103a2 100644
--- a/dom/media/webrtc/third_party_build/loop-ff.sh
+++ b/dom/media/webrtc/third_party_build/loop-ff.sh
@@ -135,11 +135,9 @@ bash $SCRIPT_DIR/fast-forward-libwebrtc.sh 2>&1| tee -a $LOOP_OUTPUT_LOG
 MOZ_CHANGED=`hg diff -c tip --stat \
    | egrep -ve "README.moz-ff-commit|README.mozilla|files changed," \
    | wc -l | tr -d " " || true`
-GIT_CHANGED=`cd $MOZ_LIBWEBRTC_SRC ; \
-   git show --oneline --name-only $MOZ_LIBWEBRTC_NEXT_BASE \
-   | csplit -f $TMP_DIR/gitshow -sk - 2 ; cat $TMP_DIR/gitshow01 \
-   | egrep -ve "^CODE_OF_CONDUCT.md|^ENG_REVIEW_OWNERS|^PRESUBMIT.py|^README.chromium|^WATCHLISTS|^abseil-in-webrtc.md|^codereview.settings|^license_template.txt|^native-api.md|^presubmit_test.py|^presubmit_test_mocks.py|^pylintrc|^style-guide.md" \
-   | wc -l | tr -d " " || true`
+GIT_CHANGED=`./mach python $SCRIPT_DIR/filter_git_changes.py \
+   --repo-path $MOZ_LIBWEBRTC_SRC --commit-sha $MOZ_LIBWEBRTC_NEXT_BASE \
+   | wc -l | tr -d " "`
 FILE_CNT_MISMATCH_MSG=$"
 The number of files changed in the upstream commit ($GIT_CHANGED) does
 not match the number of files changed in the local Mozilla repo
diff --git a/dom/media/webrtc/third_party_build/vendor-libwebrtc.py b/dom/media/webrtc/third_party_build/vendor-libwebrtc.py
index 73865e90298..99723849c71 100644
--- a/dom/media/webrtc/third_party_build/vendor-libwebrtc.py
+++ b/dom/media/webrtc/third_party_build/vendor-libwebrtc.py
@@ -12,54 +12,6 @@ import tarfile
 
 import requests
 
-# If changing the list of unused files, please also update the egrep line
-# of the GIT_CHANGED variable in loop-ff.sh.
-LIBWEBRTC_UNUSED_IN_FIREFOX = [
-    ".clang-format",
-    ".git-blame-ignore-revs",
-    ".gitignore",
-    ".vpython",
-    "CODE_OF_CONDUCT.md",
-    "ENG_REVIEW_OWNERS",
-    "PRESUBMIT.py",
-    "README.chromium",
-    "WATCHLISTS",
-    "abseil-in-webrtc.md",
-    "codereview.settings",
-    "license_template.txt",
-    "native-api.md",
-    "presubmit_test.py",
-    "presubmit_test_mocks.py",
-    "pylintrc",
-    "style-guide.md",
-    # Only the camera code under sdk/android/api/org/webrtc is used, so
-    # we remove a bunch of other java files that aren't useful.
-    "sdk/android/api/org/webrtc/CandidatePairChangeEvent.java",
-    "sdk/android/api/org/webrtc/DefaultVideoEncoderFactory.java",
-    "sdk/android/api/org/webrtc/HardwareVideoEncoderFactory.java",
-    "sdk/android/api/org/webrtc/IceCandidate.java",
-    "sdk/android/api/org/webrtc/MediaStream.java",
-    "sdk/android/api/org/webrtc/NetworkChangeDetector.java",
-    "sdk/android/api/org/webrtc/NetworkChangeDetectorFactory.java",
-    "sdk/android/api/org/webrtc/NetworkControllerFactoryFactory.java",
-    "sdk/android/api/org/webrtc/NetworkMonitor.java",
-    "sdk/android/api/org/webrtc/NetworkMonitorAutoDetect.java",
-    "sdk/android/api/org/webrtc/NetworkStatePredictorFactoryFactory.java",
-    "sdk/android/api/org/webrtc/PeerConnection.java",
-    "sdk/android/api/org/webrtc/PeerConnectionDependencies.java",
-    "sdk/android/api/org/webrtc/PeerConnectionFactory.java",
-    "sdk/android/api/org/webrtc/RTCStats.java",
-    "sdk/android/api/org/webrtc/RTCStatsCollectorCallback.java",
-    "sdk/android/api/org/webrtc/RTCStatsReport.java",
-    "sdk/android/api/org/webrtc/RtcCertificatePem.java",
-    "sdk/android/api/org/webrtc/RtpParameters.java",
-    "sdk/android/api/org/webrtc/RtpReceiver.java",
-    "sdk/android/api/org/webrtc/RtpSender.java",
-    "sdk/android/api/org/webrtc/RtpTransceiver.java",
-    "sdk/android/src/java/org/webrtc/JniHelper.java",
-]
-
-
 THIRDPARTY_USED_IN_FIREFOX = [
     "abseil-cpp",
     "google_benchmark",
@@ -67,10 +19,174 @@ THIRDPARTY_USED_IN_FIREFOX = [
     "rnnoise",
 ]
 
-
 LIBWEBRTC_DIR = os.path.normpath("third_party/libwebrtc")
 
 
+def get_excluded_paths():
+    return [
+        ".clang-format",
+        ".git-blame-ignore-revs",
+        ".gitignore",
+        ".vpython",
+        "CODE_OF_CONDUCT.md",
+        "ENG_REVIEW_OWNERS",
+        "PRESUBMIT.py",
+        "README.chromium",
+        "WATCHLISTS",
+        "codereview.settings",
+        "license_template.txt",
+        "native-api.md",
+        "presubmit_test.py",
+        "presubmit_test_mocks.py",
+        "pylintrc",
+        # Only the camera code under sdk/android/api/org/webrtc is used, so
+        # we remove sdk/android and add back the specific files we want.
+        "sdk/android",
+    ]
+
+
+# Paths in this list are included even if their parent directory is
+# excluded in get_excluded_paths()
+def get_included_path_overrides():
+    return [
+        "sdk/android/src/java/org/webrtc/NativeLibrary.java",
+        "sdk/android/src/java/org/webrtc/FramerateBitrateAdjuster.java",
+        "sdk/android/src/java/org/webrtc/MediaCodecVideoDecoderFactory.java",
+        "sdk/android/src/java/org/webrtc/BitrateAdjuster.java",
+        "sdk/android/src/java/org/webrtc/MediaCodecWrapperFactory.java",
+        "sdk/android/src/java/org/webrtc/WebRtcClassLoader.java",
+        "sdk/android/src/java/org/webrtc/audio/WebRtcAudioRecord.java",
+        "sdk/android/src/java/org/webrtc/audio/WebRtcAudioTrack.java",
+        "sdk/android/src/java/org/webrtc/audio/WebRtcAudioManager.java",
+        "sdk/android/src/java/org/webrtc/audio/LowLatencyAudioBufferManager.java",
+        "sdk/android/src/java/org/webrtc/audio/WebRtcAudioUtils.java",
+        "sdk/android/src/java/org/webrtc/audio/WebRtcAudioEffects.java",
+        "sdk/android/src/java/org/webrtc/audio/VolumeLogger.java",
+        "sdk/android/src/java/org/webrtc/NativeCapturerObserver.java",
+        "sdk/android/src/java/org/webrtc/MediaCodecWrapper.java",
+        "sdk/android/src/java/org/webrtc/CalledByNative.java",
+        "sdk/android/src/java/org/webrtc/Histogram.java",
+        "sdk/android/src/java/org/webrtc/EglBase10Impl.java",
+        "sdk/android/src/java/org/webrtc/EglBase14Impl.java",
+        "sdk/android/src/java/org/webrtc/MediaCodecWrapperFactoryImpl.java",
+        "sdk/android/src/java/org/webrtc/AndroidVideoDecoder.java",
+        "sdk/android/src/java/org/webrtc/BaseBitrateAdjuster.java",
+        "sdk/android/src/java/org/webrtc/HardwareVideoEncoder.java",
+        "sdk/android/src/java/org/webrtc/VideoCodecMimeType.java",
+        "sdk/android/src/java/org/webrtc/NativeAndroidVideoTrackSource.java",
+        "sdk/android/src/java/org/webrtc/VideoDecoderWrapper.java",
+        "sdk/android/src/java/org/webrtc/JNILogging.java",
+        "sdk/android/src/java/org/webrtc/CameraCapturer.java",
+        "sdk/android/src/java/org/webrtc/CameraSession.java",
+        "sdk/android/src/java/org/webrtc/H264Utils.java",
+        "sdk/android/src/java/org/webrtc/Empty.java",
+        "sdk/android/src/java/org/webrtc/DynamicBitrateAdjuster.java",
+        "sdk/android/src/java/org/webrtc/Camera1Session.java",
+        "sdk/android/src/java/org/webrtc/JniCommon.java",
+        "sdk/android/src/java/org/webrtc/NV12Buffer.java",
+        "sdk/android/src/java/org/webrtc/WrappedNativeI420Buffer.java",
+        "sdk/android/src/java/org/webrtc/GlGenericDrawer.java",
+        "sdk/android/src/java/org/webrtc/RefCountDelegate.java",
+        "sdk/android/src/java/org/webrtc/Camera2Session.java",
+        "sdk/android/src/java/org/webrtc/MediaCodecUtils.java",
+        "sdk/android/src/java/org/webrtc/CalledByNativeUnchecked.java",
+        "sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java",
+        "sdk/android/src/java/org/webrtc/NV21Buffer.java",
+        "sdk/android/api/org/webrtc/RendererCommon.java",
+        "sdk/android/api/org/webrtc/YuvHelper.java",
+        "sdk/android/api/org/webrtc/LibvpxVp9Encoder.java",
+        "sdk/android/api/org/webrtc/Metrics.java",
+        "sdk/android/api/org/webrtc/CryptoOptions.java",
+        "sdk/android/api/org/webrtc/MediaConstraints.java",
+        "sdk/android/api/org/webrtc/YuvConverter.java",
+        "sdk/android/api/org/webrtc/JavaI420Buffer.java",
+        "sdk/android/api/org/webrtc/VideoDecoder.java",
+        "sdk/android/api/org/webrtc/WrappedNativeVideoDecoder.java",
+        "sdk/android/api/org/webrtc/Camera2Enumerator.java",
+        "sdk/android/api/org/webrtc/SurfaceTextureHelper.java",
+        "sdk/android/api/org/webrtc/EglBase10.java",
+        "sdk/android/api/org/webrtc/DataChannel.java",
+        "sdk/android/api/org/webrtc/audio/JavaAudioDeviceModule.java",
+        "sdk/android/api/org/webrtc/audio/AudioDeviceModule.java",
+        "sdk/android/api/org/webrtc/audio/LegacyAudioDeviceModule.java",
+        "sdk/android/api/org/webrtc/SessionDescription.java",
+        "sdk/android/api/org/webrtc/GlUtil.java",
+        "sdk/android/api/org/webrtc/VideoSource.java",
+        "sdk/android/api/org/webrtc/AudioTrack.java",
+        "sdk/android/api/org/webrtc/EglRenderer.java",
+        "sdk/android/api/org/webrtc/VideoEncoder.java",
+        "sdk/android/api/org/webrtc/VideoCapturer.java",
+        "sdk/android/api/org/webrtc/SoftwareVideoDecoderFactory.java",
+        "sdk/android/api/org/webrtc/AudioSource.java",
+        "sdk/android/api/org/webrtc/GlRectDrawer.java",
+        "sdk/android/api/org/webrtc/StatsReport.java",
+        "sdk/android/api/org/webrtc/CameraVideoCapturer.java",
+        "sdk/android/api/org/webrtc/NetEqFactoryFactory.java",
+        "sdk/android/api/org/webrtc/AudioProcessingFactory.java",
+        "sdk/android/api/org/webrtc/Camera2Capturer.java",
+        "sdk/android/api/org/webrtc/ScreenCapturerAndroid.java",
+        "sdk/android/api/org/webrtc/RefCounted.java",
+        "sdk/android/api/org/webrtc/VideoEncoderFallback.java",
+        "sdk/android/api/org/webrtc/AudioEncoderFactoryFactory.java",
+        "sdk/android/api/org/webrtc/EglBase14.java",
+        "sdk/android/api/org/webrtc/SoftwareVideoEncoderFactory.java",
+        "sdk/android/api/org/webrtc/VideoEncoderFactory.java",
+        "sdk/android/api/org/webrtc/StatsObserver.java",
+        "sdk/android/api/org/webrtc/PlatformSoftwareVideoDecoderFactory.java",
+        "sdk/android/api/org/webrtc/Camera1Capturer.java",
+        "sdk/android/api/org/webrtc/AddIceObserver.java",
+        "sdk/android/api/org/webrtc/SurfaceViewRenderer.java",
+        "sdk/android/api/org/webrtc/CameraEnumerator.java",
+        "sdk/android/api/org/webrtc/CameraEnumerationAndroid.java",
+        "sdk/android/api/org/webrtc/VideoDecoderFallback.java",
+        "sdk/android/api/org/webrtc/FileVideoCapturer.java",
+        "sdk/android/api/org/webrtc/NativeLibraryLoader.java",
+        "sdk/android/api/org/webrtc/Camera1Enumerator.java",
+        "sdk/android/api/org/webrtc/NativePeerConnectionFactory.java",
+        "sdk/android/api/org/webrtc/LibaomAv1Encoder.java",
+        "sdk/android/api/org/webrtc/BuiltinAudioEncoderFactoryFactory.java",
+        "sdk/android/api/org/webrtc/AudioDecoderFactoryFactory.java",
+        "sdk/android/api/org/webrtc/FecControllerFactoryFactoryInterface.java",
+        "sdk/android/api/org/webrtc/VideoFrameBufferType.java",
+        "sdk/android/api/org/webrtc/SdpObserver.java",
+        "sdk/android/api/org/webrtc/Predicate.java",
+        "sdk/android/api/org/webrtc/VideoFileRenderer.java",
+        "sdk/android/api/org/webrtc/WrappedNativeVideoEncoder.java",
+        "sdk/android/api/org/webrtc/LibvpxVp8Encoder.java",
+        "sdk/android/api/org/webrtc/DtmfSender.java",
+        "sdk/android/api/org/webrtc/VideoTrack.java",
+        "sdk/android/api/org/webrtc/LibvpxVp8Decoder.java",
+        "sdk/android/api/org/webrtc/GlShader.java",
+        "sdk/android/api/org/webrtc/FrameEncryptor.java",
+        "sdk/android/api/org/webrtc/EglBase.java",
+        "sdk/android/api/org/webrtc/VideoProcessor.java",
+        "sdk/android/api/org/webrtc/SSLCertificateVerifier.java",
+        "sdk/android/api/org/webrtc/VideoSink.java",
+        "sdk/android/api/org/webrtc/MediaSource.java",
+        "sdk/android/api/org/webrtc/DefaultVideoDecoderFactory.java",
+        "sdk/android/api/org/webrtc/VideoCodecInfo.java",
+        "sdk/android/api/org/webrtc/FrameDecryptor.java",
+        "sdk/android/api/org/webrtc/VideoDecoderFactory.java",
+        "sdk/android/api/org/webrtc/TextureBufferImpl.java",
+        "sdk/android/api/org/webrtc/VideoFrame.java",
+        "sdk/android/api/org/webrtc/IceCandidateErrorEvent.java",
+        "sdk/android/api/org/webrtc/CapturerObserver.java",
+        "sdk/android/api/org/webrtc/MediaStreamTrack.java",
+        "sdk/android/api/org/webrtc/GlTextureFrameBuffer.java",
+        "sdk/android/api/org/webrtc/TurnCustomizer.java",
+        "sdk/android/api/org/webrtc/TimestampAligner.java",
+        "sdk/android/api/org/webrtc/BuiltinAudioDecoderFactoryFactory.java",
+        "sdk/android/api/org/webrtc/LibvpxVp9Decoder.java",
+        "sdk/android/api/org/webrtc/SurfaceEglRenderer.java",
+        "sdk/android/api/org/webrtc/HardwareVideoDecoderFactory.java",
+        "sdk/android/api/org/webrtc/VideoCodecStatus.java",
+        "sdk/android/api/org/webrtc/Dav1dDecoder.java",
+        "sdk/android/api/org/webrtc/VideoFrameDrawer.java",
+        "sdk/android/api/org/webrtc/CallSessionFileRotatingLogSink.java",
+        "sdk/android/api/org/webrtc/EncodedImage.java",
+    ]
+
+
 def make_github_url(repo, commit):
     if not repo.endswith("/"):
         repo += "/"
@@ -186,31 +302,47 @@ def unpack(target):
             except NotADirectoryError:
                 pass
 
+        unused_libwebrtc_in_firefox = get_excluded_paths()
+        forced_used_in_firefox = get_included_path_overrides()
+
         # adjust target_path if GitHub packaging is involved
         if not os.path.exists(os.path.join(target_path, libwebrtc_used_in_firefox[0])):
             # GitHub packs everything inside a separate directory
             target_path = os.path.join(target_path, os.listdir(target_path)[0])
 
-        # remove the top level exceptions we don't want to vendor into our tree
-        libwebrtc_used_in_firefox = [
-            path
-            for path in libwebrtc_used_in_firefox
-            if (path not in LIBWEBRTC_UNUSED_IN_FIREFOX)
-        ]
+        # remove any entries found in unused_libwebrtc_in_firefox from the
+        # tarfile
+        for path in unused_libwebrtc_in_firefox:
+            if os.path.isdir(os.path.join(target_path, path)):
+                shutil.rmtree(os.path.join(target_path, path))
+            else:
+                os.remove(os.path.join(target_path, path))
 
-        # move all the top level entries from the tarfile to LIBWEBRTC_DIR
-        for path in libwebrtc_used_in_firefox:
+        # move remaining top level entries from the tarfile to LIBWEBRTC_DIR
+        for path in os.listdir(target_path):
             shutil.move(
                 os.path.join(target_path, path), os.path.join(LIBWEBRTC_DIR, path)
             )
 
-        # remove any non-top-level entries in LIBWEBRTC_UNUSED_IN_FIREFOX
-        for path in LIBWEBRTC_UNUSED_IN_FIREFOX:
-            try:
-                os.remove(os.path.join(LIBWEBRTC_DIR, path))
-            except OSError:
-                # we can ignore errors from trying to delete directories
-                pass
+        # An easy, but inefficient way to accomplish including specific
+        # files from directories otherwise removed.  Re-extract the tar
+        # file, and only copy over the exact files requested.
+        shutil.rmtree(target_path)
+        with tarfile.open(target_archive) as t:
+            safe_extract(t, path=target_path)
+
+        # Copy the force included files.  Note: the instinctual action
+        # is to do this prior to removing the excluded paths to avoid
+        # reextracting the tar file.  However, this causes errors due to
+        # pre-existing paths when other directories are moved out of the
+        # tar file in the "move all the top level entries from the
+        # tarfile" phase above.
+        for path in forced_used_in_firefox:
+            dest_path = os.path.join(LIBWEBRTC_DIR, path)
+            dir_path = os.path.dirname(dest_path)
+            if not os.path.exists(dir_path):
+                os.makedirs(dir_path)
+            shutil.move(os.path.join(target_path, path), dest_path)
     elif target == "build":
         try:
             shutil.rmtree(os.path.join(LIBWEBRTC_DIR, "build"))
diff --git a/dom/streams/ReadableStream.cpp b/dom/streams/ReadableStream.cpp
index e854befe984..8fa64d34de3 100644
--- a/dom/streams/ReadableStream.cpp
+++ b/dom/streams/ReadableStream.cpp
@@ -82,17 +82,29 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ReadableStream)
   NS_INTERFACE_MAP_ENTRY(nsISupports)
 NS_INTERFACE_MAP_END
 
-ReadableStream::ReadableStream(nsIGlobalObject* aGlobal)
-    : mGlobal(aGlobal), mReader(nullptr) {
-  mozilla::HoldJSObjects(this);
+ReadableStream::ReadableStream(nsIGlobalObject* aGlobal,
+                               HoldDropJSObjectsCaller aHoldDropCaller)
+    : mGlobal(aGlobal), mReader(nullptr), mHoldDropCaller(aHoldDropCaller) {
+  if (mHoldDropCaller == HoldDropJSObjectsCaller::Implicit) {
+    mozilla::HoldJSObjects(this);
+  }
 }
 
-ReadableStream::ReadableStream(const GlobalObject& aGlobal)
-    : mGlobal(do_QueryInterface(aGlobal.GetAsSupports())), mReader(nullptr) {
-  mozilla::HoldJSObjects(this);
+ReadableStream::ReadableStream(const GlobalObject& aGlobal,
+                               HoldDropJSObjectsCaller aHoldDropCaller)
+    : mGlobal(do_QueryInterface(aGlobal.GetAsSupports())),
+      mReader(nullptr),
+      mHoldDropCaller(aHoldDropCaller) {
+  if (mHoldDropCaller == HoldDropJSObjectsCaller::Implicit) {
+    mozilla::HoldJSObjects(this);
+  }
 }
 
-ReadableStream::~ReadableStream() { mozilla::DropJSObjects(this); }
+ReadableStream::~ReadableStream() {
+  if (mHoldDropCaller == HoldDropJSObjectsCaller::Implicit) {
+    mozilla::DropJSObjects(this);
+  }
+}
 
 JSObject* ReadableStream::WrapObject(JSContext* aCx,
                                      JS::Handle aGivenProto) {
@@ -167,7 +179,8 @@ already_AddRefed ReadableStream::Constructor(
   }
 
   // Step 3.
-  RefPtr readableStream = new ReadableStream(aGlobal);
+  RefPtr readableStream =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
 
   // Step 4.
   if (underlyingSourceDict.mType.WasPassed()) {
@@ -264,7 +277,8 @@ already_AddRefed ReadableStream::CreateAbstract(
   // Step 3.
   MOZ_ASSERT(IsNonNegativeNumber(highWaterMark));
   // Step 4.
-  RefPtr stream = new ReadableStream(aGlobal);
+  RefPtr stream =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
 
   // Step 5.
   InitializeReadableStream(stream);
@@ -1001,7 +1015,8 @@ already_AddRefed ReadableStream::CreateByteAbstract(
     JSContext* aCx, nsIGlobalObject* aGlobal,
     UnderlyingSourceAlgorithmsBase* aAlgorithms, ErrorResult& aRv) {
   // Step 1. Let stream be a new ReadableStream.
-  RefPtr stream = new ReadableStream(aGlobal);
+  RefPtr stream =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
 
   // Step 2. Perform ! InitializeReadableStream(stream).
   InitializeReadableStream(stream);
@@ -1045,7 +1060,8 @@ already_AddRefed ReadableStream::CreateNative(
   // ReadableStream::Constructor for details)
 
   // Step 5: Perform ! InitializeReadableStream(stream).
-  RefPtr stream = new ReadableStream(aGlobal);
+  RefPtr stream =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
 
   // Step 6: Let controller be a new ReadableStreamDefaultController.
   auto controller = MakeRefPtr(aGlobal);
@@ -1092,7 +1108,8 @@ already_AddRefed ReadableStream::CreateByteNative(
     JSContext* aCx, nsIGlobalObject* aGlobal,
     UnderlyingSourceAlgorithmsWrapper& aAlgorithms,
     mozilla::Maybe aHighWaterMark, ErrorResult& aRv) {
-  RefPtr stream = new ReadableStream(aGlobal);
+  RefPtr stream =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
   stream->SetUpByteNative(aCx, aAlgorithms, aHighWaterMark, aRv);
   if (aRv.Failed()) {
     return nullptr;
diff --git a/dom/streams/ReadableStream.h b/dom/streams/ReadableStream.h
index 87534d5d990..0b0f1de9732 100644
--- a/dom/streams/ReadableStream.h
+++ b/dom/streams/ReadableStream.h
@@ -53,8 +53,17 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
 
   nsCOMPtr mGlobal;
 
-  explicit ReadableStream(const GlobalObject& aGlobal);
-  explicit ReadableStream(nsIGlobalObject* aGlobal);
+  // If one extends ReadableStream with another cycle collectable class,
+  // calling HoldJSObjects and DropJSObjects should happen using 'this' of
+  // that extending class. And in that case Explicit should be passed to the
+  // constructor of ReadableStream so that it doesn't make those calls.
+  // See also https://bugzilla.mozilla.org/show_bug.cgi?id=1801214.
+  enum class HoldDropJSObjectsCaller { Implicit, Explicit };
+
+  explicit ReadableStream(const GlobalObject& aGlobal,
+                          HoldDropJSObjectsCaller aHoldDropCaller);
+  explicit ReadableStream(nsIGlobalObject* aGlobal,
+                          HoldDropJSObjectsCaller aHoldDropCaller);
 
  public:
   // Abstract algorithms
@@ -229,6 +238,8 @@ class ReadableStream : public nsISupports, public nsWrapperCache {
   RefPtr mReader;
   ReaderState mState = ReaderState::Readable;
   JS::Heap mStoredError;
+
+  HoldDropJSObjectsCaller mHoldDropCaller;
 };
 
 namespace streams_abstract {
diff --git a/dom/streams/Transferable.cpp b/dom/streams/Transferable.cpp
index 20168a6bf94..efb7819c2fe 100644
--- a/dom/streams/Transferable.cpp
+++ b/dom/streams/Transferable.cpp
@@ -863,7 +863,8 @@ ReadableStream::ReceiveTransferImpl(JSContext* aCx, nsIGlobalObject* aGlobal,
   // Step 2: Let port be deserializedRecord.[[Deserialized]].
 
   // Step 3: Perform ! SetUpCrossRealmTransformReadable(value, port).
-  RefPtr readable = new ReadableStream(aGlobal);
+  RefPtr readable =
+      new ReadableStream(aGlobal, HoldDropJSObjectsCaller::Implicit);
   ErrorResult rv;
   SetUpCrossRealmTransformReadable(readable, &aPort, rv);
   if (rv.MaybeSetPendingException(aCx)) {
@@ -910,7 +911,8 @@ bool WritableStream::Transfer(JSContext* aCx, UniqueMessagePortId& aPortId) {
   }
 
   // Step 5: Let readable be a new ReadableStream in the current Realm.
-  RefPtr readable = new ReadableStream(mGlobal);
+  RefPtr readable = new ReadableStream(
+      mGlobal, ReadableStream::HoldDropJSObjectsCaller::Implicit);
 
   // Step 6: Perform ! SetUpCrossRealmTransformReadable(readable, port1).
   // MOZ_KnownLive because Port1 never changes before CC
diff --git a/dom/svg/test/mochitest.ini b/dom/svg/test/mochitest.ini
index 7fec1934631..e52932b7455 100644
--- a/dom/svg/test/mochitest.ini
+++ b/dom/svg/test/mochitest.ini
@@ -31,21 +31,33 @@ support-files =
   text-helper.svg
   viewport-helper.svg
 
+[test_SVGLengthList-2.xhtml]
+[test_SVGLengthList.xhtml]
+[test_SVGMatrix.xhtml]
+[test_SVGNumberList.xhtml]
+[test_SVGPointList.xhtml]
+[test_SVGStringList.xhtml]
+[test_SVGStyleElement.xhtml]
+[test_SVGTransformList.xhtml]
+[test_SVGTransformListAddition.xhtml]
+[test_SVG_namespace_ids.html]
+[test_SVGxxxList.xhtml]
+[test_SVGxxxListIndexing.xhtml]
 [test_a_href_01.xhtml]
 [test_a_href_02.xhtml]
 [test_animLengthObjectIdentity.xhtml]
 [test_animLengthReadonly.xhtml]
 [test_animLengthUnits.xhtml]
+[test_bbox-changes.xhtml]
 [test_bbox-with-invalid-viewBox.xhtml]
 [test_bbox.xhtml]
-[test_bbox-changes.xhtml]
 [test_bounds.html]
-[test_bug872812.html]
 [test_bug1426594.html]
-[test_getBBox-method.html]
+[test_bug872812.html]
 [test_dataTypes.html]
 [test_dataTypesModEvents.html]
 [test_fragments.html]
+[test_getBBox-method.html]
 [test_getCTM.html]
 [test_getElementById.xhtml]
 [test_getPathSegListAtLength_with_d_property.html]
@@ -57,8 +69,8 @@ skip-if = true # disabled-for-intermittent-failures--bug-701060
 [test_length.xhtml]
 [test_lengthParsing.html]
 [test_markerOrient.xhtml]
-[test_nonAnimStrings.xhtml]
 [test_non-scaling-stroke.html]
+[test_nonAnimStrings.xhtml]
 [test_object-delayed-intrinsic-size.html]
 [test_onerror.xhtml]
 [test_onload.xhtml]
@@ -76,28 +88,16 @@ skip-if = true # We need to polyfill the SVG DOM for path data
 [test_pointer-events-7.xhtml]
 [test_scientific.html]
 [test_selectSubString.xhtml]
-[test_style_sheet.html]
 [test_stroke-hit-testing.xhtml]
 [test_stroke-linecap-hit-testing.xhtml]
-[test_SVGLengthList-2.xhtml]
-[test_SVGLengthList.xhtml]
-[test_SVGMatrix.xhtml]
-[test_SVG_namespace_ids.html]
-[test_SVGNumberList.xhtml]
-[test_SVGPointList.xhtml]
-[test_SVGStringList.xhtml]
-[test_SVGStyleElement.xhtml]
-[test_SVGTransformListAddition.xhtml]
-[test_SVGTransformList.xhtml]
-[test_SVGxxxListIndexing.xhtml]
-[test_SVGxxxList.xhtml]
+[test_style_sheet.html]
 [test_switch.xhtml]
 [test_tabindex.html]
 [test_tearoff_with_cc.html]
 support-files = tearoff_with_cc_helper.html
+[test_text.html]
 [test_text_2.html]
 [test_text_dirty.html]
-[test_text.html]
 [test_text_lengthAdjust.html]
 [test_text_scaled.html]
 [test_text_selection.html]
diff --git a/dom/tests/mochitest/webcomponents/chrome.ini b/dom/tests/mochitest/webcomponents/chrome.ini
index 02494b10131..8f54af95e3d 100644
--- a/dom/tests/mochitest/webcomponents/chrome.ini
+++ b/dom/tests/mochitest/webcomponents/chrome.ini
@@ -2,6 +2,7 @@
 support-files =
   dummy_page.html
 
+[test_custom_element_ensure_custom_element.html]
 [test_custom_element_htmlconstructor_chrome.html]
 support-files =
   htmlconstructor_autonomous_tests.js
diff --git a/dom/tests/mochitest/webcomponents/test_custom_element_ensure_custom_element.html b/dom/tests/mochitest/webcomponents/test_custom_element_ensure_custom_element.html
new file mode 100644
index 00000000000..03ed2e38156
--- /dev/null
+++ b/dom/tests/mochitest/webcomponents/test_custom_element_ensure_custom_element.html
@@ -0,0 +1,55 @@
+
+
+  
+
+  
+  Test for customElements.ensureCustomElement
+  
+  
+  
+
+
+

+ +

+
+
diff --git a/dom/webauthn/WebAuthnController.cpp b/dom/webauthn/WebAuthnController.cpp
index f0c890b8beb..ec83ae58577 100644
--- a/dom/webauthn/WebAuthnController.cpp
+++ b/dom/webauthn/WebAuthnController.cpp
@@ -707,7 +707,9 @@ void WebAuthnController::RunPinCallback(uint64_t aTransactionId,
                                         const nsCString& aPin) {
   mozilla::ipc::AssertIsOnBackgroundThread();
 
-  mTransportImpl->PinCallback(aTransactionId, aPin);
+  if (mTransportImpl) {
+    mTransportImpl->PinCallback(aTransactionId, aPin);
+  }
 }
 
 NS_IMETHODIMP
diff --git a/dom/webbrowserpersist/nsIWebBrowserPersist.idl b/dom/webbrowserpersist/nsIWebBrowserPersist.idl
index 0cfd021142f..577334118f3 100644
--- a/dom/webbrowserpersist/nsIWebBrowserPersist.idl
+++ b/dom/webbrowserpersist/nsIWebBrowserPersist.idl
@@ -129,11 +129,9 @@ interface nsIWebBrowserPersist : nsICancelable
    *                   nsIURI object with a file scheme or a scheme that
    *                   supports uploading (e.g. ftp).
    * @param aContentPolicyType The type of content we're saving.
-   * @param aPrivacyContext A context from which the privacy status of this
-   *                   save operation can be determined. Must only be null
-   *                   in situations in which no such context is available
-   *                   (eg. the operation has no logical association with any
-   *                   window or document)
+   * @param aIsPrivate Treat the save operation as private (ie. with
+   *                   regards to networking operations and persistence
+   *                   of intermediate data, etc.)
    *
    * @see nsIFile
    * @see nsIURI
@@ -141,22 +139,7 @@ interface nsIWebBrowserPersist : nsICancelable
    *
    * @throws NS_ERROR_INVALID_ARG One or more arguments was invalid.
    */
-  void saveURI(in nsIURI aURI, in nsIPrincipal aTriggeringPrincipal,
-      in unsigned long aCacheKey,
-      in nsIReferrerInfo aReferrerInfo,
-      in nsICookieJarSettings aCookieJarSettings,
-      in nsIInputStream aPostData,
-      in string aExtraHeaders, in nsISupports aFile,
-      in nsContentPolicyType aContentPolicyType,
-      in nsILoadContext aPrivacyContext);
-
-  /**
-   * @param aIsPrivate Treat the save operation as private (ie. with
-   *                   regards to networking operations and persistence
-   *                   of intermediate data, etc.)
-   * @see saveURI for all other parameter descriptions
-   */
-  void savePrivacyAwareURI(in nsIURI aURI,
+  void saveURI(in nsIURI aURI,
       in nsIPrincipal aTriggeringPrincipal, in unsigned long aCacheKey,
       in nsIReferrerInfo aReferrerInfo,
       in nsICookieJarSettings aCookieJarSettings,
diff --git a/dom/webbrowserpersist/nsWebBrowserPersist.cpp b/dom/webbrowserpersist/nsWebBrowserPersist.cpp
index eac9681f2cc..2a83a166cfc 100644
--- a/dom/webbrowserpersist/nsWebBrowserPersist.cpp
+++ b/dom/webbrowserpersist/nsWebBrowserPersist.cpp
@@ -412,17 +412,6 @@ NS_IMETHODIMP nsWebBrowserPersist::SetProgressListener(
 }
 
 NS_IMETHODIMP nsWebBrowserPersist::SaveURI(
-    nsIURI* aURI, nsIPrincipal* aPrincipal, uint32_t aCacheKey,
-    nsIReferrerInfo* aReferrerInfo, nsICookieJarSettings* aCookieJarSettings,
-    nsIInputStream* aPostData, const char* aExtraHeaders, nsISupports* aFile,
-    nsContentPolicyType aContentPolicyType, nsILoadContext* aPrivacyContext) {
-  bool isPrivate = aPrivacyContext && aPrivacyContext->UsePrivateBrowsing();
-  return SavePrivacyAwareURI(aURI, aPrincipal, aCacheKey, aReferrerInfo,
-                             aCookieJarSettings, aPostData, aExtraHeaders,
-                             aFile, aContentPolicyType, isPrivate);
-}
-
-NS_IMETHODIMP nsWebBrowserPersist::SavePrivacyAwareURI(
     nsIURI* aURI, nsIPrincipal* aPrincipal, uint32_t aCacheKey,
     nsIReferrerInfo* aReferrerInfo, nsICookieJarSettings* aCookieJarSettings,
     nsIInputStream* aPostData, const char* aExtraHeaders, nsISupports* aFile,
@@ -435,7 +424,7 @@ NS_IMETHODIMP nsWebBrowserPersist::SavePrivacyAwareURI(
   rv = GetValidURIFromObject(aFile, getter_AddRefs(fileAsURI));
   NS_ENSURE_SUCCESS(rv, NS_ERROR_INVALID_ARG);
 
-  // SaveURI doesn't like broken uris.
+  // SaveURIInternal doesn't like broken uris.
   mPersistFlags |= PERSIST_FLAGS_FAIL_ON_BROKEN_LINKS;
   rv = SaveURIInternal(aURI, aPrincipal, aContentPolicy, aCacheKey,
                        aReferrerInfo, aCookieJarSettings, aPostData,
@@ -456,7 +445,7 @@ NS_IMETHODIMP nsWebBrowserPersist::SaveChannel(nsIChannel* aChannel,
   rv = aChannel->GetURI(getter_AddRefs(mURI));
   NS_ENSURE_SUCCESS(rv, rv);
 
-  // SaveURI doesn't like broken uris.
+  // SaveChannelInternal doesn't like broken uris.
   mPersistFlags |= PERSIST_FLAGS_FAIL_ON_BROKEN_LINKS;
   rv = SaveChannelInternal(aChannel, fileAsURI, false);
   return NS_FAILED(rv) ? rv : NS_OK;
diff --git a/dom/webgpu/ipc/WebGPUParent.cpp b/dom/webgpu/ipc/WebGPUParent.cpp
index aa5fb581092..8d9e01f5f67 100644
--- a/dom/webgpu/ipc/WebGPUParent.cpp
+++ b/dom/webgpu/ipc/WebGPUParent.cpp
@@ -272,7 +272,6 @@ ipc::IPCResult WebGPUParent::RecvInstanceRequestAdapter(
         aOptions.mPowerPreference.Value());
   }
   options.force_fallback_adapter = aOptions.mForceFallbackAdapter;
-  // TODO: make available backends configurable by prefs
 
   ErrorBuffer error;
   int8_t index = ffi::wgpu_server_instance_request_adapter(
@@ -378,28 +377,28 @@ struct MapRequest {
   WebGPUParent::BufferMapResolver mResolver;
 };
 
-nsCString MapStatusString(ffi::WGPUBufferMapAsyncStatus status) {
+static const char* MapStatusString(ffi::WGPUBufferMapAsyncStatus status) {
   switch (status) {
     case ffi::WGPUBufferMapAsyncStatus_Success:
-      return nsCString("Success");
+      return "Success";
     case ffi::WGPUBufferMapAsyncStatus_AlreadyMapped:
-      return nsCString("Already mapped");
+      return "Already mapped";
     case ffi::WGPUBufferMapAsyncStatus_MapAlreadyPending:
-      return nsCString("Map is already pending");
+      return "Map is already pending";
     case ffi::WGPUBufferMapAsyncStatus_Aborted:
-      return nsCString("Map aborted");
+      return "Map aborted";
     case ffi::WGPUBufferMapAsyncStatus_ContextLost:
-      return nsCString("Context lost");
+      return "Context lost";
     case ffi::WGPUBufferMapAsyncStatus_Invalid:
-      return nsCString("Invalid buffer");
+      return "Invalid buffer";
     case ffi::WGPUBufferMapAsyncStatus_InvalidRange:
-      return nsCString("Invalid range");
+      return "Invalid range";
     case ffi::WGPUBufferMapAsyncStatus_InvalidAlignment:
-      return nsCString("Invalid alignment");
+      return "Invalid alignment";
     case ffi::WGPUBufferMapAsyncStatus_InvalidUsageFlags:
-      return nsCString("Invalid usage flags");
+      return "Invalid usage flags";
     case ffi::WGPUBufferMapAsyncStatus_Error:
-      return nsCString("Map failed");
+      return "Map failed";
     case ffi::WGPUBufferMapAsyncStatus_Sentinel:  // For -Wswitch
       break;
   }
@@ -423,7 +422,8 @@ static void MapCallback(ffi::WGPUBufferMapAsyncStatus status,
   MOZ_RELEASE_ASSERT(mapData);
 
   if (status != ffi::WGPUBufferMapAsyncStatus_Success) {
-    result = BufferMapError(MapStatusString(status));
+    result = BufferMapError(nsPrintfCString("Mapping WebGPU buffer failed: %s",
+                                            MapStatusString(status)));
   } else {
     auto size = req->mSize;
     auto offset = req->mOffset;
@@ -1082,7 +1082,7 @@ ipc::IPCResult WebGPUParent::RecvBumpImplicitBindGroupLayout(RawId aPipelineId,
 ipc::IPCResult WebGPUParent::RecvDevicePushErrorScope(RawId aDeviceId) {
   const auto& lookup = mErrorScopeMap.find(aDeviceId);
   if (lookup == mErrorScopeMap.end()) {
-    NS_WARNING("WebGPU error scopes on a destroyed device!");
+    NS_WARNING("WebGPU: attempt to push an error scope on a destroyed device!");
     return IPC_OK();
   }
 
@@ -1094,7 +1094,7 @@ ipc::IPCResult WebGPUParent::RecvDevicePopErrorScope(
     RawId aDeviceId, DevicePopErrorScopeResolver&& aResolver) {
   const auto& lookup = mErrorScopeMap.find(aDeviceId);
   if (lookup == mErrorScopeMap.end()) {
-    NS_WARNING("WebGPU error scopes on a destroyed device!");
+    NS_WARNING("WebGPU: attempt to pop an error scope on a destroyed device!");
     ScopedError error = {true};
     aResolver(Some(error));
     return IPC_OK();
diff --git a/dom/webidl/EventHandler.webidl b/dom/webidl/EventHandler.webidl
index d8be7a18257..d20496f7813 100644
--- a/dom/webidl/EventHandler.webidl
+++ b/dom/webidl/EventHandler.webidl
@@ -33,6 +33,8 @@ interface mixin GlobalEventHandlers {
            attribute EventHandler onauxclick;
            [Pref="dom.input_events.beforeinput.enabled"]
            attribute EventHandler onbeforeinput;
+           [Pref="dom.element.popover.enabled"]
+           attribute EventHandler onbeforetoggle;
            attribute EventHandler oncanplay;
            attribute EventHandler oncanplaythrough;
            attribute EventHandler onchange;
diff --git a/dom/webidl/HTMLButtonElement.webidl b/dom/webidl/HTMLButtonElement.webidl
index 79ad88b9b04..37770416ae5 100644
--- a/dom/webidl/HTMLButtonElement.webidl
+++ b/dom/webidl/HTMLButtonElement.webidl
@@ -46,3 +46,5 @@ interface HTMLButtonElement : HTMLElement {
 
   readonly attribute NodeList labels;
 };
+
+HTMLButtonElement includes PopoverInvokerElement;
diff --git a/dom/webidl/HTMLInputElement.webidl b/dom/webidl/HTMLInputElement.webidl
index 8fe2c926fcb..ad9f8de92f1 100644
--- a/dom/webidl/HTMLInputElement.webidl
+++ b/dom/webidl/HTMLInputElement.webidl
@@ -228,6 +228,8 @@ HTMLInputElement includes MozEditableElement;
 
 HTMLInputElement includes MozImageLoadingContent;
 
+HTMLInputElement includes PopoverInvokerElement;
+
 // https://wicg.github.io/entries-api/#idl-index
 partial interface HTMLInputElement {
   [Pref="dom.webkitBlink.filesystem.enabled", Frozen, Cached, Pure]
diff --git a/dom/webidl/PopoverInvokerElement.webidl b/dom/webidl/PopoverInvokerElement.webidl
new file mode 100644
index 00000000000..b5d98856b71
--- /dev/null
+++ b/dom/webidl/PopoverInvokerElement.webidl
@@ -0,0 +1,13 @@
+/* -*- 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://html.spec.whatwg.org/multipage/popover.html#popoverinvokerelement
+ */
+
+interface mixin PopoverInvokerElement {
+  [Pref="dom.element.popover.enabled", CEReactions] attribute Element? popoverTargetElement;
+  [Pref="dom.element.popover.enabled", CEReactions] attribute DOMString popoverTargetAction;
+};
diff --git a/dom/webidl/moz.build b/dom/webidl/moz.build
index b53b4ac18f9..2f7ef731579 100644
--- a/dom/webidl/moz.build
+++ b/dom/webidl/moz.build
@@ -271,6 +271,9 @@ with Files("GeolocationPosition*"):
 with Files("ProfileTimelineMarker.webidl"):
     BUG_COMPONENT = ("DevTools", "Performance Tools (Profiler/Timeline)")
 
+with Files("PopoverInvokerElement.webidl"):
+    BUG_COMPONENT = ("Core", "DOM: Core & HTML")
+
 with Files("ProgressEvent.webidl"):
     BUG_COMPONENT = ("Core", "DOM: Events")
 
@@ -792,6 +795,7 @@ WEBIDL_FILES = [
     "Plugin.webidl",
     "PluginArray.webidl",
     "PointerEvent.webidl",
+    "PopoverInvokerElement.webidl",
     "ProcessingInstruction.webidl",
     "ProfileTimelineMarker.webidl",
     "Promise.webidl",
diff --git a/dom/webtransport/api/WebTransportReceiveStream.cpp b/dom/webtransport/api/WebTransportReceiveStream.cpp
index c72b5bc49b9..0d886af6035 100644
--- a/dom/webtransport/api/WebTransportReceiveStream.cpp
+++ b/dom/webtransport/api/WebTransportReceiveStream.cpp
@@ -17,8 +17,20 @@ using namespace mozilla::ipc;
 
 namespace mozilla::dom {
 
-WebTransportReceiveStream::WebTransportReceiveStream(nsIGlobalObject* aGlobal)
-    : ReadableStream(aGlobal) {}
+NS_IMPL_CYCLE_COLLECTION_INHERITED(WebTransportReceiveStream, ReadableStream,
+                                   mTransport)
+NS_IMPL_ADDREF_INHERITED(WebTransportReceiveStream, ReadableStream)
+NS_IMPL_RELEASE_INHERITED(WebTransportReceiveStream, ReadableStream)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebTransportReceiveStream)
+NS_INTERFACE_MAP_END_INHERITING(ReadableStream)
+
+WebTransportReceiveStream::WebTransportReceiveStream(nsIGlobalObject* aGlobal,
+                                                     WebTransport* aTransport)
+    : ReadableStream(aGlobal,
+                     ReadableStream::HoldDropJSObjectsCaller::Explicit),
+      mTransport(aTransport) {
+  mozilla::HoldJSObjects(this);
+}
 
 // WebIDL Boilerplate
 
@@ -37,7 +49,7 @@ already_AddRefed WebTransportReceiveStream::Create(
   }
   JSContext* cx = jsapi.cx();
 
-  auto stream = MakeRefPtr(aGlobal);
+  auto stream = MakeRefPtr(aGlobal, aWebTransport);
 
   nsCOMPtr inputStream = receiver;
   auto algorithms = MakeRefPtr(
diff --git a/dom/webtransport/api/WebTransportReceiveStream.h b/dom/webtransport/api/WebTransportReceiveStream.h
index a87c6257c5e..2809dd18a25 100644
--- a/dom/webtransport/api/WebTransportReceiveStream.h
+++ b/dom/webtransport/api/WebTransportReceiveStream.h
@@ -19,10 +19,11 @@ class WebTransport;
 
 class WebTransportReceiveStream final : public ReadableStream {
  public:
-  NS_INLINE_DECL_REFCOUNTING_INHERITED(WebTransportReceiveStream,
-                                       ReadableStream)
+  NS_DECL_ISUPPORTS_INHERITED
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(WebTransportReceiveStream,
+                                           ReadableStream)
 
-  explicit WebTransportReceiveStream(nsIGlobalObject* aGlobal);
+  WebTransportReceiveStream(nsIGlobalObject* aGlobal, WebTransport* aTransport);
 
   MOZ_CAN_RUN_SCRIPT_BOUNDARY static already_AddRefed
   Create(WebTransport* aWebTransport, nsIGlobalObject* aGlobal,
@@ -36,7 +37,13 @@ class WebTransportReceiveStream final : public ReadableStream {
   already_AddRefed GetStats();
 
  private:
-  ~WebTransportReceiveStream() override = default;
+  ~WebTransportReceiveStream() override { mozilla::DropJSObjects(this); }
+
+  // We must hold a reference to the WebTransport so it can't go away on
+  // us.  This forms a cycle with WebTransport that will be broken when the
+  // CC runs.   WebTransport::CleanUp() will destroy all the send and receive
+  // streams, breaking the cycle.
+  RefPtr mTransport;
 };
 }  // namespace mozilla::dom
 
diff --git a/dom/webtransport/api/WebTransportSendStream.cpp b/dom/webtransport/api/WebTransportSendStream.cpp
index 12fc8e0ba39..d9fc60ce74e 100644
--- a/dom/webtransport/api/WebTransportSendStream.cpp
+++ b/dom/webtransport/api/WebTransportSendStream.cpp
@@ -16,9 +16,20 @@ using namespace mozilla::ipc;
 
 namespace mozilla::dom {
 
-WebTransportSendStream::WebTransportSendStream(nsIGlobalObject* aGlobal)
+NS_IMPL_CYCLE_COLLECTION_INHERITED(WebTransportSendStream, WritableStream,
+                                   mTransport)
+NS_IMPL_ADDREF_INHERITED(WebTransportSendStream, WritableStream)
+NS_IMPL_RELEASE_INHERITED(WebTransportSendStream, WritableStream)
+NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebTransportSendStream)
+NS_INTERFACE_MAP_END_INHERITING(WritableStream)
+
+WebTransportSendStream::WebTransportSendStream(nsIGlobalObject* aGlobal,
+                                               WebTransport* aTransport)
     : WritableStream(aGlobal,
-                     WritableStream::HoldDropJSObjectsCaller::Implicit) {}
+                     WritableStream::HoldDropJSObjectsCaller::Explicit),
+      mTransport(aTransport) {
+  mozilla::HoldJSObjects(this);
+}
 
 JSObject* WebTransportSendStream::WrapObject(
     JSContext* aCx, JS::Handle aGivenProto) {
@@ -37,7 +48,7 @@ already_AddRefed WebTransportSendStream::Create(
   }
   JSContext* cx = jsapi.cx();
 
-  auto stream = MakeRefPtr(aGlobal);
+  auto stream = MakeRefPtr(aGlobal, aWebTransport);
 
   nsCOMPtr outputStream = sender;
   auto algorithms = MakeRefPtr(
diff --git a/dom/webtransport/api/WebTransportSendStream.h b/dom/webtransport/api/WebTransportSendStream.h
index f12b9431902..1c90f7bf9a5 100644
--- a/dom/webtransport/api/WebTransportSendStream.h
+++ b/dom/webtransport/api/WebTransportSendStream.h
@@ -19,9 +19,11 @@ class WebTransport;
 
 class WebTransportSendStream final : public WritableStream {
  public:
-  NS_INLINE_DECL_REFCOUNTING_INHERITED(WebTransportSendStream, WritableStream)
+  NS_DECL_ISUPPORTS_INHERITED
+  NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(WebTransportSendStream,
+                                           WritableStream)
 
-  explicit WebTransportSendStream(nsIGlobalObject* aGlobal);
+  WebTransportSendStream(nsIGlobalObject* aGlobal, WebTransport* aTransport);
 
   MOZ_CAN_RUN_SCRIPT_BOUNDARY static already_AddRefed
   Create(WebTransport* aWebTransport, nsIGlobalObject* aGlobal,
@@ -35,7 +37,13 @@ class WebTransportSendStream final : public WritableStream {
   already_AddRefed GetStats();
 
  private:
-  ~WebTransportSendStream() override = default;
+  ~WebTransportSendStream() override { mozilla::DropJSObjects(this); };
+
+  // We must hold a reference to the WebTransport so it can't go away on
+  // us.  This forms a cycle with WebTransport that will be broken when the
+  // CC runs.   WebTransport::CleanUp() will destroy all the send and receive
+  // streams, breaking the cycle.
+  RefPtr mTransport;
 };
 }  // namespace mozilla::dom
 
diff --git a/dom/workers/ScriptLoader.cpp b/dom/workers/ScriptLoader.cpp
index e11800a340f..ef9acd3b66a 100644
--- a/dom/workers/ScriptLoader.cpp
+++ b/dom/workers/ScriptLoader.cpp
@@ -976,7 +976,9 @@ nsresult WorkerScriptLoader::LoadScript(
   if (!IsDebuggerScript()) {
     headerProcessor = MakeRefPtr(
         mWorkerRef->Private(),
-        loadContext->IsTopLevel() && !IsDynamicImport(request));
+        loadContext->IsTopLevel() && !IsDynamicImport(request),
+        GetContentPolicyType(request) ==
+            nsIContentPolicy::TYPE_INTERNAL_WORKER_IMPORT_SCRIPTS);
   }
 
   nsCOMPtr loader;
diff --git a/dom/workers/loader/ScriptResponseHeaderProcessor.cpp b/dom/workers/loader/ScriptResponseHeaderProcessor.cpp
index 7b844d66011..30b9d426135 100644
--- a/dom/workers/loader/ScriptResponseHeaderProcessor.cpp
+++ b/dom/workers/loader/ScriptResponseHeaderProcessor.cpp
@@ -34,6 +34,20 @@ nsresult ScriptResponseHeaderProcessor::ProcessCrossOriginEmbedderPolicyHeader(
   return NS_OK;
 }
 
+// Enforce strict MIME type checks for worker-imported scripts
+// https://github.com/whatwg/html/pull/4001
+nsresult ScriptResponseHeaderProcessor::EnsureJavaScriptMimeType(
+    nsIRequest* aRequest) {
+  nsCOMPtr channel = do_QueryInterface(aRequest);
+  MOZ_ASSERT(channel);
+  nsAutoCString mimeType;
+  channel->GetContentType(mimeType);
+  if (!nsContentUtils::IsJavascriptMIMEType(NS_ConvertUTF8toUTF16(mimeType))) {
+    return NS_ERROR_DOM_NETWORK_ERR;
+  }
+  return NS_OK;
+}
+
 nsresult ScriptResponseHeaderProcessor::ProcessCrossOriginEmbedderPolicyHeader(
     nsIRequest* aRequest) {
   nsCOMPtr httpChannel = do_QueryInterface(aRequest);
diff --git a/dom/workers/loader/ScriptResponseHeaderProcessor.h b/dom/workers/loader/ScriptResponseHeaderProcessor.h
index 755712c66f4..43a9bfde42a 100644
--- a/dom/workers/loader/ScriptResponseHeaderProcessor.h
+++ b/dom/workers/loader/ScriptResponseHeaderProcessor.h
@@ -14,6 +14,7 @@
 #include "nsIStreamLoader.h"
 #include "nsStreamUtils.h"
 #include "mozilla/StaticPrefs_browser.h"
+#include "mozilla/StaticPrefs_dom.h"
 
 namespace mozilla::dom {
 
@@ -34,17 +35,29 @@ class ScriptResponseHeaderProcessor final : public nsIRequestObserver {
   NS_DECL_ISUPPORTS
 
   ScriptResponseHeaderProcessor(WorkerPrivate* aWorkerPrivate,
-                                bool aIsMainScript)
-      : mWorkerPrivate(aWorkerPrivate), mIsMainScript(aIsMainScript) {
+                                bool aIsMainScript, bool aIsImportScript)
+      : mWorkerPrivate(aWorkerPrivate),
+        mIsMainScript(aIsMainScript),
+        mIsImportScript(aIsImportScript) {
     AssertIsOnMainThread();
   }
 
   NS_IMETHOD OnStartRequest(nsIRequest* aRequest) override {
+    nsresult rv = NS_OK;
+    if (mIsImportScript &&
+        StaticPrefs::dom_workers_importScripts_enforceStrictMimeType()) {
+      rv = EnsureJavaScriptMimeType(aRequest);
+      if (NS_WARN_IF(NS_FAILED(rv))) {
+        aRequest->Cancel(rv);
+        return NS_OK;
+      }
+    }
+
     if (!StaticPrefs::browser_tabs_remote_useCrossOriginEmbedderPolicy()) {
       return NS_OK;
     }
 
-    nsresult rv = ProcessCrossOriginEmbedderPolicyHeader(aRequest);
+    rv = ProcessCrossOriginEmbedderPolicyHeader(aRequest);
 
     if (NS_WARN_IF(NS_FAILED(rv))) {
       aRequest->Cancel(rv);
@@ -65,10 +78,13 @@ class ScriptResponseHeaderProcessor final : public nsIRequestObserver {
  private:
   ~ScriptResponseHeaderProcessor() = default;
 
+  nsresult EnsureJavaScriptMimeType(nsIRequest* aRequest);
+
   nsresult ProcessCrossOriginEmbedderPolicyHeader(nsIRequest* aRequest);
 
   WorkerPrivate* const mWorkerPrivate;
   const bool mIsMainScript;
+  const bool mIsImportScript;
 };
 
 }  // namespace workerinternals::loader
diff --git a/dom/workers/loader/WorkerModuleLoader.cpp b/dom/workers/loader/WorkerModuleLoader.cpp
index b6279cf8a75..4dc58aad902 100644
--- a/dom/workers/loader/WorkerModuleLoader.cpp
+++ b/dom/workers/loader/WorkerModuleLoader.cpp
@@ -191,7 +191,8 @@ void WorkerModuleLoader::OnModuleLoadComplete(ModuleLoadRequest* aRequest) {
 bool WorkerModuleLoader::IsModuleEvaluationAborted(
     ModuleLoadRequest* aRequest) {
   WorkerPrivate* workerPrivate = GetCurrentThreadWorkerPrivate();
-  return workerPrivate->GlobalScope()->IsDying();
+  return !workerPrivate || !workerPrivate->GlobalScope() ||
+         workerPrivate->GlobalScope()->IsDying();
 }
 
 }  // namespace mozilla::dom::workerinternals::loader
diff --git a/dom/workers/test/importScripts_worker.js b/dom/workers/test/importScripts_worker.js
index c3099b48de6..a3c73725526 100644
--- a/dom/workers/test/importScripts_worker.js
+++ b/dom/workers/test/importScripts_worker.js
@@ -39,7 +39,7 @@ function tryBadScripts() {
   }
 }
 
-const url = "data:text/plain,const startResponse = 'started';";
+const url = "data:text/javascript,const startResponse = 'started';";
 importScripts(url);
 
 onmessage = function(event) {
diff --git a/extensions/spellcheck/tests/mochitest/test_bug1170484.html b/extensions/spellcheck/tests/mochitest/test_bug1170484.html
index a541dd250ce..fa22998ada6 100644
--- a/extensions/spellcheck/tests/mochitest/test_bug1170484.html
+++ b/extensions/spellcheck/tests/mochitest/test_bug1170484.html
@@ -11,7 +11,7 @@ https://bugzilla.mozilla.org/show_bug.cgi?id=1170484
   
   
   
   
 
-
+ + diff --git a/layout/style/test/test_non_content_accessible_properties.html b/layout/style/test/test_non_content_accessible_properties.html index 65373d71e9b..bbb249bff90 100644 --- a/layout/style/test/test_non_content_accessible_properties.html +++ b/layout/style/test/test_non_content_accessible_properties.html @@ -1,8 +1,8 @@ - -
+ + diff --git a/layout/style/test/test_revert.html b/layout/style/test/test_revert.html index 3346e932f93..48897a75ca4 100644 --- a/layout/style/test/test_revert.html +++ b/layout/style/test/test_revert.html @@ -21,8 +21,6 @@ const kInheritedDiv = document.getElementById("inherited"); const kResetDiv = document.getElementById("nonInherited"); const kNoAuthorStylesDiv = document.getElementById("noAuthorStyleApplied"); -SimpleTest.expectAssertions(3, 3); // bug 1790201 - function computedValue(node, property) { return get_computed_value(getComputedStyle(node), property); } diff --git a/layout/tables/nsTableFrame.cpp b/layout/tables/nsTableFrame.cpp index 68650262479..0129c749360 100644 --- a/layout/tables/nsTableFrame.cpp +++ b/layout/tables/nsTableFrame.cpp @@ -3548,20 +3548,25 @@ Maybe nsTableFrame::GetNaturalBaselineBOffset( OrderRowGroups(orderedRowGroups); // XXX not sure if this should be the size of the containing block instead. nsSize containerSize = mRect.Size(); - auto TableBaseline = [aWM, containerSize](nsTableRowGroupFrame* aRowGroup, - nsTableRowFrame* aRow) { + auto TableBaseline = [aWM, containerSize]( + nsTableRowGroupFrame* aRowGroup, + nsTableRowFrame* aRow) -> Maybe { nscoord rgBStart = LogicalRect(aWM, aRowGroup->GetNormalRect(), containerSize).BStart(aWM); nscoord rowBStart = - LogicalRect(aWM, aRow->GetNormalRect(), containerSize).BStart(aWM); - return rgBStart + rowBStart + aRow->GetRowBaseline(aWM); + LogicalRect(aWM, aRow->GetNormalRect(), aRowGroup->GetSize()) + .BStart(aWM); + return aRow->GetRowBaseline(aWM).map( + [rgBStart, rowBStart](nscoord aBaseline) { + return rgBStart + rowBStart + aBaseline; + }); }; if (aBaselineGroup == BaselineSharingGroup::First) { for (uint32_t rgIndex = 0; rgIndex < orderedRowGroups.Length(); rgIndex++) { nsTableRowGroupFrame* rgFrame = orderedRowGroups[rgIndex]; nsTableRowFrame* row = rgFrame->GetFirstRow(); if (row) { - return Some(TableBaseline(rgFrame, row)); + return TableBaseline(rgFrame, row); } } } else { @@ -3569,7 +3574,9 @@ Maybe nsTableFrame::GetNaturalBaselineBOffset( nsTableRowGroupFrame* rgFrame = orderedRowGroups[rgIndex]; nsTableRowFrame* row = rgFrame->GetLastRow(); if (row) { - return Some(BSize(aWM) - TableBaseline(rgFrame, row)); + return TableBaseline(rgFrame, row).map([this, aWM](nscoord aBaseline) { + return BSize(aWM) - aBaseline; + }); } } } diff --git a/layout/tables/nsTableRowFrame.cpp b/layout/tables/nsTableRowFrame.cpp index 89302ca9a6e..6a35c088a91 100644 --- a/layout/tables/nsTableRowFrame.cpp +++ b/layout/tables/nsTableRowFrame.cpp @@ -398,13 +398,15 @@ void nsTableRowFrame::DidResize() { // *including* cells with rowspans nscoord nsTableRowFrame::GetMaxCellAscent() const { return mMaxCellAscent; } -nscoord nsTableRowFrame::GetRowBaseline(WritingMode aWM) { +Maybe nsTableRowFrame::GetRowBaseline(WritingMode aWM) { if (mMaxCellAscent) { - return mMaxCellAscent; + return Some(mMaxCellAscent); } // If we get here, we don't have a baseline on any of the cells in this row. - + if (aWM.IsCentralBaseline()) { + return Nothing{}; + } nscoord ascent = 0; for (nsIFrame* childFrame : mFrames) { MOZ_ASSERT(childFrame->IsTableCellFrame()); @@ -412,7 +414,7 @@ nscoord nsTableRowFrame::GetRowBaseline(WritingMode aWM) { childFrame, aWM, BaselineSharingGroup::First); ascent = std::max(ascent, s); } - return ascent; + return Some(ascent); } nscoord nsTableRowFrame::GetInitialBSize(nscoord aPctBasis) const { diff --git a/layout/tables/nsTableRowFrame.h b/layout/tables/nsTableRowFrame.h index c666ad6079f..6ca6d78bdaa 100644 --- a/layout/tables/nsTableRowFrame.h +++ b/layout/tables/nsTableRowFrame.h @@ -132,7 +132,7 @@ class nsTableRowFrame : public nsContainerFrame { /* return the row ascent */ - nscoord GetRowBaseline(mozilla::WritingMode aWritingMode); + Maybe GetRowBaseline(mozilla::WritingMode aWM); /** returns the ordinal position of this row in its table */ virtual int32_t GetRowIndex() const; diff --git a/layout/tables/nsTableWrapperFrame.cpp b/layout/tables/nsTableWrapperFrame.cpp index 267416a288d..37a4391b750 100644 --- a/layout/tables/nsTableWrapperFrame.cpp +++ b/layout/tables/nsTableWrapperFrame.cpp @@ -28,9 +28,12 @@ using namespace mozilla::layout; nscoord nsTableWrapperFrame::SynthesizeFallbackBaseline( mozilla::WritingMode aWM, BaselineSharingGroup aBaselineGroup) const { + const auto marginBlockEnd = GetLogicalUsedMargin(aWM).BEnd(aWM); + if (aWM.IsCentralBaseline()) { + return (BSize(aWM) + marginBlockEnd) / 2; + } // Our fallback baseline is the block-end margin-edge, with respect to the // given writing mode. - const auto marginBlockEnd = GetLogicalUsedMargin(aWM).BEnd(aWM); if (aBaselineGroup == BaselineSharingGroup::Last) { return -marginBlockEnd; } diff --git a/media/libcubeb/src/moz.build b/media/libcubeb/src/moz.build index 5a864c239f8..8dd28502bf1 100644 --- a/media/libcubeb/src/moz.build +++ b/media/libcubeb/src/moz.build @@ -97,6 +97,7 @@ if CONFIG['MOZ_AAUDIO'] or CONFIG['MOZ_OPENSL']: if CONFIG['MOZ_AAUDIO']: SOURCES += ['cubeb_aaudio.cpp'] + SOURCES['cubeb_aaudio.cpp'].flags += ['-D__ANDROID_UNAVAILABLE_SYMBOLS_ARE_WEAK__'] DEFINES['USE_AAUDIO'] = True if CONFIG['MOZ_OPENSL']: diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/background.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/background.js index 6e80e803838..c818719d3b6 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/background.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/background.js @@ -71,6 +71,12 @@ const APIS = { ClearHSTSState() { return browser.test.clearHSTSState(); }, + TriggerCookieBannerDetected({ tab }) { + return browser.test.triggerCookieBannerDetected(tab.id); + }, + TriggerCookieBannerHandled({ tab }) { + return browser.test.triggerCookieBannerHandled(tab.id); + }, }; port.onMessage.addListener(async message => { diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-api.js b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-api.js index 6a2bd6822e2..4bddaedfeac 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-api.js +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-api.js @@ -42,10 +42,20 @@ this.test = class extends ExtensionAPI { } getAPI(context) { - function windowActor(tabId) { + /** + * Helper function for getting window or process actors. + * + * @param tabId - id of the tab; required + * @param actorName - a string; the name of the actor + * Default: "TestSupport" which is our test framework actor + * (you can still pass the second parameter when getting the TestSupport actor, for readability) + * + * @returns actor + */ + function getActorForTab(tabId, actorName = "TestSupport") { const tab = context.extension.tabManager.get(tabId); const { browsingContext } = tab.browser; - return browsingContext.currentWindowGlobal.getActor("TestSupport"); + return browsingContext.currentWindowGlobal.getActor(actorName); } return { @@ -83,7 +93,10 @@ this.test = class extends ExtensionAPI { /* Gets link color for a given selector. */ async getLinkColor(tabId, selector) { - return windowActor(tabId).sendQuery("GetLinkColor", { selector }); + return getActorForTab(tabId, "TestSupport").sendQuery( + "GetLinkColor", + { selector } + ); }, async getRequestedLocales() { @@ -134,9 +147,12 @@ this.test = class extends ExtensionAPI { }, async setResolutionAndScaleTo(tabId, resolution) { - return windowActor(tabId).sendQuery("SetResolutionAndScaleTo", { - resolution, - }); + return getActorForTab(tabId, "TestSupport").sendQuery( + "SetResolutionAndScaleTo", + { + resolution, + } + ); }, async getActive(tabId) { @@ -155,11 +171,15 @@ this.test = class extends ExtensionAPI { // flushApzRepaints is called for the target content document, if we // still meet intermittent failures, we might want to do it here as // well. - await windowActor(tabId).sendQuery("FlushApzRepaints"); + await getActorForTab(tabId, "TestSupport").sendQuery( + "FlushApzRepaints" + ); }, async promiseAllPaintsDone(tabId) { - await windowActor(tabId).sendQuery("PromiseAllPaintsDone"); + await getActorForTab(tabId, "TestSupport").sendQuery( + "PromiseAllPaintsDone" + ); }, async usingGpuProcess() { @@ -189,6 +209,20 @@ this.test = class extends ExtensionAPI { ); return sss.clearAll(); }, + + async triggerCookieBannerDetected(tabId) { + const actor = getActorForTab(tabId, "CookieBanner"); + return actor.receiveMessage({ + name: "CookieBanner::DetectedBanner", + }); + }, + + async triggerCookieBannerHandled(tabId) { + const actor = getActorForTab(tabId, "CookieBanner"); + return actor.receiveMessage({ + name: "CookieBanner::HandledBanner", + }); + }, }, }; } diff --git a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-schema.json b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-schema.json index c3afa0f79e9..64c7f9ebca0 100644 --- a/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-schema.json +++ b/mobile/android/geckoview/src/androidTest/assets/web_extensions/test-support/test-schema.json @@ -232,6 +232,32 @@ "async": true, "description": "Clears the sites on the HSTS list.", "parameters": [] + }, + + { + "name": "triggerCookieBannerDetected", + "type": "function", + "async": true, + "description": "Simulates a cookie banner detection", + "parameters": [ + { + "type": "number", + "name": "tabId" + } + ] + }, + + { + "name": "triggerCookieBannerHandled", + "type": "function", + "async": true, + "description": "Simulates a cookie banner handling", + "parameters": [ + { + "type": "number", + "name": "tabId" + } + ] } ] } diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt index 6294b920a10..8c326169d83 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/BaseSessionTest.kt @@ -261,6 +261,12 @@ open class BaseSessionTest(noErrorCollector: Boolean = false) { fun GeckoSession.setResolutionAndScaleTo(resolution: Float) = sessionRule.setResolutionAndScaleTo(this, resolution) + fun GeckoSession.triggerCookieBannerDetected() = + sessionRule.triggerCookieBannerDetected(this) + + fun GeckoSession.triggerCookieBannerHandled() = + sessionRule.triggerCookieBannerHandled(this) + var GeckoSession.active: Boolean get() = sessionRule.getActive(this) set(value) = setActive(value) diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt index d1e329e6796..b28e19d35c3 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/ContentDelegateTest.kt @@ -17,6 +17,7 @@ import org.junit.Assume.assumeThat import org.junit.Test import org.junit.runner.RunWith import org.mozilla.geckoview.* // ktlint-disable no-wildcard-imports +import org.mozilla.geckoview.ContentBlocking.CookieBannerMode import org.mozilla.geckoview.GeckoDisplay.SurfaceInfo import org.mozilla.geckoview.GeckoSession.ContentDelegate import org.mozilla.geckoview.GeckoSession.NavigationDelegate @@ -367,6 +368,52 @@ class ContentDelegateTest : BaseSessionTest() { }) } + @Test fun cookieBannerDetectedEvent() { + sessionRule.setPrefsUntilTestEnd( + mapOf( + "cookiebanners.service.mode" to CookieBannerMode.COOKIE_BANNER_MODE_REJECT + ) + ) + + val detectHandled = GeckoResult() + mainSession.delegateUntilTestEnd(object : GeckoSession.ContentDelegate { + override fun onCookieBannerDetected( + session: GeckoSession + ) { + detectHandled.complete(null) + } + }) + + mainSession.loadTestPath(HELLO_HTML_PATH) + mainSession.waitForPageStop() + mainSession.triggerCookieBannerDetected() + + sessionRule.waitForResult(detectHandled) + } + + @Test fun cookieBannerHandledEvent() { + sessionRule.setPrefsUntilTestEnd( + mapOf( + "cookiebanners.service.mode" to CookieBannerMode.COOKIE_BANNER_MODE_REJECT + ) + ) + + val handleHandled = GeckoResult() + mainSession.delegateUntilTestEnd(object : GeckoSession.ContentDelegate { + override fun onCookieBannerHandled( + session: GeckoSession + ) { + handleHandled.complete(null) + } + }) + + mainSession.loadTestPath(HELLO_HTML_PATH) + mainSession.waitForPageStop() + mainSession.triggerCookieBannerHandled() + + sessionRule.waitForResult(handleHandled) + } + @WithDisplay(width = 100, height = 100) @Test fun setCursor() { diff --git a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java index 1295fc291a4..81133bb063d 100644 --- a/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java +++ b/mobile/android/geckoview/src/androidTest/java/org/mozilla/geckoview/test/rule/GeckoSessionTestRule.java @@ -2456,6 +2456,14 @@ public class GeckoSessionTestRule implements TestRule { return isActive; } + public void triggerCookieBannerDetected(final @NonNull GeckoSession session) { + webExtensionApiCall(session, "TriggerCookieBannerDetected", null); + } + + public void triggerCookieBannerHandled(final @NonNull GeckoSession session) { + webExtensionApiCall(session, "TriggerCookieBannerHandled", null); + } + private Object waitForMessage(final WebExtension.Port port, final String id) { mPendingResponses.add(port, id); UiThreadUtils.waitForCondition(() -> mPendingMessages.containsKey(id), mTimeoutMillis); diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java index e0d5d646f0e..31262989a40 100644 --- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java +++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/GeckoAppShell.java @@ -355,11 +355,9 @@ public class GeckoAppShell { return false; } - if (!locationHighAccuracyEnabled) { - final Location lastKnownLocation = getLastKnownLocation(lm); - if (lastKnownLocation != null) { - sAndroidListeners.onLocationChanged(lastKnownLocation); - } + final Location lastKnownLocation = getLastKnownLocation(lm); + if (lastKnownLocation != null) { + sAndroidListeners.onLocationChanged(lastKnownLocation); } final Criteria criteria = new Criteria(); diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml index 411da168e1a..5d844c26295 100644 --- a/modules/libpref/init/StaticPrefList.yaml +++ b/modules/libpref/init/StaticPrefList.yaml @@ -3960,6 +3960,11 @@ value: true mirror: always +- name: dom.workers.importScripts.enforceStrictMimeType + type: RelaxedAtomicBool + value: @IS_NIGHTLY_BUILD@ + mirror: always + # Is support for modules (new Worker(..., {type: "module">)) enabled for workers? - name: dom.workers.modules.enabled type: RelaxedAtomicBool @@ -4610,6 +4615,24 @@ value: false mirror: always +# Comma-separated list of wgpu backend names to permit in WebGPU adapters. +# +# If non-empty, this is parsed by `wgpu_core::instance::parse_backends_from_comma_list` to +# produce a `wgpu_types::Backends` bitset used to create a `wgpu_core::hub::Global`. As of +# 2023-3-22, recognized names are: +# +# "vulkan" | "vk" => Backends::VULKAN, +# "dx12" | "d3d12" => Backends::DX12, +# "dx11" | "d3d11" => Backends::DX11, +# "metal" | "mtl" => Backends::METAL, +# "opengl" | "gles" | "gl" => Backends::GL, +# "webgpu" => Backends::BROWSER_WEBGPU, +- name: dom.webgpu.wgpu-backend + type: DataMutexString + value: "" + mirror: always + rust: true + # Is support for HTMLInputElement.webkitEntries enabled? - name: dom.webkitBlink.filesystem.enabled type: bool @@ -9060,6 +9083,14 @@ value: 4 mirror: always +# Whether to load the broken image icon eagerly. This is mostly needed for +# reftests, since the broken image icon doesn't block the load event and thus +# there's no easy way to guarantee it's loaded. +- name: layout.image.eager_broken_image_icon + type: bool + value: false + mirror: always + # Enable/disable interruptible reflow, which allows reflows to stop # before completion (and display the partial results) when user events # are pending. @@ -9484,7 +9515,7 @@ #elif defined(XP_WIN) && !defined(_ARM64_) value: true #elif defined(XP_MACOSX) - value: @IS_NIGHTLY_BUILD@ + value: true #else value: false #endif @@ -9494,11 +9525,11 @@ type: bool mirror: always #if defined(XP_LINUX) && !defined(MOZ_WIDGET_ANDROID) - value: @IS_NIGHTLY_BUILD@ + value: true #elif defined(XP_WIN) && !defined(_ARM64_) value: true #elif defined(XP_MACOSX) - value: @IS_NIGHTLY_BUILD@ + value: true #else value: false #endif @@ -10081,9 +10112,12 @@ # Force to copy dmabuf video frames # Used for debugging/troubleshooting only -- name: media.ffmpeg.vaapi.force-surface-copy - type: bool - value: false +# 0 - force disable +# 1 - force enable +# 2 - default +- name: media.ffmpeg.vaapi.force-surface-zero-copy + type: uint32_t + value: 2 mirror: once #endif # MOZ_WIDGET_GTK @@ -10212,6 +10246,12 @@ value: false mirror: always +# This allows playing DRM video via the media engine pipeline. +- name: media.wmf.media-engine.drm-playback + type: RelaxedAtomicBool + value: false + mirror: always + # The amount of video raw data the engine stream will queue - name: media.wmf.media-engine.raw-data-threshold.video type: RelaxedAtomicInt32 diff --git a/modules/libpref/init/all.js b/modules/libpref/init/all.js index b2ad4491e09..e23fa3b20bb 100644 --- a/modules/libpref/init/all.js +++ b/modules/libpref/init/all.js @@ -3780,12 +3780,18 @@ pref("browser.sanitizer.loglevel", "Warn"); // [1]: https://browser.mt/ // [2]: https://github.com/mozilla/firefox-translations pref("browser.translations.enable", false); -// Set to "All" to see all logs, which are useful for debugging. +// Set to "All" to see all logs, which are useful for debugging. Set to "Info" to see +// the application logic logs, and not all of the translated messages, which can be +// slow and overwhelming. pref("browser.translations.logLevel", "Error"); // By default the translations engine on about:translations uses text for translation, // and the full page translations uses HTML. Set this pref to true to use the HTML // translation behavior on about:translations. Requires a page refresh. pref("browser.translations.useHTML", false); +// Normally there is a UI to ask the user to translate a page, this pref makes it +// so that the page automatically performs a translation if one is detected as being +// required. +pref("browser.translations.autoTranslate", false); // When a user cancels this number of authentication dialogs coming from // a single web page in a row, all following authentication dialogs will diff --git a/modules/libpref/init/generate_static_pref_list.py b/modules/libpref/init/generate_static_pref_list.py index 8656df681d8..2e9cf9d98fd 100644 --- a/modules/libpref/init/generate_static_pref_list.py +++ b/modules/libpref/init/generate_static_pref_list.py @@ -46,7 +46,7 @@ VALID_TYPES.update( "SequentiallyConsistentAtomicUint32": "uint32_t", "AtomicFloat": "float", "String": None, - "DataMutexString": None, + "DataMutexString": "nsACString", } ) @@ -56,6 +56,7 @@ RUST_TYPES = { "int32_t": "i32", "uint32_t": "u32", "float": "f32", + "DataMutexString": "nsCString", } HEADER_LINE = ( @@ -114,6 +115,13 @@ extern "C" {typ} StaticPrefs_{full_id}() {{ }} """ +STATIC_PREFS_C_GETTERS_NSSTRING_TEMPLATE = """\ +extern "C" void StaticPrefs_{full_id}(nsACString *result) {{ + const auto preflock = mozilla::StaticPrefs::{full_id}(); + result->Append(*preflock); +}} +""" + def error(msg): raise ValueError(msg) @@ -308,22 +316,40 @@ def generate_code(pref_list, input_filename): ) if rust: - # Generate the C getter. - static_prefs_c_getters_cpp.append( - STATIC_PREFS_C_GETTERS_TEMPLATE.format( - typ=VALID_TYPES[typ], full_id=full_id + passed_type = VALID_TYPES[typ] + if passed_type == "nsACString": + # Generate the C getter. + static_prefs_c_getters_cpp.append( + STATIC_PREFS_C_GETTERS_NSSTRING_TEMPLATE.format(full_id=full_id) ) - ) - # Generate the C getter declaration, in Rust. - decl = " pub fn StaticPrefs_{full_id}() -> {typ};" - static_prefs_rs_decls.append( - decl.format(full_id=full_id, typ=RUST_TYPES[VALID_TYPES[typ]]) - ) + # Generate the C getter declaration, in Rust. + decl = " pub fn StaticPrefs_{full_id}(result: *mut nsstring::nsACString);" + static_prefs_rs_decls.append(decl.format(full_id=full_id)) - # Generate the Rust macro entry. - macro = ' ("{name}") => (unsafe {{ $crate::StaticPrefs_{full_id}() }});' - static_prefs_rs_macro.append(macro.format(name=name, full_id=full_id)) + # Generate the Rust macro entry. + macro = ' ("{name}") => (unsafe {{ let mut result = $crate::nsCString::new(); $crate::StaticPrefs_{full_id}(&mut *result); result }});' + static_prefs_rs_macro.append(macro.format(name=name, full_id=full_id)) + + else: + # Generate the C getter. + static_prefs_c_getters_cpp.append( + STATIC_PREFS_C_GETTERS_TEMPLATE.format( + typ=passed_type, full_id=full_id + ) + ) + + # Generate the C getter declaration, in Rust. + decl = " pub fn StaticPrefs_{full_id}() -> {typ};" + static_prefs_rs_decls.append( + decl.format(full_id=full_id, typ=RUST_TYPES[passed_type]) + ) + + # Generate the Rust macro entry. + macro = ( + ' ("{name}") => (unsafe {{ $crate::StaticPrefs_{full_id}() }});' + ) + static_prefs_rs_macro.append(macro.format(name=name, full_id=full_id)) # Delete this so that `group` can be reused below without Flake8 # complaining. @@ -365,7 +391,7 @@ def generate_code(pref_list, input_filename): ) # static_prefs.rs contains the Rust macro getters. - static_prefs_rs = [first_line, "", 'extern "C" {'] + static_prefs_rs = [first_line, "", "pub use nsstring::nsCString;", 'extern "C" {'] static_prefs_rs.extend(static_prefs_rs_decls) static_prefs_rs.extend(["}", "", "#[macro_export]", "macro_rules! pref {"]) static_prefs_rs.extend(static_prefs_rs_macro) diff --git a/modules/libpref/init/static_prefs/Cargo.toml b/modules/libpref/init/static_prefs/Cargo.toml index 7c73def39ed..061bf92b484 100644 --- a/modules/libpref/init/static_prefs/Cargo.toml +++ b/modules/libpref/init/static_prefs/Cargo.toml @@ -9,3 +9,4 @@ license = "MPL-2.0" [dependencies] mozbuild = "0.1" +nsstring = { path = "../../../../xpcom/rust/nsstring" } diff --git a/modules/libpref/test/test_generate_static_pref_list.py b/modules/libpref/test/test_generate_static_pref_list.py index 118aa47ec64..2c8797099e6 100644 --- a/modules/libpref/test/test_generate_static_pref_list.py +++ b/modules/libpref/test/test_generate_static_pref_list.py @@ -74,6 +74,13 @@ good_input = """ value: "foobar" # This string is quoted. mirror: always +# Mirrored string-valued prefs are interesting in Rust. +- name: my.datamutex.string.rust + type: DataMutexString + value: "" + mirror: always + rust: true + # YAML+Python interprets `10 + 10 * 20` as a string, and so it is printed # unchanged. - name: my.atomic.int @@ -164,6 +171,13 @@ ALWAYS_DATAMUTEX_PREF( DataMutexString, "foobar"_ns ) +ALWAYS_DATAMUTEX_PREF( + "my.datamutex.string.rust", + my_datamutex_string_rust, + my_datamutex_string_rust, + DataMutexString, ""_ns +) + ALWAYS_PREF( "my.atomic.int", my_atomic_int, @@ -219,6 +233,11 @@ extern "C" float StaticPrefs_my_float_AtStartup_DoNotUseDirectly() { extern "C" bool StaticPrefs_my_atomic_bool() { return mozilla::StaticPrefs::my_atomic_bool(); } + +extern "C" void StaticPrefs_my_datamutex_string_rust(nsACString *result) { + const auto preflock = mozilla::StaticPrefs::my_datamutex_string_rust(); + result->Append(*preflock); +} """ good[ @@ -226,10 +245,12 @@ good[ ] = """\ // This file was generated by generate_static_pref_list.py from (string input). DO NOT EDIT. +pub use nsstring::nsCString; extern "C" { pub fn StaticPrefs_my_uint() -> u32; pub fn StaticPrefs_my_float_AtStartup_DoNotUseDirectly() -> f32; pub fn StaticPrefs_my_atomic_bool() -> bool; + pub fn StaticPrefs_my_datamutex_string_rust(result: *mut nsstring::nsACString); } #[macro_export] @@ -237,6 +258,7 @@ macro_rules! pref { ("my.uint") => (unsafe { $crate::StaticPrefs_my_uint() }); ("my.float") => (unsafe { $crate::StaticPrefs_my_float_AtStartup_DoNotUseDirectly() }); ("my.atomic.bool") => (unsafe { $crate::StaticPrefs_my_atomic_bool() }); + ("my.datamutex.string.rust") => (unsafe { let mut result = $crate::nsCString::new(); $crate::StaticPrefs_my_datamutex_string_rust(&mut *result); result }); } """ diff --git a/mozglue/baseprofiler/core/shared-libraries-win32.cc b/mozglue/baseprofiler/core/shared-libraries-win32.cc index 3131feda20d..4a3a9017521 100644 --- a/mozglue/baseprofiler/core/shared-libraries-win32.cc +++ b/mozglue/baseprofiler/core/shared-libraries-win32.cc @@ -97,113 +97,126 @@ static bool IsModuleUnsafeToLoad(const std::string& aModuleName) { return false; } +void SharedLibraryInfo::AddSharedLibraryFromModuleInfo( + const wchar_t* aModulePath, mozilla::Maybe aModule) { + mozilla::UniquePtr utf8ModulePath( + mozilla::glue::WideToUTF8(aModulePath)); + if (!utf8ModulePath) { + return; + } + + std::string modulePathStr(utf8ModulePath.get()); + size_t pos = modulePathStr.find_last_of("\\/"); + std::string moduleNameStr = (pos != std::string::npos) + ? modulePathStr.substr(pos + 1) + : modulePathStr; + + // If the module is unsafe to call LoadLibraryEx for, we skip. + if (IsModuleUnsafeToLoad(moduleNameStr)) { + return; + } + + // Load the module again to make sure that its handle will remain + // valid as we attempt to read the PDB information from it. We load the + // DLL as a datafile so that we don't end up running the newly loaded + // module's DllMain function. If the original handle |aModule| is + // valid, LoadLibraryEx just increments its refcount. + // LOAD_LIBRARY_AS_IMAGE_RESOURCE is needed to read information from the + // sections (not PE headers) which should be relocated by the loader, + // otherwise GetPdbInfo() will cause a crash. + nsModuleHandle handleLock(::LoadLibraryExW( + aModulePath, NULL, + LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)); + if (!handleLock) { + return; + } + + mozilla::nt::PEHeaders headers(handleLock.get()); + if (!headers) { + return; + } + + mozilla::Maybe> bounds = headers.GetBounds(); + if (!bounds) { + return; + } + + // Put the original |aModule| into SharedLibrary, but we get debug info + // from |handleLock| as |aModule| might be inaccessible. + const uintptr_t modStart = + aModule.isSome() ? reinterpret_cast(*aModule) + : reinterpret_cast(handleLock.get()); + const uintptr_t modEnd = modStart + bounds->length(); + + std::string breakpadId; + std::string pdbPathStr; + std::string pdbNameStr; + if (const auto* debugInfo = headers.GetPdbInfo()) { + MOZ_ASSERT(breakpadId.empty()); + const GUID& pdbSig = debugInfo->pdbSignature; + AppendHex(pdbSig.Data1, breakpadId, WITH_PADDING); + AppendHex(pdbSig.Data2, breakpadId, WITH_PADDING); + AppendHex(pdbSig.Data3, breakpadId, WITH_PADDING); + AppendHex(reinterpret_cast(&pdbSig.Data4), + reinterpret_cast(&pdbSig.Data4) + + sizeof(pdbSig.Data4), + breakpadId); + AppendHex(debugInfo->pdbAge, breakpadId, WITHOUT_PADDING); + + // The PDB file name could be different from module filename, + // so report both + // e.g. The PDB for C:\Windows\SysWOW64\ntdll.dll is wntdll.pdb + pdbPathStr = debugInfo->pdbFileName; + size_t pos = pdbPathStr.find_last_of("\\/"); + pdbNameStr = + (pos != std::string::npos) ? pdbPathStr.substr(pos + 1) : pdbPathStr; + } + + std::string codeId; + DWORD timestamp; + DWORD imageSize; + if (headers.GetTimeStamp(timestamp) && headers.GetImageSize(imageSize)) { + AppendHex(timestamp, codeId, WITH_PADDING); + AppendHex(imageSize, codeId, WITHOUT_PADDING, LOWERCASE); + } + + std::string versionStr; + uint64_t version; + if (headers.GetVersionInfo(version)) { + versionStr += std::to_string((version >> 48) & 0xFFFF); + versionStr += '.'; + versionStr += std::to_string((version >> 32) & 0xFFFF); + versionStr += '.'; + versionStr += std::to_string((version >> 16) & 0xFFFF); + versionStr += '.'; + versionStr += std::to_string(version & 0xFFFF); + } + + SharedLibrary shlib(modStart, modEnd, + 0, // DLLs are always mapped at offset 0 on Windows + breakpadId, codeId, moduleNameStr, modulePathStr, + pdbNameStr, pdbPathStr, versionStr, ""); + AddSharedLibrary(shlib); +} + SharedLibraryInfo SharedLibraryInfo::GetInfoForSelf() { SharedLibraryInfo sharedLibraryInfo; - auto addSharedLibraryFromModuleInfo = [&sharedLibraryInfo]( - const wchar_t* aModulePath, - HMODULE aModule) { - mozilla::UniquePtr utf8ModulePath( - mozilla::glue::WideToUTF8(aModulePath)); - if (!utf8ModulePath) { - return; - } - - std::string modulePathStr(utf8ModulePath.get()); - size_t pos = modulePathStr.find_last_of("\\/"); - std::string moduleNameStr = (pos != std::string::npos) - ? modulePathStr.substr(pos + 1) - : modulePathStr; - - // If the module is unsafe to call LoadLibraryEx for, we skip. - if (IsModuleUnsafeToLoad(moduleNameStr)) { - return; - } - - // Load the module again to make sure that its handle will remain - // valid as we attempt to read the PDB information from it. We load the - // DLL as a datafile so that we don't end up running the newly loaded - // module's DllMain function. If the original handle |aModule| is - // valid, LoadLibraryEx just increments its refcount. - // LOAD_LIBRARY_AS_IMAGE_RESOURCE is needed to read information from the - // sections (not PE headers) which should be relocated by the loader, - // otherwise GetPdbInfo() will cause a crash. - nsModuleHandle handleLock(::LoadLibraryExW( - aModulePath, NULL, - LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE)); - if (!handleLock) { - return; - } - - mozilla::nt::PEHeaders headers(handleLock.get()); - if (!headers) { - return; - } - - mozilla::Maybe> bounds = headers.GetBounds(); - if (!bounds) { - return; - } - - // Put the original |aModule| into SharedLibrary, but we get debug info - // from |handleLock| as |aModule| might be inaccessible. - const uintptr_t modStart = reinterpret_cast(aModule); - const uintptr_t modEnd = modStart + bounds->length(); - - std::string breakpadId; - std::string pdbPathStr; - std::string pdbNameStr; - if (const auto* debugInfo = headers.GetPdbInfo()) { - MOZ_ASSERT(breakpadId.empty()); - const GUID& pdbSig = debugInfo->pdbSignature; - AppendHex(pdbSig.Data1, breakpadId, WITH_PADDING); - AppendHex(pdbSig.Data2, breakpadId, WITH_PADDING); - AppendHex(pdbSig.Data3, breakpadId, WITH_PADDING); - AppendHex(reinterpret_cast(&pdbSig.Data4), - reinterpret_cast(&pdbSig.Data4) + - sizeof(pdbSig.Data4), - breakpadId); - AppendHex(debugInfo->pdbAge, breakpadId, WITHOUT_PADDING); - - // The PDB file name could be different from module filename, - // so report both - // e.g. The PDB for C:\Windows\SysWOW64\ntdll.dll is wntdll.pdb - pdbPathStr = debugInfo->pdbFileName; - size_t pos = pdbPathStr.find_last_of("\\/"); - pdbNameStr = - (pos != std::string::npos) ? pdbPathStr.substr(pos + 1) : pdbPathStr; - } - - std::string codeId; - DWORD timestamp; - DWORD imageSize; - if (headers.GetTimeStamp(timestamp) && headers.GetImageSize(imageSize)) { - AppendHex(timestamp, codeId, WITH_PADDING); - AppendHex(imageSize, codeId, WITHOUT_PADDING, LOWERCASE); - } - - std::string versionStr; - uint64_t version; - if (headers.GetVersionInfo(version)) { - versionStr += std::to_string((version >> 48) & 0xFFFF); - versionStr += '.'; - versionStr += std::to_string((version >> 32) & 0xFFFF); - versionStr += '.'; - versionStr += std::to_string((version >> 16) & 0xFFFF); - versionStr += '.'; - versionStr += std::to_string(version & 0xFFFF); - } - - SharedLibrary shlib(modStart, modEnd, - 0, // DLLs are always mapped at offset 0 on Windows - breakpadId, codeId, moduleNameStr, modulePathStr, - pdbNameStr, pdbPathStr, versionStr, ""); - sharedLibraryInfo.AddSharedLibrary(shlib); - }; + auto addSharedLibraryFromModuleInfo = + [&sharedLibraryInfo](const wchar_t* aModulePath, HMODULE aModule) { + sharedLibraryInfo.AddSharedLibraryFromModuleInfo( + aModulePath, mozilla::Some(aModule)); + }; mozilla::EnumerateProcessModules(addSharedLibraryFromModuleInfo); return sharedLibraryInfo; } +SharedLibraryInfo SharedLibraryInfo::GetInfoFromPath(const wchar_t* aPath) { + SharedLibraryInfo sharedLibraryInfo; + sharedLibraryInfo.AddSharedLibraryFromModuleInfo(aPath, mozilla::Nothing()); + return sharedLibraryInfo; +} + void SharedLibraryInfo::Initialize() { /* do nothing */ } diff --git a/mozglue/baseprofiler/public/BaseProfilerSharedLibraries.h b/mozglue/baseprofiler/public/BaseProfilerSharedLibraries.h index 4e7d39f4c60..705ca55f4b6 100644 --- a/mozglue/baseprofiler/public/BaseProfilerSharedLibraries.h +++ b/mozglue/baseprofiler/public/BaseProfilerSharedLibraries.h @@ -125,6 +125,10 @@ static bool CompareAddresses(const SharedLibrary& first, class SharedLibraryInfo { public: static SharedLibraryInfo GetInfoForSelf(); +#ifdef XP_WIN + static SharedLibraryInfo GetInfoFromPath(const wchar_t* aPath); +#endif + static void Initialize(); SharedLibraryInfo() {} @@ -155,6 +159,11 @@ class SharedLibraryInfo { void Clear() { mEntries.clear(); } private: +#ifdef XP_WIN + void AddSharedLibraryFromModuleInfo(const wchar_t* aModulePath, + mozilla::Maybe aModule); +#endif + std::vector mEntries; }; diff --git a/netwerk/base/nsNetUtil.cpp b/netwerk/base/nsNetUtil.cpp index 08b0ec48839..91183882e5f 100644 --- a/netwerk/base/nsNetUtil.cpp +++ b/netwerk/base/nsNetUtil.cpp @@ -2937,9 +2937,16 @@ static bool ShouldSecureUpgradeNoHSTS(nsIURI* aURI, nsILoadInfo* aLoadInfo) { return true; } - // 4. Https-Only / -First - if (nsHTTPSOnlyUtils::ShouldUpgradeRequest(aURI, aLoadInfo) || - nsHTTPSOnlyUtils::ShouldUpgradeHttpsFirstRequest(aURI, aLoadInfo)) { + // 4. Https-Only + if (nsHTTPSOnlyUtils::ShouldUpgradeRequest(aURI, aLoadInfo)) { + Telemetry::AccumulateCategorical( + Telemetry::LABELS_HTTP_SCHEME_UPGRADE_TYPE::HTTPSOnly); + return true; + } + // 4.a Https-First + if (nsHTTPSOnlyUtils::ShouldUpgradeHttpsFirstRequest(aURI, aLoadInfo)) { + Telemetry::AccumulateCategorical( + Telemetry::LABELS_HTTP_SCHEME_UPGRADE_TYPE::HTTPSFirst); return true; } return false; diff --git a/netwerk/protocol/about/nsAboutProtocolUtils.h b/netwerk/protocol/about/nsAboutProtocolUtils.h index ef508dce2e2..68d1f4d54b3 100644 --- a/netwerk/protocol/about/nsAboutProtocolUtils.h +++ b/netwerk/protocol/about/nsAboutProtocolUtils.h @@ -17,8 +17,7 @@ NS_ASSERTION(aAboutURI->SchemeIs("about"), "should be used only on about: URIs"); - nsresult rv = aAboutURI->GetPathQueryRef(aModule); - NS_ENSURE_SUCCESS(rv, rv); + MOZ_TRY(aAboutURI->GetPathQueryRef(aModule)); int32_t f = aModule.FindCharInSet("#?"_ns); if (f != kNotFound) { @@ -30,12 +29,20 @@ return NS_OK; } +[[nodiscard]] inline bool NS_IsContentAccessibleAboutURI(nsIURI* aURI) { + MOZ_ASSERT(aURI->SchemeIs("about"), "Should be used only on about: URIs"); + nsAutoCString name; + if (NS_WARN_IF(NS_FAILED(NS_GetAboutModuleName(aURI, name)))) { + return true; + } + return name.EqualsLiteral("blank") || name.EqualsLiteral("srcdoc"); +} + inline nsresult NS_GetAboutModule(nsIURI* aAboutURI, nsIAboutModule** aModule) { MOZ_ASSERT(aAboutURI, "Must have URI"); nsAutoCString contractID; - nsresult rv = NS_GetAboutModuleName(aAboutURI, contractID); - if (NS_FAILED(rv)) return rv; + MOZ_TRY(NS_GetAboutModuleName(aAboutURI, contractID)); // look up a handler to deal with "what" contractID.InsertLiteral(NS_ABOUT_MODULE_CONTRACTID_PREFIX, 0); diff --git a/netwerk/protocol/http/Http3Session.cpp b/netwerk/protocol/http/Http3Session.cpp index 42287240d75..55d8b7bca61 100644 --- a/netwerk/protocol/http/Http3Session.cpp +++ b/netwerk/protocol/http/Http3Session.cpp @@ -229,7 +229,7 @@ void Http3Session::Shutdown() { (mError == NS_ERROR_NET_HTTP3_PROTOCOL_ERROR)) && (mError != mozilla::psm::GetXPCOMFromNSSError(SSL_ERROR_BAD_CERT_DOMAIN)) && - !isEchRetry) { + !isEchRetry && !mConnInfo->GetWebTransport()) { gHttpHandler->ExcludeHttp3(mConnInfo); } @@ -1730,9 +1730,12 @@ void Http3Session::CloseStreamInternal(Http3StreamBase* aStream, } mWebTransportSessions.RemoveElement(aStream); mWebTransportStreams.RemoveElement(aStream); + // Close(NS_OK) implies that the NeqoHttp3Conn will be closed, so we can only + // do this when there is no Http3Steeam, WebTransportSession and + // WebTransportStream. if ((mShouldClose || mGoawayReceived) && - (!mStreamTransactionHash.Count() || !mWebTransportSessions.IsEmpty() || - !mWebTransportStreams.IsEmpty())) { + (!mStreamTransactionHash.Count() && mWebTransportSessions.IsEmpty() && + mWebTransportStreams.IsEmpty())) { MOZ_ASSERT(!IsClosing()); Close(NS_OK); } diff --git a/netwerk/protocol/http/HttpBaseChannel.cpp b/netwerk/protocol/http/HttpBaseChannel.cpp index a914d3e00d8..bb675975cf5 100644 --- a/netwerk/protocol/http/HttpBaseChannel.cpp +++ b/netwerk/protocol/http/HttpBaseChannel.cpp @@ -3308,7 +3308,8 @@ void HttpBaseChannel::SetChannelBlockedByOpaqueResponse() { dom::WindowContext* windowContext = browsingContext->GetTopWindowContext(); if (windowContext) { - windowContext->Canonical()->SetHasBlockedOpaqueResponse(); + windowContext->Canonical()->SetShouldReportHasBlockedOpaqueResponse( + mLoadInfo->InternalContentPolicyType()); } } diff --git a/python/l10n/fluent_migrations/bug_1813077_popup_notification_learn_more.py b/python/l10n/fluent_migrations/bug_1813077_popup_notification_learn_more.py new file mode 100644 index 00000000000..bba68d163e0 --- /dev/null +++ b/python/l10n/fluent_migrations/bug_1813077_popup_notification_learn_more.py @@ -0,0 +1,22 @@ +# coding=utf8 + +# Any copyright is dedicated to the Public Domain. +# http://creativecommons.org/publicdomain/zero/1.0/ + +from __future__ import absolute_import +import fluent.syntax.ast as FTL +from fluent.migrate.helpers import transforms_from + + +def migrate(ctx): + """Bug 1813077 - Migrate xpinstallPromptMessage.learnMore to Fluent , part {index}.""" + + ctx.add_transforms( + "browser/browser/browser.ftl", + "browser/browser/browser.ftl", + transforms_from( + """ +popup-notification-xpinstall-prompt-learn-more = { COPY("browser/chrome/browser/browser.properties", "xpinstallPromptMessage.learnMore") } +""" + ), + ) diff --git a/python/mozboot/mozboot/android.py b/python/mozboot/mozboot/android.py index 9ccf6819f7f..bb8170b0d3e 100644 --- a/python/mozboot/mozboot/android.py +++ b/python/mozboot/mozboot/android.py @@ -20,7 +20,7 @@ from tqdm import tqdm # variable. from mozboot.bootstrap import MOZCONFIG_SUGGESTION_TEMPLATE -NDK_VERSION = "r21d" +NDK_VERSION = "r23c" CMDLINE_TOOLS_VERSION_STRING = "9.0" CMDLINE_TOOLS_VERSION = "9477386" @@ -676,19 +676,14 @@ def generate_mozconfig(os_name, artifact_mode=False): def android_ndk_url(os_name, ver=NDK_VERSION): # Produce a URL like - # 'https://dl.google.com/android/repository/android-ndk-$VER-linux-x86_64.zip + # 'https://dl.google.com/android/repository/android-ndk-$VER-linux.zip base_url = "https://dl.google.com/android/repository/android-ndk" if os_name == "macosx": # |mach bootstrap| uses 'macosx', but Google uses 'darwin'. os_name = "darwin" - if sys.maxsize > 2 ** 32: - arch = "x86_64" - else: - arch = "x86" - - return "%s-%s-%s-%s.zip" % (base_url, ver, os_name, arch) + return "%s-%s-%s.zip" % (base_url, ver, os_name) def main(argv): diff --git a/python/mozbuild/mozbuild/action/file_generate_wrapper.py b/python/mozbuild/mozbuild/action/file_generate_wrapper.py index 6c29e887361..b6c030bbf6a 100644 --- a/python/mozbuild/mozbuild/action/file_generate_wrapper.py +++ b/python/mozbuild/mozbuild/action/file_generate_wrapper.py @@ -20,12 +20,12 @@ def action(fh, script, target_dir, *args): topsrcdir = Path(buildconfig.topsrcdir) def make_absolute(base_path, p): - return base_path / p[1:] if p.startswith("/") else base_path / p + return Path(base_path) / Path(p.lstrip("/")) try: - abs_target_dir = make_absolute(objdir, target_dir) + abs_target_dir = str(make_absolute(objdir, target_dir)) abs_script = make_absolute(topsrcdir, script) - script = [abs_script] + script = [str(abs_script)] if abs_script.suffix == ".py": script = [sys.executable] + script subprocess.check_call(script + args, cwd=abs_target_dir) diff --git a/python/mozbuild/mozbuild/vendor/vendor_rust.py b/python/mozbuild/mozbuild/vendor/vendor_rust.py index fb3e7812cc9..46d036d8943 100644 --- a/python/mozbuild/mozbuild/vendor/vendor_rust.py +++ b/python/mozbuild/mozbuild/vendor/vendor_rust.py @@ -105,6 +105,8 @@ TOLERATED_DUPES = { "bytes": 2, "crossbeam-deque": 2, "crossbeam-epoch": 2, + # tokio 0.1 uses an older version, allow both during transition. + "crossbeam-queue": 2, "crossbeam-utils": 3, "futures": 2, "memoffset": 2, diff --git a/python/mozperftest/mozperftest/system/android.py b/python/mozperftest/mozperftest/system/android.py index 98941e71a74..650b0fb29dd 100644 --- a/python/mozperftest/mozperftest/system/android.py +++ b/python/mozperftest/mozperftest/system/android.py @@ -12,6 +12,8 @@ from mozperftest.layers import Layer from mozperftest.system.android_perf_tuner import tune_performance from mozperftest.utils import download_file +HERE = Path(__file__).parent + _ROOT_URL = "https://firefox-ci-tc.services.mozilla.com/api/index/v1/task/" _FENIX_NIGHTLY_BUILDS = ( "mobile.v3.firefox-android.apks.fenix-nightly.latest.{architecture}" @@ -117,9 +119,26 @@ class AndroidDevice(Layer): super(AndroidDevice, self).__init__(env, mach_cmd) self.android_activity = self.app_name = self.device = None self.capture_logcat = self.capture_file = None + self._custom_apk_path = None + + @property + def custom_apk_path(self): + if self._custom_apk_path is None: + custom_apk_path = Path(HERE, "..", "user_upload.apk") + if custom_apk_path.exists(): + self._custom_apk_path = custom_apk_path + return self._custom_apk_path + + def custom_apk_exists(self): + return self.custom_apk_path is not None def setup(self): - pass + if self.custom_apk_exists(): + self.info( + f"Replacing --android-install-apk with custom APK found at " + f"{self.custom_apk_path}" + ) + self.set_arg("android-install-apk", [self.custom_apk_path]) def teardown(self): if self.capture_file is not None: @@ -181,9 +200,9 @@ class AndroidDevice(Layer): self.info("Uninstalling old version") self.device.uninstall_app(self.get_arg("android-app-name")) self.info("Installing %s" % apk) - if apk in _PERMALINKS: + if str(apk) in _PERMALINKS: apk = _PERMALINKS[apk] - if apk.startswith("http"): + if str(apk).startswith("http"): with tempfile.TemporaryDirectory() as tmpdirname: target = Path(tmpdirname, "target.apk") self.info("Downloading %s" % apk) diff --git a/python/mozperftest/mozperftest/system/android_startup.py b/python/mozperftest/mozperftest/system/android_startup.py index c83001f6ffc..8b13ab86201 100644 --- a/python/mozperftest/mozperftest/system/android_startup.py +++ b/python/mozperftest/mozperftest/system/android_startup.py @@ -216,14 +216,19 @@ class AndroidStartUp(AndroidDevice): def run_performance_analysis(self, apk_metadata): # Installing the application on the device and getting ready to run the tests + install_path = apk_metadata[KEY_NAME] + if self.custom_apk_exists(): + install_path = self.custom_apk_path + self.device.uninstall_app(self.package_id) - self.info(f"Installing {apk_metadata[KEY_NAME]}...") - app_name = self.device.install_app(apk_metadata[KEY_NAME]) + self.info(f"Installing {install_path}...") + app_name = self.device.install_app(install_path) if self.device.is_app_installed(app_name): self.info(f"Successfully installed {app_name}") else: raise AndroidStartUpInstallError("The android app was not installed") self.apk_name = apk_metadata[KEY_NAME].split(".")[0] + return self.run_tests() def run_tests(self): diff --git a/python/mozperftest/mozperftest/tests/test_android.py b/python/mozperftest/mozperftest/tests/test_android.py index f442722bb1b..881fcb1cd8d 100644 --- a/python/mozperftest/mozperftest/tests/test_android.py +++ b/python/mozperftest/mozperftest/tests/test_android.py @@ -1,4 +1,5 @@ #!/usr/bin/env python +import pathlib from unittest import mock import mozunit @@ -162,6 +163,9 @@ def test_android_failure(): android(metadata) +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch("mozperftest.utils.requests.get", new=requests_content()) @mock.patch("mozperftest.system.android.ADBLoggedDevice") def test_android_apk_alias(device): @@ -177,7 +181,7 @@ def test_android_apk_alias(device): system = env.layers[SYSTEM] with system as android, silence(system): android(metadata) - # XXX really ? + assert device.mock_calls[1][1][0] == "org.mozilla.fenix" assert device.mock_calls[2][1][0].endswith("target.apk") @@ -250,5 +254,78 @@ def test_android_log_cat(device): andro.device.clear_logcat.assert_called() +@mock.patch("mozperftest.system.android.AndroidDevice.setup", new=mock.MagicMock) +@mock.patch("mozperftest.system.android.Path") +@mock.patch("mozperftest.system.android.ADBLoggedDevice", new=FakeDevice) +def test_android_custom_apk(mozperftest_android_path): + args = { + "flavor": "mobile-browser", + "android": True, + } + + with temp_file(name="user_upload.apk", content="") as sample_apk: + sample_apk = pathlib.Path(sample_apk) + mozperftest_android_path.return_value = sample_apk + + mach_cmd, metadata, env = get_running_env(**args) + system = env.layers[SYSTEM] + android = system.layers[1] + + with system as _, silence(system): + assert android._custom_apk_path is None + assert android.custom_apk_exists() + assert android.custom_apk_path == sample_apk + + mozperftest_android_path.assert_called_once() + + +@mock.patch("mozperftest.system.android.AndroidDevice.setup", new=mock.MagicMock) +@mock.patch("mozperftest.system.android.Path.exists") +@mock.patch("mozperftest.system.android.ADBLoggedDevice", new=FakeDevice) +def test_android_custom_apk_nonexistent(path_exists): + args = { + "flavor": "mobile-browser", + "android": True, + } + + path_exists.return_value = False + + mach_cmd, metadata, env = get_running_env(**args) + system = env.layers[SYSTEM] + android = system.layers[1] + + with system as _, silence(system): + assert android._custom_apk_path is None + assert not android.custom_apk_exists() + assert android.custom_apk_path is None + + path_exists.assert_called() + + +@mock.patch("mozperftest.system.android.Path") +@mock.patch("mozperftest.system.android.ADBLoggedDevice", new=FakeDevice) +def test_android_setup_custom_apk(mozperftest_android_path): + args = { + "flavor": "mobile-browser", + "android": True, + } + + with temp_file(name="user_upload.apk", content="") as sample_apk: + sample_apk = pathlib.Path(sample_apk) + mozperftest_android_path.return_value = sample_apk + + mach_cmd, metadata, env = get_running_env(**args) + system = env.layers[SYSTEM] + android = system.layers[1] + + with system as _, silence(system): + # The custom apk should be found immediately, and it + # should replace any --android-install-apk settings + assert android._custom_apk_path == sample_apk + assert env.get_arg("android-install-apk") == [sample_apk] + + mozperftest_android_path.assert_called_once() + + if __name__ == "__main__": mozunit.main() diff --git a/python/mozperftest/mozperftest/tests/test_android_startup.py b/python/mozperftest/mozperftest/tests/test_android_startup.py index 957a9666618..9344875507d 100644 --- a/python/mozperftest/mozperftest/tests/test_android_startup.py +++ b/python/mozperftest/mozperftest/tests/test_android_startup.py @@ -1,10 +1,12 @@ import copy import json +import pathlib import random import time from datetime import date from unittest import mock +import mozunit import pytest import requests @@ -14,7 +16,11 @@ from mozperftest.system.android_startup import ( AndroidStartUpMatchingError, AndroidStartUpUnknownTestError, ) -from mozperftest.tests.support import EXAMPLE_ANDROID_STARTUP_TEST, get_running_env +from mozperftest.tests.support import ( + EXAMPLE_ANDROID_STARTUP_TEST, + get_running_env, + temp_file, +) SAMPLE_APK_METADATA = { "name": "fenix_nightly_armeabi-v7a_2022_09_27.apk", @@ -95,6 +101,9 @@ def init_mocked_request(status_code, **kwargs): return mock_request +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -132,6 +141,9 @@ def test_invalid_test_name(*mocked): pass +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -151,6 +163,9 @@ def test_multiple_matching_lines(*mocked): pass +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -170,6 +185,9 @@ def test_multiple_total_time_prefix(*mocked): pass +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -190,6 +208,9 @@ def test_multiple_start_proc_lines(*mocked): pass +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -209,6 +230,39 @@ def test_perfherder_layer(*mocked): test.run(metadata) +@mock.patch("mozperftest.system.android.Path") +@mock.patch( + "mozdevice.ADBDevice", + new=FakeDevice, +) +@mock.patch("time.sleep", return_value=time.sleep(0)) +@mock.patch( + "mozperftest.system.android_startup.AndroidStartUp.get_measurement", + return_value=random.randint(500, 1000), +) +def test_custom_apk_startup(get_measurement_mock, time_sleep_mock, path_mock): + SAMPLE_APK_METADATA["name"] = "name_for_multiple_Totaltime_strings" + ARGS["apk_metadata"] = SAMPLE_APK_METADATA + mach_cmd, metadata, env = running_env( + tests=[str(EXAMPLE_ANDROID_STARTUP_TEST)], **ARGS + ) + + with temp_file(name="user_upload.apk", content="") as sample_apk: + sample_apk = pathlib.Path(sample_apk) + path_mock.return_value = sample_apk + + with mock.patch( + "mozperftest.system.android_startup.AndroidStartUp.run_tests" + ) as _: + test = android_startup.AndroidStartUp(env, mach_cmd) + test.run_tests = lambda: True + test.package_id = "FakeID" + assert test.run_performance_analysis(SAMPLE_APK_METADATA) + + +@mock.patch( + "mozperftest.system.android.AndroidDevice.custom_apk_exists", new=lambda x: False +) @mock.patch( "mozdevice.ADBDevice", new=FakeDevice, @@ -224,3 +278,7 @@ def test_get_measurement_from_nav_start_logcat_match_error(*mocked): test = android_startup.AndroidStartUp(env, mach_cmd) with pytest.raises(AndroidStartUpMatchingError): test.run(metadata) + + +if __name__ == "__main__": + mozunit.main() diff --git a/python/sites/docs.txt b/python/sites/docs.txt index aae217ca3d9..e0c5ac53dae 100644 --- a/python/sites/docs.txt +++ b/python/sites/docs.txt @@ -1,46 +1,48 @@ pth:tools/lint/eslint/ -pypi:alabaster==0.7.12 -pypi:Babel==2.8.0 +pypi:alabaster==0.7.13 +pypi:Babel==2.12.1 pypi:backports-abc==0.5 -pypi:boto3==1.16.63 -pypi:botocore==1.19.63 +pypi:boto3==1.26.80 +pypi:botocore==1.29.80 pypi:colorama==0.4.5 pypi:commonmark==0.9.1 -pypi:docutils==0.16 +pypi:docutils==0.17.1 pypi:fluent.pygments==1.0 pypi:fluent.syntax==0.18.1 pypi:idna==2.10 -pypi:imagesize==1.2.0 -pypi:jmespath==0.10.0 +pypi:imagesize==1.4.1 +pypi:importlib-resources==5.12.0 +pypi:jmespath==1.0.1 +pypi:jsonschema==4.17.3 pypi:livereload==2.6.3 pypi:Markdown==3.3.4 pypi:MarkupSafe==2.0.1 -pypi:mock==4.0.2 +pypi:mock==5.0.1 pypi:myst-parser==0.16.1 pypi:mdit-py-plugins==0.3.0 pypi:parsimonious==0.10.0 pypi:pyasn1==0.4.8 pypi:pyasn1-modules==0.2.8 -pypi:Pygments==2.7.1 +pypi:Pygments==2.14.0 pypi:pyparsing==2.4.7 # for autodoc pypi:pytest==7.2.1 pypi:python-dateutil==2.8.2 -pypi:python-frontmatter==0.5.0 -pypi:pytz==2020.1 +pypi:python-frontmatter==1.0.0 +pypi:pytz==2022.7.1 # for autodoc pypi:pywatchman==1.4.1 pypi:redo==2.0.3 -pypi:s3transfer==0.3.3 +pypi:s3transfer==0.6.0 pypi:scandir==1.10.0 -pypi:singledispatch==3.4.0.3 -pypi:snowballstemmer==2.0.0 -pypi:Sphinx==4.3.2 -pypi:sphinx-copybutton==0.5.0 +pypi:singledispatch==4.0.0 +pypi:snowballstemmer==2.2.0 +pypi:Sphinx==4.5 +pypi:sphinx-copybutton==0.5.1 pypi:sphinx-panels==0.6.0 pypi:sphinx-js==3.2.1 pypi:sphinx-markdown-tables==0.0.15 -pypi:sphinx-rtd-theme==1.1.1 +pypi:sphinx-rtd-theme==1.2.0 pypi:sphinxcontrib-applehelp==1.0.2 pypi:sphinxcontrib-devhelp==1.0.2 pypi:sphinxcontrib-htmlhelp==2.0.0 diff --git a/remote/cdp/test/browser/head.js b/remote/cdp/test/browser/head.js index 7b1f4dab232..856285b4d1b 100644 --- a/remote/cdp/test/browser/head.js +++ b/remote/cdp/test/browser/head.js @@ -439,7 +439,7 @@ async function createFileStream(contents, options = {}) { async function throwScriptError(options = {}) { const { inContent = true } = options; - const addScriptErrorInternal = ({ options }) => { + const addScriptErrorInternal = options => { const { flag = Ci.nsIScriptError.errorFlag, innerWindowId = content.windowGlobalChild.innerWindowId, @@ -462,14 +462,14 @@ async function throwScriptError(options = {}) { }; if (inContent) { - ContentTask.spawn( + SpecialPowers.spawn( gBrowser.selectedBrowser, - { options }, + [options], addScriptErrorInternal ); } else { options.innerWindowId = window.windowGlobalChild.innerWindowId; - addScriptErrorInternal({ options }); + addScriptErrorInternal(options); } } diff --git a/remote/cdp/test/browser/network/browser_setCacheDisabled.js b/remote/cdp/test/browser/network/browser_setCacheDisabled.js index 4d99cfc095d..485185f0bcd 100644 --- a/remote/cdp/test/browser/network/browser_setCacheDisabled.js +++ b/remote/cdp/test/browser/network/browser_setCacheDisabled.js @@ -38,9 +38,9 @@ add_task(async function cacheDisabled({ client }) { // The promise itself will resolve when the progressListener will detect the // expected flags for the provided url. function watchLoadFlags(flags, url) { - return ContentTask.spawn( + return SpecialPowers.spawn( gBrowser.selectedBrowser, - { flags, url }, + [{ flags, url }], async (options = {}) => { const { flags, url } = options; @@ -125,7 +125,7 @@ function watchLoadFlags(flags, url) { // Wait for the latest promise created in-content by watchLoadFlags to resolve. function waitForLoadFlags() { - return ContentTask.spawn(gBrowser.selectedBrowser, {}, async () => { + return SpecialPowers.spawn(gBrowser.selectedBrowser, [], async () => { await content.resolveCheckLoadFlags; delete content.resolveCheckLoadFlags; }); diff --git a/remote/cdp/test/browser/runtime/browser_consoleAPICalled.js b/remote/cdp/test/browser/runtime/browser_consoleAPICalled.js index 8aa0ea11c53..eac774bd28f 100644 --- a/remote/cdp/test/browser/runtime/browser_consoleAPICalled.js +++ b/remote/cdp/test/browser/runtime/browser_consoleAPICalled.js @@ -13,7 +13,9 @@ const PAGE_CONSOLE_EVENTS_ONLOAD = add_task(async function noEventsWhenRuntimeDomainDisabled({ client }) { await runConsoleTest(client, 0, async () => { - ContentTask.spawn(gBrowser.selectedBrowser, {}, () => console.log("foo")); + SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => + content.console.log("foo") + ); }); }); @@ -24,7 +26,9 @@ add_task(async function noEventsAfterRuntimeDomainDisabled({ client }) { await Runtime.disable(); await runConsoleTest(client, 0, async () => { - ContentTask.spawn(gBrowser.selectedBrowser, {}, () => console.log("foo")); + SpecialPowers.spawn(gBrowser.selectedBrowser, [], () => + content.console.log("foo") + ); }); }); diff --git a/remote/marionette/driver.sys.mjs b/remote/marionette/driver.sys.mjs index 0e4104c208b..8e12a8a66dd 100644 --- a/remote/marionette/driver.sys.mjs +++ b/remote/marionette/driver.sys.mjs @@ -3115,8 +3115,6 @@ GeckoDriver.prototype.teardownReftest = function() { * @param {boolean=} background * Whether or not to print background colors and images. * Defaults to false, which prints without background graphics. - * @param {boolean=} landscape - * Paper orientation. Defaults to false. * @param {number=} margin.bottom * Bottom margin in cm. Defaults to 1cm (~0.4 inches). * @param {number=} margin.left @@ -3125,6 +3123,8 @@ GeckoDriver.prototype.teardownReftest = function() { * Right margin in cm. Defaults to 1cm (~0.4 inches). * @param {number=} margin.top * Top margin in cm. Defaults to 1cm (~0.4 inches). + * @param {('landscape'|'portrait')=} options.orientation + * Paper orientation. Defaults to 'portrait'. * @param {Array.=} pageRanges * Paper ranges to print, e.g., ['1-5', 8, '11-13']. * Defaults to the empty array, which means print all pages. @@ -3178,7 +3178,14 @@ GeckoDriver.prototype.print = async function(cmd) { `scale ${settings.scale} is outside the range ${lazy.print.minScaleValue}-${lazy.print.maxScaleValue}` )(settings.scale); lazy.assert.boolean(settings.shrinkToFit); - lazy.assert.boolean(settings.landscape); + lazy.assert.that( + orientation => lazy.print.defaults.orientationValue.includes(orientation), + `orientation ${ + settings.orientation + } doesn't match allowed values "${lazy.print.defaults.orientationValue.join( + "/" + )}"` + )(settings.orientation); lazy.assert.boolean(settings.background); lazy.assert.array(settings.pageRanges); diff --git a/remote/shared/PDF.sys.mjs b/remote/shared/PDF.sys.mjs index 8508137ad26..e7c6506b022 100644 --- a/remote/shared/PDF.sys.mjs +++ b/remote/shared/PDF.sys.mjs @@ -36,8 +36,6 @@ print.defaults = { print.addDefaultSettings = function(settings) { const { background = false, - // TODO: Bug 1791819. Remove when marionette supports orientation argument. - landscape = false, margin = {}, orientation = "portrait", page = {}, @@ -75,8 +73,6 @@ print.addDefaultSettings = function(settings) { return { background, - // TODO: Bug 1791819. Remove when marionette supports orientation argument. - landscape, margin, orientation, page, diff --git a/security/.eslintrc.js b/security/.eslintrc.js index c8b766d1208..3709eff7f83 100644 --- a/security/.eslintrc.js +++ b/security/.eslintrc.js @@ -5,8 +5,6 @@ "use strict"; module.exports = { - extends: ["plugin:mozilla/valid-jsdoc"], - rules: { // Enforce return statements in callbacks of array methods. "array-callback-return": "error", diff --git a/security/manager/ssl/StaticHPKPins.h b/security/manager/ssl/StaticHPKPins.h index f51cd81b75c..91f51ecd2f0 100644 --- a/security/manager/ssl/StaticHPKPins.h +++ b/security/manager/ssl/StaticHPKPins.h @@ -1106,4 +1106,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = { static const int32_t kUnknownId = -1; -static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1687766637660000); +static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1688025871990000); diff --git a/security/sandbox/chromium/sandbox/win/src/sandbox_nt_util.cc b/security/sandbox/chromium/sandbox/win/src/sandbox_nt_util.cc index 07493ff25f9..2641a13d042 100644 --- a/security/sandbox/chromium/sandbox/win/src/sandbox_nt_util.cc +++ b/security/sandbox/chromium/sandbox/win/src/sandbox_nt_util.cc @@ -404,6 +404,21 @@ bool IsValidImageSection(HANDLE section, if (!(basic_info.Attributes & SEC_IMAGE)) return false; + // Windows 10 2009+ may open PEs as SEC_IMAGE_NO_EXECUTE in non-dll-loading + // paths which looks identical to dll-loading unless we check if the section + // handle has execute rights. + // Avoid memset inserted by -ftrivial-auto-var-init=pattern. + STACK_UNINITIALIZED OBJECT_BASIC_INFORMATION obj_info; + ULONG obj_size_returned; + ret = g_nt.QueryObject(section, ObjectBasicInformation, &obj_info, + sizeof(obj_info), &obj_size_returned); + + if (!NT_SUCCESS(ret) || sizeof(obj_info) != obj_size_returned) + return false; + + if (!(obj_info.GrantedAccess & SECTION_MAP_EXECUTE)) + return false; + return true; } diff --git a/services/settings/dumps/main/cookie-banner-rules-list.json b/services/settings/dumps/main/cookie-banner-rules-list.json index c85c6fd7062..919dcaa161a 100644 --- a/services/settings/dumps/main/cookie-banner-rules-list.json +++ b/services/settings/dumps/main/cookie-banner-rules-list.json @@ -1,5 +1,19 @@ { "data": [ + { + "click": { + "optIn": "button.accept-all", + "optOut": "button.reject-all", + "presence": "div#consent-page" + }, + "schema": 1678898205499, + "cookies": {}, + "domains": [ + "yahoo.com" + ], + "id": "2f9123b1-7d6b-460f-8da8-988f82238ec7", + "last_modified": 1679487994744 + }, { "click": { "optIn": "#truste-consent-button", @@ -4146,19 +4160,6 @@ "id": "ed6379a2-717a-4571-9a81-abb0c5b29098", "last_modified": 1674560738090 }, - { - "click": { - "optIn": "button.primary", - "presence": "div#consent-page" - }, - "schema": 1674521304583, - "cookies": {}, - "domains": [ - "yahoo.com" - ], - "id": "2f9123b1-7d6b-460f-8da8-988f82238ec7", - "last_modified": 1674560738083 - }, { "click": { "optIn": "#cmpbntyestxt", @@ -7736,5 +7737,5 @@ "last_modified": 1670498155641 } ], - "timestamp": 1678276263380 + "timestamp": 1679487994744 } diff --git a/services/settings/dumps/security-state/intermediates.json b/services/settings/dumps/security-state/intermediates.json index c2833205d83..b969032cdda 100644 --- a/services/settings/dumps/security-state/intermediates.json +++ b/services/settings/dumps/security-state/intermediates.json @@ -1,5 +1,167 @@ { "data": [ + { + "schema": 1679518190665, + "derHash": "uLGLq6y2qU6r5pKMa6z09qLYQjXX+GZIa194RHO+cIw=", + "subject": "CN=CATrust ECC DV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IEVDQyBEViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "2ab6599fd3c8df213b615d6d3adaac51b5dd5ab735e95d8920d82f75d82bafc7", + "size": 1268, + "filename": "3UyXjiYjrNvUOYfp8OLu2PTkIolV-fC0_CEKjYqPo8U=.pem", + "location": "security-state-staging/intermediates/42de34a5-6028-49ac-ad65-66dd57d6e252.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "3UyXjiYjrNvUOYfp8OLu2PTkIolV+fC0/CEKjYqPo8U=", + "crlite_enrolled": false, + "id": "f446d9cb-98b5-4366-981c-641d30e22c9d", + "last_modified": 1679518623586 + }, + { + "schema": 1679518189726, + "derHash": "aZeihYStCsZhkTbivB+pxjHKMCS4KEKU4m/OM2vlQcM=", + "subject": "CN=CATrust RSA OV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IFJTQSBPViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "c50626a2bf256c4f795c7546f7c51cc388150ec1253e5b17c5822c4e348a36d8", + "size": 2284, + "filename": "v6XOiEkxQzkn7SEb0Q2LQaZ0gtWNS8AnXawpcfDPS60=.pem", + "location": "security-state-staging/intermediates/95162acb-3cc8-4551-883d-e2e3116b7a77.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "v6XOiEkxQzkn7SEb0Q2LQaZ0gtWNS8AnXawpcfDPS60=", + "crlite_enrolled": false, + "id": "6a472d8a-b1a2-4dea-a336-15de8f5e3e00", + "last_modified": 1679518623577 + }, + { + "schema": 1679518188768, + "derHash": "JuHhe1efUd4DIEUhttZzI8l7DzUemSPFqo5/Mz+atI4=", + "subject": "CN=CATrust RSA EV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IFJTQSBFViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "e0b60ed6235c7c1b2e6a29c91630c277016d26759c1fac2990ec71ed1f76c672", + "size": 2272, + "filename": "BtUPHcjEELm-QnFyE15TdkdlQOavUDnjajRQcWpYsl0=.pem", + "location": "security-state-staging/intermediates/27cd65f3-81c0-4ac3-a394-2ba20dda0ca1.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "BtUPHcjEELm+QnFyE15TdkdlQOavUDnjajRQcWpYsl0=", + "crlite_enrolled": false, + "id": "e33f5591-6c13-4223-a468-b530f7cd851e", + "last_modified": 1679518623567 + }, + { + "schema": 1679518187835, + "derHash": "iYxEvueLFjTI1YBwCjgUa59YCeswcDQivLNfQE5qEOw=", + "subject": "CN=CATrust ECC EV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IEVDQyBFViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "da5540304b11677882ea6ae0ec717e4b5e57af19c621241695957f1a715d3cfd", + "size": 1260, + "filename": "hIyspf1ZWyfmS7ZOEhBNhGHOU6RFe3xq6HrgMqSZ30U=.pem", + "location": "security-state-staging/intermediates/716326ca-2ca9-412a-a186-4908fab9e555.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "hIyspf1ZWyfmS7ZOEhBNhGHOU6RFe3xq6HrgMqSZ30U=", + "crlite_enrolled": false, + "id": "198baa50-bb6f-4745-b605-6b4e0d4d3282", + "last_modified": 1679518623557 + }, + { + "schema": 1679518186919, + "derHash": "wfeN/0sT1kyxCe6yrfxLFkAM9Y6MCF+pVHLKUWVZBNw=", + "subject": "CN=CATrust ECC OV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IEVDQyBPViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "3bece7a6b82fa63353dc9b8f92d4246e6b4aa212220b446d2f0e1600baf82e04", + "size": 1268, + "filename": "dTVBbobQ2Ok-sZMKOKt0n9iYoBl2bqIUEkZMIKpowiU=.pem", + "location": "security-state-staging/intermediates/a0db7a14-88b2-49fb-8ce0-fad4acb30896.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "dTVBbobQ2Ok+sZMKOKt0n9iYoBl2bqIUEkZMIKpowiU=", + "crlite_enrolled": false, + "id": "2fd47a56-dee1-4852-bb55-c48b9c9dca1a", + "last_modified": 1679518623547 + }, + { + "schema": 1679518185972, + "derHash": "KSX5m593b4QdC0wJoH8KNsEH8JN2Eeg+AHpxLkt+xzU=", + "subject": "CN=GZCA ECC DV SSL CA,O=Guizhou Electronic Certification Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGoxCzAJBgNVBAYTAkNOMT4wPAYDVQQKEzVHdWl6aG91IEVsZWN0cm9uaWMgQ2VydGlmaWNhdGlvbiBUZWNobm9sb2d5IENvLiwgTHRkLjEbMBkGA1UEAxMSR1pDQSBFQ0MgRFYgU1NMIENB", + "whitelist": false, + "attachment": { + "hash": "20ba25c049bb6275e2df1411c3b57caf370ace54bbb113a9009b68ce9c14fa39", + "size": 1276, + "filename": "b_IMNNNv_FTbv-C7MMHsmjCkXCfwDWOhmqEFl5il9W0=.pem", + "location": "security-state-staging/intermediates/8d552c15-b5f4-449d-b02a-a6b7154bb03c.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "b/IMNNNv/FTbv+C7MMHsmjCkXCfwDWOhmqEFl5il9W0=", + "crlite_enrolled": false, + "id": "40c3d218-9465-4338-9925-2c0c2b467776", + "last_modified": 1679518623537 + }, + { + "schema": 1679518185013, + "derHash": "UPFoRh2Kvz0E5Uvs0AlkXQtxxJ/fVh4NjUOtkAXH+MQ=", + "subject": "CN=CATrust RSA DV SSL CA,O=Zhejiang Xinya Network Technology Co.\\, Ltd.,C=CN", + "subjectDN": "MGMxCzAJBgNVBAYTAkNOMTQwMgYDVQQKEytaaGVqaWFuZyBYaW55YSBOZXR3b3JrIFRlY2hub2xvZ3kgQ28uLCBMdGQuMR4wHAYDVQQDExVDQVRydXN0IFJTQSBEViBTU0wgQ0E=", + "whitelist": false, + "attachment": { + "hash": "acd1f4f34a78e8e0484ee2f961ef7598795e43a6bfe7c316a4a21d194123ad17", + "size": 2280, + "filename": "N7vnsahv1k49T5Q2aUOGwPQQO7vC3fd1R6bOSKLtzco=.pem", + "location": "security-state-staging/intermediates/9c173173-2fdc-4b67-b5c8-1b8d4afbcc07.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "N7vnsahv1k49T5Q2aUOGwPQQO7vC3fd1R6bOSKLtzco=", + "crlite_enrolled": false, + "id": "2014a9a5-bf50-429b-92e1-751d01acc3e9", + "last_modified": 1679518623527 + }, + { + "schema": 1679496492018, + "derHash": "LhmMIn+T+c+W97ihmG9llzVQLJVkB9s28NSj1gH0JHI=", + "subject": "CN=cyber_Folks,O=cyber_Folks S.A.,C=PL", + "subjectDN": "MD4xCzAJBgNVBAYTAlBMMRkwFwYDVQQKDBBjeWJlcl9Gb2xrcyBTLkEuMRQwEgYDVQQDDAtjeWJlcl9Gb2xrcw==", + "whitelist": false, + "attachment": { + "hash": "af7452cf60f895407cabded55c5f101c501466461b80c9552ae1d72d1ca49017", + "size": 1703, + "filename": "shhKME0KxqZQ2wHqxgxToMHmEKhynXo_W0VCw1DIHRU=.pem", + "location": "security-state-staging/intermediates/9eb81bcd-faf9-49a0-910e-d37386c11aec.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "shhKME0KxqZQ2wHqxgxToMHmEKhynXo/W0VCw1DIHRU=", + "crlite_enrolled": false, + "id": "2da2da44-5d5f-4bbe-9515-f533a291ad43", + "last_modified": 1679497023553 + }, + { + "schema": 1679348884403, + "derHash": "/jy+2DjTC6uQAYTB8hpLJ9MhHLXJJX1+mFwq5DrGqJ8=", + "subject": "CN=DigiCert QuoVadis G3 Qualified TLS RSA4096 SHA256 2023 CA1,O=QuoVadis Trustlink B.V.,C=NL", + "subjectDN": "MIGNMQswCQYDVQQGEwJOTDEgMB4GA1UECgwXUXVvVmFkaXMgVHJ1c3RsaW5rIEIuVi4xFzAVBgNVBGEMDk5UUk5MLTMwMjM3NDU5MUMwQQYDVQQDDDpEaWdpQ2VydCBRdW9WYWRpcyBHMyBRdWFsaWZpZWQgVExTIFJTQTQwOTYgU0hBMjU2IDIwMjMgQ0Ex", + "whitelist": false, + "attachment": { + "hash": "86aebbb76a7e4b04ea41677c2df013545eb98d7452e87bb68bcb48b1c1fbf0a1", + "size": 2548, + "filename": "YubuyclU_SovUNMJEaROc1k7BuMker87y_5vmVN7WpI=.pem", + "location": "security-state-staging/intermediates/acc32d68-3a01-4913-aebb-4ab3cd246e71.pem", + "mimetype": "application/x-pem-file" + }, + "pubKeyHash": "YubuyclU/SovUNMJEaROc1k7BuMker87y/5vmVN7WpI=", + "crlite_enrolled": false, + "id": "c0049371-5f14-47b1-8279-402e553cb17c", + "last_modified": 1679349423384 + }, { "schema": 1677228491917, "derHash": "KuBib5pD7bKwoi1BDrBsSC75glY6cXokcofFBNeb+YA=", @@ -27307,5 +27469,5 @@ "last_modified": 1559865863642 } ], - "timestamp": 1678287423458 + "timestamp": 1679518623586 } diff --git a/services/sync/modules/engines/tabs.sys.mjs b/services/sync/modules/engines/tabs.sys.mjs index dd1126933c4..099d6930c59 100644 --- a/services/sync/modules/engines/tabs.sys.mjs +++ b/services/sync/modules/engines/tabs.sys.mjs @@ -28,11 +28,11 @@ const lazy = {}; ChromeUtils.defineESModuleGetters(lazy, { PlacesUtils: "resource://gre/modules/PlacesUtils.sys.mjs", PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.sys.mjs", + ReaderMode: "resource://gre/modules/ReaderMode.sys.mjs", }); XPCOMUtils.defineLazyModuleGetters(lazy, { NimbusFeatures: "resource://nimbus/ExperimentAPI.jsm", - ReaderMode: "resource://gre/modules/ReaderMode.jsm", TabsStore: "resource://gre/modules/RustTabs.jsm", }); diff --git a/servo/components/style/properties/longhands/ui.mako.rs b/servo/components/style/properties/longhands/ui.mako.rs index f9c15d64143..3ece832fefe 100644 --- a/servo/components/style/properties/longhands/ui.mako.rs +++ b/servo/components/style/properties/longhands/ui.mako.rs @@ -384,7 +384,7 @@ ${helpers.predefined_type( ${helpers.predefined_type( "view-timeline-inset", "ViewTimelineInset", - "computed::ViewTimelineInset::zero()", + "computed::ViewTimelineInset::default()", vector=True, need_index=True, engines="gecko", diff --git a/servo/components/style/values/computed/ui.rs b/servo/components/style/values/computed/ui.rs index ee0fcadf414..477050ed657 100644 --- a/servo/components/style/values/computed/ui.rs +++ b/servo/components/style/values/computed/ui.rs @@ -23,16 +23,3 @@ pub type ScrollbarColor = generics::GenericScrollbarColor; /// A computed value for the `view-timeline-inset` property. pub type ViewTimelineInset = generics::GenericViewTimelineInset; - -impl ViewTimelineInset { - /// Returns the initial value, `0`. - #[inline] - pub fn zero() -> Self { - use crate::Zero; - - Self { - start: Zero::zero(), - end: Zero::zero(), - } - } -} diff --git a/servo/components/style/values/generics/ui.rs b/servo/components/style/values/generics/ui.rs index 1b7dac1da02..de347435be3 100644 --- a/servo/components/style/values/generics/ui.rs +++ b/servo/components/style/values/generics/ui.rs @@ -169,3 +169,12 @@ where Ok(()) } } + +impl Default for ViewTimelineInset { + fn default() -> Self { + Self { + start: GenericLengthPercentageOrAuto::auto(), + end: GenericLengthPercentageOrAuto::auto(), + } + } +} diff --git a/supply-chain/audits.toml b/supply-chain/audits.toml index 68902c38448..6f007d363e7 100644 --- a/supply-chain/audits.toml +++ b/supply-chain/audits.toml @@ -420,6 +420,11 @@ who = "Mike Hommey " criteria = "safe-to-deploy" delta = "0.9.10 -> 0.9.13" +[[audits.crossbeam-queue]] +who = "Matthew Gregan " +criteria = "safe-to-deploy" +version = "0.3.8" + [[audits.crossbeam-utils]] who = "Mike Hommey " criteria = "safe-to-deploy" @@ -1017,6 +1022,12 @@ who = "Mike Hommey " criteria = "safe-to-deploy" delta = "0.3.0 -> 0.3.1" +[[audits.glsl]] +who = "Mike Hommey " +criteria = "safe-to-deploy" +delta = "6.0.1 -> 6.0.2" +notes = "I'm the author of the changes in this version of the crate." + [[audits.goblin]] who = "Jan-Erik Rediger " criteria = "safe-to-deploy" @@ -1081,6 +1092,12 @@ who = "Mike Hommey " criteria = "safe-to-run" delta = "0.3.7 -> 0.3.8" +[[audits.headers-core]] +who = "Bobby Holley " +criteria = "safe-to-deploy" +version = "0.2.0" +notes = "Trivial crate, no unsafe code." + [[audits.heck]] who = "Mike Hommey " criteria = "safe-to-deploy" @@ -1126,6 +1143,12 @@ who = "Mike Hommey " criteria = "safe-to-run" delta = "0.14.23 -> 0.14.24" +[[audits.idna]] +who = "Bobby Holley " +criteria = "safe-to-deploy" +delta = "0.3.0 -> 0.2.3" +notes = "Backwards diff with some algorithm changes, no unsafe code." + [[audits.indexmap]] who = "Mike Hommey " criteria = "safe-to-deploy" @@ -1237,6 +1260,17 @@ who = "Gabriele Svelto " criteria = "safe-to-deploy" version = "0.4.1" +[[audits.malloc_buf]] +who = "Bobby Holley " +criteria = "safe-to-deploy" +version = "0.0.6" +notes = """ +Very small crate for managing malloc-ed buffers, primarily for use in the objc crate. +There is an edge-case condition that passes slice::from_raw_parts(0x1, 0) which I'm +not entirely certain is technically sound, but in either case I am reasonably confident +it's not exploitable. +""" + [[audits.malloc_size_of_derive]] who = "Bobby Holley " criteria = "safe-to-deploy" @@ -1588,6 +1622,12 @@ who = "Mike Hommey " criteria = "safe-to-deploy" delta = "1.0.8 -> 1.0.11" +[[audits.peeking_take_while]] +who = "Bobby Holley " +criteria = "safe-to-deploy" +delta = "1.0.0 -> 0.1.2" +notes = "Small refactor of some simple iterator logic, no unsafe code or capabilities." + [[audits.pin-project]] who = "Mike Hommey " criteria = "safe-to-run" @@ -1945,6 +1985,12 @@ who = "Mike Hommey " criteria = "safe-to-deploy" delta = "1.0.11 -> 1.0.12" +[[audits.safemem]] +who = "Bobby Holley " +criteria = "safe-to-run" +version = "0.3.3" +notes = "I didn't review the allocation code carefully but it's not malicious." + [[audits.scoped-tls]] who = "Mike Hommey " criteria = "safe-to-run" diff --git a/supply-chain/config.toml b/supply-chain/config.toml index 9a46f1af7a8..f397ef8dcf5 100644 --- a/supply-chain/config.toml +++ b/supply-chain/config.toml @@ -621,10 +621,6 @@ criteria = "safe-to-deploy" version = "0.3.7" criteria = "safe-to-run" -[[exemptions.headers-core]] -version = "0.2.0" -criteria = "safe-to-run" - [[exemptions.hermit-abi]] version = "0.1.19" criteria = "safe-to-deploy" @@ -641,10 +637,6 @@ criteria = "safe-to-run" version = "1.0.1" criteria = "safe-to-deploy" -[[exemptions.idna]] -version = "0.2.3" -criteria = "safe-to-deploy" - [[exemptions.indexmap]] version = "1.8.2" criteria = "safe-to-deploy" @@ -731,10 +723,6 @@ criteria = "safe-to-deploy" version = "0.3.2" criteria = "safe-to-deploy" -[[exemptions.malloc_buf]] -version = "0.0.6" -criteria = "safe-to-deploy" - [[exemptions.memalloc]] version = "0.1.0" criteria = "safe-to-deploy" @@ -867,10 +855,6 @@ criteria = "safe-to-deploy" version = "1.0.7" criteria = "safe-to-deploy" -[[exemptions.peeking_take_while]] -version = "0.1.2" -criteria = "safe-to-deploy" - [[exemptions.phf]] version = "0.10.1" criteria = "safe-to-deploy" @@ -1015,10 +999,6 @@ criteria = "safe-to-deploy" version = "1.0.10" criteria = "safe-to-deploy" -[[exemptions.safemem]] -version = "0.3.3" -criteria = "safe-to-run" - [[exemptions.same-file]] version = "1.0.6" criteria = "safe-to-deploy" @@ -1243,10 +1223,6 @@ criteria = "safe-to-deploy" version = "0.8.2" criteria = "safe-to-deploy" -[[exemptions.version_check]] -version = "0.9.4" -criteria = "safe-to-deploy" - [[exemptions.walkdir]] version = "2.3.2" criteria = "safe-to-deploy" diff --git a/supply-chain/imports.lock b/supply-chain/imports.lock index 55712feeaa4..2252ec9c948 100644 --- a/supply-chain/imports.lock +++ b/supply-chain/imports.lock @@ -8,13 +8,6 @@ user-id = 128763 user-login = "martinthomson" user-name = "Martin Thomson" -[[publisher.glean]] -version = "52.3.0" -when = "2023-02-23" -user-id = 48 -user-login = "badboy" -user-name = "Jan-Erik Rediger" - [[publisher.glean]] version = "52.4.2" when = "2023-03-15" @@ -22,13 +15,6 @@ user-id = 48 user-login = "badboy" user-name = "Jan-Erik Rediger" -[[publisher.glean-core]] -version = "52.3.0" -when = "2023-02-23" -user-id = 48 -user-login = "badboy" -user-name = "Jan-Erik Rediger" - [[publisher.glean-core]] version = "52.4.2" when = "2023-03-15" @@ -139,12 +125,29 @@ criteria = "safe-to-deploy" version = "2.2.1" notes = "I am the author of this crate." +[[audits.bytecode-alliance.audits.idna]] +who = "Alex Crichton " +criteria = "safe-to-deploy" +version = "0.3.0" +notes = """ +This is a crate without unsafe code or usage of the standard library. The large +size of this crate comes from the large generated unicode tables file. This +crate is broadly used throughout the ecosystem and does not contain anything +suspicious. +""" + [[audits.bytecode-alliance.audits.leb128]] who = "Nick Fitzgerald " criteria = "safe-to-deploy" version = "0.2.5" notes = "I am the author of this crate." +[[audits.bytecode-alliance.audits.peeking_take_while]] +who = "Nick Fitzgerald " +criteria = "safe-to-deploy" +version = "1.0.0" +notes = "I am the author of this crate." + [[audits.bytecode-alliance.audits.percent-encoding]] who = "Alex Crichton " criteria = "safe-to-deploy" @@ -191,48 +194,24 @@ throughout the ecosystem and skimming the crate shows no usage of `std::*` APIs and nothing suspicious. """ -[[audits.bytecode-alliance.audits.wasm-encoder]] -who = "Alex Crichton " -criteria = "safe-to-deploy" -version = "0.23.0" -notes = "The Bytecode Alliance is the author of this crate." - [[audits.bytecode-alliance.audits.wasm-encoder]] who = "Alex Crichton " criteria = "safe-to-deploy" version = "0.25.0" notes = "The Bytecode Alliance is the author of this crate." -[[audits.bytecode-alliance.audits.wasm-smith]] -who = "Alex Crichton " -criteria = "safe-to-run" -version = "0.12.2" -notes = "The Bytecode Alliance is the author of this crate." - [[audits.bytecode-alliance.audits.wasm-smith]] who = "Alex Crichton " criteria = "safe-to-run" version = "0.12.5" notes = "The Bytecode Alliance is the author of this crate." -[[audits.bytecode-alliance.audits.wasmparser]] -who = "Alex Crichton " -criteria = "safe-to-deploy" -version = "0.100.0" -notes = "The Bytecode Alliance is the author of this crate." - [[audits.bytecode-alliance.audits.wasmparser]] who = "Alex Crichton " criteria = "safe-to-deploy" version = "0.102.0" notes = "The Bytecode Alliance is the author of this crate." -[[audits.bytecode-alliance.audits.wast]] -who = "Alex Crichton " -criteria = "safe-to-deploy" -version = "53.0.0" -notes = "The Bytecode Alliance is the author of this crate." - [[audits.bytecode-alliance.audits.wast]] who = "Alex Crichton " criteria = "safe-to-deploy" @@ -313,6 +292,11 @@ who = "ChromeOS" criteria = "safe-to-run" version = "0.2.3" +[[audits.chromeos.audits.version_check]] +who = "George Burgess IV " +criteria = "safe-to-deploy" +version = "0.9.4" + [[audits.chromeos.audits.want]] who = "ChromeOS" criteria = "safe-to-run" diff --git a/taskcluster/ci/build-fat-aar/kind.yml b/taskcluster/ci/build-fat-aar/kind.yml index 3c5c563b63d..eecefaa930a 100644 --- a/taskcluster/ci/build-fat-aar/kind.yml +++ b/taskcluster/ci/build-fat-aar/kind.yml @@ -79,6 +79,7 @@ job-defaults: toolchain: - android-ndk-linux - android-sdk-linux + - linux64-binutils - linux64-clang - linux64-jdk - linux64-rust-android diff --git a/taskcluster/ci/build/android.yml b/taskcluster/ci/build/android.yml index d45d4532c61..74d2be208ac 100644 --- a/taskcluster/ci/build/android.yml +++ b/taskcluster/ci/build/android.yml @@ -46,6 +46,7 @@ job-defaults: toolchain: - android-ndk-linux - android-sdk-linux + - linux64-binutils - linux64-jdk - linux64-rust-android - linux64-rust-size diff --git a/taskcluster/ci/fetch/toolchains.yml b/taskcluster/ci/fetch/toolchains.yml index 4a406d96bc4..38cb0360a55 100644 --- a/taskcluster/ci/fetch/toolchains.yml +++ b/taskcluster/ci/fetch/toolchains.yml @@ -611,7 +611,7 @@ cargo-vet: fetch: type: git repo: https://github.com/mozilla/cargo-vet - revision: b31b5428709583d0de0fa1b54d88624fd04f8a50 + revision: 00c92524f41eb3bcdd71f7a62625fd9b490b605a symbol-scrapers: description: Linux distribution symbol scraper source diff --git a/taskcluster/ci/packages/debian.yml b/taskcluster/ci/packages/debian.yml index 9074366fb4b..0ded69cf675 100644 --- a/taskcluster/ci/packages/debian.yml +++ b/taskcluster/ci/packages/debian.yml @@ -22,6 +22,7 @@ deb11-mercurial: sed -i -e "s/__VERSION__/$(awk -F\" '$2 {print $2}' mercurial/__version__.py)-1.deb11moz1/" \ -e "s/__DATE__/$(date --rfc-2822)/" \ -e "s/__CODENAME__/bullseye/" debian/changelog + patch: mercurial-timeout.diff deb11-cmake: description: "cmake" diff --git a/taskcluster/ci/packages/ubuntu.yml b/taskcluster/ci/packages/ubuntu.yml index efc5ac2e272..1633d627f76 100644 --- a/taskcluster/ci/packages/ubuntu.yml +++ b/taskcluster/ci/packages/ubuntu.yml @@ -71,6 +71,7 @@ ub18-mercurial: sed -i -e "s/__VERSION__/$(awk -F\" '$2 {print $2}' mercurial/__version__.py)-1.ub18moz1/" \ -e "s/__DATE__/$(date --rfc-2822)/" \ -e "s/__CODENAME__/bionic/" debian/changelog + patch: mercurial-timeout.diff ub20-python-zstandard: description: "python-zstandard for Ubuntu focal" @@ -98,3 +99,4 @@ ub20-mercurial: sed -i -e "s/__VERSION__/$(awk -F\" '$2 {print $2}' mercurial/__version__.py)-1.ub20moz1/" \ -e "s/__DATE__/$(date --rfc-2822)/" \ -e "s/__CODENAME__/focal/" debian/changelog + patch: mercurial-timeout.diff diff --git a/taskcluster/ci/test/browsertime-desktop.yml b/taskcluster/ci/test/browsertime-desktop.yml index cc0a47f254c..3397f56b708 100644 --- a/taskcluster/ci/test/browsertime-desktop.yml +++ b/taskcluster/ci/test/browsertime-desktop.yml @@ -413,6 +413,30 @@ browsertime-youtube-playback: youtube-playback-widevine.*: 3600 default: 2700 +browsertime-youtube-playback-power: + description: Browsertime YouTube Playback on Firefox with power usage tracking + raptor: + apps: [firefox] + subtests: + by-app: + firefox: + + - [youtube-playback-h264-1080p30, ytp-h264-1080p30] + - [youtube-playback-h264-1080p60, ytp-h264-1080p60] + - [youtube-playback-h264-full-1080p30, ytp-h264-full-1080p30] + - [youtube-playback-h264-full-1080p60, ytp-h264-full-1080p60] + - [youtube-playback-v9-1080p30, ytp-v9-1080p30] + - [youtube-playback-v9-1080p60, ytp-v9-1080p60] + - [youtube-playback-v9-full-1080p30, ytp-v9-full-1080p30] + - [youtube-playback-v9-full-1080p60, ytp-v9-full-1080p60] + treeherder-symbol: Btime() + run-on-projects: + by-test-platform: + macosx.*shippable-qr.*: [mozilla-central] + default: [] + tier: 2 + max-run-time: 2700 + browsertime-tp6-live: <<: *tp6-defaults description: Raptor (browsertime) tp6 on live-sites diff --git a/taskcluster/ci/test/kind.yml b/taskcluster/ci/test/kind.yml index d799dd3dc80..10d81b195a6 100644 --- a/taskcluster/ci/test/kind.yml +++ b/taskcluster/ci/test/kind.yml @@ -37,7 +37,6 @@ jobs-from: - marionette.yml - misc.yml - mochitest.yml - - raptor.yml - raptor-chrome.yml - reftest.yml - talos.yml diff --git a/taskcluster/ci/test/mochitest.yml b/taskcluster/ci/test/mochitest.yml index 66225c6cef3..2b6ae01cbc5 100644 --- a/taskcluster/ci/test/mochitest.yml +++ b/taskcluster/ci/test/mochitest.yml @@ -102,11 +102,11 @@ mochitest-plain: default: [] headless: by-test-platform: - linux.*64(-shippable)?-qr/opt: ['mozilla-central'] + linux1804-64.*: ['mozilla-central'] default: [] headless+socketprocess_networking: by-test-platform: - linux.*64(-shippable)?-qr/opt: ['mozilla-central'] + linux1804-64.*: ['mozilla-central'] default: [] no-fission: by-test-platform: diff --git a/taskcluster/ci/test/raptor.yml b/taskcluster/ci/test/raptor.yml deleted file mode 100644 index 93614acd509..00000000000 --- a/taskcluster/ci/test/raptor.yml +++ /dev/null @@ -1,90 +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/. ---- -job-defaults: - max-run-time: - by-app: - firefox: - by-test-platform: - .*-ref-hw-2017-qr/.*: 3600 - .*-qr/.*: 2400 - default: 1800 - default: - by-test-platform: - .*-qr/.*: 2400 - .*-ux/.*: 2400 - default: 1800 - suite: raptor - test-manifest-loader: null # don't load tests in the taskgraph - run-on-projects: [] - limit-platforms: - by-app: - chrome: - - .*shippable(?!-qr).* - chromium: - - .*shippable(?!-qr).* - default: [] - tier: 2 - virtualization: hardware - mozharness: - script: raptor_script.py - config: - by-test-platform: - macosx.*: - - raptor/mac_config.py - windows.*: - - raptor/windows_config.py - default: - - raptor/linux_config.py - extra-options: - # Bug 1626522: Temporarily enable extension logging for - # an easier investigation of intermittents on mobile devices - - --setpref=extensions.logging.enabled=true - - --webext - fetches: - fetch: - by-app: - chromium: - by-test-platform: - win.*64.*: - - win64-chromium - win.*32.*: - - win32-chromium - macosx.*: - - mac-chromium - default: - - linux64-chromium - default: [] - -raptor-youtube-playback-v9-power-firefox: - description: Raptor V9 YouTube Playback on Firefox with Power Testing - try-name: raptor-youtube-playback-v9-power-firefox - treeherder-symbol: Rap(ytp-v9-p) - run-on-projects: - by-test-platform: - (linux|windows.*64|macos)(?!.*shippable).*: [] - (linux|windows.*64|macos)(?!.*-qr).*: [] - default: [mozilla-central] - max-run-time: 2700 - tier: 2 - mozharness: - extra-options: - - --test=raptor-youtube-playback-v9 - - --power-test - -raptor-youtube-playback-h264-power-firefox: - description: Raptor H264 YouTube Playback on Firefox with Power Testing - try-name: raptor-youtube-playback-h264-power-firefox - treeherder-symbol: Rap(ytp-h264-p) - run-on-projects: - by-test-platform: - (linux|windows.*64|macos)(?!.*shippable).*: [] - (linux|windows.*64|macos)(?!.*-qr).*: [] - default: [mozilla-central] - max-run-time: 2700 - tier: 2 - mozharness: - extra-options: - - --test=raptor-youtube-playback-h264 - - --power-test diff --git a/taskcluster/ci/test/test-platforms.yml b/taskcluster/ci/test/test-platforms.yml index 0ee28231e23..a9b87770967 100644 --- a/taskcluster/ci/test/test-platforms.yml +++ b/taskcluster/ci/test/test-platforms.yml @@ -318,7 +318,6 @@ macosx1015-64-shippable-qr/opt: - desktop-screenshot-capture - macosx1015-64-qr-tests - macosx64-talos - - raptor-firefox-power - talos-profiling - web-platform-tests - web-platform-tests-backlog diff --git a/taskcluster/ci/test/test-sets.yml b/taskcluster/ci/test/test-sets.yml index c34e07478df..caed2affd57 100644 --- a/taskcluster/ci/test/test-sets.yml +++ b/taskcluster/ci/test/test-sets.yml @@ -87,6 +87,7 @@ browsertime: - browsertime-benchmark - browsertime-benchmark-wasm - browsertime-youtube-playback + - browsertime-youtube-playback-power - browsertime-custom - browsertime-first-install - browsertime-grandprix @@ -112,12 +113,6 @@ browsertime-high-priority: - browsertime-benchmark - browsertime-tp6 -# Raptor desktop power tests -# (requires Intel Power Gadget to be pre-installed) -raptor-firefox-power: - - raptor-youtube-playback-v9-power-firefox - - raptor-youtube-playback-h264-power-firefox - awsy: - awsy - awsy-base diff --git a/taskcluster/ci/test/web-platform.yml b/taskcluster/ci/test/web-platform.yml index e062980b543..eba7654ad47 100644 --- a/taskcluster/ci/test/web-platform.yml +++ b/taskcluster/ci/test/web-platform.yml @@ -255,7 +255,6 @@ web-platform-tests-wdspec: headless: by-test-platform: android.*: [] - .*-tsan.*: [] default: built-projects no-fission: by-test-platform: diff --git a/taskcluster/ci/toolchain/rust.yml b/taskcluster/ci/toolchain/rust.yml index 19d7c942f43..35cead14817 100644 --- a/taskcluster/ci/toolchain/rust.yml +++ b/taskcluster/ci/toolchain/rust.yml @@ -176,26 +176,6 @@ linux64-rust-macos-1.68: ] toolchain-alias: linux64-rust-macos -linux64-rust-android-1.67: - description: "rust repack with android-cross support" - treeherder: - symbol: TL(rust-android-1.67) - run: - arguments: [ - '--channel', '1.67.0', - '--host', 'x86_64-unknown-linux-gnu', - '--target', 'x86_64-unknown-linux-gnu', - '--target', 'armv7-linux-androideabi', - '--target', 'thumbv7neon-linux-androideabi', - '--target', 'aarch64-linux-android', - '--target', 'i686-linux-android', - '--target', 'x86_64-linux-android', - '--compiler-builtins-hack', - ] - fetches: - toolchain: - - linux64-clang-toolchain - linux64-rust-android-1.68: description: "rust repack with android-cross support" treeherder: diff --git a/taskcluster/ci/webrender/kind.yml b/taskcluster/ci/webrender/kind.yml index 7268224449a..7396d6319bc 100644 --- a/taskcluster/ci/webrender/kind.yml +++ b/taskcluster/ci/webrender/kind.yml @@ -272,7 +272,7 @@ jobs: - android-system-image-x86_64-linux - android-avd-x86_64-linux - linux64-jdk - - linux64-rust-android-1.67 + - linux64-rust-android - wrench-deps treeherder: platform: android-em-7-0-x86/debug @@ -317,7 +317,7 @@ jobs: - android-system-image-x86_64-linux - android-avd-x86_64-linux - linux64-jdk - - linux64-rust-android-1.67 + - linux64-rust-android - wrench-deps treeherder: platform: android-em-7-0-x86/opt diff --git a/taskcluster/docker/decision/VERSION b/taskcluster/docker/decision/VERSION index fcdb2e109f6..1454f6ed4b7 100644 --- a/taskcluster/docker/decision/VERSION +++ b/taskcluster/docker/decision/VERSION @@ -1 +1 @@ -4.0.0 +4.0.1 diff --git a/taskcluster/docker/partner-repack/known_hosts b/taskcluster/docker/partner-repack/known_hosts index 73b210c5aac..f4c560e0e7c 100644 --- a/taskcluster/docker/partner-repack/known_hosts +++ b/taskcluster/docker/partner-repack/known_hosts @@ -1,2 +1,3 @@ -|1|l1+RDluaBh2vgAVjzSQP5cMsazU=|zA0AvSBB4c3SJ6OM1H0pjrTY/BQ= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== -|1|A4q4hHD/XV6BPf9bom/6780dCwk=|gm+K1qkEPDUMm1axYNTOkbI1BQ4= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ== +github.com ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOMqqnkVzrm0SdG6UOoqKLsabgH5C9okWi0dh2l9GKJl +github.com ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBEmKSENjQEezOmxkZMy7opKgwFB9nkt5YRrYMjNuG5N87uRgg6CLrbo5wAdT/y6v0mKV0U2w0WZ2YB/++Tpockg= +github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk= diff --git a/taskcluster/docker/periodic-updates/.eslintrc.js b/taskcluster/docker/periodic-updates/.eslintrc.js index 15d7603afd5..9828adaa40f 100644 --- a/taskcluster/docker/periodic-updates/.eslintrc.js +++ b/taskcluster/docker/periodic-updates/.eslintrc.js @@ -5,8 +5,6 @@ "use strict"; module.exports = { - extends: ["plugin:mozilla/valid-jsdoc"], - globals: { // JS files in this folder are commonly xpcshell scripts where |arguments| // is defined in the global scope. diff --git a/taskcluster/gecko_taskgraph/test/test_optimize_strategies.py b/taskcluster/gecko_taskgraph/test/test_optimize_strategies.py index 76e2fd28908..0f373323009 100644 --- a/taskcluster/gecko_taskgraph/test/test_optimize_strategies.py +++ b/taskcluster/gecko_taskgraph/test/test_optimize_strategies.py @@ -36,7 +36,7 @@ def clear_push_schedules_memoize(): @pytest.fixture def params(): return { - "branch": "integration/autoland", + "branch": "autoland", "head_repository": "https://hg.mozilla.org/integration/autoland", "head_rev": "abcdef", "project": "autoland", diff --git a/taskcluster/scripts/builder/build-haz-linux.sh b/taskcluster/scripts/builder/build-haz-linux.sh index ffa05715942..8ee44dfaf4a 100755 --- a/taskcluster/scripts/builder/build-haz-linux.sh +++ b/taskcluster/scripts/builder/build-haz-linux.sh @@ -93,7 +93,7 @@ function grab_artifacts () { shopt -s nullglob set +e local important - important=(refs.txt unnecessary.txt hazards.txt gcFunctions.txt allFunctions.txt heapWriteHazards.txt) + important=(refs.txt unnecessary.txt hazards.txt gcFunctions.txt allFunctions.txt heapWriteHazards.txt rootingHazards.json hazards.html) # Bundle up the less important but still useful intermediate outputs, # just to cut down on the clutter in treeherder's Job Details pane. @@ -173,15 +173,11 @@ function check_hazards () { trap grab_artifacts EXIT -# Directory to hold the (useless) object files generated by the analysis. -export HAZ_OBJDIR="$WORKSPACE/obj-analyzed-$PROJECT" -mkdir -p "$HAZ_OBJDIR" - # Gather the information from the source tree by compiling it. -$GECKO_PATH/mach hazards gather --application=$PROJECT --haz-objdir="$HAZ_OBJDIR" --work-dir="$ANALYSIS_DIR" +$GECKO_PATH/mach hazards gather --project=$PROJECT --work-dir="$ANALYSIS_DIR" # Analyze the collected information. -$GECKO_PATH/mach hazards analyze --application=$PROJECT --shell-objdir="$HAZARD_SHELL_OBJDIR" --work-dir="$ANALYSIS_DIR" +$GECKO_PATH/mach hazards analyze --project=$PROJECT --shell-objdir="$HAZARD_SHELL_OBJDIR" --work-dir="$ANALYSIS_DIR" check_hazards "$ANALYSIS_DIR" diff --git a/taskcluster/scripts/misc/fetch-content b/taskcluster/scripts/misc/fetch-content index 67697f61ffa..f3160fad5da 100755 --- a/taskcluster/scripts/misc/fetch-content +++ b/taskcluster/scripts/misc/fetch-content @@ -183,8 +183,8 @@ def stream_download(url, sha256=None, size=None): t0 = time.time() with urllib.request.urlopen( - url, cafile=certifi.where() - ) if certifi else urllib.request.urlopen(url) as fh: + url, timeout=60, cafile=certifi.where() + ) if certifi else urllib.request.urlopen(url, timeout=60) as fh: if not url.endswith(".gz") and fh.info().get("Content-Encoding") == "gzip": fh = gzip.GzipFile(fileobj=fh) diff --git a/testing/condprofile/condprof/creator.py b/testing/condprofile/condprof/creator.py index c11f7451df4..7e03f6a8da2 100644 --- a/testing/condprofile/condprof/creator.py +++ b/testing/condprofile/condprof/creator.py @@ -25,6 +25,7 @@ that keep track of the Firefox version that was used and the profile age. """ import os import tempfile +import shutil from arsenic import get_session from arsenic.browsers import Firefox @@ -115,6 +116,10 @@ class ProfileCreator: ] for name in names: + # remove `cache` from profile + shutil.rmtree(os.path.join(self.env.profile, "cache"), ignore_errors=True) + shutil.rmtree(os.path.join(self.env.profile, "cache2"), ignore_errors=True) + archiver = Archiver(self.scenario, self.env.profile, self.archive) # the archive name is of the form # profile[-vXYZ.x]---.tgz diff --git a/testing/mochitest/ignorePrefs.json b/testing/mochitest/ignorePrefs.json index 32e0639b810..531b8aad711 100644 --- a/testing/mochitest/ignorePrefs.json +++ b/testing/mochitest/ignorePrefs.json @@ -1,17 +1,18 @@ [ - "app.update.lastUpdateTime.search-engine-update-timer", - "media.gmp-manager.buildID", - "app.update.lastUpdateTime.browser-cleanup-thumbnails", - "app.update.lastUpdateTime.services-settings-poll-changes", "app.update.lastUpdateTime.addon-background-update-timer", - "media.gmp-manager.lastEmptyCheck", "app.update.lastUpdateTime.background-update-timer", - "media.gmp-manager.lastCheck", - "toolkit.startup.last_success", - "toolkit.telemetry.cachedClientID", - "security.webauth.softtoken_counter", - "extensions.webextensions.ExtensionStorageIDB.migrated.*", + "app.update.lastUpdateTime.browser-cleanup-thumbnails", "app.update.lastUpdateTime.region-update-timer", + "app.update.lastUpdateTime.search-engine-update-timer", + "app.update.lastUpdateTime.services-settings-poll-changes", "app.update.lastUpdateTime.xpi-signature-verification", - "browser.bookmarks.restore_default_bookmarks" + "browser.bookmarks.restore_default_bookmarks", + "extensions.webextensions.ExtensionStorageIDB.migrated.*", + "media.gmp.storage.version.observed", + "media.gmp-manager.buildID", + "media.gmp-manager.lastCheck", + "media.gmp-manager.lastEmptyCheck", + "security.webauth.softtoken_counter", + "toolkit.startup.last_success", + "toolkit.telemetry.cachedClientID" ] diff --git a/testing/mozharness/external_tools/robustcheckout.py b/testing/mozharness/external_tools/robustcheckout.py index 661bcfcab15..7c270e9269d 100644 --- a/testing/mozharness/external_tools/robustcheckout.py +++ b/testing/mozharness/external_tools/robustcheckout.py @@ -9,6 +9,8 @@ from a source repo using best practices to ensure optimal clone times and storage efficiency. """ +from __future__ import absolute_import + import contextlib import json import os @@ -39,7 +41,7 @@ from mercurial import ( # Causes worker to purge caches on process exit and for task to retry. EXIT_PURGE_CACHE = 72 -testedwith = b"4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8" +testedwith = b"4.5 4.6 4.7 4.8 4.9 5.0 5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9" minimumhgversion = b"4.5" cmdtable = {} @@ -59,12 +61,8 @@ def getsparse(): def peerlookup(remote, v): - # TRACKING hg46 4.6 added commandexecutor API. - if util.safehasattr(remote, "commandexecutor"): - with remote.commandexecutor() as e: - return e.callcommand(b"lookup", {b"key": v}).result() - else: - return remote.lookup(v) + with remote.commandexecutor() as e: + return e.callcommand(b"lookup", {b"key": v}).result() @command( @@ -179,6 +177,8 @@ def robustcheckout( # worker.backgroundclose only makes things faster if running anti-virus, # which our automation doesn't. Disable it. ui.setconfig(b"worker", b"backgroundclose", False) + # Don't wait forever if the connection hangs + ui.setconfig(b"http", b"timeout", 600) # By default the progress bar starts after 3s and updates every 0.1s. We # change this so it shows and updates every 1.0s. @@ -509,6 +509,10 @@ def _docheckout( pycompat.bytestr(str(e.reason)), ) ) + elif isinstance(e, socket.timeout): + ui.warn(b"socket timeout\n") + handlenetworkfailure() + return True else: ui.warn( b"unhandled exception during network operation; type: %s; " @@ -529,7 +533,12 @@ def _docheckout( rootnode = peerlookup(clonepeer, b"0") except error.RepoLookupError: raise error.Abort(b"unable to resolve root revision from clone " b"source") - except (error.Abort, ssl.SSLError, urllibcompat.urlerr.urlerror) as e: + except ( + error.Abort, + ssl.SSLError, + urllibcompat.urlerr.urlerror, + socket.timeout, + ) as e: if handlepullerror(e): return callself() raise @@ -568,6 +577,11 @@ def _docheckout( if storevfs.exists(b".hg/requires"): requires = set(storevfs.read(b".hg/requires").splitlines()) + # "share-safe" (enabled by default as of hg 6.1) moved most + # requirements to a new file, so we need to look there as well to avoid + # deleting and re-cloning each time + if b"share-safe" in requires: + requires |= set(storevfs.read(b".hg/store/requires").splitlines()) # FUTURE when we require generaldelta, this is where we can check # for that. required = {b"dotencode", b"fncache"} @@ -617,7 +631,12 @@ def _docheckout( shareopts=shareopts, stream=True, ) - except (error.Abort, ssl.SSLError, urllibcompat.urlerr.urlerror) as e: + except ( + error.Abort, + ssl.SSLError, + urllibcompat.urlerr.urlerror, + socket.timeout, + ) as e: if handlepullerror(e): return callself() raise @@ -685,7 +704,12 @@ def _docheckout( pullop = exchange.pull(repo, remote, heads=pullrevs) if not pullop.rheads: raise error.Abort(b"unable to pull requested revision") - except (error.Abort, ssl.SSLError, urllibcompat.urlerr.urlerror) as e: + except ( + error.Abort, + ssl.SSLError, + urllibcompat.urlerr.urlerror, + socket.timeout, + ) as e: if handlepullerror(e): return callself() raise @@ -721,14 +745,7 @@ def _docheckout( try: old_sparse_fn = getattr(repo.dirstate, "_sparsematchfn", None) if old_sparse_fn is not None: - # TRACKING hg50 - # Arguments passed to `matchmod.always` were unused and have been removed - if util.versiontuple(n=2) >= (5, 0): - repo.dirstate._sparsematchfn = lambda: matchmod.always() - else: - repo.dirstate._sparsematchfn = lambda: matchmod.always( - repo.root, "" - ) + repo.dirstate._sparsematchfn = lambda: matchmod.always() with timeit("purge", "purge"): if purge( @@ -765,13 +782,9 @@ def _docheckout( b"%s" % (sparse_profile, checkoutrevision) ) - # TRACKING hg48 - parseconfig takes `action` param - if util.versiontuple(n=2) >= (4, 8): - old_config = sparsemod.parseconfig( - repo.ui, repo.vfs.tryread(b"sparse"), b"sparse" - ) - else: - old_config = sparsemod.parseconfig(repo.ui, repo.vfs.tryread(b"sparse")) + old_config = sparsemod.parseconfig( + repo.ui, repo.vfs.tryread(b"sparse"), b"sparse" + ) old_includes, old_excludes, old_profiles = old_config @@ -793,7 +806,9 @@ def _docheckout( # one to change the sparse profile and another to update to the new # revision. This is not desired. But there's not a good API in # Mercurial to do this as one operation. - with repo.wlock(), timeit("sparse_update_config", "sparse-update-config"): + with repo.wlock(), repo.dirstate.parentchange(), timeit( + "sparse_update_config", "sparse-update-config" + ): # pylint --py3k: W1636 fcounts = list( map( diff --git a/testing/mozharness/mozharness/mozilla/testing/raptor.py b/testing/mozharness/mozharness/mozilla/testing/raptor.py index 569aee08a87..9c78a0654fd 100644 --- a/testing/mozharness/mozharness/mozilla/testing/raptor.py +++ b/testing/mozharness/mozharness/mozilla/testing/raptor.py @@ -9,6 +9,7 @@ import copy import glob import multiprocessing import os +import pathlib import re import subprocess import sys @@ -1235,7 +1236,17 @@ class Raptor( if not self.config.get("noinstall", False): if self.app in self.firefox_android_browsers: self.device.uninstall_app(self.binary_path) - self.install_android_app(self.installer_path) + + # Check if the user supplied their own APK, and install + # that instead + installer_path = pathlib.Path( + self.raptor_path, "raptor", "user_upload.apk" + ) + if not installer_path.exists(): + installer_path = self.installer_path + + self.info(f"Installing APK from: {installer_path}") + self.install_android_app(str(installer_path)) else: super(Raptor, self).install() diff --git a/testing/perfdocs/generated/raptor.rst b/testing/perfdocs/generated/raptor.rst index 4279afc3c1a..5f5c2d6aaf8 100644 --- a/testing/perfdocs/generated/raptor.rst +++ b/testing/perfdocs/generated/raptor.rst @@ -4604,11 +4604,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false} * **subtest lower is better**: true @@ -4617,6 +4618,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-h264-1080p60 :container: + anchor-id-youtube-playback-h264-1080p60-b @@ -4626,11 +4741,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false} * **subtest lower is better**: true @@ -4639,6 +4755,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-h264-full-1080p30 :container: + anchor-id-youtube-playback-h264-full-1080p30-b @@ -4648,11 +4878,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false, "full-screen-api.allow-trusted-requests-only": false, "full-screen-api.warning.timeout": 0} * **subtest lower is better**: true @@ -4661,6 +4892,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-h264-full-1080p60 :container: + anchor-id-youtube-playback-h264-full-1080p60-b @@ -4670,11 +5015,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false, "full-screen-api.allow-trusted-requests-only": false, "full-screen-api.warning.timeout": 0} * **subtest lower is better**: true @@ -4683,6 +5029,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-h264-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-h264-sfr :container: + anchor-id-youtube-playback-h264-sfr-b @@ -5081,11 +5541,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false} * **subtest lower is better**: true @@ -5094,6 +5555,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-v9-1080p60 :container: + anchor-id-youtube-playback-v9-1080p60-b @@ -5103,11 +5678,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false} * **subtest lower is better**: true @@ -5116,6 +5692,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-v9-full-1080p30 :container: + anchor-id-youtube-playback-v9-full-1080p30-b @@ -5125,11 +5815,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false, "full-screen-api.allow-trusted-requests-only": false, "full-screen-api.warning.timeout": 0} * **subtest lower is better**: true @@ -5138,6 +5829,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p30** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-v9-full-1080p60 :container: + anchor-id-youtube-playback-v9-full-1080p60-b @@ -5147,11 +5952,12 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **alert threshold**: 2.0 * **apps**: firefox * **expected**: pass + * **gather cpuTime**: true * **gecko profile entries**: 50000000 * **gecko profile interval**: 1000 * **gecko profile threads**: MediaPlayback * **lower is better**: true - * **page cycles**: 1 + * **page cycles**: 20 * **page timeout**: 2700000 * **preferences**: {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, "media.autoplay.block-webaudio": false, "media.allowed-to-play.enabled": true, "media.block-autoplay-until-in-foreground": false, "full-screen-api.allow-trusted-requests-only": false, "full-screen-api.warning.timeout": 0} * **subtest lower is better**: true @@ -5160,6 +5966,120 @@ Standard benchmarks are third-party tests (i.e. Speedometer) that we have integr * **type**: benchmark * **unit**: score * **use live sites**: true + * **Test Task**: + + .. list-table:: **test-linux1804-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-linux1804-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-macosx1015-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ✅ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-32-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + + .. list-table:: **test-windows10-64-shippable-qr/opt** + :widths: 30 15 15 15 15 + :header-rows: 1 + + * - **Test Name** + - mozilla-central + - autoland + - mozilla-release + - mozilla-beta + * - **browsertime-power-firefox-youtube-playback-v9-full-1080p60** + - ❌ + - ❌ + - ❌ + - ❌ + + .. dropdown:: youtube-playback-vp9-sfr :container: + anchor-id-youtube-playback-vp9-sfr-b diff --git a/testing/profiles/reftest/user.js b/testing/profiles/reftest/user.js index a54b3f8d5d8..2ac6af5a47d 100644 --- a/testing/profiles/reftest/user.js +++ b/testing/profiles/reftest/user.js @@ -58,6 +58,9 @@ user_pref("layout.interruptible-reflow.enabled", false); // can't guarantee taking both reftest snapshots at the same point // during the fade. user_pref("layout.testing.overlay-scrollbars.always-visible", true); +// The broken image icon doesn't block the load event and thus there's no easy +// way to guarantee it's loaded by the time we take the reftest screenshot. +user_pref("layout.image.eager_broken_image_icon", true); user_pref("media.gmp-manager.url.override", "http://localhost/dummy-gmp-manager.xml"); user_pref("media.openUnsupportedTypeWithExternalApp", false); // Reftests load a lot of URLs very quickly. This puts avoidable and diff --git a/testing/raptor/raptor/output.py b/testing/raptor/raptor/output.py index 40267adb238..478f7c58eb7 100644 --- a/testing/raptor/raptor/output.py +++ b/testing/raptor/raptor/output.py @@ -1839,53 +1839,60 @@ class BrowsertimeOutput(PerftestOutput): if "alert_change_type" in test and "alertChangeType" not in suite: suite["alertChangeType"] = test["alert_change_type"] + def _process_measurements(measurement_name, replicates): + subtest = {} + subtest["name"] = measurement_name + subtest["lowerIsBetter"] = test["subtest_lower_is_better"] + subtest["alertThreshold"] = float(test["alert_threshold"]) + subtest["unit"] = ( + "ms" if measurement_name == "cpuTime" else test["subtest_unit"] + ) + + # Add the alert window settings if needed here too in case + # there is no summary value in the test + for schema_name in ( + "minBackWindow", + "maxBackWindow", + "foreWindow", + ): + if suite.get(schema_name, None) is not None: + subtest[schema_name] = suite[schema_name] + + # if 'alert_on' is set for this particular measurement, then we want to set + # the flag in the perfherder output to turn on alerting for this subtest + if self.subtest_alert_on is not None: + if measurement_name in self.subtest_alert_on: + LOG.info( + "turning on subtest alerting for measurement type: %s" + % measurement_name + ) + subtest["shouldAlert"] = True + if self.app in ("chrome", "chrome-m", "chromium"): + subtest["shouldAlert"] = False + else: + # Explicitly set `shouldAlert` to False so that the measurement + # is not alerted on. Otherwise Perfherder defaults to alerting. + LOG.info( + "turning off subtest alerting for measurement type: %s" + % measurement_name + ) + subtest["shouldAlert"] = False + subtest["replicates"] = replicates + return subtest + if test["type"] in ["pageload", "scenario", "power"]: for measurement_name, replicates in test["measurements"].items(): + new_subtest = _process_measurements(measurement_name, replicates) if measurement_name not in suite["subtests"]: - subtest = {} - subtest["name"] = measurement_name - subtest["lowerIsBetter"] = test["subtest_lower_is_better"] - subtest["alertThreshold"] = float(test["alert_threshold"]) - subtest["unit"] = test["subtest_unit"] - - # Add the alert window settings if needed here too in case - # there is no summary value in the test - for schema_name in ( - "minBackWindow", - "maxBackWindow", - "foreWindow", - ): - if suite.get(schema_name, None) is not None: - subtest[schema_name] = suite[schema_name] - - # if 'alert_on' is set for this particular measurement, then we want to set - # the flag in the perfherder output to turn on alerting for this subtest - if self.subtest_alert_on is not None: - if measurement_name in self.subtest_alert_on: - LOG.info( - "turning on subtest alerting for measurement type: %s" - % measurement_name - ) - subtest["shouldAlert"] = True - if self.app in ("chrome", "chrome-m", "chromium"): - subtest["shouldAlert"] = False - else: - # Explicitly set `shouldAlert` to False so that the measurement - # is not alerted on. Otherwise Perfherder defaults to alerting. - LOG.info( - "turning off subtest alerting for measurement type: %s" - % measurement_name - ) - subtest["shouldAlert"] = False - subtest["replicates"] = [] - suite["subtests"][measurement_name] = subtest + suite["subtests"][measurement_name] = new_subtest else: - subtest = suite["subtests"][measurement_name] - - subtest["replicates"].extend(replicates) + suite["subtests"][measurement_name]["replicates"].extend( + new_subtest["replicates"] + ) elif "benchmark" in test["type"]: subtests = None + if "speedometer" in test["measurements"]: # this includes stylebench subtests, vals = self.parseSpeedometerOutput(test) @@ -1925,6 +1932,15 @@ class BrowsertimeOutput(PerftestOutput): raise Exception("No benchmark metrics found in browsertime results") suite["subtests"] = subtests + + if "cpuTime" in test["measurements"] and test.get( + "gather_cpuTime", None + ): + replicates = test["measurements"]["cpuTime"] + cpu_subtest = _process_measurements("cpuTime", replicates) + _process(cpu_subtest) + suite["subtests"].append(cpu_subtest) + # summarize results for both benchmark type tests if len(subtests) > 1: suite["value"] = self.construct_summary(vals, testname=test["name"]) diff --git a/testing/raptor/raptor/results.py b/testing/raptor/raptor/results.py index ef365bfb10a..d41378042a1 100644 --- a/testing/raptor/raptor/results.py +++ b/testing/raptor/raptor/results.py @@ -593,6 +593,16 @@ class BrowsertimeResultsHandler(PerftestResultsHandler): "statistics": {}, } + def _extract_cpu_vals(): + # Bug 1806402 - Handle chrome cpu data properly + cpu_vals = raw_result.get("cpu", None) + if ( + cpu_vals + and self.app + not in NON_FIREFOX_BROWSERS + NON_FIREFOX_BROWSERS_MOBILE + ): + bt_result["measurements"].setdefault("cpuTime", []).extend(cpu_vals) + if self.power_test: power_result = { "bt_ver": bt_ver, @@ -602,6 +612,7 @@ class BrowsertimeResultsHandler(PerftestResultsHandler): "statistics": {}, "power_data": True, } + for cycle in raw_result["android"]["power"]: for metric in cycle: if "total" in metric: @@ -650,6 +661,7 @@ class BrowsertimeResultsHandler(PerftestResultsHandler): bt_result["measurements"].setdefault( "perfstat-" + metric, [] ).append(cycle[metric]) + _extract_cpu_vals() else: # extracting values from browserScripts and statistics for bt, raptor in conversion: @@ -694,14 +706,7 @@ class BrowsertimeResultsHandler(PerftestResultsHandler): raw_result["statistics"]["timings"], raptor, retval={} ) - # Bug 1806402 - Handle chrome cpu data properly - cpu_vals = raw_result.get("cpu", None) - if ( - cpu_vals - and self.app - not in NON_FIREFOX_BROWSERS + NON_FIREFOX_BROWSERS_MOBILE - ): - bt_result["measurements"].setdefault("cpuTime", []).extend(cpu_vals) + _extract_cpu_vals() if self.perfstats: for cycle in raw_result["geckoPerfStats"]: @@ -1007,7 +1012,7 @@ class BrowsertimeResultsHandler(PerftestResultsHandler): new_result = _new_standard_result( new_result, subtest_unit=test.get("subtest_unit", "ms") ) - + new_result["gather_cpuTime"] = test.get("gather_cpuTime", None) LOG.info("parsed new benchmark result: %s" % str(new_result)) return new_result diff --git a/testing/raptor/raptor/tests/benchmarks/youtube-playback.ini b/testing/raptor/raptor/tests/benchmarks/youtube-playback.ini index 83b301df500..4123192b479 100644 --- a/testing/raptor/raptor/tests/benchmarks/youtube-playback.ini +++ b/testing/raptor/raptor/tests/benchmarks/youtube-playback.ini @@ -67,14 +67,20 @@ test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf- [youtube-playback-h264-1080p30] apps = firefox +page_cycles = 20 +gather_cpuTime = true test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf-sfr-h264-test&tests=18&raptor=true&muted=true&command=run&exclude=1,2 [youtube-playback-h264-1080p60] apps = firefox +page_cycles = 20 +gather_cpuTime = true test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf-hfr-test&raptor=true&tests=46&muted=true&command=run&exclude=1,2 [youtube-playback-h264-full-1080p30] apps = firefox +page_cycles = 20 +gather_cpuTime = true preferences = {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, @@ -87,6 +93,8 @@ test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf- [youtube-playback-h264-full-1080p60] apps = firefox +page_cycles = 20 +gather_cpuTime = true preferences = {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, @@ -109,14 +117,20 @@ test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf- [youtube-playback-v9-1080p30] apps = firefox +page_cycles = 20 +gather_cpuTime = true test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf-sfr-vp9-test&raptor=true&tests=18&muted=true&command=run&exclude=1,2 [youtube-playback-v9-1080p60] apps = firefox +page_cycles = 20 +gather_cpuTime = true test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf-hfr-test&raptor=true&tests=14&muted=true&command=run&exclude=1,2 [youtube-playback-v9-full-1080p30] apps = firefox +page_cycles = 20 +gather_cpuTime = true preferences = {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, @@ -129,6 +143,8 @@ test_url = https://yttest.prod.mozaws.net/2020/main.html?test_type=playbackperf- [youtube-playback-v9-full-1080p60] apps = firefox +page_cycles = 20 +gather_cpuTime = true preferences = {"media.autoplay.default": 0, "media.autoplay.ask-permission": false, "media.autoplay.blocking_policy": 0, diff --git a/testing/web-platform/meta/css/css-align/baseline-rules/inline-table-inline-block-baseline-vert-rl.html.ini b/testing/web-platform/meta/css/css-align/baseline-rules/inline-table-inline-block-baseline-vert-rl.html.ini deleted file mode 100644 index af7335d456c..00000000000 --- a/testing/web-platform/meta/css/css-align/baseline-rules/inline-table-inline-block-baseline-vert-rl.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[inline-table-inline-block-baseline-vert-rl.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-mix-function.html.ini b/testing/web-platform/meta/css/css-color/parsing/color-valid-color-mix-function.html.ini deleted file mode 100644 index 52aaec72238..00000000000 --- a/testing/web-platform/meta/css/css-color/parsing/color-valid-color-mix-function.html.ini +++ /dev/null @@ -1,381 +0,0 @@ -[color-valid-color-mix-function.html] - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg), 25% lch(50 60 70deg))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg), lch(50 60 70deg) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg) 25%, lch(50 60 70deg) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg / .4), 25% lch(50 60 70deg / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg / .4), lch(50 60 70deg / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lch, lch(10 20 30deg / .4) 25%, lch(50 60 70deg / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg), 25% oklch(50 60 70deg))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg), oklch(50 60 70deg) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg) 25%, oklch(50 60 70deg) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg / .4), 25% oklch(50 60 70deg / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg / .4), oklch(50 60 70deg / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklch, oklch(10 20 30deg / .4) 25%, oklch(50 60 70deg / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30), 25% lab(50 60 70))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30), lab(50 60 70) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30) 25%, lab(50 60 70) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30 / .4), 25% lab(50 60 70 / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30 / .4), lab(50 60 70 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in lab, lab(10 20 30 / .4) 25%, lab(50 60 70 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30), 25% oklab(50 60 70))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30), oklab(50 60 70) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30) 25%, oklab(50 60 70) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30 / .4), 25% oklab(50 60 70 / .8))" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30 / .4), oklab(50 60 70 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in oklab, oklab(10 20 30 / .4) 25%, oklab(50 60 70 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4), color(srgb .5 .6 .7 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3), color(srgb-linear .5 .6 .7) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3) 25%, color(srgb-linear .5 .6 .7) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4), color(srgb-linear .5 .6 .7 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in srgb-linear, color(srgb-linear .1 .2 .3 / .4) 25%, color(srgb-linear .5 .6 .7 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz, color(xyz .1 .2 .3), color(xyz .5 .6 .7) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz, color(xyz .1 .2 .3) 25%, color(xyz .5 .6 .7) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4), color(xyz .5 .6 .7 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz, color(xyz .1 .2 .3 / .4) 25%, color(xyz .5 .6 .7 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4), color(xyz-d50 .5 .6 .7 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3), color(xyz-d65 .5 .6 .7) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3) 25%, color(xyz-d65 .5 .6 .7) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4), color(xyz-d65 .5 .6 .7 / .8) 25%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d65, color(xyz-d65 .1 .2 .3 / .4) 25%, color(xyz-d65 .5 .6 .7 / .8) 75%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in hsl, red 60%, blue 40%)" should set the property value] - expected: FAIL - - [e.style['color'\] = "color-mix(in xyz-d50, color(xyz-d50 -2 -3 -4 / -5), color(xyz-d50 -4 -6 -8 / -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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .5), color(xyz-d50 .5 .6 .7 / .8))" 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-mix(in srgb, color(srgb .1 .2 .3 / .4) 0%, color(srgb .5 .6 .7 / .8))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 25%, color(xyz-d50 .5 .6 .7))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 0%, color(xyz-d50 .5 .6 .7 / .8))" 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-mix(in srgb, color(srgb -2 -3 -4 / -5), color(srgb -4 -6 -8 / -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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 12.5%, color(xyz-d50 .5 .6 .7) 37.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-mix(in srgb, color(srgb -2 -3 -4), color(srgb -4 -6 -8))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 0%, color(xyz-d50 .5 .6 .7))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 30%, color(xyz-d50 .5 .6 .7 / .8) 90%)" 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-mix(in xyz-d50, color(xyz-d50 2 3 4 / 5), color(xyz-d50 4 6 8 / 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-mix(in srgb, color(srgb .1 .2 .3 / .4) 12.5%, color(srgb .5 .6 .7 / .8) 37.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-mix(in srgb, color(srgb 2 3 4 / 5), color(srgb 4 6 8 / 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-mix(in srgb, color(srgb .1 .2 .3 / .4) 25%, color(srgb .5 .6 .7 / .8))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 25%, color(xyz-d50 .5 .6 .7 / .8))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3) 30%, color(xyz-d50 .5 .6 .7) 90%)" 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-mix(in srgb, color(srgb .1 .2 .3) 25%, color(srgb .5 .6 .7))" 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-mix(in xyz-d50, color(xyz-d50 -2 -3 -4), color(xyz-d50 -4 -6 -8))" 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-mix(in srgb, color(srgb .1 .2 .3) 30%, color(srgb .5 .6 .7) 90%)" 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-mix(in srgb, color(srgb .1 .2 .3 / .4) 30%, color(srgb .5 .6 .7 / .8) 90%)" 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-mix(in srgb, color(srgb .1 .2 .3), color(srgb .5 .6 .7))" 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-mix(in srgb, color(srgb .1 .2 .3) 0%, color(srgb .5 .6 .7))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3 / .4) 12.5%, color(xyz-d50 .5 .6 .7 / .8) 37.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-mix(in srgb, color(srgb .1 .2 .3) 12.5%, color(srgb .5 .6 .7) 37.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-mix(in srgb, color(srgb .1 .2 .3 / .5), color(srgb .5 .6 .7 / .8))" 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-mix(in xyz-d50, color(xyz-d50 .1 .2 .3), color(xyz-d50 .5 .6 .7))" 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] diff --git a/testing/web-platform/meta/css/css-flexbox/negative-overflow-002.html.ini b/testing/web-platform/meta/css/css-flexbox/negative-overflow-002.html.ini index c625928ece7..0e91e22e4eb 100644 --- a/testing/web-platform/meta/css/css-flexbox/negative-overflow-002.html.ini +++ b/testing/web-platform/meta/css/css-flexbox/negative-overflow-002.html.ini @@ -1,40 +1,40 @@ [negative-overflow-002.html] [.container 27] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 16] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 17] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 63] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 45] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 57] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 14] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 13] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 15] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-grid/alignment/grid-content-alignment-overflow-002.html.ini b/testing/web-platform/meta/css/css-grid/alignment/grid-content-alignment-overflow-002.html.ini index e9410a6246b..3551172f6a8 100644 --- a/testing/web-platform/meta/css/css-grid/alignment/grid-content-alignment-overflow-002.html.ini +++ b/testing/web-platform/meta/css/css-grid/alignment/grid-content-alignment-overflow-002.html.ini @@ -1,4 +1,5 @@ [grid-content-alignment-overflow-002.html] [.grid 8] + bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1715154 expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-002.html.ini b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-002.html.ini index 10d747062f7..f840da45b56 100644 --- a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-002.html.ini +++ b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-002.html.ini @@ -5,6 +5,9 @@ [.target > * 3] expected: FAIL + [.target > * 4] + expected: FAIL + [.target > * 5] expected: FAIL @@ -14,18 +17,12 @@ [.target > * 9] expected: FAIL - [.target > * 11] - expected: FAIL - - [.target > * 13] + [.target > * 10] expected: FAIL [.target > * 15] expected: FAIL - [.target > * 17] - expected: FAIL - [.target > * 19] expected: FAIL diff --git a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-003.html.ini b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-003.html.ini index 8e4dbec5b03..f90c93729c1 100644 --- a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-003.html.ini +++ b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-first-003.html.ini @@ -14,20 +14,8 @@ [.target > * 9] expected: FAIL - [.target > * 11] - expected: FAIL - - [.target > * 13] - expected: FAIL - [.target > * 15] expected: FAIL - [.target > * 17] - expected: FAIL - - [.target > * 19] - expected: FAIL - [.target > * 21] expected: FAIL diff --git a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-002.html.ini b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-002.html.ini index 118bedbc909..a316973bf81 100644 --- a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-002.html.ini +++ b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-002.html.ini @@ -1,19 +1,17 @@ [baseline-source-last-002.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [.target > * 1] + [.target > * 3] expected: FAIL - [.target > * 3] + [.target > * 4] expected: FAIL [.target > * 5] expected: FAIL - [.target > * 7] + [.target > * 9] expected: FAIL - [.target > * 9] + [.target > * 10] expected: FAIL [.target > * 11] @@ -22,9 +20,6 @@ [.target > * 13] expected: FAIL - [.target > * 15] - expected: FAIL - [.target > * 17] expected: FAIL diff --git a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-003.html.ini b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-003.html.ini index a102ada16d0..26b2da15ae6 100644 --- a/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-003.html.ini +++ b/testing/web-platform/meta/css/css-inline/baseline-source/baseline-source-last-003.html.ini @@ -1,16 +1,10 @@ [baseline-source-last-003.html] - [.target > * 1] - expected: FAIL - [.target > * 3] expected: FAIL [.target > * 5] expected: FAIL - [.target > * 7] - expected: FAIL - [.target > * 9] expected: FAIL @@ -20,9 +14,6 @@ [.target > * 13] expected: FAIL - [.target > * 15] - expected: FAIL - [.target > * 17] expected: FAIL diff --git a/testing/web-platform/meta/css/css-masking/mask-image/mask-image-2.html.ini b/testing/web-platform/meta/css/css-masking/mask-image/mask-image-2.html.ini deleted file mode 100644 index 4a5a1b94139..00000000000 --- a/testing/web-platform/meta/css/css-masking/mask-image/mask-image-2.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[mask-image-2.html] - expected: FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-padding.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-padding.html.ini index deb75c35b1b..c1316ad482a 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-padding.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-padding.html.ini @@ -37,60 +37,60 @@ [scrollable-container 6] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 1] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 5] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 28] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 21] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 18] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 8] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 20] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 30] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 10] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 23] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 16] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 25] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [scrollable-container 26] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-self-collapsing.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-self-collapsing.html.ini index 97f3a2a68fe..4148657ef16 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-self-collapsing.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-self-collapsing.html.ini @@ -1,4 +1,4 @@ [scrollable-overflow-self-collapsing.html] [.target 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-001.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-001.html.ini index 9a1fece016f..593f8e6590c 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-001.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-001.html.ini @@ -1,8 +1,8 @@ [scrollable-overflow-transform-001.html] [.container 1] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-002.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-002.html.ini index 5a071b09d33..96fb0cec483 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-002.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-002.html.ini @@ -1,8 +1,8 @@ [scrollable-overflow-transform-002.html] [.container 1] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-003.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-003.html.ini index 7bf10054a51..89fa898b6d5 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-003.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-transform-003.html.ini @@ -1,8 +1,8 @@ [scrollable-overflow-transform-003.html] [.container 1] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.container 3] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-zero-one-axis.html.ini b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-zero-one-axis.html.ini index ce1400f7875..87f19bd72cb 100644 --- a/testing/web-platform/meta/css/css-overflow/scrollable-overflow-zero-one-axis.html.ini +++ b/testing/web-platform/meta/css/css-overflow/scrollable-overflow-zero-one-axis.html.ini @@ -1,20 +1,20 @@ [scrollable-overflow-zero-one-axis.html] [.scroll 4] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.scroll 2] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.scroll 6] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.scroll 1] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL [.scroll 5] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-002.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-002.xht.ini deleted file mode 100644 index 95ce1bd6a9f..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-002.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-block-alignment-002.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-003.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-003.xht.ini deleted file mode 100644 index 2af8e6cefa6..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-003.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-block-alignment-003.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-004.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-004.xht.ini deleted file mode 100644 index 6f87ae7fb5f..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-004.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-block-alignment-004.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-005.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-005.xht.ini deleted file mode 100644 index c280123bf78..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-block-alignment-005.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-block-alignment-005.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-002.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-002.xht.ini deleted file mode 100644 index 8d4e0d045b9..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-002.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-table-alignment-002.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-003.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-003.xht.ini deleted file mode 100644 index 8ea6acb9a89..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-003.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-table-alignment-003.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-004.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-004.xht.ini deleted file mode 100644 index f0a8e129827..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-004.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-table-alignment-004.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-005.xht.ini b/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-005.xht.ini deleted file mode 100644 index 89c3a001056..00000000000 --- a/testing/web-platform/meta/css/css-writing-modes/inline-table-alignment-005.xht.ini +++ /dev/null @@ -1,3 +0,0 @@ -[inline-table-alignment-005.xht] - expected: FAIL - bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1179952 diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini index e18a2019507..562d6e95e71 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-attribute-basic.html.ini @@ -63,9 +63,6 @@ [Removing a visible popover=auto element from the document should close the popover] expected: FAIL - [A showing popover=auto does not match :modal] - expected: FAIL - [Removing a visible popover=hint element from the document should close the popover] expected: FAIL @@ -75,9 +72,6 @@ [Removing a visible popover=manual element from the document should close the popover] expected: FAIL - [A showing popover=manual does not match :modal] - expected: FAIL - [Changing the popover type in a "beforetoggle" event handler should throw an exception (during showPopover())] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-beforetoggle-opening-event.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-beforetoggle-opening-event.html.ini deleted file mode 100644 index 5fa1dad959b..00000000000 --- a/testing/web-platform/meta/html/semantics/popovers/popover-beforetoggle-opening-event.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[popover-beforetoggle-opening-event.html] - [Ensure the `beforetoggle` event can be used to populate content before the popover renders] - expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-focus-2.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-focus-2.html.ini index c531945b842..eaa6f529acf 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-focus-2.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-focus-2.html.ini @@ -4,3 +4,6 @@ [Popover focus returns when popover is hidden by invoker] expected: FAIL + + [Circular reference tab navigation] + expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-focus-child-dialog.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-focus-child-dialog.html.ini index 3d4bebe7af6..2323b5ede93 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-focus-child-dialog.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-focus-child-dialog.html.ini @@ -1,7 +1,4 @@ [popover-focus-child-dialog.html] + max-asserts: 2 expected: if (os == "android") and fission: [ERROR, TIMEOUT] - ERROR - max-asserts: 2 - [Popovers should not initially focus child popover elements.] - expected: NOTRUN diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-light-dismiss.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-light-dismiss.html.ini index afee3b89473..376980ad82b 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-light-dismiss.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-light-dismiss.html.ini @@ -24,9 +24,6 @@ [Clicking inside a parent popover should close child popover] expected: FAIL - [Clicking on invoking element, after using it for activation, shouldn't close its popover] - expected: FAIL - [Clicking on invoking element, after using it for activation, shouldn't close its popover (nested case)] expected: FAIL @@ -58,10 +55,7 @@ expected: FAIL [Scrolling within a popover should not close the popover] - expected: FAIL - - [Moving focus back to the anchor element should not dismiss the popover] - expected: FAIL + expected: [FAIL, PASS] [Ensure circular/convoluted ancestral relationships are functional] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-not-keyboard-focusable.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-not-keyboard-focusable.html.ini deleted file mode 100644 index 582f5d5fff5..00000000000 --- a/testing/web-platform/meta/html/semantics/popovers/popover-not-keyboard-focusable.html.ini +++ /dev/null @@ -1,3 +0,0 @@ -[popover-not-keyboard-focusable.html] - [Popover should not be keyboard focusable] - expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-shadow-dom.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-shadow-dom.html.ini index 5de9b62887d..f81d6832696 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-shadow-dom.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-shadow-dom.html.ini @@ -1,7 +1,4 @@ [popover-shadow-dom.html] - [Popovers located inside shadow DOM can still be shown] - expected: FAIL - [anchor references do not cross shadow boundaries] expected: FAIL diff --git a/testing/web-platform/meta/html/semantics/popovers/popover-top-layer-interactions.html.ini b/testing/web-platform/meta/html/semantics/popovers/popover-top-layer-interactions.html.ini index fb271dec444..6911d7a45ab 100644 --- a/testing/web-platform/meta/html/semantics/popovers/popover-top-layer-interactions.html.ini +++ b/testing/web-platform/meta/html/semantics/popovers/popover-top-layer-interactions.html.ini @@ -1,28 +1,12 @@ [popover-top-layer-interactions.html] - expected: ERROR [A Popover API should close a Popover API] expected: FAIL [A Modal Dialog should close a Popover API] - expected: NOTRUN + expected: FAIL [A Fullscreen Element should close a Popover API] - expected: NOTRUN - - [A Popover API should *not* close a Modal Dialog] - expected: NOTRUN - - [A Popover API should *not* close a Fullscreen Element] - expected: NOTRUN + expected: FAIL [A Fullscreen Element should *not* close a Fullscreen Element] - expected: NOTRUN - - [A Modal Dialog should *not* close a Modal Dialog] - expected: NOTRUN - - [A Fullscreen Element should *not* close a Modal Dialog] - expected: NOTRUN - - [A Modal Dialog should *not* close a Fullscreen Element] - expected: NOTRUN + expected: FAIL diff --git a/testing/web-platform/meta/infrastructure/server/__dir__.ini b/testing/web-platform/meta/infrastructure/server/__dir__.ini index bbdcef0e3e7..fac13d9e92a 100644 --- a/testing/web-platform/meta/infrastructure/server/__dir__.ini +++ b/testing/web-platform/meta/infrastructure/server/__dir__.ini @@ -1,2 +1,3 @@ lsan-disabled: true leak-threshold: [default:51200, tab:51200] +prefs: [network.webtransport.enabled:true, network.webtransport.datagrams.enabled:true, security.OCSP.enabled:0] diff --git a/testing/web-platform/meta/infrastructure/server/webtransport-h3.https.sub.any.js.ini b/testing/web-platform/meta/infrastructure/server/webtransport-h3.https.sub.any.js.ini index 30cfb8576b6..144b5495c0c 100644 --- a/testing/web-platform/meta/infrastructure/server/webtransport-h3.https.sub.any.js.ini +++ b/testing/web-platform/meta/infrastructure/server/webtransport-h3.https.sub.any.js.ini @@ -1,26 +1,37 @@ [webtransport-h3.https.sub.any.sharedworker.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + [OK, TIMEOUT] [WebTransport server should be running and should handle a bidirectional stream] - expected: FAIL + expected: + if (os == "android"): [FAIL, TIMEOUT] + [PASS, TIMEOUT] [webtransport-h3.https.sub.any.serviceworker.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "android"): [OK, TIMEOUT] + [WebTransport server should be running and should handle a bidirectional stream] - expected: FAIL + expected: + if (os == "android"): [FAIL, TIMEOUT] + [PASS, TIMEOUT] [webtransport-h3.https.sub.any.worker.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "android"): [OK, TIMEOUT] + [WebTransport server should be running and should handle a bidirectional stream] - expected: FAIL + expected: + if (os == "android"): [FAIL, TIMEOUT] + [PASS, TIMEOUT] [webtransport-h3.https.sub.any.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "android"): [OK, TIMEOUT] + [WebTransport server should be running and should handle a bidirectional stream] - expected: FAIL + expected: + if (os == "android"): [FAIL, TIMEOUT] + [PASS, TIMEOUT] diff --git a/testing/web-platform/meta/scroll-animations/css/animation-timeline-ignored.tentative.html.ini b/testing/web-platform/meta/scroll-animations/css/animation-timeline-ignored.tentative.html.ini index 4b9a1881a42..95efea2688a 100644 --- a/testing/web-platform/meta/scroll-animations/css/animation-timeline-ignored.tentative.html.ini +++ b/testing/web-platform/meta/scroll-animations/css/animation-timeline-ignored.tentative.html.ini @@ -13,4 +13,4 @@ [Changing animation-timeline changes the timeline (sanity check)] expected: - if (os == "android") and not debug: [PASS, FAIL] + if os == "android": FAIL diff --git a/testing/web-platform/meta/webtransport/__dir__.ini b/testing/web-platform/meta/webtransport/__dir__.ini new file mode 100644 index 00000000000..f1de1c26f6c --- /dev/null +++ b/testing/web-platform/meta/webtransport/__dir__.ini @@ -0,0 +1,4 @@ +prefs: [network.webtransport.enabled:true, network.webtransport.datagrams.enabled:true, security.OCSP.enabled:0] +# OCSP is disabled for this directory because we get errors from attempts to access the internet with it on +disabled: + if os == "android": 1823759 diff --git a/testing/web-platform/meta/webtransport/close.https.any.js.ini b/testing/web-platform/meta/webtransport/close.https.any.js.ini index 84df8b9f317..78af9bf0af4 100644 --- a/testing/web-platform/meta/webtransport/close.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/close.https.any.js.ini @@ -1,81 +1,86 @@ [close.https.any.sharedworker.html] + expected: + [OK, TIMEOUT] [close] - expected: FAIL + expected: [PASS, TIMEOUT] [close with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and long reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated closure with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated connection closure] - expected: FAIL + expected: [FAIL, TIMEOUT, NOTRUN] [server initiated closure without code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close.https.any.worker.html] + expected: + [OK, TIMEOUT] [close] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and long reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated closure with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated connection closure] - expected: FAIL + expected: [FAIL, TIMEOUT, NOTRUN] [server initiated closure without code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close.https.any.serviceworker.html] expected: - if (os == "win") and not debug and (processor == "x86_64") and (version == "10.0.22621"): [OK, TIMEOUT] - if (os == "win") and not debug and (processor == "x86_64") and (version == "10.0.19041"): [OK, TIMEOUT] + [OK, TIMEOUT] [close] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and long reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated closure with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated connection closure] - expected: FAIL + expected: [FAIL, TIMEOUT, NOTRUN] [server initiated closure without code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close.https.any.html] + expected: + [OK, TIMEOUT] [close] - expected: FAIL + expected: [PASS, TIMEOUT] [close with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [close with code and long reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated closure with code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [server initiated connection closure] - expected: FAIL + expected: [FAIL, TIMEOUT, NOTRUN] [server initiated closure without code and reason] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] diff --git a/testing/web-platform/meta/webtransport/connect.https.any.js.ini b/testing/web-platform/meta/webtransport/connect.https.any.js.ini index cfbef444e91..0ba4ae474a5 100644 --- a/testing/web-platform/meta/webtransport/connect.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/connect.https.any.js.ini @@ -1,92 +1,102 @@ [connect.https.any.html] + expected: + if (os == "android"): [OK, TIMEOUT] + [WebTransport session is established with status code 200] - expected: FAIL + [PASS, TIMEOUT] [WebTransport session is established with status code 204] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 301] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment with status code 401] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 404] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Echo back request headers] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Cookie header is not echoed back] - expected: FAIL - - -[connect.https.any.sharedworker.html] - [WebTransport session is established with status code 200] - expected: FAIL - - [WebTransport session is established with status code 204] - expected: FAIL - - [WebTransport session establishment fails with status code 301] - expected: FAIL - - [WebTransport session establishment with status code 401] - expected: FAIL - - [WebTransport session establishment fails with status code 404] - expected: FAIL - - [Echo back request headers] - expected: FAIL - - [Cookie header is not echoed back] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [connect.https.any.worker.html] + expected: + if (os == "android"): [OK, TIMEOUT] + [WebTransport session is established with status code 200] - expected: FAIL + [PASS, TIMEOUT] [WebTransport session is established with status code 204] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 301] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment with status code 401] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 404] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Echo back request headers] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Cookie header is not echoed back] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [connect.https.any.serviceworker.html] expected: - if (os == "win") and not debug and (processor == "x86_64"): [OK, TIMEOUT] + if (os == "android"): [OK, TIMEOUT] + [WebTransport session is established with status code 200] - expected: FAIL + [PASS, TIMEOUT] [WebTransport session is established with status code 204] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 301] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment with status code 401] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [WebTransport session establishment fails with status code 404] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Echo back request headers] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] [Cookie header is not echoed back] - expected: FAIL + [PASS, TIMEOUT, NOTRUN] + + +[connect.https.any.sharedworker.html] + expected: + if (os == "android"): [OK, TIMEOUT] + + [WebTransport session is established with status code 200] + [PASS, TIMEOUT] + + [WebTransport session is established with status code 204] + [PASS, TIMEOUT, NOTRUN] + + [WebTransport session establishment fails with status code 301] + [PASS, TIMEOUT, NOTRUN] + + [WebTransport session establishment with status code 401] + [PASS, TIMEOUT, NOTRUN] + + [WebTransport session establishment fails with status code 404] + [PASS, TIMEOUT, NOTRUN] + + [Echo back request headers] + [PASS, TIMEOUT, NOTRUN] + + [Cookie header is not echoed back] + [PASS, TIMEOUT, NOTRUN] diff --git a/testing/web-platform/meta/webtransport/constructor.https.any.js.ini b/testing/web-platform/meta/webtransport/constructor.https.any.js.ini index 46de2342157..41358269ea7 100644 --- a/testing/web-platform/meta/webtransport/constructor.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/constructor.https.any.js.ini @@ -1,200 +1,19 @@ -[constructor.https.any.serviceworker.html] - expected: - if (os == "win") and not debug and (processor == "x86_64"): [OK, TIMEOUT] - [WebTransport constructor should reject URL 'null'] - expected: FAIL - - [WebTransport constructor should reject URL ''] - expected: FAIL - - [WebTransport constructor should reject URL 'no-scheme'] - expected: FAIL - - [WebTransport constructor should reject URL 'http://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'quic-transport://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'https:///'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://example.com/#failing'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://web-platform.test:999999/'] - expected: FAIL - - [Connection to port 0 should fail] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true}] - expected: FAIL - - [WebTransport constructor should allow options {"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"default"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"throughput"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"low-latency"}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true,"congestionControl":"low-latency"}] - expected: FAIL - - [constructor.https.any.html] - [WebTransport constructor should reject URL 'null'] - expected: FAIL - - [WebTransport constructor should reject URL ''] - expected: FAIL - - [WebTransport constructor should reject URL 'no-scheme'] - expected: FAIL - - [WebTransport constructor should reject URL 'http://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'quic-transport://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'https:///'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://example.com/#failing'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://web-platform.test:999999/'] - expected: FAIL - - [Connection to port 0 should fail] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true}] - expected: FAIL - - [WebTransport constructor should allow options {"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"default"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"throughput"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"low-latency"}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true,"congestionControl":"low-latency"}] - expected: FAIL - - -[constructor.https.any.sharedworker.html] - [WebTransport constructor should reject URL 'null'] - expected: FAIL - - [WebTransport constructor should reject URL ''] - expected: FAIL - - [WebTransport constructor should reject URL 'no-scheme'] - expected: FAIL - - [WebTransport constructor should reject URL 'http://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'quic-transport://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'https:///'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://example.com/#failing'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://web-platform.test:999999/'] - expected: FAIL - - [Connection to port 0 should fail] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true}] - expected: FAIL - - [WebTransport constructor should allow options {"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"default"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"throughput"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"low-latency"}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true,"congestionControl":"low-latency"}] - expected: FAIL - + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] [constructor.https.any.worker.html] - [WebTransport constructor should reject URL 'null'] - expected: FAIL + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] - [WebTransport constructor should reject URL ''] - expected: FAIL +[constructor.https.any.serviceworker.html] + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] - [WebTransport constructor should reject URL 'no-scheme'] - expected: FAIL - - [WebTransport constructor should reject URL 'http://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'quic-transport://example.com/'] - expected: FAIL - - [WebTransport constructor should reject URL 'https:///'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://example.com/#failing'] - expected: FAIL - - [WebTransport constructor should reject URL 'https://web-platform.test:999999/'] - expected: FAIL - - [Connection to port 0 should fail] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true}] - expected: FAIL - - [WebTransport constructor should allow options {"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"default"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"throughput"}] - expected: FAIL - - [WebTransport constructor should allow options {"congestionControl":"low-latency"}] - expected: FAIL - - [WebTransport constructor should allow options {"allowPooling":true,"requireUnreliable":true,"congestionControl":"low-latency"}] - expected: FAIL +[constructor.https.any.sharedworker.html] + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] diff --git a/testing/web-platform/meta/webtransport/csp-fail.https.window.js.ini b/testing/web-platform/meta/webtransport/csp-fail.https.window.js.ini index 21971dc11a8..0879ba83be2 100644 --- a/testing/web-platform/meta/webtransport/csp-fail.https.window.js.ini +++ b/testing/web-platform/meta/webtransport/csp-fail.https.window.js.ini @@ -1,5 +1,6 @@ [csp-fail.https.window.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] + if (os == "android"): [OK, TIMEOUT] + [OK] [WebTransport connection should fail when CSP connect-src is set to none and reject the promises] expected: FAIL diff --git a/testing/web-platform/meta/webtransport/csp-pass.https.window.js.ini b/testing/web-platform/meta/webtransport/csp-pass.https.window.js.ini index 79ca4356f0c..bf0d1d93b0e 100644 --- a/testing/web-platform/meta/webtransport/csp-pass.https.window.js.ini +++ b/testing/web-platform/meta/webtransport/csp-pass.https.window.js.ini @@ -1,5 +1,5 @@ [csp-pass.https.window.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] - [WebTransport connection should succeed when CSP connect-src destination is set to the page] - expected: FAIL + if (os == "android"): [OK, TIMEOUT] + [OK] + diff --git a/testing/web-platform/meta/webtransport/datagram-cancel-crash.https.window.js.ini b/testing/web-platform/meta/webtransport/datagram-cancel-crash.https.window.js.ini index 6798633c50a..44b64eb9aa4 100644 --- a/testing/web-platform/meta/webtransport/datagram-cancel-crash.https.window.js.ini +++ b/testing/web-platform/meta/webtransport/datagram-cancel-crash.https.window.js.ini @@ -1,5 +1,4 @@ [datagram-cancel-crash.https.window.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] - [call cancel() on stream in destroyed realm] - expected: FAIL + if (os == "android"): [OK, TIMEOUT] + [OK] diff --git a/testing/web-platform/meta/webtransport/datagrams.https.any.js.ini b/testing/web-platform/meta/webtransport/datagrams.https.any.js.ini index 6e3d098e6c9..c33d000da37 100644 --- a/testing/web-platform/meta/webtransport/datagrams.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/datagrams.https.any.js.ini @@ -1,15 +1,7 @@ [datagrams.https.any.html] - [Datagrams are echoed successfully] - expected: FAIL - - [Sending and receiving datagrams is ready to use before session is established] - expected: FAIL - - [Datagram's outgoingHighWaterMark correctly regulates written datagrams] - expected: FAIL - - [Datagrams read is less than or equal to the incomingHighWaterMark] - expected: FAIL + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] [Successfully reading datagrams with BYOB reader.] expected: FAIL @@ -17,21 +9,17 @@ [Reading datagrams with insufficient buffer should be rejected.] expected: FAIL + [Datagram's outgoingHighWaterMark correctly regulates written datagrams] + expected: FAIL + + [Datagrams read is less than or equal to the incomingHighWaterMark] + expected: [PASS, FAIL] + [datagrams.https.any.serviceworker.html] expected: - if (os == "win") and not debug and (processor == "x86_64"): [OK, TIMEOUT] - [Datagrams are echoed successfully] - expected: FAIL - - [Sending and receiving datagrams is ready to use before session is established] - expected: FAIL - - [Datagram's outgoingHighWaterMark correctly regulates written datagrams] - expected: FAIL - - [Datagrams read is less than or equal to the incomingHighWaterMark] - expected: FAIL + if (os == "android"): [OK, TIMEOUT] + [OK] [Successfully reading datagrams with BYOB reader.] expected: FAIL @@ -39,42 +27,44 @@ [Reading datagrams with insufficient buffer should be rejected.] expected: FAIL - -[datagrams.https.any.sharedworker.html] - [Datagrams are echoed successfully] - expected: FAIL - - [Sending and receiving datagrams is ready to use before session is established] - expected: FAIL - [Datagram's outgoingHighWaterMark correctly regulates written datagrams] expected: FAIL [Datagrams read is less than or equal to the incomingHighWaterMark] - expected: FAIL - - [Successfully reading datagrams with BYOB reader.] - expected: FAIL - - [Reading datagrams with insufficient buffer should be rejected.] - expected: FAIL + expected: [PASS, FAIL] [datagrams.https.any.worker.html] - [Datagrams are echoed successfully] - expected: FAIL - - [Sending and receiving datagrams is ready to use before session is established] - expected: FAIL - - [Datagram's outgoingHighWaterMark correctly regulates written datagrams] - expected: FAIL - - [Datagrams read is less than or equal to the incomingHighWaterMark] - expected: FAIL + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] [Successfully reading datagrams with BYOB reader.] expected: FAIL [Reading datagrams with insufficient buffer should be rejected.] expected: FAIL + + [Datagram's outgoingHighWaterMark correctly regulates written datagrams] + expected: FAIL + + [Datagrams read is less than or equal to the incomingHighWaterMark] + expected: [PASS, FAIL] + + +[datagrams.https.any.sharedworker.html] + expected: + if (os == "android"): [OK, TIMEOUT] + [OK] + + [Successfully reading datagrams with BYOB reader.] + expected: FAIL + + [Reading datagrams with insufficient buffer should be rejected.] + expected: FAIL + + [Datagram's outgoingHighWaterMark correctly regulates written datagrams] + expected: FAIL + + [Datagrams read is less than or equal to the incomingHighWaterMark] + expected: [PASS, FAIL] diff --git a/testing/web-platform/meta/webtransport/idlharness.https.any.js.ini b/testing/web-platform/meta/webtransport/idlharness.https.any.js.ini deleted file mode 100644 index 64ae2fba6ab..00000000000 --- a/testing/web-platform/meta/webtransport/idlharness.https.any.js.ini +++ /dev/null @@ -1,938 +0,0 @@ -[idlharness.https.any.sharedworker.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [idl_test setup] - expected: FAIL - - [WebTransport interface: existence and properties of interface object] - expected: FAIL - - [WebTransport interface object length] - expected: FAIL - - [WebTransport interface object name] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute ready] - expected: FAIL - - [WebTransport interface: attribute closed] - expected: FAIL - - [WebTransport interface: operation close(optional WebTransportCloseInfo)] - expected: FAIL - - [WebTransport interface: attribute datagrams] - expected: FAIL - - [WebTransport interface: attribute incomingBidirectionalStreams] - expected: FAIL - - [WebTransport interface: attribute incomingUnidirectionalStreams] - expected: FAIL - - [WebTransport must be primary interface of webTransport] - expected: FAIL - - [Stringification of webTransport] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "getStats()" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "ready" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "closed" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type] - expected: FAIL - - [WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "datagrams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute maxDatagramSize] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingHighWaterMark] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingMaxAge] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingHighWaterMark] - expected: FAIL - - [WebTransportError interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute writable] - expected: FAIL - - [WebTransportError interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface object name] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface object length] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportError interface: attribute source] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute writable] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingMaxAge] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportError interface: attribute streamErrorCode] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: attribute reliability] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "reliability" with the proper type] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportSendStream interface object length] - expected: FAIL - - [WebTransportSendStream interface object name] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportSendStream interface: operation getStats()] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportReceiveStream interface object length] - expected: FAIL - - [WebTransportReceiveStream interface object name] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportReceiveStream interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute congestionControl] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "congestionControl" with the proper type] - expected: FAIL - - [WebTransport interface: operation createBidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: operation createUnidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createBidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createBidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createUnidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - -[idlharness.https.any.worker.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [idl_test setup] - expected: FAIL - - [WebTransport interface: existence and properties of interface object] - expected: FAIL - - [WebTransport interface object length] - expected: FAIL - - [WebTransport interface object name] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute ready] - expected: FAIL - - [WebTransport interface: attribute closed] - expected: FAIL - - [WebTransport interface: operation close(optional WebTransportCloseInfo)] - expected: FAIL - - [WebTransport interface: attribute datagrams] - expected: FAIL - - [WebTransport interface: attribute incomingBidirectionalStreams] - expected: FAIL - - [WebTransport interface: attribute incomingUnidirectionalStreams] - expected: FAIL - - [WebTransport must be primary interface of webTransport] - expected: FAIL - - [Stringification of webTransport] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "getStats()" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "ready" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "closed" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type] - expected: FAIL - - [WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "datagrams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute maxDatagramSize] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingHighWaterMark] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingMaxAge] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingHighWaterMark] - expected: FAIL - - [WebTransportError interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute writable] - expected: FAIL - - [WebTransportError interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface object name] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface object length] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportError interface: attribute source] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute writable] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingMaxAge] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportError interface: attribute streamErrorCode] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: attribute reliability] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "reliability" with the proper type] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportSendStream interface object length] - expected: FAIL - - [WebTransportSendStream interface object name] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportSendStream interface: operation getStats()] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportReceiveStream interface object length] - expected: FAIL - - [WebTransportReceiveStream interface object name] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportReceiveStream interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute congestionControl] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "congestionControl" with the proper type] - expected: FAIL - - [WebTransport interface: operation createBidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: operation createUnidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createBidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createBidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createUnidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - -[idlharness.https.any.serviceworker.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [idl_test setup] - expected: FAIL - - [WebTransport interface: existence and properties of interface object] - expected: FAIL - - [WebTransport interface object length] - expected: FAIL - - [WebTransport interface object name] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute ready] - expected: FAIL - - [WebTransport interface: attribute closed] - expected: FAIL - - [WebTransport interface: operation close(optional WebTransportCloseInfo)] - expected: FAIL - - [WebTransport interface: attribute datagrams] - expected: FAIL - - [WebTransport interface: attribute incomingBidirectionalStreams] - expected: FAIL - - [WebTransport interface: attribute incomingUnidirectionalStreams] - expected: FAIL - - [WebTransport must be primary interface of webTransport] - expected: FAIL - - [Stringification of webTransport] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "getStats()" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "ready" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "closed" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type] - expected: FAIL - - [WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "datagrams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute maxDatagramSize] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingHighWaterMark] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingMaxAge] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingHighWaterMark] - expected: FAIL - - [WebTransportError interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute writable] - expected: FAIL - - [WebTransportError interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface object name] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface object length] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportError interface: attribute source] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute writable] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingMaxAge] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportError interface: attribute streamErrorCode] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: attribute reliability] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "reliability" with the proper type] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportSendStream interface object length] - expected: FAIL - - [WebTransportSendStream interface object name] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportSendStream interface: operation getStats()] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportReceiveStream interface object length] - expected: FAIL - - [WebTransportReceiveStream interface object name] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportReceiveStream interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute congestionControl] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "congestionControl" with the proper type] - expected: FAIL - - [WebTransport interface: operation createBidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: operation createUnidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createBidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createBidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createUnidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - -[idlharness.https.any.html] - expected: - if (os == "android") and fission: [OK, TIMEOUT] - [idl_test setup] - expected: FAIL - - [WebTransport interface: existence and properties of interface object] - expected: FAIL - - [WebTransport interface object length] - expected: FAIL - - [WebTransport interface object name] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransport interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute ready] - expected: FAIL - - [WebTransport interface: attribute closed] - expected: FAIL - - [WebTransport interface: operation close(optional WebTransportCloseInfo)] - expected: FAIL - - [WebTransport interface: attribute datagrams] - expected: FAIL - - [WebTransport interface: attribute incomingBidirectionalStreams] - expected: FAIL - - [WebTransport interface: attribute incomingUnidirectionalStreams] - expected: FAIL - - [WebTransport must be primary interface of webTransport] - expected: FAIL - - [Stringification of webTransport] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "getStats()" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "ready" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "closed" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "close(optional WebTransportCloseInfo)" with the proper type] - expected: FAIL - - [WebTransport interface: calling close(optional WebTransportCloseInfo) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "datagrams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingBidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "incomingUnidirectionalStreams" with the proper type] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute maxDatagramSize] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingHighWaterMark] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingMaxAge] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute incomingHighWaterMark] - expected: FAIL - - [WebTransportError interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute writable] - expected: FAIL - - [WebTransportError interface: existence and properties of interface object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface object name] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface object name] - expected: FAIL - - [WebTransportBidirectionalStream interface object length] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportError interface: attribute source] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute writable] - expected: FAIL - - [WebTransportDatagramDuplexStream interface object length] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: attribute outgoingMaxAge] - expected: FAIL - - [WebTransportBidirectionalStream interface: attribute readable] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportError interface: attribute streamErrorCode] - expected: FAIL - - [WebTransportBidirectionalStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportError interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportDatagramDuplexStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransport interface: attribute reliability] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "reliability" with the proper type] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportSendStream interface object length] - expected: FAIL - - [WebTransportSendStream interface object name] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportSendStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportSendStream interface: operation getStats()] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface object] - expected: FAIL - - [WebTransportReceiveStream interface object length] - expected: FAIL - - [WebTransportReceiveStream interface object name] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's "constructor" property] - expected: FAIL - - [WebTransportReceiveStream interface: existence and properties of interface prototype object's @@unscopables property] - expected: FAIL - - [WebTransportReceiveStream interface: operation getStats()] - expected: FAIL - - [WebTransport interface: attribute congestionControl] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "congestionControl" with the proper type] - expected: FAIL - - [WebTransport interface: operation createBidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: operation createUnidirectionalStream(optional WebTransportSendStreamOptions)] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createBidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createBidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL - - [WebTransport interface: webTransport must inherit property "createUnidirectionalStream(optional WebTransportSendStreamOptions)" with the proper type] - expected: FAIL - - [WebTransport interface: calling createUnidirectionalStream(optional WebTransportSendStreamOptions) on webTransport with too few arguments must throw TypeError] - expected: FAIL diff --git a/testing/web-platform/meta/webtransport/in-removed-iframe.https.html.ini b/testing/web-platform/meta/webtransport/in-removed-iframe.https.html.ini index 57f1a368663..5a771f292db 100644 --- a/testing/web-platform/meta/webtransport/in-removed-iframe.https.html.ini +++ b/testing/web-platform/meta/webtransport/in-removed-iframe.https.html.ini @@ -1,5 +1,4 @@ -[in-removed-iframe.https.html] +[in-removed-iframe.https.window.html] expected: - if (os == "android") and fission: [OK, TIMEOUT] - [in-removed-iframe] - expected: FAIL + if (os == "android"): [OK, TIMEOUT] + [OK] diff --git a/testing/web-platform/meta/webtransport/streams-close.https.any.js.ini b/testing/web-platform/meta/webtransport/streams-close.https.any.js.ini index e87b959aab3..8d120bca955 100644 --- a/testing/web-platform/meta/webtransport/streams-close.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/streams-close.https.any.js.ini @@ -1,12 +1,15 @@ [streams-close.https.any.worker.html] + expected: + [OK, TIMEOUT] + [Close outgoing stream / bidi-1] - expected: FAIL + expected: PASS [Close outgoing stream / bidi-2] - expected: FAIL + expected: PASS [Close outgoing stream / uni] - expected: FAIL + expected: PASS [Abort client-created bidirectional stream] expected: FAIL @@ -24,21 +27,24 @@ expected: FAIL [STOP_SENDING coming from server] - expected: FAIL + expected: TIMEOUT [RESET_STREAM coming from server] - expected: FAIL + expected: NOTRUN [streams-close.https.any.html] + expected: + [OK, TIMEOUT] + [Close outgoing stream / bidi-1] - expected: FAIL + expected: PASS [Close outgoing stream / bidi-2] - expected: FAIL + expected: PASS [Close outgoing stream / uni] - expected: FAIL + expected: PASS [Abort client-created bidirectional stream] expected: FAIL @@ -56,21 +62,24 @@ expected: FAIL [STOP_SENDING coming from server] - expected: FAIL + expected: TIMEOUT [RESET_STREAM coming from server] - expected: FAIL + expected: NOTRUN [streams-close.https.any.sharedworker.html] + expected: + [OK, TIMEOUT] + [Close outgoing stream / bidi-1] - expected: FAIL + expected: PASS [Close outgoing stream / bidi-2] - expected: FAIL + expected: PASS [Close outgoing stream / uni] - expected: FAIL + expected: PASS [Abort client-created bidirectional stream] expected: FAIL @@ -88,23 +97,24 @@ expected: FAIL [STOP_SENDING coming from server] - expected: FAIL + expected: TIMEOUT [RESET_STREAM coming from server] - expected: FAIL + expected: NOTRUN [streams-close.https.any.serviceworker.html] expected: - if (os == "win") and not debug and (processor == "x86_64"): [OK, TIMEOUT] + [OK, TIMEOUT] + [Close outgoing stream / bidi-1] - expected: FAIL + expected: PASS [Close outgoing stream / bidi-2] - expected: FAIL + expected: PASS [Close outgoing stream / uni] - expected: FAIL + expected: PASS [Abort client-created bidirectional stream] expected: FAIL @@ -122,7 +132,7 @@ expected: FAIL [STOP_SENDING coming from server] - expected: FAIL + expected: TIMEOUT [RESET_STREAM coming from server] - expected: FAIL + expected: NOTRUN diff --git a/testing/web-platform/meta/webtransport/streams-echo.https.any.js.ini b/testing/web-platform/meta/webtransport/streams-echo.https.any.js.ini index 45f25bf23b4..bee336c9d69 100644 --- a/testing/web-platform/meta/webtransport/streams-echo.https.any.js.ini +++ b/testing/web-platform/meta/webtransport/streams-echo.https.any.js.ini @@ -1,69 +1,103 @@ -[streams-echo.https.any.sharedworker.html] - [WebTransport server should be able to create and handle a bidirectional stream] - expected: FAIL - - [WebTransport server should be able to accept and handle a bidirectional stream] - expected: FAIL - - [WebTransport server should be able to create, accept, and handle a unidirectional stream] - expected: FAIL - - [Can read data from a bidirectional stream with BYOB reader] - expected: FAIL - - [Can read data from a unidirectional stream with BYOB reader] - expected: FAIL - - [streams-echo.https.any.html] + expected: + [OK, TIMEOUT] + [WebTransport server should be able to create and handle a bidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT] [WebTransport server should be able to accept and handle a bidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [WebTransport server should be able to create, accept, and handle a unidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [Can read data from a bidirectional stream with BYOB reader] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [Can read data from a unidirectional stream with BYOB reader] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + +[streams-echo.https.any.worker.html] + expected: + [OK, TIMEOUT] + + [WebTransport server should be able to create and handle a bidirectional stream] + expected: [PASS, TIMEOUT] + + [WebTransport server should be able to accept and handle a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [WebTransport server should be able to create, accept, and handle a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [Can read data from a bidirectional stream with BYOB reader] + expected: [PASS, TIMEOUT, NOTRUN] + + [Can read data from a unidirectional stream with BYOB reader] + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + +[streams-echo.https.any.sharedworker.html] + expected: + [OK, TIMEOUT] + + [WebTransport server should be able to create and handle a bidirectional stream] + expected: [PASS, TIMEOUT] + + [WebTransport server should be able to accept and handle a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [WebTransport server should be able to create, accept, and handle a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [Can read data from a bidirectional stream with BYOB reader] + expected: [PASS, TIMEOUT, NOTRUN] + + [Can read data from a unidirectional stream with BYOB reader] + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] + + [Transfer large chunks of data on a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] [streams-echo.https.any.serviceworker.html] expected: - if (os == "win") and not debug and (processor == "x86"): [OK, TIMEOUT] - if (os == "win") and not debug and (processor == "x86_64"): [OK, TIMEOUT] + [OK, TIMEOUT] + [WebTransport server should be able to create and handle a bidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT] [WebTransport server should be able to accept and handle a bidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [WebTransport server should be able to create, accept, and handle a unidirectional stream] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [Can read data from a bidirectional stream with BYOB reader] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] [Can read data from a unidirectional stream with BYOB reader] - expected: FAIL + expected: [PASS, TIMEOUT, NOTRUN] + [Transfer large chunks of data on a bidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] -[streams-echo.https.any.worker.html] - [WebTransport server should be able to create and handle a bidirectional stream] - expected: FAIL + [Transfer large chunks of data on a unidirectional stream] + expected: [PASS, TIMEOUT, NOTRUN] - [WebTransport server should be able to accept and handle a bidirectional stream] - expected: FAIL - - [WebTransport server should be able to create, accept, and handle a unidirectional stream] - expected: FAIL - - [Can read data from a bidirectional stream with BYOB reader] - expected: FAIL - - [Can read data from a unidirectional stream with BYOB reader] - expected: FAIL diff --git a/testing/web-platform/meta/workers/importscripts_mime_local.any.js.ini b/testing/web-platform/meta/workers/importscripts_mime_local.any.js.ini index b9c279f4832..1a29e06370c 100644 --- a/testing/web-platform/meta/workers/importscripts_mime_local.any.js.ini +++ b/testing/web-platform/meta/workers/importscripts_mime_local.any.js.ini @@ -1,218 +1,290 @@ [importscripts_mime_local.any.worker.html] [importScripts() requires scripty MIME types for data: URLs: image/png is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: video/mpeg is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/plain is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: application/xml is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: application/octet-stream is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/potato is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: potato/text is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: aaa/aaa is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: zzz/zzz is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv; charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv;charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv;bla;bla is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: Text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/Html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: TeXt/HtMl is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: TEXT/HTML is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: image/png is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: video/mpeg is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/plain is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: application/xml is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: application/octet-stream is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/potato is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: potato/text is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: aaa/aaa is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: zzz/zzz is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv; charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv;charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv;bla;bla is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: Text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/Html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: TeXt/HtMl is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: TEXT/HTML is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importscripts_mime_local.any.sharedworker.html] [importScripts() requires scripty MIME types for data: URLs: image/png is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: video/mpeg is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/plain is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: application/xml is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: application/octet-stream is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/potato is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: potato/text is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: aaa/aaa is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: zzz/zzz is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv; charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv;charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/csv;bla;bla is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: Text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: text/Html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: TeXt/HtMl is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for data: URLs: TEXT/HTML is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: image/png is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: video/mpeg is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/plain is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: application/xml is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: application/octet-stream is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/potato is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: potato/text is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: aaa/aaa is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: zzz/zzz is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv; charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv;charset=utf-8 is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/csv;bla;bla is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: Text/html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: text/Html is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: TeXt/HtMl is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL [importScripts() requires scripty MIME types for blob: URLs: TEXT/HTML is blocked.] - expected: FAIL + expected: + if release_or_beta: FAIL diff --git a/testing/web-platform/tests/css/css-color/parsing/color-valid-color-mix-function.html b/testing/web-platform/tests/css/css-color/parsing/color-valid-color-mix-function.html index cbd8e3a1911..9501eb121c9 100644 --- a/testing/web-platform/tests/css/css-color/parsing/color-valid-color-mix-function.html +++ b/testing/web-platform/tests/css/css-color/parsing/color-valid-color-mix-function.html @@ -21,15 +21,15 @@ test_valid_value(`color`, `color-mix(in hsl, red calc(20%), blue)`, `color-mix(in hsl, red calc(20%), blue)`); test_valid_value(`color`, `color-mix(in hsl, red calc(var(--v)*1%), blue)`, `color-mix(in hsl, red calc(var(--v)*1%), blue)`); test_valid_value(`color`, `color-mix(in hsl, currentcolor, blue)`, `color-mix(in hsl, currentcolor, blue)`); - test_valid_value(`color`, `color-mix(in hsl, red 60%, blue 40%)`, `color-mix(in hsl, red 60%, blue 40%)`); + test_valid_value(`color`, `color-mix(in hsl, red 60%, blue 40%)`, `color-mix(in hsl, red 60%, blue)`); test_valid_value(`color`, `color-mix(in lch decreasing hue, red, hsl(120, 100%, 50%))`, `color-mix(in lch decreasing hue, red, rgb(0, 255, 0))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`); test_valid_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20%), hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71) 25%)`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color-mix(in hsl, rgb(46, 56, 46), rgb(133, 102, 71) 25%)`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71) 75%)`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), 25% hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71))`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%), hsl(30deg 30% 40%) 25%)`, `color-mix(in hsl, rgb(46, 56, 46) 75%, rgb(133, 102, 71))`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40%) 75%)`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgb(133, 102, 71))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 30%, hsl(30deg 30% 40%) 90%)`, `color-mix(in hsl, rgb(46, 56, 46) 30%, rgb(133, 102, 71) 90%)`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 12.5%, hsl(30deg 30% 40%) 37.5%)`, `color-mix(in hsl, rgb(46, 56, 46) 12.5%, rgb(133, 102, 71) 37.5%)`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 0%, hsl(30deg 30% 40%))`, `color-mix(in hsl, rgb(46, 56, 46) 0%, rgb(133, 102, 71))`); @@ -37,9 +37,9 @@ test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20%) 25%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgb(46, 56, 46) 25%, rgba(133, 102, 71, 0.8))`); test_valid_value(`color`, `color-mix(in hsl, 25% hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8))`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4), rgba(133, 102, 71, 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8) 75%)`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), 25% hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8))`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4), hsl(30deg 30% 40% / .8) 25%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 75%, rgba(133, 102, 71, 0.8))`); + test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 25%, hsl(30deg 30% 40% / .8) 75%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 25%, rgba(133, 102, 71, 0.8))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 30%, hsl(30deg 30% 40% / .8) 90%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 30%, rgba(133, 102, 71, 0.8) 90%)`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 12.5%, hsl(30deg 30% 40% / .8) 37.5%)`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 12.5%, rgba(133, 102, 71, 0.8) 37.5%)`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 10% 20% / .4) 0%, hsl(30deg 30% 40% / .8))`, `color-mix(in hsl, rgba(46, 56, 46, 0.4) 0%, rgba(133, 102, 71, 0.8))`); @@ -90,22 +90,22 @@ test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / 0.5))`, `color-mix(in hsl, rgba(61, 143, 61, 0), rgba(143, 61, 61, 0.5))`); test_valid_value(`color`, `color-mix(in hsl, hsl(120deg 40% 40% / none), hsl(0deg 40% 40% / none))`, `color-mix(in hsl, rgba(61, 143, 61, 0), rgba(143, 61, 61, 0))`); - test_valid_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); + test_valid_value(`color`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, color(display-p3 0 1 0) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(100 116 334) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, lch(0 116 334) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hsl, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`); test_valid_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20%), hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77) 25%)`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color-mix(in hwb, rgb(26, 204, 26), rgb(153, 115, 77) 25%)`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77) 75%)`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77))`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), hwb(30deg 30% 40%) 25%)`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgb(153, 115, 77))`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 25%, hwb(30deg 30% 40%) 75%)`, `color-mix(in hwb, rgb(26, 204, 26) 25%, rgb(153, 115, 77))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 30%, hwb(30deg 30% 40%) 90%)`, `color-mix(in hwb, rgb(26, 204, 26) 30%, rgb(153, 115, 77) 90%)`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 12.5%, hwb(30deg 30% 40%) 37.5%)`, `color-mix(in hwb, rgb(26, 204, 26) 12.5%, rgb(153, 115, 77) 37.5%)`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%) 0%, hwb(30deg 30% 40%))`, `color-mix(in hwb, rgb(26, 204, 26) 0%, rgb(153, 115, 77))`); @@ -113,9 +113,9 @@ test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4), rgba(153, 115, 77, 0.8))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`); test_valid_value(`color`, `color-mix(in hwb, 25% hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgb(26, 204, 26), rgba(153, 115, 77, 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4), rgba(153, 115, 77, 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8) 75%)`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20%), 25% hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgb(26, 204, 26) 75%, rgba(153, 115, 77, 0.8))`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4), hwb(30deg 30% 40% / .8) 25%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 75%, rgba(153, 115, 77, 0.8))`); + test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 25%, hwb(30deg 30% 40% / .8) 75%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 25%, rgba(153, 115, 77, 0.8))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 30%, hwb(30deg 30% 40% / .8) 90%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 30%, rgba(153, 115, 77, 0.8) 90%)`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 12.5%, hwb(30deg 30% 40% / .8) 37.5%)`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 12.5%, rgba(153, 115, 77, 0.8) 37.5%)`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / .4) 0%, hwb(30deg 30% 40% / .8))`, `color-mix(in hwb, rgba(26, 204, 26, 0.4) 0%, rgba(153, 115, 77, 0.8))`); @@ -165,23 +165,23 @@ test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / 0.5))`, `color-mix(in hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0.5))`); test_valid_value(`color`, `color-mix(in hwb, hwb(120deg 10% 20% / none), hwb(30deg 30% 40% / none))`, `color-mix(in hwb, rgba(26, 204, 26, 0), rgba(153, 115, 77, 0))`); - test_valid_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); - test_valid_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`); + test_valid_value(`color`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, color(display-p3 0 1 0) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(100 104.3 -50.9) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lab(0 104.3 -50.9) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(100 116 334) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, lch(0 116 334) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(100 0.365 -0.16) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklab(0 0.365 -0.16) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(100 0.399 336.3) 100%, rgb(0, 0, 0))`); + test_valid_value(`color`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0) 0%)`, `color-mix(in hwb, oklch(0 0.399 336.3) 100%, rgb(0, 0, 0))`); for (const colorSpace of [ "lch", "oklch" ]) { test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg), ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 25%, ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, 25% ${colorSpace}(10 20 30deg), ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg), 25% ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg), ${colorSpace}(50 60 70deg) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 25%, ${colorSpace}(50 60 70deg) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg), 25% ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 75%, ${colorSpace}(50 60 70))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg), ${colorSpace}(50 60 70deg) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 75%, ${colorSpace}(50 60 70))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 25%, ${colorSpace}(50 60 70deg) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 30%, ${colorSpace}(50 60 70deg) 90%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 30%, ${colorSpace}(50 60 70) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 12.5%, ${colorSpace}(50 60 70deg) 37.5%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 12.5%, ${colorSpace}(50 60 70) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg) 0%, ${colorSpace}(50 60 70deg))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 0%, ${colorSpace}(50 60 70))`); @@ -189,9 +189,9 @@ test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4), ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 25%, ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, 25% ${colorSpace}(10 20 30deg / .4), ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4), 25% ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4), ${colorSpace}(50 60 70deg / .8) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 25%, ${colorSpace}(50 60 70deg / .8) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4), 25% ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 75%, ${colorSpace}(50 60 70 / 0.8))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4), ${colorSpace}(50 60 70deg / .8) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 75%, ${colorSpace}(50 60 70 / 0.8))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 25%, ${colorSpace}(50 60 70deg / .8) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 30%, ${colorSpace}(50 60 70deg / .8) 90%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 30%, ${colorSpace}(50 60 70 / 0.8) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 12.5%, ${colorSpace}(50 60 70deg / .8) 37.5%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 12.5%, ${colorSpace}(50 60 70 / 0.8) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30deg / .4) 0%, ${colorSpace}(50 60 70deg / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 0%, ${colorSpace}(50 60 70 / 0.8))`); @@ -246,9 +246,9 @@ test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, 25% ${colorSpace}(10 20 30), ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), 25% ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), 25% ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 75%, ${colorSpace}(50 60 70))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30), ${colorSpace}(50 60 70) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 75%, ${colorSpace}(50 60 70))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 25%, ${colorSpace}(50 60 70))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 30%, ${colorSpace}(50 60 70) 90%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 30%, ${colorSpace}(50 60 70) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 12.5%, ${colorSpace}(50 60 70) 37.5%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 12.5%, ${colorSpace}(50 60 70) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 0%, ${colorSpace}(50 60 70))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30) 0%, ${colorSpace}(50 60 70))`); @@ -256,9 +256,9 @@ test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4), ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 25%, ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, 25% ${colorSpace}(10 20 30 / .4), ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4), 25% ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4), ${colorSpace}(50 60 70 / .8) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4), ${colorSpace}(50 60 70 / 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 25%, ${colorSpace}(50 60 70 / .8) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4), 25% ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 75%, ${colorSpace}(50 60 70 / 0.8))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4), ${colorSpace}(50 60 70 / .8) 25%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 75%, ${colorSpace}(50 60 70 / 0.8))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 25%, ${colorSpace}(50 60 70 / .8) 75%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 25%, ${colorSpace}(50 60 70 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 30%, ${colorSpace}(50 60 70 / .8) 90%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 30%, ${colorSpace}(50 60 70 / 0.8) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 12.5%, ${colorSpace}(50 60 70 / .8) 37.5%)`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 12.5%, ${colorSpace}(50 60 70 / 0.8) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / .4) 0%, ${colorSpace}(50 60 70 / .8))`, `color-mix(in ${colorSpace}, ${colorSpace}(10 20 30 / 0.4) 0%, ${colorSpace}(50 60 70 / 0.8))`); @@ -279,16 +279,16 @@ test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3), color(${resultColorSpace} 0.5 0.6 0.7))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3), color(${resultColorSpace} 0.5 0.6 0.7) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3), color(${colorSpace} .5 .6 .7) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 75%, color(${resultColorSpace} 0.5 0.6 0.7))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 25%, color(${colorSpace} .5 .6 .7) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 25%, color(${resultColorSpace} 0.5 0.6 0.7))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 30%, color(${colorSpace} .5 .6 .7) 90%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 30%, color(${resultColorSpace} 0.5 0.6 0.7) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 12.5%, color(${colorSpace} .5 .6 .7) 37.5%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 12.5%, color(${resultColorSpace} 0.5 0.6 0.7) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3) 0%, color(${colorSpace} .5 .6 .7))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3) 0%, color(${resultColorSpace} 0.5 0.6 0.7))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .5), color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.5), color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4), color(${colorSpace} .5 .6 .7 / .8) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4), color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 25%)`); - test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 75%)`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4), color(${colorSpace} .5 .6 .7 / .8) 25%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 75%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); + test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 25%, color(${colorSpace} .5 .6 .7 / .8) 75%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 25%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 30%, color(${colorSpace} .5 .6 .7 / .8) 90%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 30%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 90%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 12.5%, color(${colorSpace} .5 .6 .7 / .8) 37.5%)`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 12.5%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8) 37.5%)`); test_valid_value(`color`, `color-mix(in ${colorSpace}, color(${colorSpace} .1 .2 .3 / .4) 0%, color(${colorSpace} .5 .6 .7 / .8))`, `color-mix(in ${resultColorSpace}, color(${resultColorSpace} 0.1 0.2 0.3 / 0.4) 0%, color(${resultColorSpace} 0.5 0.6 0.7 / 0.8))`); diff --git a/testing/web-platform/tests/css/css-masking/mask-image/mask-image-2.html b/testing/web-platform/tests/css/css-masking/mask-image/mask-image-2.html index a071cff3fa3..ba6eb37ef6d 100644 --- a/testing/web-platform/tests/css/css-masking/mask-image/mask-image-2.html +++ b/testing/web-platform/tests/css/css-masking/mask-image/mask-image-2.html @@ -7,6 +7,7 @@ +