From b41032d110380094d4b8e8fd4b809beb727b35fa Mon Sep 17 00:00:00 2001 From: Alexander Frick Date: Tue, 19 Nov 2024 19:33:35 -0600 Subject: [PATCH] M130 stage 2 --- .../widevine/cdm/linux/arm64/LICENSE | 0 .../cdm/linux/arm64/libwidevinecdm.so | Bin .../cdm/linux/arm64/libwidevinecdm_real.so | Bin .../widevine/cdm/linux/arm64/manifest.json | 0 .../cdm/linux/arm64/widevine_cdm_version.h | 0 infra/THORIUM_DEV_BOOKMARKS.html | 6 +- logos/NEW/webui/extension.svg | 2 +- logos/NEW/webui/icon_extensions.svg | 2 +- logos/NEW/webui/searchbox/bookmark_cr23.svg | 1 + logos/NEW/webui/{ => searchbox}/dino.svg | 0 logos/NEW/webui/searchbox/dino_cr23.svg | 1 + logos/NEW/webui/searchbox/extension_app.svg | 1 + logos/NEW/webui/{ => searchbox}/incognito.svg | 0 logos/NEW/webui/searchbox/incognito_cr23.svg | 1 + logos/NEW/webui/searchbox/star_active.svg | 1 + setup.sh | 12 +- .../app/theme/chromium/product_logo_16.png | Bin 0 -> 511 bytes .../app/theme/chromium/product_logo_32.png | Bin 0 -> 1099 bytes .../app/theme/chromium/win/chromium_doc.ico | Bin 0 -> 57284 bytes .../app/theme/chromium/win/chromium_pdf.ico | Bin 0 -> 56131 bytes src/media/base/media_switches.cc | 154 ++++++++++-------- src/media/ffmpeg/ffmpeg_common.cc | 5 + src/media/filters/ffmpeg_glue.cc | 42 +++-- src/media/filters/ffmpeg_video_decoder.cc | 9 +- src/net/base/load_flags_list.h | 14 +- src/net/dns/dns_client.cc | 11 +- src/net/dns/dns_transaction.cc | 9 +- src/net/url_request/url_request_http_job.cc | 49 ++++-- src/ui/base/x/x11_util.cc | 18 +- .../searchbox/icons/bookmark_cr23.svg | 1 + .../searchbox/icons/extension_app.svg | 1 + .../searchbox/icons/star_active.svg | 1 + src/ui/webui/resources/images/extension.svg | 2 +- .../resources/images/icon_extensions.svg | 2 +- 34 files changed, 208 insertions(+), 137 deletions(-) rename arm/{raspi => }/third_party/widevine/cdm/linux/arm64/LICENSE (100%) rename arm/{raspi => }/third_party/widevine/cdm/linux/arm64/libwidevinecdm.so (100%) rename arm/{raspi => }/third_party/widevine/cdm/linux/arm64/libwidevinecdm_real.so (100%) rename arm/{raspi => }/third_party/widevine/cdm/linux/arm64/manifest.json (100%) rename arm/{raspi => }/third_party/widevine/cdm/linux/arm64/widevine_cdm_version.h (100%) create mode 100644 logos/NEW/webui/searchbox/bookmark_cr23.svg rename logos/NEW/webui/{ => searchbox}/dino.svg (100%) create mode 100644 logos/NEW/webui/searchbox/dino_cr23.svg create mode 100644 logos/NEW/webui/searchbox/extension_app.svg rename logos/NEW/webui/{ => searchbox}/incognito.svg (100%) create mode 100644 logos/NEW/webui/searchbox/incognito_cr23.svg create mode 100644 logos/NEW/webui/searchbox/star_active.svg create mode 100644 src/chrome/app/theme/chromium/product_logo_16.png create mode 100644 src/chrome/app/theme/chromium/product_logo_32.png create mode 100644 src/chrome/app/theme/chromium/win/chromium_doc.ico create mode 100644 src/chrome/app/theme/chromium/win/chromium_pdf.ico create mode 100644 src/ui/webui/resources/cr_components/searchbox/icons/bookmark_cr23.svg create mode 100644 src/ui/webui/resources/cr_components/searchbox/icons/extension_app.svg create mode 100644 src/ui/webui/resources/cr_components/searchbox/icons/star_active.svg diff --git a/arm/raspi/third_party/widevine/cdm/linux/arm64/LICENSE b/arm/third_party/widevine/cdm/linux/arm64/LICENSE similarity index 100% rename from arm/raspi/third_party/widevine/cdm/linux/arm64/LICENSE rename to arm/third_party/widevine/cdm/linux/arm64/LICENSE diff --git a/arm/raspi/third_party/widevine/cdm/linux/arm64/libwidevinecdm.so b/arm/third_party/widevine/cdm/linux/arm64/libwidevinecdm.so similarity index 100% rename from arm/raspi/third_party/widevine/cdm/linux/arm64/libwidevinecdm.so rename to arm/third_party/widevine/cdm/linux/arm64/libwidevinecdm.so diff --git a/arm/raspi/third_party/widevine/cdm/linux/arm64/libwidevinecdm_real.so b/arm/third_party/widevine/cdm/linux/arm64/libwidevinecdm_real.so similarity index 100% rename from arm/raspi/third_party/widevine/cdm/linux/arm64/libwidevinecdm_real.so rename to arm/third_party/widevine/cdm/linux/arm64/libwidevinecdm_real.so diff --git a/arm/raspi/third_party/widevine/cdm/linux/arm64/manifest.json b/arm/third_party/widevine/cdm/linux/arm64/manifest.json similarity index 100% rename from arm/raspi/third_party/widevine/cdm/linux/arm64/manifest.json rename to arm/third_party/widevine/cdm/linux/arm64/manifest.json diff --git a/arm/raspi/third_party/widevine/cdm/linux/arm64/widevine_cdm_version.h b/arm/third_party/widevine/cdm/linux/arm64/widevine_cdm_version.h similarity index 100% rename from arm/raspi/third_party/widevine/cdm/linux/arm64/widevine_cdm_version.h rename to arm/third_party/widevine/cdm/linux/arm64/widevine_cdm_version.h diff --git a/infra/THORIUM_DEV_BOOKMARKS.html b/infra/THORIUM_DEV_BOOKMARKS.html index ddea06b8..834f4c89 100644 --- a/infra/THORIUM_DEV_BOOKMARKS.html +++ b/infra/THORIUM_DEV_BOOKMARKS.html @@ -58,10 +58,7 @@
media_switches.cc - Chromium Code Search
ffmpeg_glue.cc - Chromium Code Search
ffmpeg_video_decoder.cc - Chromium Code Search -
gpu_video_decode_accelerator_factory.cc - Chromium Code Search -
gpu_video_decode_accelerator.cc - Chromium Code Search -
vaapi_video_decode_accelerator.cc - Chromium Code Search -
vaapi_video_decode_accelerator.h - Chromium Code Search +
ffmpeg_common.cc - Chromium Code Search
vaapi_wrapper.cc - Chromium Code Search
vaapi_wrapper.h - Chromium Code Search
load_flags_list.h - Chromium Code Search @@ -198,7 +195,6 @@
about_version.html - Chromium Code Search
supported_types.cc - Chromium Code Search
variations_service.cc - Chromium Code Search -
ffmpeg_common.cc - Chromium Code Search
BUILD.gn - Chromium Code Search
media_options.gni - Chromium Code Search
ignores.txt - Chromium Code Search diff --git a/logos/NEW/webui/extension.svg b/logos/NEW/webui/extension.svg index 0b17b55c..1ff80eb4 100644 --- a/logos/NEW/webui/extension.svg +++ b/logos/NEW/webui/extension.svg @@ -1 +1 @@ - + diff --git a/logos/NEW/webui/icon_extensions.svg b/logos/NEW/webui/icon_extensions.svg index febd5808..aa87165d 100644 --- a/logos/NEW/webui/icon_extensions.svg +++ b/logos/NEW/webui/icon_extensions.svg @@ -1 +1 @@ - + diff --git a/logos/NEW/webui/searchbox/bookmark_cr23.svg b/logos/NEW/webui/searchbox/bookmark_cr23.svg new file mode 100644 index 00000000..7c4b7baa --- /dev/null +++ b/logos/NEW/webui/searchbox/bookmark_cr23.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/logos/NEW/webui/dino.svg b/logos/NEW/webui/searchbox/dino.svg similarity index 100% rename from logos/NEW/webui/dino.svg rename to logos/NEW/webui/searchbox/dino.svg diff --git a/logos/NEW/webui/searchbox/dino_cr23.svg b/logos/NEW/webui/searchbox/dino_cr23.svg new file mode 100644 index 00000000..ebdf51fc --- /dev/null +++ b/logos/NEW/webui/searchbox/dino_cr23.svg @@ -0,0 +1 @@ + diff --git a/logos/NEW/webui/searchbox/extension_app.svg b/logos/NEW/webui/searchbox/extension_app.svg new file mode 100644 index 00000000..1a52035d --- /dev/null +++ b/logos/NEW/webui/searchbox/extension_app.svg @@ -0,0 +1 @@ + diff --git a/logos/NEW/webui/incognito.svg b/logos/NEW/webui/searchbox/incognito.svg similarity index 100% rename from logos/NEW/webui/incognito.svg rename to logos/NEW/webui/searchbox/incognito.svg diff --git a/logos/NEW/webui/searchbox/incognito_cr23.svg b/logos/NEW/webui/searchbox/incognito_cr23.svg new file mode 100644 index 00000000..db803f3d --- /dev/null +++ b/logos/NEW/webui/searchbox/incognito_cr23.svg @@ -0,0 +1 @@ + diff --git a/logos/NEW/webui/searchbox/star_active.svg b/logos/NEW/webui/searchbox/star_active.svg new file mode 100644 index 00000000..f01a4717 --- /dev/null +++ b/logos/NEW/webui/searchbox/star_active.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/setup.sh b/setup.sh index 7fe99118..9d0c51cc 100755 --- a/setup.sh +++ b/setup.sh @@ -126,6 +126,16 @@ patchAC3 () { cd ~/thorium } +patchSSE2 () { + cp -v other/SSE2/angle-lockfree.patch ${CR_SRC_DIR}/third_party/angle/src/ && + + printf "\n" && + printf "${YEL}Patching ANGLE for SSE2...${c0}\n" && + cd ${CR_SRC_DIR}/third_party/angle/src && + git apply --reject ./angle-lockfree.patch && + cd ~/thorium +} + cd ~/thorium && printf "\n" && @@ -144,7 +154,6 @@ copyMacOS () { printf "\n" && printf "${YEL}Copying files for MacOS...${c0}\n" && cp -v arm/mac_arm.gni ${CR_SRC_DIR}/build/config/arm.gni && - cp -v other/AVX2/build/config/compiler/BUILD.gn ${CR_SRC_DIR}/build/config/compiler/ && cp -r -v arm/third_party/* ${CR_SRC_DIR}/third_party/ && cd ${CR_SRC_DIR} && python3 tools/update_pgo_profiles.py --target=mac update --gs-url-base=chromium-optimization-profiles/pgo_profiles && @@ -263,6 +272,7 @@ copySSE2 () { python3 tools/update_pgo_profiles.py --target=win32 update --gs-url-base=chromium-optimization-profiles/pgo_profiles && cd ~/thorium && [ -f ${CR_SRC_DIR}/third_party/ffmpeg/ffmpeg_hevc_ac3.patch ] || patchAC3; + [ -f ${CR_SRC_DIR}/third_party/angle/src/angle-lockfree.patch ] || patchSSE2; printf "\n" } case $1 in diff --git a/src/chrome/app/theme/chromium/product_logo_16.png b/src/chrome/app/theme/chromium/product_logo_16.png new file mode 100644 index 0000000000000000000000000000000000000000..5f86bf2a6d375249612d7829dcd57b8f0a477605 GIT binary patch literal 511 zcmVWBzz4p3yw3}x<3Q01e@xj!|5Vi3d$CYqvq#=noMo1;*o`M&y^h0% zsR!wXR6F&s@^P1kE8Az%>o`1I*<^CtL-!yGW!C`egKYQjEzNIV`O&%qU~x9a=GG4H zmZpc+C;$p&xAfczha_Z-5FyQf()m<)zdyucuod4ob22EdDh(3gi>9 zbQug&HlGT+zBKlsX5z(p{jEl9N_cV3r^3ECKLH{&c**t5v{V29002ovPDHLkV1f=f B;u!z{ literal 0 HcmV?d00001 diff --git a/src/chrome/app/theme/chromium/product_logo_32.png b/src/chrome/app/theme/chromium/product_logo_32.png new file mode 100644 index 0000000000000000000000000000000000000000..5e685e9f2d533299295bb668fab6e1c58caacf5e GIT binary patch literal 1099 zcmV-R1ho5!P)Q`a7Sauz zEyEcYB{JECps-N}gWc$E_Mum!gN_Zf2pf)s!I<04ri?WV2c1JLdSMF1qLUJ^>U7nU zK=ZK+kItH$oTGF5--Yw!{Xg&X@jm}Y!X(Oj<`m#%parN0Y5+z1tO8+R8W;!0B7-i~ z%(;>Y;u@eA@a-csf(m>K3`7Q9;UhVq-MCL9|2G%_`t>3r>5!iRe$>Kz90&ugkwMqe z!4Dz>c{4C|jO1u%O=)NAM?kyz6j026gH@nmeIX~{3>!qV%ws@T^L2}C7hH=d)cVlZ0a=o{MN1JO#<}E@SEPKe$%b}_yfA4p6 zc@n9(4#nAQy37@4Gg5IKv%iOoOzTCa);m*C#7WCeea0epP+b0uVb>in!iwVZb9eT( zVM~fk6E5fE32H0s06Y!{u;khg-RzcJJ3oB=sbR2$-j|B9r?R%?aY1P9kp4kPxSS=N zsOcaP-8l5YiRcEGuU<3M4MKaHGs0odr`B~5buLIM88=OyO2$#=f>gVk4CjK-WRxzR zYiuR8I)l16VcG$8ae~z94DLp+k?FM1G@LH-?In17M%Wzn6N}6mlE)&mY>xVQ`@;YQ zwjv|*aRH3!)xj<*>)WV%^?lX@Eo|QpWlTpZ8E5-`i1k1VFTC~v7hY^LqZ`L|r{M_j zdN%81BF@6}_k;#JcOE8}f3H0g(T$xtS)IY#GeX-d?VK)?jU4#O=aD=2#xXE&Ccm+* zb(ZHtMDG2@-CLglP<`nw%AY;YGqqld9S$y3SrNkAINno4-NS1CF(_af&suO47^?jN zpGWRHsEGQrwWJx87D#5u!y4CuG literal 0 HcmV?d00001 diff --git a/src/chrome/app/theme/chromium/win/chromium_doc.ico b/src/chrome/app/theme/chromium/win/chromium_doc.ico new file mode 100644 index 0000000000000000000000000000000000000000..af7337ea0bd8be4fa5603c33541310a0fddd8d76 GIT binary patch literal 57284 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%0AZkk?6d!jr2jc1E$<= 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ⅅ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

id}g@7@Otdjc?UQXcTnx12e1MwsSZoSo!9rHu)! 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

gNLS5;^@T~T}?GPaie@4&G3@E;WrCD!RHFE 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 XET@%& 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 R^>hFL002ovPDHLkV1fgwraS-u literal 0 HcmV?d00001 diff --git a/src/media/base/media_switches.cc b/src/media/base/media_switches.cc index c2bd10af..a056ad07 100644 --- a/src/media/base/media_switches.cc +++ b/src/media/base/media_switches.cc @@ -115,12 +115,12 @@ const char kAudioCapturerWithEchoCancellation[] = "audio-capturer-with-echo-cancellation"; #endif // BUILDFLAG(IS_FUCHSIA) -#if defined(USE_CRAS) +#if BUILDFLAG(USE_CRAS) // Use CRAS, the ChromeOS audio server. const char kUseCras[] = "use-cras"; // Enforce system audio echo cancellation. const char kSystemAecEnabled[] = "system-aec-enabled"; -#endif // defined(USE_CRAS) +#endif // BUILDFLAG(USE_CRAS) // For automated testing of protected content, this switch allows specific // domains (e.g. example.com) to always allow the permission to share the @@ -367,6 +367,13 @@ BASE_FEATURE(kResumeBackgroundVideo, BASE_FEATURE(kMacLoopbackAudioForScreenShare, "MacLoopbackAudioForScreenShare", base::FEATURE_DISABLED_BY_DEFAULT); + +// Use the built-in MacOS screen-sharing picker (SCContentSharingPicker). This +// flag will only use the built-in picker on MacOS 15 Sequoia and later where it +// is required to avoid recurring permission dialogs. +BASE_FEATURE(kUseSCContentSharingPicker, + "UseSCContentSharingPicker", + base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_MAC) #if BUILDFLAG(IS_LINUX) @@ -474,7 +481,7 @@ BASE_FEATURE(kContextMenuSaveVideoFrameAs, // Enables the "Search Video Frame with " context menu item. BASE_FEATURE(kContextMenuSearchForVideoFrame, "ContextMenuSearchForVideoFrame", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION) // If echo cancellation for a mic signal is requested, mix and cancel all audio @@ -568,12 +575,10 @@ BASE_FEATURE(kCrOSDspBasedAgcAllowed, "CrOSDspBasedAgcAllowed", base::FEATURE_ENABLED_BY_DEFAULT); -BASE_FEATURE(kIgnoreUiGains, - "IgnoreUiGains", - base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kIgnoreUiGains, "IgnoreUiGains", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kShowForceRespectUiGainsToggle, "ShowForceRespectUiGainsToggle", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kCrOSSystemVoiceIsolationOption, "CrOSSystemVoiceIsolationOption", @@ -591,12 +596,6 @@ BASE_FEATURE(kMemoryPressureBasedSourceBufferGC, "MemoryPressureBasedSourceBufferGC", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables writing pixels together for all planes to a multi-planar shared -// image. -BASE_FEATURE(kUseWritePixelsYUV, - "UseWritePixelsYUV", - base::FEATURE_ENABLED_BY_DEFAULT); - // Controls whether the Mirroring Service will fetch, analyze, and store // information on the quality of the session using RTCP logs. BASE_FEATURE(kEnableRtcpReporting, @@ -673,6 +672,13 @@ BASE_FEATURE(kFeatureManagementLiveTranslateCrOS, "FeatureManagementLiveTranslateCrOS", base::FEATURE_DISABLED_BY_DEFAULT); +#if !BUILDFLAG(IS_ANDROID) +// Blocks picture-in-picture windows while file dialogs are open. +BASE_FEATURE(kFileDialogsBlockPictureInPicture, + "FileDialogsBlockPictureInPicture", + base::FEATURE_ENABLED_BY_DEFAULT); +#endif // !BUILDFLAG(IS_ANDROID) + // Show toolbar button that opens dialog for controlling media sessions. BASE_FEATURE(kGlobalMediaControls, "GlobalMediaControls", @@ -688,17 +694,12 @@ BASE_FEATURE(kGlobalMediaControlsAutoDismiss, "GlobalMediaControlsAutoDismiss", base::FEATURE_ENABLED_BY_DEFAULT); -#if BUILDFLAG(IS_CHROMEOS) -// Updated global media controls UI for CrOS. -BASE_FEATURE(kGlobalMediaControlsCrOSUpdatedUI, - "GlobalMediaControlsCrOSUpdatedUI", - base::FEATURE_ENABLED_BY_DEFAULT); -#else // BUILDFLAG(IS_CHROMEOS) +#if !BUILDFLAG(IS_CHROMEOS) // Updated global media controls UI for all the non-CrOS desktop platforms. BASE_FEATURE(kGlobalMediaControlsUpdatedUI, "GlobalMediaControlsUpdatedUI", base::FEATURE_DISABLED_BY_DEFAULT); -#endif // BUILDFLAG(IS_CHROMEOS) +#endif // !BUILDFLAG(IS_CHROMEOS) #if !BUILDFLAG(IS_ANDROID) // If enabled, users can request Media Remoting without fullscreen-in-tab. @@ -827,6 +828,11 @@ BASE_FEATURE(kGlobalVaapiLock, BASE_FEATURE(kVaapiH264TemporalLayerHWEncoding, "VaapiH264TemporalLayerEncoding", base::FEATURE_ENABLED_BY_DEFAULT); +// Enable software bitrate controller for H264 temporal layer encoding with HW +// encoder on ChromeOS. +BASE_FEATURE(kVaapiH264SWBitrateController, + "VaapiH264SWBitrateController", + base::FEATURE_DISABLED_BY_DEFAULT); // Enable VP8 temporal layer encoding with HW encoder on ChromeOS. BASE_FEATURE(kVaapiVp8TemporalLayerHWEncoding, "VaapiVp8TemporalLayerEncoding", @@ -835,6 +841,10 @@ BASE_FEATURE(kVaapiVp8TemporalLayerHWEncoding, BASE_FEATURE(kVaapiVp9SModeHWEncoding, "VaapiVp9SModeHWEncoding", base::FEATURE_ENABLED_BY_DEFAULT); +// Enables VSync aligned MJPEG decoding. +BASE_FEATURE(kVSyncMjpegDecoding, + "VSyncMjpegDecoding", + base::FEATURE_DISABLED_BY_DEFAULT); #endif // defined(ARCH_CPU_X86_FAMILY) && BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) // Enables the new V4L2StatefulVideoDecoder instead of V4L2VideoDecoder. @@ -843,7 +853,11 @@ BASE_FEATURE(kVaapiVp9SModeHWEncoding, // all platforms. BASE_FEATURE(kV4L2FlatStatefulVideoDecoder, "V4L2FlatStatefulVideoDecoder", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); +// Enable H264 temporal layer encoding with V4L2 HW encoder on ChromeOS. +BASE_FEATURE(kV4L2H264TemporalLayerHWEncoding, + "V4L2H264TemporalLayerHWEncoding", + base::FEATURE_DISABLED_BY_DEFAULT); #endif // Inform video blitter of video color space. @@ -860,9 +874,9 @@ BASE_FEATURE(kVideoFrameUseClientSITextureTarget, "VideoFrameUseClientSITextureTarget", base::FEATURE_ENABLED_BY_DEFAULT); -// Displays a minimize button on video picture-in-picture windows. -BASE_FEATURE(kVideoPictureInPictureMinimizeButton, - "VideoPictureInPictureMinimizeButton", +// Displays new video picture-in-picture controls for the 2024 UI update. +BASE_FEATURE(kVideoPictureInPictureControlsUpdate2024, + "VideoPictureInPictureControlsUpdate2024", base::FEATURE_DISABLED_BY_DEFAULT); // A video encoder is allowed to drop a frame in cast mirroring. @@ -878,7 +892,7 @@ BASE_FEATURE(kWebCodecsVideoEncoderFrameDrop, // A hardware video encoder is allowed to drop a frame in WebRTC. BASE_FEATURE(kWebRTCHardwareVideoEncoderFrameDrop, "WebRTCHardwareVideoEncoderFrameDrop", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Inform webrtc with correct video color space information whenever // possible. @@ -897,6 +911,12 @@ BASE_FEATURE(kExternalClearKeyForTesting, // Specifies the path to the MediaFoundation Clear Key CDM for testing. const base::FeatureParam kMediaFoundationClearKeyCdmPathForTesting{ &kExternalClearKeyForTesting, "media_foundation_cdm_path", ""}; + +// Enables the use of a faulty GPU for MediaFoundation. This is used for testing +// purposes only. +BASE_FEATURE(kEnableFaultyGPUForMediaFoundation, + "EnableFaultyGPUForMediaFoundation", + base::FEATURE_DISABLED_BY_DEFAULT); #endif // BUILDFLAG(IS_WIN) // Enables the On-Device Web Speech feature on supported devices. @@ -963,11 +983,7 @@ BASE_FEATURE(kLiveCaptionUseWaitK, // Live Caption can be used in multiple languages, as opposed to just English. BASE_FEATURE(kLiveCaptionMultiLanguage, "LiveCaptionMultiLanguage", -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif ); // Enable experimental Live Caption languages. @@ -993,11 +1009,7 @@ BASE_FEATURE(kLiveCaptionWebAudio, // Live Translate translates captions generated by Live Caption. BASE_FEATURE(kLiveTranslate, "LiveTranslate", -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) base::FEATURE_ENABLED_BY_DEFAULT -#else - base::FEATURE_DISABLED_BY_DEFAULT -#endif ); // Prevents UrlProvisionFetcher from making a provisioning request. If @@ -1112,6 +1124,17 @@ BASE_FEATURE(kAVDColorSpaceChanges, "AVDColorSpaceChanges", base::FEATURE_ENABLED_BY_DEFAULT); +// Whether FFmpeg supports decoding H.264 video in software. Has no effect if +// BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) is false. +BASE_FEATURE(kBuiltInH264Decoder, + "BuiltInH264Decoder", +#if BUILDFLAG(IS_ANDROID) || !BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) + base::FEATURE_DISABLED_BY_DEFAULT +#else + base::FEATURE_ENABLED_BY_DEFAULT +#endif +); + #if BUILDFLAG(IS_ANDROID) // Should we allow video playback to use an overlay if it's not needed for // security? Normally, we'd always want to allow this, except as part of the @@ -1120,10 +1143,10 @@ BASE_FEATURE(kAllowNonSecureOverlays, "AllowNonSecureOverlays", base::FEATURE_ENABLED_BY_DEFAULT); -// Enables support for playback of encrypted AV1 content. -BASE_FEATURE(kEnableEncryptedAV1, - "EnableEncryptedAV1", - base::FEATURE_ENABLED_BY_DEFAULT); +// Enables block model (LinearBlock) on supported devices. +BASE_FEATURE(kMediaCodecBlockModel, + "MediaCodecBlockModel", + base::FEATURE_DISABLED_BY_DEFAULT); // Allow FrameInfoHelper to guess coded size information for MediaCodec frames. BASE_FEATURE(kMediaCodecCodedSizeGuessing, @@ -1164,11 +1187,6 @@ BASE_FEATURE(kMediaDrmGetStatusForPolicy, "MediaDrmGetStatusForPolicy", base::FEATURE_ENABLED_BY_DEFAULT); -// Enables CanPlayType() (and other queries) for HLS MIME types. Note that -// disabling this also causes navigation to .m3u8 files to trigger downloading -// instead of playback. -BASE_FEATURE(kCanPlayHls, "CanPlayHls", base::FEATURE_ENABLED_BY_DEFAULT); - // Enables the use of MediaPlayerRenderer for HLS playback. When disabled, // HLS manifests will fail to load (triggering source fallback or load error). BASE_FEATURE(kHlsPlayer, "HlsPlayer", base::FEATURE_ENABLED_BY_DEFAULT); @@ -1200,6 +1218,13 @@ BASE_FEATURE(kAllowMediaCodecSoftwareDecoder, "AllowMediaCodecSoftwareDecoder", base::FEATURE_DISABLED_BY_DEFAULT); +// This feature allows for some MediaDrm functions to be executed in a separate +// process so that crashes do not bring down the browser. Flag is available so +// that it can be disabled for WebView as separate processes are not allowed. +BASE_FEATURE(kAllowMediaCodecCallsInSeparateProcess, + "AllowMediaCodecCallsInSeparateProcess", + base::FEATURE_ENABLED_BY_DEFAULT); + #endif // BUILDFLAG(IS_ANDROID) #if BUILDFLAG(ENABLE_HLS_DEMUXER) @@ -1233,17 +1258,6 @@ BASE_FEATURE(kChromeOSHWVBREncoding, #endif ); -#if !BUILDFLAG(USE_VAAPI) -// Enable the hardware-accelerated direct video decoder instead of the one -// needing the VdaVideoDecoder adapter. This flag is used mainly as a -// chrome:flag for developers debugging issues as well as to be able to -// experiment with direct VideoDecoder path on Linux Desktop. -// TODO(b/159825227): remove when the direct video decoder is fully launched. -BASE_FEATURE(kUseChromeOSDirectVideoDecoder, - "UseChromeOSDirectVideoDecoder", - base::FEATURE_ENABLED_BY_DEFAULT); -#endif // !BUILDFLAG(USE_VAAPI) - // Limit the number of concurrent hardware decoder instances on ChromeOS. BASE_FEATURE(kLimitConcurrentDecoderInstances, "LimitConcurrentDecoderInstances", @@ -1296,21 +1310,13 @@ BASE_FEATURE(kEnableArmHwdrm10bitOverlays, #if BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) // Enable use of HW based L1 Widevine DRM via the cdm-oemcrypto daemon on // ChromeOS. This flag is temporary while we finish development. -// Expiry: M128 +// Expiry: M133 +// TODO(b/364969273): Remove this flag later. BASE_FEATURE(kEnableArmHwdrm, "EnableArmHwdrm", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); #endif // BUILDFLAG(USE_CHROMEOS_PROTECTED_MEDIA) #endif // defined(ARCH_CPU_ARM_FAMILY) -#if BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(USE_VAAPI) -// ChromeOS has one of two VideoDecoder implementations active based on -// SoC/board specific configurations that are sent via command line flags. This -// switch allows using the non default implementation for testing. -// TODO(b/159825227): remove when the "old" video decoder is fully launched. -BASE_FEATURE(kUseAlternateVideoDecoderImplementation, - "UseAlternateVideoDecoderImplementation", - base::FEATURE_DISABLED_BY_DEFAULT); -#endif // BUILDFLAG(IS_CHROMEOS) && !BUILDFLAG(USE_VAAPI) #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) #if BUILDFLAG(IS_WIN) @@ -1414,7 +1420,12 @@ const base::FeatureParam kBatchReadCount{&kMediaFoundationBatchRead, // ENABLE_PLATFORM_ENCRYPTED_DOLBY_VISION is disabled. BASE_FEATURE(kPlatformEncryptedDolbyVision, "PlatformEncryptedDolbyVision", +#if BUILDFLAG(IS_WIN) + base::FEATURE_ENABLED_BY_DEFAULT +#else base::FEATURE_ENABLED_BY_DEFAULT); +#endif +); // When ENABLE_PLATFORM_ENCRYPTED_DOLBY_VISION is enabled at build time and // `kPlatformEncryptedDolbyVision` is enabled at run time, encrypted Dolby @@ -1723,6 +1734,13 @@ BASE_FEATURE(kCastStreamingMacHardwareH264, base::FEATURE_ENABLED_BY_DEFAULT); #endif +#if BUILDFLAG(IS_WIN) +// Controls whether hardware H264 is default enabled on Windows. +BASE_FEATURE(kCastStreamingWinHardwareH264, + "CastStreamingWinHardwareH264", + base::FEATURE_DISABLED_BY_DEFAULT); +#endif + #if BUILDFLAG(IS_FUCHSIA) // Enables use of Fuchsia's Mediacodec service for encoding. BASE_FEATURE(kFuchsiaMediacodecVideoEncoder, @@ -1734,11 +1752,7 @@ BASE_FEATURE(kFuchsiaMediacodecVideoEncoder, // smaller than maximum supported decodes as advertiszed by decoder. BASE_FEATURE(kVideoDecodeBatching, "VideoDecodeBatching", -#if BUILDFLAG(IS_CHROMEOS) - base::FEATURE_ENABLED_BY_DEFAULT -#else base::FEATURE_DISABLED_BY_DEFAULT -#endif ); // Safety switch to allow us to revert to the previous behavior of using the @@ -1864,10 +1878,6 @@ bool IsVideoCaptureAcceleratedJpegDecodingEnabled() { #endif } -bool IsWritePixelsYUVEnabled() { - return base::FeatureList::IsEnabled(kUseWritePixelsYUV); -} - #if BUILDFLAG(IS_WIN) bool IsMediaFoundationD3D11VideoCaptureEnabled() { return base::FeatureList::IsEnabled(kMediaFoundationD3D11VideoCapture); diff --git a/src/media/ffmpeg/ffmpeg_common.cc b/src/media/ffmpeg/ffmpeg_common.cc index b0d6abd1..22119846 100644 --- a/src/media/ffmpeg/ffmpeg_common.cc +++ b/src/media/ffmpeg/ffmpeg_common.cc @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifdef UNSAFE_BUFFERS_BUILD +// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. +#pragma allow_unsafe_buffers +#endif + #include "media/ffmpeg/ffmpeg_common.h" #include "base/hash/sha1.h" diff --git a/src/media/filters/ffmpeg_glue.cc b/src/media/filters/ffmpeg_glue.cc index f8f8d01e..0295daef 100644 --- a/src/media/filters/ffmpeg_glue.cc +++ b/src/media/filters/ffmpeg_glue.cc @@ -12,10 +12,20 @@ #include "base/types/cxx23_to_underlying.h" #include "media/base/container_names.h" #include "media/base/media_switches.h" +#include "media/base/supported_types.h" #include "media/ffmpeg/ffmpeg_common.h" namespace media { +// Kill switches in case things explode. Remove after M132. +// TODO(crbug.com/355485812): Re-enable this flag. +BASE_FEATURE(kAllowOnlyAudioCodecsDuringDemuxing, + "AllowOnlyAudioCodecsDuringDemuxing", + base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kForbidH264ParsingDuringDemuxing, + "ForbidH264ParsingDuringDemuxing", + base::FEATURE_DISABLED_BY_DEFAULT); + // Internal buffer size used by AVIO for reading. // TODO(dalecurtis): Experiment with this buffer size and measure impact on // performance. Currently we want to use 32kb to preserve existing behavior @@ -108,6 +118,12 @@ FFmpegGlue::FFmpegGlue(FFmpegURLProtocol* protocol) { // Enable fast, but inaccurate seeks for MP3. format_context_->flags |= AVFMT_FLAG_FAST_SEEK; + // We don't allow H.264 parsing during demuxing since we have our own parser + // and the ffmpeg one increases memory usage unnecessarily. + if (base::FeatureList::IsEnabled(kForbidH264ParsingDuringDemuxing)) { + format_context_->flags |= AVFMT_FLAG_NOH264PARSE; + } + // Ensures format parsing errors will bail out. From an audit on 11/2017, all // instances were real failures. Solves bugs like http://crbug.com/710791. format_context_->error_recognition |= AV_EF_EXPLODE; @@ -122,6 +138,13 @@ FFmpegGlue::FFmpegGlue(FFmpegURLProtocol* protocol) { // deprecations and when an external ffmpeg is used this adds extra // security. static const base::NoDestructor kCombinedCodecList([]() { + if (base::FeatureList::IsEnabled(kAllowOnlyAudioCodecsDuringDemuxing)) { + // We also don't allow ffmpeg to use any video decoders during demuxing + // since it's unnecessary for the codecs we use and just increases + // memory usage. + return std::string(GetAllowedAudioDecoders()); + } + return base::JoinString( {GetAllowedAudioDecoders(), GetAllowedVideoDecoders()}, ","); }()); @@ -151,22 +174,15 @@ const char* FFmpegGlue::GetAllowedAudioDecoders() { // static const char* FFmpegGlue::GetAllowedVideoDecoders() { - static const base::NoDestructor kAllowedVideoCodecs([]() { // This should match the configured lists in //third_party/ffmpeg. -#if BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) - std::vector allowed_decoders; -#if BUILDFLAG(USE_PROPRIETARY_CODECS) - allowed_decoders.push_back("h264"); +#if BUILDFLAG(USE_PROPRIETARY_CODECS) && BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) #if BUILDFLAG(ENABLE_PLATFORM_HEVC) - allowed_decoders.push_back("hevc"); -#endif // BUILDFLAG(ENABLE_PLATFORM_HEVC) -#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) - return base::JoinString(allowed_decoders, ","); + return IsBuiltInVideoCodec(VideoCodec::kH264) ? "h264,hevc" : ""; #else - return std::string(); -#endif // BUILDFLAG(ENABLE_FFMPEG_VIDEO_DECODERS) - }()); - return kAllowedVideoCodecs->c_str(); + return IsBuiltInVideoCodec(VideoCodec::kH264) ? "h264" : ""; +#else + return ""; +#endif } bool FFmpegGlue::OpenContext(bool is_local_file) { diff --git a/src/media/filters/ffmpeg_video_decoder.cc b/src/media/filters/ffmpeg_video_decoder.cc index 6364f782..8c8cd1f6 100644 --- a/src/media/filters/ffmpeg_video_decoder.cc +++ b/src/media/filters/ffmpeg_video_decoder.cc @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifdef UNSAFE_BUFFERS_BUILD +// TODO(crbug.com/40285824): Remove this and convert code to safer constructs. +#pragma allow_unsafe_buffers +#endif + #include "media/filters/ffmpeg_video_decoder.h" #include @@ -21,6 +26,7 @@ #include "media/base/limits.h" #include "media/base/media_log.h" #include "media/base/media_switches.h" +#include "media/base/supported_types.h" #include "media/base/timestamp_constants.h" #include "media/base/video_aspect_ratio.h" #include "media/base/video_frame.h" @@ -120,7 +126,8 @@ static void ReleaseVideoBufferImpl(void* opaque, uint8_t* data) { // static bool FFmpegVideoDecoder::IsCodecSupported(VideoCodec codec) { - return avcodec_find_decoder(VideoCodecToCodecID(codec)) != nullptr; + // We only build support for H.264 and HEVC. + return codec == VideoCodec::kH264 && IsBuiltInVideoCodec(codec); } FFmpegVideoDecoder::FFmpegVideoDecoder(MediaLog* media_log) diff --git a/src/net/base/load_flags_list.h b/src/net/base/load_flags_list.h index 958f3b56..e78786d0 100644 --- a/src/net/base/load_flags_list.h +++ b/src/net/base/load_flags_list.h @@ -95,15 +95,15 @@ LOAD_FLAG(SUPPORT_ASYNC_REVALIDATION, 1 << 14) // Indicates that a prefetch request's cached response should be restricted in // in terms of reuse. The cached response can only be reused by requests with -// the LOAD_CAN_USE_RESTRICTED_PREFETCH load flag. -LOAD_FLAG(RESTRICTED_PREFETCH, 1 << 15) +// the LOAD_CAN_USE_RESTRICTED_PREFETCH_FOR_MAIN_FRAME load flag. +LOAD_FLAG(RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 15) // This flag must be set on requests that are allowed to reuse cache entries -// that are marked as RESTRICTED_PREFETCH. Requests without this flag cannot -// reuse restricted prefetch responses in the cache. Restricted response reuse -// is considered privileged, and therefore this flag must only be set from a -// trusted process. -LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH, 1 << 16) +// that are marked as RESTRICTED_PREFETCH_FOR_MAIN_FRAME. Requests without this +// flag cannot reuse restricted prefetch responses in the cache. Restricted +// response reuse is considered privileged, and therefore this flag must only be +// set from a trusted process. +LOAD_FLAG(CAN_USE_RESTRICTED_PREFETCH_FOR_MAIN_FRAME, 1 << 16) // Indicates that this load can use a shared dictionary. LOAD_FLAG(CAN_USE_SHARED_DICTIONARY, 1 << 17) diff --git a/src/net/dns/dns_client.cc b/src/net/dns/dns_client.cc index fb719114..d38d5952 100644 --- a/src/net/dns/dns_client.cc +++ b/src/net/dns/dns_client.cc @@ -88,7 +88,8 @@ void UpdateConfigForDohUpgrade(DnsConfig* config) { } class DnsClientImpl : public DnsClient { - const bool disable_thorium_dns_config = base::CommandLine::ForCurrentProcess()->HasSwitch("disable-thorium-dns-config"); + const bool disable_thorium_dns_config = + base::CommandLine::ForCurrentProcess()->HasSwitch("disable-thorium-dns-config"); public: DnsClientImpl(NetLog* net_log, const RandIntCallback& rand_int_callback) : net_log_(net_log), rand_int_callback_(rand_int_callback) {} @@ -251,14 +252,12 @@ class DnsClientImpl : public DnsClient { private: std::optional BuildEffectiveConfig() const { DnsConfig config; - // in Bromite it is sufficient to have secure DoH enabled to give the overrides priority + // In Thorium it is sufficient to have secure DoH enabled to give the overrides priority if (config_overrides_.dns_over_https_config && config_overrides_.secure_dns_mode && !disable_thorium_dns_config) { config = config_overrides_.ApplyOverrides(DnsConfig()); - } else if (disable_thorium_dns_config && config_overrides_.OverridesEverything()) { - config = config_overrides_.ApplyOverrides(DnsConfig()); } else { if (!system_config_) { - LOG(WARNING) << "BuildEffectiveConfig(): System configuration not set: No system_config_ "; + LOG(WARNING) << "dns_client.cc->BuildEffectiveConfig(): System configuration not set: No system_config_ "; return std::nullopt; } @@ -276,7 +275,7 @@ class DnsClientImpl : public DnsClient { config.nameservers.clear(); if (!config.IsValid()) { - LOG(WARNING) << "BuildEffectiveConfig(): invalid configuration"; + LOG(WARNING) << "dns_client.cc->BuildEffectiveConfig(): Invalid configuration"; return std::nullopt; } diff --git a/src/net/dns/dns_transaction.cc b/src/net/dns/dns_transaction.cc index e557acca..78b01fd5 100644 --- a/src/net/dns/dns_transaction.cc +++ b/src/net/dns/dns_transaction.cc @@ -472,7 +472,7 @@ class DnsHTTPAttempt : public DnsAttempt, public URLRequest::Delegate { request_->SetIdempotency(IDEMPOTENT); std::unique_ptr reader = std::make_unique( - query_->io_buffer()->data(), query_->io_buffer()->size()); + query_->io_buffer()->span()); request_->set_upload( ElementsUploadDataStream::CreateWithReader(std::move(reader), 0)); extra_request_headers.SetHeader(HttpRequestHeaders::kContentType, @@ -813,8 +813,7 @@ class DnsTCPAttempt : public DnsAttempt { uint16_t query_size = static_cast(query_->io_buffer()->size()); if (static_cast(query_size) != query_->io_buffer()->size()) return ERR_FAILED; - base::as_writable_bytes(length_buffer_->span()) - .copy_from(base::U16ToBigEndian(query_size)); + length_buffer_->span().copy_from(base::U16ToBigEndian(query_size)); buffer_ = base::MakeRefCounted(length_buffer_, length_buffer_->size()); next_state_ = STATE_SEND_LENGTH; @@ -879,8 +878,8 @@ class DnsTCPAttempt : public DnsAttempt { return OK; } - response_length_ = base::U16FromBigEndian( - base::as_bytes(length_buffer_->span().first<2u>())); + response_length_ = + base::U16FromBigEndian(length_buffer_->span().first<2u>()); // Check if advertised response is too short. (Optimization only.) if (response_length_ < query_->io_buffer()->size()) return ERR_DNS_MALFORMED_RESPONSE; diff --git a/src/net/url_request/url_request_http_job.cc b/src/net/url_request/url_request_http_job.cc index fc4a63cc..194c2064 100644 --- a/src/net/url_request/url_request_http_job.cc +++ b/src/net/url_request/url_request_http_job.cc @@ -111,6 +111,7 @@ #if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) #include "net/device_bound_sessions/registration_fetcher_param.h" +#include "net/device_bound_sessions/session_challenge_param.h" #include "net/device_bound_sessions/session_service.h" #endif // BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) @@ -306,7 +307,7 @@ HttpRequestSSLUpgradeDecision GetMetricForSSLUpgradeDecision( return is_secure ? HttpRequestSSLUpgradeDecision::kSSLDynamicUpgrade : HttpRequestSSLUpgradeDecision::kInsecureDynamicUpgrade; } - NOTREACHED_NORETURN(); + NOTREACHED(); } void RecordSTSHistograms(net::SSLUpgradeDecision upgrade_decision, @@ -445,6 +446,9 @@ void URLRequestHttpJob::Start() { request_info_.is_subframe_document_resource = request_->isolation_info().request_type() == net::IsolationInfo::RequestType::kSubFrame; + request_info_.is_main_frame_navigation = + request_->isolation_info().IsMainFrameRequest(); + request_info_.initiator = request_->initiator(); request_info_.load_flags = request_->load_flags(); request_info_.priority_incremental = request_->priority_incremental(); request_info_.secure_dns_policy = request_->secure_dns_policy(); @@ -496,7 +500,9 @@ bool ShouldBlockAllCookies(PrivacyMode privacy_mode) { } // namespace void URLRequestHttpJob::MaybeSetSecFetchStorageAccessHeader() { - if (!base::FeatureList::IsEnabled(features::kStorageAccessHeaders)) { + if (!request_->network_delegate()->IsStorageAccessHeaderEnabled( + base::OptionalToPtr(request_->isolation_info().top_frame_origin()), + request_->url())) { return; } // Avoid attaching the header in cases where the Cookie header is not included @@ -1044,10 +1050,7 @@ void URLRequestHttpJob::SaveCookiesAndNotifyHeadersComplete(int result) { clear_site_data_prevents_cookies_from_being_stored = true; } - base::Time response_date; - std::optional server_time = std::nullopt; - if (GetResponseHeaders()->GetDateValue(&response_date)) - server_time = std::make_optional(response_date); + std::optional server_time = GetResponseHeaders()->GetDateValue(); bool force_ignore_site_for_cookies = request_->force_ignore_site_for_cookies(); @@ -1167,14 +1170,26 @@ void URLRequestHttpJob::OnSetCookieResult(const CookieOptions& options, #if BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) void URLRequestHttpJob::ProcessDeviceBoundSessionsHeader() { + device_bound_sessions::SessionService* service = + request_->context()->device_bound_session_service(); + if (!service) { + return; + } + + const auto& request_url = request_->url(); + auto* headers = GetResponseHeaders(); std::vector params = device_bound_sessions::RegistrationFetcherParam::CreateIfValid( - request_->url(), GetResponseHeaders()); - if (auto* service = request_->context()->device_bound_session_service()) { - for (auto& param : params) { - service->RegisterBoundSession(std::move(param), - request_->isolation_info()); - } + request_url, headers); + for (auto& param : params) { + service->RegisterBoundSession(std::move(param), request_->isolation_info()); + } + + std::vector challenge_params = + device_bound_sessions::SessionChallengeParam::CreateIfValid(request_url, + headers); + for (auto& param : challenge_params) { + service->SetChallengeForBoundSession(request_url, std::move(param)); } } #endif // BUILDFLAG(ENABLE_DEVICE_BOUND_SESSIONS) @@ -1585,7 +1600,9 @@ bool URLRequestHttpJob::NeedsAuth() { } bool URLRequestHttpJob::NeedsRetryWithStorageAccess() { - if (!base::FeatureList::IsEnabled(features::kStorageAccessHeaders)) { + if (!request_->network_delegate()->IsStorageAccessHeaderEnabled( + base::OptionalToPtr(request_->isolation_info().top_frame_origin()), + request_->url())) { return false; } if (!ShouldAddCookieHeader() || @@ -1601,7 +1618,11 @@ bool URLRequestHttpJob::NeedsRetryWithStorageAccess() { } HttpResponseHeaders* headers = request_->response_headers(); - return headers && headers->HasStorageAccessRetryHeader(); + // We use the Origin header's value directly, rather than + // `request_.initiator()`, because the header may be "null" in some cases. + return headers && headers->HasStorageAccessRetryHeader(base::OptionalToPtr( + request_info_.extra_headers.GetHeader( + HttpRequestHeaders::kOrigin))); } void URLRequestHttpJob::SetSharedDictionaryGetter( diff --git a/src/ui/base/x/x11_util.cc b/src/ui/base/x/x11_util.cc index b7b3edc6..958b4b78 100644 --- a/src/ui/base/x/x11_util.cc +++ b/src/ui/base/x/x11_util.cc @@ -2,6 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#ifdef UNSAFE_BUFFERS_BUILD +// TODO(crbug.com/351564777): Remove this and convert code to safer constructs. +#pragma allow_unsafe_buffers +#endif + // This file defines utility functions for X11 (Linux only). This code has been // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support // remains woefully incomplete. @@ -18,6 +23,7 @@ #include "base/command_line.h" #include "base/containers/contains.h" +#include "base/containers/span.h" #include "base/location.h" #include "base/logging.h" #include "base/memory/ref_counted_memory.h" @@ -133,7 +139,7 @@ void DrawPixmap(x11::Connection* connection, for (int row = 0; row < height; row += rows_per_request) { size_t n_rows = std::min(rows_per_request, height - row); auto data = base::MakeRefCounted( - vec.data() + row * row_bytes, n_rows * row_bytes); + base::span(vec).subspan(row * row_bytes, n_rows * row_bytes)); connection->PutImage({ .format = x11::ImageFormat::ZPixmap, .drawable = drawable, @@ -365,14 +371,9 @@ bool GetCustomFramePrefDefault() { return false; } - ui::WindowManagerName wm = GuessWindowManager(); // Never default to using the custom title bar, unless the windows manager is a tiling WM. // Thorium should integrate, not be a special little snowflake. - if (IsWmTiling(wm)) { - return true; - } else { - return false; - } + return false; } bool IsWmTiling(WindowManagerName window_manager) { @@ -548,8 +549,7 @@ UMALinuxWindowManager GetWindowManagerUMA() { case WM_XMONAD: return UMALinuxWindowManager::kXmonad; } - NOTREACHED_IN_MIGRATION(); - return UMALinuxWindowManager::kOther; + NOTREACHED(); } bool IsX11WindowFullScreen(x11::Window window) { diff --git a/src/ui/webui/resources/cr_components/searchbox/icons/bookmark_cr23.svg b/src/ui/webui/resources/cr_components/searchbox/icons/bookmark_cr23.svg new file mode 100644 index 00000000..7c4b7baa --- /dev/null +++ b/src/ui/webui/resources/cr_components/searchbox/icons/bookmark_cr23.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/ui/webui/resources/cr_components/searchbox/icons/extension_app.svg b/src/ui/webui/resources/cr_components/searchbox/icons/extension_app.svg new file mode 100644 index 00000000..1a52035d --- /dev/null +++ b/src/ui/webui/resources/cr_components/searchbox/icons/extension_app.svg @@ -0,0 +1 @@ + diff --git a/src/ui/webui/resources/cr_components/searchbox/icons/star_active.svg b/src/ui/webui/resources/cr_components/searchbox/icons/star_active.svg new file mode 100644 index 00000000..f01a4717 --- /dev/null +++ b/src/ui/webui/resources/cr_components/searchbox/icons/star_active.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/ui/webui/resources/images/extension.svg b/src/ui/webui/resources/images/extension.svg index 0b17b55c..1ff80eb4 100644 --- a/src/ui/webui/resources/images/extension.svg +++ b/src/ui/webui/resources/images/extension.svg @@ -1 +1 @@ - + diff --git a/src/ui/webui/resources/images/icon_extensions.svg b/src/ui/webui/resources/images/icon_extensions.svg index febd5808..aa87165d 100644 --- a/src/ui/webui/resources/images/icon_extensions.svg +++ b/src/ui/webui/resources/images/icon_extensions.svg @@ -1 +1 @@ - +