diff --git a/DEPS b/DEPS index b621f05..76f5ea4e 100644 --- a/DEPS +++ b/DEPS
@@ -309,11 +309,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': 'fed805fe6ee67e7f5252b9faecc6741c057464d8', + 'skia_revision': 'beb6739688027fa5d1e1da5a946defa18217f171', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'f5fc76fe8c184b0173d3e88a4a038fdf0cd05734', + 'v8_revision': 'ec517fdfbd438e98cc95d6d9fd93816c710e9dc8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. @@ -377,7 +377,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. - 'crossbench_revision': '0f26144e3635a33fc18bdb726a6439090dc9e990', + 'crossbench_revision': '9355cb1425d7c25994b2e945fb39c54350651176', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -397,7 +397,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '77804ac0072e8c287727e6d393eafb49374c46e3', + 'devtools_frontend_revision': 'ad8438edb0fff5b4a87669fe237ec2ae7d30c86e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -529,7 +529,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'compiler_rt_revision': '02145296c3a848274a6146176a74d0e468452e68', + 'compiler_rt_revision': '45b0d106857b21348a01c292cb30a261ef968b7e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling clusterfuzz-data # and whatever else without interference from each other. @@ -537,7 +537,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': 'bcc74d7745a74dae059f1a4ca97e2979f5f77661', + 'libcxx_revision': '0cb7f02f783ef23ba0a9f73d632a5ae95af042c5', # GN CIPD package version. 'gn_version': 'git_revision:81b24e01531ecf0eff12ec9359a555ec3944ec4e', @@ -1190,7 +1190,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm', - 'version': 'UJpSXjZaBeaMomSPHbJCfzdKIkMMaTDZ_i-YXJjtcW0C', + 'version': 'ItXtwLleOTEcnS88rvu7eTFULkYVDwhMW-e0nw9UMn4C', }, ], 'condition': 'checkout_android', @@ -1201,7 +1201,7 @@ 'packages': [ { 'package': 'chromium/chrome/android/orderfiles/arm64', - 'version': 'OfUY6zghU4PmQuSCkMVNmNee_OzonxHsgImK3bWPvgoC', + 'version': 'dxu4WfKppIIXeHstnVnyxsWQEUHqnPzXATobWGKyhV4C', }, ], 'condition': 'checkout_android', @@ -1212,7 +1212,7 @@ 'packages': [ { 'package': 'chromium/android_webview/tools/orderfiles/arm64', - 'version': 'ttPALgnEpUnbrf9UaC1ySjIaFJ1Dq9i-4gyPn_C6d_QC', + 'version': 'zjFO-RB5cckztVK3C5VgUlD1gR-LdNCBi4ZA7RlFuQYC', }, ], 'condition': 'checkout_android', @@ -1597,7 +1597,7 @@ 'packages': [ { 'package': 'chromium/chrome/test/data/variations/cipd', - 'version': 'eqArp52Rq-uihdvcpYkwdYJQEjPLfYusJEtlbLvU98IC', + 'version': 'lLpN-aXP14rxPQA9BqI-BzMkBZ81r-OgZClXQHkGiG8C', }, ], 'dep_type': 'cipd', @@ -1608,7 +1608,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '1b59aa2b6c0cd8da2f566044846ef1590fe32e72', + '2503c7ae1f74a085503e3432fe26ff1f49397c26', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1708,7 +1708,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'M5giEmh4O2ZmwKQvQ47NVgpAf3i59Cf3wx4ZMipqnp4C', + 'version': 'VC9i_CgYSMT9ZWi48Sb5jeZNPwBEwuACZvkPwNX9LbAC', }, ], 'condition': 'checkout_android and non_git_source', @@ -2908,7 +2908,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@14f79df6f67f644d2b26ddc5d690ffa8f2030e6b', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8571c2cb2137af5bb8754d5e501aae90831fb7e1', 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@a57276bf558f5cf94d3a9854ebdf5a2236849a5a', 'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3', 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@01e0577914a75a2569c846778c2f93aa8e6feddd', @@ -2917,7 +2917,7 @@ 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@f703f919c30c5b67958d35d40a4297cb3823ed78', 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@d643b80d6ba8c191bc289fdda52867c3bb3c190b', 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@4322db5906e67b57ec9c327e6afe3d98ed893df7', - 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@5e817f0563ce8c6d9c023f85133ad0628d0dfc05', + 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@e7ba8af40a7e9b8e5d24eb8c5459d0bdd8101498', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'cb0597213b0fcb999caa9ed08c2f88dc45eb7d50', @@ -2960,7 +2960,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'c412d4776ca54546b9dd41be15eeaf9147a2f753', + Var('webrtc_git') + '/src.git' + '@' + '8d5c61bb7ab3464a8dc3354bc54c78100eb92335', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -3093,7 +3093,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/boca_app/app', - 'version': 'Mz5dXx73Yd3-srzT2ipOxc7qC9_ynsB0a5OcvaIQdQUC', + 'version': 'd2v47wM7X5TkWEliRPPIIBZ4coz4LE0tK5HQVHGE0_EC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3104,7 +3104,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'pQZz_HJkOnr5Q_utdJivpJL_AwR55jEawPH3SQ7wB9IC', + 'version': 'Ik_WgpS7JJMc22wM49FgbLX5b4lBt-bHQqeYhSS-e-oC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3115,7 +3115,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'XvKnnh7v9JO88zLLNIiOHcAC6XP6NpWRMxVeHaGd9N0C', + 'version': 'SCtijtDMFjvW73-I6tDNDR0reZseVtpY2cs9hDgpElwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3148,7 +3148,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': '1_DjXQ2Rs1l_YNHCq7MI4n5qXa1YgJbjpp_hpQcQhcMC', + 'version': 'UcC8QWHxy5HMx1hItCqETDWNyx6exCsr5Zruo6myxcoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3741,7 +3741,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '70aacbfb7d3ed93f0d8681880e07b92531b29992', + '979d50337992bd9cb2ad58006f7e5f3722470c66', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/ash/webui/boca_ui/boca_app_page_handler.cc b/ash/webui/boca_ui/boca_app_page_handler.cc index cb81ae4..e1dc4461 100644 --- a/ash/webui/boca_ui/boca_app_page_handler.cc +++ b/ash/webui/boca_ui/boca_app_page_handler.cc
@@ -22,15 +22,18 @@ #include "ash/webui/boca_ui/provider/tab_info_collector.h" #include "ash/wm/window_state.h" #include "ash/wm/wm_event.h" +#include "base/check.h" #include "base/check_is_test.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/functional/callback_forward.h" #include "base/functional/callback_helpers.h" +#include "base/location.h" #include "base/logging.h" #include "base/notreached.h" #include "base/sequence_checker.h" #include "base/strings/utf_string_conversions.h" +#include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "chromeos/ash/components/boca/boca_app_client.h" #include "chromeos/ash/components/boca/boca_metrics_util.h" @@ -641,27 +644,13 @@ const std::string& id, EndViewScreenSessionCallback callback) { CHECK(spotlight_service_); - - if (ash::features::IsBocaSpotlightRobotRequesterEnabled()) { - GetSessionManager()->EndSpotlightSession(); + if (student_screen_presenter() && + student_screen_presenter()->IsPresenting()) { + // Already ended and a presentation is in progress. + std::move(callback).Run(std::nullopt); + return; } - - spotlight_service_->UpdateViewScreenState( - id, ::boca::ViewScreenConfig::INACTIVE, base_url_, - base::BindOnce( - [](EndViewScreenSessionCallback cb, - base::expected<bool, google_apis::ApiErrorCode> result) { - if (!result.has_value()) { - boca::RecordEndViewStudentScreenErrorCode(result.error()); - LOG(WARNING) - << "[Boca] Error setting view screen state to inactive: " - << result.error(); - std::move(cb).Run(mojom::EndViewScreenSessionError::kHTTPError); - return; - } - std::move(cb).Run(std::nullopt); - }, - std::move(callback))); + EndViewScreenSessionInternal(id, std::move(callback)); } void BocaAppHandler::SetViewScreenSessionActive( @@ -773,26 +762,19 @@ mojom::IdentityPtr student, const std::string& receiver_id, PresentStudentScreenCallback callback) { - if (!student_screen_presenter()) { + auto* session = GetSessionManager()->GetCurrentSession(); + if (!student_screen_presenter() || !session || + !IsActiveSession(session->session_id())) { LOG(ERROR) << "[Boca] unexpected call to present student screen"; std::move(callback).Run(false); return; } - ::boca::UserIdentity student_identity; - student_identity.set_gaia_id(student->id); - student_identity.set_email(student->email); - student_identity.set_full_name(student->name); - std::optional<std::string> student_device_id = - GetSessionManager()->GetStudentActiveDeviceId(student->id); - if (!student_device_id.has_value()) { - std::move(callback).Run(false); - return; - } - student_screen_presenter()->Start( - receiver_id, student_identity, student_device_id.value(), - std::move(callback), - base::BindOnce(&BocaAppHandler::OnPresentStudentScreenEnded, - weak_ptr_factory_.GetWeakPtr())); + std::string student_id = student->id; + auto end_view_screen_cb = base::BindOnce( + &BocaAppHandler::OnEndViewScreenResponseForPresentStudentScreen, + weak_ptr_factory_.GetWeakPtr(), session->session_id(), std::move(student), + receiver_id, std::move(callback)); + EndViewScreenSessionInternal(student_id, std::move(end_view_screen_cb)); } void BocaAppHandler::StopPresentingStudentScreen( @@ -1348,6 +1330,87 @@ remote_->OnPresentOwnScreenEnded(); } +void BocaAppHandler::EndViewScreenSessionInternal( + const std::string& id, + EndViewScreenSessionCallback callback) { + CHECK(spotlight_service_); + + if (ash::features::IsBocaSpotlightRobotRequesterEnabled()) { + GetSessionManager()->EndSpotlightSession(); + } + + spotlight_service_->UpdateViewScreenState( + id, ::boca::ViewScreenConfig::INACTIVE, base_url_, + base::BindOnce( + [](EndViewScreenSessionCallback cb, + base::expected<bool, google_apis::ApiErrorCode> result) { + if (!result.has_value()) { + boca::RecordEndViewStudentScreenErrorCode(result.error()); + LOG(WARNING) + << "[Boca] Error setting view screen state to inactive: " + << result.error(); + std::move(cb).Run(mojom::EndViewScreenSessionError::kHTTPError); + return; + } + std::move(cb).Run(std::nullopt); + }, + std::move(callback))); +} + +void BocaAppHandler::PresentStudentScreenInternal( + const std::string& session_id, + mojom::IdentityPtr student, + const std::string& receiver_id, + PresentStudentScreenCallback callback) { + if (!IsActiveSession(session_id)) { + std::move(callback).Run(false); + return; + } + if (!student_screen_presenter()) { + LOG(ERROR) << "[Boca] unexpected call to present student screen"; + std::move(callback).Run(false); + return; + } + ::boca::UserIdentity student_identity; + student_identity.set_gaia_id(student->id); + student_identity.set_email(student->email); + student_identity.set_full_name(student->name); + std::optional<std::string> student_device_id = + GetSessionManager()->GetStudentActiveDeviceId(student->id); + if (!student_device_id.has_value()) { + std::move(callback).Run(false); + return; + } + student_screen_presenter()->Start( + receiver_id, student_identity, student_device_id.value(), + std::move(callback), + base::BindOnce(&BocaAppHandler::OnPresentStudentScreenEnded, + weak_ptr_factory_.GetWeakPtr())); +} + +void BocaAppHandler::OnEndViewScreenResponseForPresentStudentScreen( + const std::string& session_id, + mojom::IdentityPtr student, + const std::string& receiver_id, + PresentStudentScreenCallback callback, + std::optional<mojom::EndViewScreenSessionError> end_view_screen_error) { + if (end_view_screen_error.has_value()) { + std::move(callback).Run(false); + return; + } + // Delay presentation to increase the likelihood the host receives the + // inactive connection notification and can accept the new one. + // TODO(crbug.com/445259545): The race condition is still there even with the + // delay. Update the host side to allow new connection even if the previous + // one is ongoing and then remove this delay. + base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( + FROM_HERE, + base::BindOnce(&BocaAppHandler::PresentStudentScreenInternal, + weak_ptr_factory_.GetWeakPtr(), session_id, + std::move(student), receiver_id, std::move(callback)), + base::Seconds(5)); +} + TeacherScreenPresenter* BocaAppHandler::teacher_screen_presenter() { return GetSessionManager()->GetTeacherScreenPresenter(); }
diff --git a/ash/webui/boca_ui/boca_app_page_handler.h b/ash/webui/boca_ui/boca_app_page_handler.h index 2ae079d8..c4f9d34 100644 --- a/ash/webui/boca_ui/boca_app_page_handler.h +++ b/ash/webui/boca_ui/boca_app_page_handler.h
@@ -6,6 +6,7 @@ #define ASH_WEBUI_BOCA_UI_BOCA_APP_PAGE_HANDLER_H_ #include <memory> +#include <optional> #include <string> #include "ash/webui/boca_ui/mojom/boca.mojom-forward.h" @@ -272,6 +273,21 @@ void OnPresentStudentScreenEnded() override; void OnPresentOwnScreenEnded() override; + void EndViewScreenSessionInternal(const std::string& id, + EndViewScreenSessionCallback callback); + + void PresentStudentScreenInternal(const std::string& session_id, + mojom::IdentityPtr student, + const std::string& receiver_id, + PresentStudentScreenCallback callback); + + void OnEndViewScreenResponseForPresentStudentScreen( + const std::string& session_id, + mojom::IdentityPtr student, + const std::string& receiver_id, + PresentStudentScreenCallback callback, + std::optional<mojom::EndViewScreenSessionError> end_view_screen_error); + TeacherScreenPresenter* teacher_screen_presenter(); StudentScreenPresenter* student_screen_presenter();
diff --git a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc index 7f43e5c..a079332f 100644 --- a/ash/webui/boca_ui/boca_app_page_handler_unittest.cc +++ b/ash/webui/boca_ui/boca_app_page_handler_unittest.cc
@@ -367,6 +367,8 @@ MOCK_METHOD(void, CheckConnection, (), (override)); MOCK_METHOD(void, Stop, (base::OnceCallback<void(bool)>), (override)); + + MOCK_METHOD(bool, IsPresenting, (), (override)); }; class MockTeacherScreenPresenter : public TeacherScreenPresenter { @@ -667,10 +669,15 @@ })); } + content::BrowserTaskEnvironment* task_environment() { + return &task_environment_; + } + private: bool is_producer_; base::test::ScopedFeatureList scoped_feature_list_; - content::BrowserTaskEnvironment task_environment_; + content::BrowserTaskEnvironment task_environment_{ + base::test::TaskEnvironment::TimeSource::MOCK_TIME}; sync_preferences::TestingPrefServiceSyncable pref_service_; TestingPrefServiceSimple local_state_; ::boca::Session session = GetCommonActiveSessionProto(); @@ -2633,6 +2640,21 @@ EXPECT_FALSE(future.Get().has_value()); } +TEST_F(BocaAppPageHandlerProducerTest, + EndViewScreenSessionWhilePresentingStudentScreen) { + base::test::TestFuture<std::optional<mojom::EndViewScreenSessionError>> + future; + auto student_screen_presenter = + std::make_unique<MockStudentScreenPresenter>(); + ON_CALL(*session_manager(), GetStudentScreenPresenter) + .WillByDefault(Return(student_screen_presenter.get())); + ON_CALL(*student_screen_presenter, IsPresenting).WillByDefault(Return(true)); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState).Times(0); + + boca_app_handler()->EndViewScreenSession("student-id", future.GetCallback()); + EXPECT_FALSE(future.Get().has_value()); +} + TEST_F(BocaAppPageHandlerProducerTest, EndViewScreenSessionFailed) { base::HistogramTester histogram_tester; const std::string student_id = "123"; @@ -3077,7 +3099,15 @@ kActiveStudentId, "student name", "student@email.com", std::nullopt); ::boca::UserIdentity student_identity; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity()); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState) + .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState, + std::string, ViewScreenRequestCallback callback) { + std::move(callback).Run(true); + }); EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId) .WillOnce(Return(kStudentDeviceId)); EXPECT_CALL(*student_screen_presenter, @@ -3093,6 +3123,7 @@ boca_app_handler()->PresentStudentScreen(student_identity_mojom->Clone(), kReceiverId, success_future.GetCallback()); + task_environment()->FastForwardBy(base::Seconds(5)); EXPECT_TRUE(success_future.Get()); EXPECT_EQ(student_identity.gaia_id(), student_identity_mojom->id); EXPECT_EQ(student_identity.full_name(), student_identity_mojom->name); @@ -3110,7 +3141,15 @@ ON_CALL(*session_manager(), GetStudentScreenPresenter) .WillByDefault(Return(student_screen_presenter.get())); base::test::TestFuture<bool> success_future; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity()); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState) + .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState, + std::string, ViewScreenRequestCallback callback) { + std::move(callback).Run(true); + }); EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId) .WillOnce(Return(kStudentDeviceId)); EXPECT_CALL(*student_screen_presenter, @@ -3124,6 +3163,58 @@ mojom::Identity::New(kActiveStudentId, "student name", "student@email.com", std::nullopt), kReceiverId, success_future.GetCallback()); + task_environment()->FastForwardBy(base::Seconds(5)); + EXPECT_FALSE(success_future.Get()); +} + +TEST_F(BocaAppPageHandlerProducerTest, + PresentStudentScreenEndViewScreenFailure) { + auto student_screen_presenter = + std::make_unique<MockStudentScreenPresenter>(); + ON_CALL(*session_manager(), GetStudentScreenPresenter) + .WillByDefault(Return(student_screen_presenter.get())); + base::test::TestFuture<bool> success_future; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); + boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity()); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState) + .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState, + std::string, ViewScreenRequestCallback callback) { + std::move(callback).Run( + base::unexpected(google_apis::ApiErrorCode::HTTP_BAD_REQUEST)); + }); + EXPECT_CALL(*student_screen_presenter, Start).Times(0); + boca_app_handler()->PresentStudentScreen( + mojom::Identity::New(kActiveStudentId, "student name", + "student@email.com", std::nullopt), + kReceiverId, success_future.GetCallback()); + EXPECT_FALSE(success_future.Get()); +} + +TEST_F(BocaAppPageHandlerProducerTest, + PresentStudentScreenSessionInactiveAfterCall) { + auto student_screen_presenter = + std::make_unique<MockStudentScreenPresenter>(); + ON_CALL(*session_manager(), GetStudentScreenPresenter) + .WillByDefault(Return(student_screen_presenter.get())); + base::test::TestFuture<bool> success_future; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); + boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity()); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState) + .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState, + std::string, ViewScreenRequestCallback callback) { + std::move(callback).Run(true); + }); + EXPECT_CALL(*student_screen_presenter, Start).Times(0); + boca_app_handler()->PresentStudentScreen( + mojom::Identity::New(kActiveStudentId, "student name", + "student@email.com", std::nullopt), + kReceiverId, success_future.GetCallback()); + session.set_session_state(::boca::Session::PAST); + task_environment()->FastForwardBy(base::Seconds(5)); EXPECT_FALSE(success_future.Get()); } @@ -3133,7 +3224,15 @@ ON_CALL(*session_manager(), GetStudentScreenPresenter) .WillByDefault(Return(student_screen_presenter.get())); base::test::TestFuture<bool> success_future; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); boca_app_handler()->OnSessionStarted("session_id", ::boca::UserIdentity()); + EXPECT_CALL(*spotlight_service(), UpdateViewScreenState) + .WillOnce([](std::string, ::boca::ViewScreenConfig::ViewScreenState, + std::string, ViewScreenRequestCallback callback) { + std::move(callback).Run(true); + }); EXPECT_CALL(*session_manager(), GetStudentActiveDeviceId) .WillOnce(Return(std::nullopt)); EXPECT_CALL(*student_screen_presenter, Start).Times(0); @@ -3141,6 +3240,7 @@ mojom::Identity::New(kActiveStudentId, "student name", "student@email.com", std::nullopt), kReceiverId, success_future.GetCallback()); + task_environment()->FastForwardBy(base::Seconds(5)); EXPECT_FALSE(success_future.Get()); } @@ -3148,6 +3248,9 @@ ON_CALL(*session_manager(), GetStudentScreenPresenter) .WillByDefault(Return(nullptr)); base::test::TestFuture<bool> success_future; + ::boca::Session session = GetCommonActiveSessionProto(); + EXPECT_CALL(*session_manager(), GetCurrentSession()) + .WillRepeatedly(Return(&session)); boca_app_handler()->PresentStudentScreen( mojom::Identity::New(kActiveStudentId, "student name", "student@email.com", std::nullopt),
diff --git a/base/message_loop/message_pump_glib.cc b/base/message_loop/message_pump_glib.cc index 648cd9c4..4e89c10 100644 --- a/base/message_loop/message_pump_glib.cc +++ b/base/message_loop/message_pump_glib.cc
@@ -18,6 +18,10 @@ #include "base/task/current_thread.h" #include "base/threading/platform_thread.h" +#if !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA) +#include "base/notimplemented.h" +#endif // !BUILDFLAG(IS_OZONE) || BUILDFLAG(IS_FUCHSIA) + namespace base { namespace { @@ -291,6 +295,14 @@ FdWatchMode mode, IOWatcher::FdWatcher& watcher, const Location& location) override { + // CurrentThreadForUI::WatchFileDescriptor is an Ozone-only feature. + // On ChromeOS, the libchrome package is built with use_glib=true, which + // includes this file. However, its configuration does not have + // BUILDFLAG(IS_OZONE) enabled, so WatchFileDescriptor is not declared. This + // guard prevents a compile error. Please note that while libchrome is + // ChromeOS specific and is used extensively by various components within + // ChromeOS, libchrome is not part of Ash-chrome. +#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) MessagePumpForIO::Mode io_mode; switch (mode) { case FdWatchMode::kRead: @@ -310,6 +322,10 @@ return nullptr; } return watch; +#else + NOTIMPLEMENTED(); + return nullptr; +#endif // BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) } private:
diff --git a/base/task/current_thread.h b/base/task/current_thread.h index bca254474..7cf3962 100644 --- a/base/task/current_thread.h +++ b/base/task/current_thread.h
@@ -250,7 +250,7 @@ CurrentUIThread* operator->() { return this; } -#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) && !BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_OZONE) && !BUILDFLAG(IS_FUCHSIA) static_assert( std::is_base_of_v<WatchableIOMessagePumpPosix, MessagePumpForUI>, "CurrentThreadForUI::WatchFileDescriptor is supported only"
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index dbb07e9..058c182 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -29.20250831.103.1 +29.20250926.103.1
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index fdaa644..39a9b96b 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision var in //DEPS. - libcxx_revision = "bcc74d7745a74dae059f1a4ca97e2979f5f77661" + libcxx_revision = "0cb7f02f783ef23ba0a9f73d632a5ae95af042c5" }
diff --git a/buildtools/third_party/libc++/libcxx_headers.gni b/buildtools/third_party/libc++/libcxx_headers.gni index 89c1cab..34e3c13 100644 --- a/buildtools/third_party/libc++/libcxx_headers.gni +++ b/buildtools/third_party/libc++/libcxx_headers.gni
@@ -11,7 +11,7 @@ import("//buildtools/deps_revisions.gni") assert( - libcxx_revision == "bcc74d7745a74dae059f1a4ca97e2979f5f77661", + libcxx_revision == "0cb7f02f783ef23ba0a9f73d632a5ae95af042c5", "libcxx_headers.gni and third_party/libc++ are out of sync.$0x0A$0x0AIf you were messing around with the libc++ repository, run:$0x0A`buildtools/third_party/libc++/generate_libcxx_headers.py`$0x0A$0x0AIf the script doesn't resolve the error, file a bug to msta@ with reproduction details.$0x0A") libcxx_headers = [
diff --git a/chrome/VERSION b/chrome/VERSION index 870bd79..849007be 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=142 MINOR=0 -BUILD=7439 +BUILD=7440 PATCH=0
diff --git a/chrome/browser/extensions/content_script_apitest.cc b/chrome/browser/extensions/content_script_apitest.cc index 4eb51554..fa72358 100644 --- a/chrome/browser/extensions/content_script_apitest.cc +++ b/chrome/browser/extensions/content_script_apitest.cc
@@ -4,6 +4,7 @@ #include <stddef.h> +#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback.h" #include "base/run_loop.h" @@ -49,6 +50,7 @@ #include "extensions/buildflags/buildflags.h" #include "extensions/common/api/content_scripts.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_features.h" #include "extensions/common/manifest_constants.h" #include "extensions/common/manifest_handlers/externally_connectable.h" #include "extensions/common/utils/content_script_utils.h" @@ -656,6 +658,77 @@ EXPECT_EQ(kInjectedDivColor, get_element_color("#div3")); } +#if !BUILDFLAG(IS_ANDROID) + +class ContentScriptCssApiTest : public ContentScriptApiTest { + protected: + base::test::ScopedFeatureList feature_list_{ + extensions_features::kExtensionLocalizationGuid}; +}; + +// Tests a page's service worker intercepting an extension's stylesheet as +// served by a dynamic URL. +// Regression test for https://crbug.com/435609878. +// TODO(crbug.com/447647864): Port to desktop Android when `getComputedStyle()` +// returns updated values for a web service worker, instead of the default. +IN_PROC_BROWSER_TEST_F(ContentScriptApiTest, LocalizedWithDynamicUrl) { + // Load an extension with a stylesheet that can be served by a dynamic URL. + ASSERT_TRUE(StartEmbeddedTestServer()); + const Extension* extension = LoadExtension( + test_data_dir_.AppendASCII("content_scripts/css_l10n_dynamic")); + ASSERT_TRUE(extension); + + // Navigate to a web page controlled by a service worker. The page will send a + // "ready" message when the service worker is activated and has claimed the + // page as a client. + const GURL url = embedded_test_server()->GetURL( + "/extensions/page_with_service_worker/index.html"); + content::WebContents* web_contents = GetActiveWebContents(); + content::DOMMessageQueue message_queue(web_contents); + ASSERT_TRUE(NavigateToURL(web_contents, url)); + std::string ready; + EXPECT_TRUE(message_queue.WaitForMessage(&ready)); + EXPECT_EQ(R"("ready")", ready); + + // Inject a script that will add a stylesheet associated with the extension's + // dynamic URL and return (via a promise) when the stylesheet has loaded. + static constexpr char kInjectStylesheet[] = + R"((function() { + let sheet = document.createElement('link'); + sheet.type = 'text/css'; + sheet.rel = 'stylesheet'; + let url = '%s'; + sheet.href = url; + return new Promise(resolve => { + sheet.onload = () => { resolve('success'); }; + sheet.onerror = error => { resolve(error); }; + document.head.appendChild(sheet); + }); + })();)"; + GURL dynamic_url = extension->dynamic_url().Resolve("style.css"); + std::string script = + base::StringPrintf(kInjectStylesheet, dynamic_url.spec()); + EXPECT_EQ("success", content::EvalJs(web_contents, script)); + + // Retrieve the body's background color. Red (rgb(255, 0, 0) comes from the + // web service worker which retrieves it from the extension's messages.json + // file. This is made possible due to the extension's `default_locale` key. + // Notes: + // * The stylesheet in the extension uses the color "green". This difference + // ensures the stylesheet is properly being served by the service worker, + // and not the extension. + // * The service worker replies with an unlocalized variable in the stylesheet + // for the color. This ensures that the stylesheet is properly localized by + // the browser process before use. + static constexpr char kGetBodyColor[] = + R"((function() { + return getComputedStyle(document.body).color; + })();)"; + EXPECT_EQ("rgb(255, 0, 0)", content::EvalJs(web_contents, kGetBodyColor)); +} + +#endif // !BUILDFLAG(IS_ANDROID) + #if BUILDFLAG(ENABLE_EXTENSIONS) // TODO(crbug.com/371432155): Port to desktop Android when the chrome.tabs API // is supported.
diff --git a/chrome/browser/feed/android/web_feed_bridge.cc b/chrome/browser/feed/android/web_feed_bridge.cc index 1865d3c..7a86d6b 100644 --- a/chrome/browser/feed/android/web_feed_bridge.cc +++ b/chrome/browser/feed/android/web_feed_bridge.cc
@@ -371,7 +371,8 @@ base::Days(GetFeedConfig().webfeed_accelerator_recent_visit_history_days); history_service->GetDailyVisitsToOrigin( url::Origin::Create(url::GURLAndroid::ToNativeGURL(env, j_url)), - begin_time, end_time, std::move(callback), &TaskTracker()); + begin_time, end_time, history::VisitQuery404sPolicy::kExclude404s, + std::move(callback), &TaskTracker()); } static void JNI_WebFeedBridge_IncrementFollowedFromWebPageMenuCount(
diff --git a/chrome/browser/ui/browser_commands.cc b/chrome/browser/ui/browser_commands.cc index 249f369..94593b9 100644 --- a/chrome/browser/ui/browser_commands.cc +++ b/chrome/browser/ui/browser_commands.cc
@@ -1288,28 +1288,7 @@ Browser::Create(Browser::CreateParams(browser->profile(), true)); } - int indices_size = tab_indices.size(); - int active_index = browser->tab_strip_model()->active_index(); - for (int i = 0; i < indices_size; i++) { - // Adjust tab index to account for tabs already moved. - int adjusted_index = tab_indices[i] - i; - bool pinned = browser->tab_strip_model()->IsTabPinned(adjusted_index); - std::unique_ptr<tabs::TabModel> tab_model = - browser->tab_strip_model()->DetachTabAtForInsertion(adjusted_index); - - int add_types = pinned ? AddTabTypes::ADD_PINNED : 0; - // The last tab made active takes precedence, so activate the last active - // tab, with a fallback for the first tab (i == 0) if the active tab isn’t - // in the set of tabs being moved. - if (i == 0 || tab_indices[i] == active_index) { - add_types = add_types | AddTabTypes::ADD_ACTIVE; - } - - new_browser->tab_strip_model()->AddTab( - std::move(tab_model), -1, ui::PAGE_TRANSITION_TYPED, add_types); - } - - new_browser->window()->Show(); + MoveTabsToExistingWindow(browser, new_browser, tab_indices); } bool CanCloseTabsToRight(const Browser* browser) { @@ -1377,16 +1356,24 @@ } int indices_size = tab_indices.size(); + int active_index = source->tab_strip_model()->active_index(); for (int i = 0; i < indices_size; i++) { // Adjust tab index to account for tabs already moved. int adjusted_index = tab_indices[i] - i; bool pinned = source->tab_strip_model()->IsTabPinned(adjusted_index); std::unique_ptr<tabs::TabModel> tab_model = source->tab_strip_model()->DetachTabAtForInsertion(adjusted_index); - int add_types = - AddTabTypes::ADD_ACTIVE | (pinned ? AddTabTypes::ADD_PINNED : 0); - target->tab_strip_model()->AddTab(std::move(tab_model), -1, - ui::PAGE_TRANSITION_TYPED, add_types); + + int add_types = pinned ? AddTabTypes::ADD_PINNED : 0; + // The last tab made active takes precedence, so activate the last active + // tab, with a fallback for the first tab (i == 0) if the active tab isn’t + // in the set of tabs being moved. + if (i == 0 || tab_indices[i] == active_index) { + add_types = add_types | AddTabTypes::ADD_ACTIVE; + } + + target->tab_strip_model()->AddTab( + std::move(tab_model), -1, ui::PAGE_TRANSITION_TYPED, add_types); } target->window()->Show(); }
diff --git a/chrome/browser/ui/browser_commands_browsertest.cc b/chrome/browser/ui/browser_commands_browsertest.cc index 228a7d9..0fc04615 100644 --- a/chrome/browser/ui/browser_commands_browsertest.cc +++ b/chrome/browser/ui/browser_commands_browsertest.cc
@@ -452,6 +452,76 @@ ASSERT_TRUE(second_window->tab_strip_model()->count() == 1); } +IN_PROC_BROWSER_TEST_F(BrowserCommandsTest, + MoveTabsToExistingWindow_ActiveTabMoved) { + auto AddTabs = [](Browser* browser, int count) { + for (int i = 0; i < count; ++i) { + chrome::NewTab(browser); + } + }; + + // Source browser: 0(NTP),1,2(active),3 + AddTabs(browser(), 3); + browser()->tab_strip_model()->ActivateTabAt(2); + content::WebContents* src_active_tab = + browser()->tab_strip_model()->GetWebContentsAt(2); + // Target browser: 0 + Browser* target_browser = + Browser::Create(Browser::CreateParams(browser()->profile(), true)); + AddTabs(target_browser, 1); + ASSERT_EQ(browser()->tab_strip_model()->count(), 4); + ASSERT_EQ(target_browser->tab_strip_model()->count(), 1); + + // Move tabs: includes active tab. + std::vector<int> indices = {1, 2, 3}; + chrome::MoveTabsToExistingWindow(browser(), target_browser, indices); + + // Verify tab counts after move. + EXPECT_EQ(1, browser()->tab_strip_model()->count()); + EXPECT_EQ(4, target_browser->tab_strip_model()->count()); + + // Verify active tab in target matches the original active tab. + // 0,1,2(active),3 + EXPECT_EQ(2, target_browser->tab_strip_model()->active_index()); + EXPECT_EQ(src_active_tab, + target_browser->tab_strip_model()->GetActiveWebContents()); +} + +IN_PROC_BROWSER_TEST_F(BrowserCommandsTest, + MoveTabsToExistingWindow_ActiveTabNotMoved) { + auto AddTabs = [](Browser* browser, int count) { + for (int i = 0; i < count; ++i) { + chrome::NewTab(browser); + } + }; + + // Source browser: 0(NTP,active),1,2,3 + AddTabs(browser(), 3); + browser()->tab_strip_model()->ActivateTabAt(0); + // Target browser: 0 + Browser* target_browser = + Browser::Create(Browser::CreateParams(browser()->profile(), true)); + AddTabs(target_browser, 1); + ASSERT_EQ(browser()->tab_strip_model()->count(), 4); + ASSERT_EQ(target_browser->tab_strip_model()->count(), 1); + + // Move tabs: does NOT include active tab. + std::vector<int> indices = {1, 2, 3}; + content::WebContents* first_moved_tab = + browser()->tab_strip_model()->GetWebContentsAt(1); + chrome::MoveTabsToExistingWindow(browser(), target_browser, indices); + + // Verify tab counts after move. + EXPECT_EQ(1, browser()->tab_strip_model()->count()); + EXPECT_EQ(4, target_browser->tab_strip_model()->count()); + + // Fallback to the first moved tab. + // 0,1(active),2,3 + EXPECT_EQ(1, target_browser->tab_strip_model()->active_index()); + EXPECT_EQ(first_moved_tab, + target_browser->tab_strip_model()->GetActiveWebContents()); +} + // Tests IDC_MOVE_TAB_TO_NEW_WINDOW. This is a browser test and not a unit test // since it needs to create a new browser window, which doesn't work with a // TestingProfile.
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc index e99e89cc..4fe7996d 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc +++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -560,10 +560,10 @@ } else { const TemplateURL* turl = nullptr; if (match.associated_keyword) { - turl = match.associated_keyword->GetTemplateURL(GetTemplateURLService(), - false); + turl = + match.associated_keyword->GetTemplateURL(GetTemplateURLService()); } else if (!match.keyword.empty()) { - turl = match.GetTemplateURL(GetTemplateURLService(), false); + turl = match.GetTemplateURL(GetTemplateURLService()); } // Fetch the favicon if the `TemplateURL` is from the enterprise search // aggregator policy. This covers both cases:
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc index d561349..cc5612a 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc +++ b/chrome/browser/ui/omnibox/chrome_omnibox_navigation_observer.cc
@@ -307,8 +307,7 @@ void ChromeOmniboxNavigationObserver::On404() { TemplateURLService* template_url_service = TemplateURLServiceFactory::GetForProfile(profile_); - const TemplateURL* template_url = match_.GetTemplateURL( - template_url_service, false /* allow_fallback_to_destination_host */); + const TemplateURL* template_url = match_.GetTemplateURL(template_url_service); // If the omnibox navigation was to a URL (and hence did not involve a // TemplateURL / search at all) or the invoked search engine has been // deleted or otherwise modified, doing nothing is the right thing.
diff --git a/chrome/browser/ui/omnibox/omnibox_controller.cc b/chrome/browser/ui/omnibox/omnibox_controller.cc index 3988c97c..b23658ec 100644 --- a/chrome/browser/ui/omnibox/omnibox_controller.cc +++ b/chrome/browser/ui/omnibox/omnibox_controller.cc
@@ -168,7 +168,7 @@ if (OmniboxFieldTrial::IsStarterPackExpansionEnabled() && match.from_keyword) { const TemplateURL* turl = - match.GetTemplateURL(client_->GetTemplateURLService(), false); + match.GetTemplateURL(client_->GetTemplateURLService()); if (turl && turl->starter_pack_id() == template_url_starter_pack_data::kGemini) { return true;
diff --git a/chrome/browser/ui/omnibox/omnibox_edit_model.cc b/chrome/browser/ui/omnibox/omnibox_edit_model.cc index f3d37ff3..06ec1ee 100644 --- a/chrome/browser/ui/omnibox/omnibox_edit_model.cc +++ b/chrome/browser/ui/omnibox/omnibox_edit_model.cc
@@ -1708,7 +1708,7 @@ const AutocompleteMatch& match) const { // Return an empty image if not an extension match. TemplateURLService* service = controller_->client()->GetTemplateURLService(); - const TemplateURL* template_url = match.GetTemplateURL(service, false); + const TemplateURL* template_url = match.GetTemplateURL(service); if (!template_url || template_url->type() != TemplateURL::OMNIBOX_API_EXTENSION) { return gfx::Image(); @@ -2019,7 +2019,7 @@ // with information from the keyword match, rather than the current match. CHECK(match.associated_keyword) << match.keyword; const TemplateURL* turl = match.associated_keyword->GetTemplateURL( - controller_->client()->GetTemplateURLService(), false); + controller_->client()->GetTemplateURLService()); std::u16string replacement_string = turl ? turl->short_name() : match.contents; bool ask_keyword = turl && turl->is_ask_starter_pack(); @@ -2601,7 +2601,7 @@ omnibox::answer_data_parser::LogAnswerUsed(match.answer_type); TemplateURLService* service = controller_->client()->GetTemplateURLService(); - TemplateURL* template_url = match.GetTemplateURL(service, false); + TemplateURL* template_url = match.GetTemplateURL(service); if (template_url) { // |match| is a Search navigation or a URL navigation in keyword mode; log // search engine usage metrics.
diff --git a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc index bf61a2c..070c61a 100644 --- a/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc +++ b/chrome/browser/ui/views/omnibox/remove_suggestion_bubble.cc
@@ -55,7 +55,7 @@ // Get the Search Provider name associated with this match. std::u16string search_provider_short_name; const TemplateURL* template_url = - match.GetTemplateURL(template_url_service, false); + match.GetTemplateURL(template_url_service); // If the match has no associated Search Provider, get the default one, // although this may still fail if it's forbidden by policy. if (!template_url) {
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index 523031cf..29b1be8 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1758931015-64353291d25d48e91387ce20404a6c405f95eae0-83b5728ee5389df34e3ec5762f30273474d80f94.profdata +chrome-android32-main-1758995345-be1673a89072b7b7afea5e5247ec413134f9b51a-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index 59fa5d38..f10e787 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1758931611-7e337a8333b801ca33703f6f859a116dc7a3b56b-c486e2f3de4ae29ef01ba41d44b98d26f4a0afc4.profdata +chrome-android64-main-1758997571-da6b2dbda31c2ceaef34434e12af96c1d7960e1c-98b77b2262c5e0763648f5fbf7f890896222bf62.profdata
diff --git a/chrome/build/android-desktop-x64.pgo.txt b/chrome/build/android-desktop-x64.pgo.txt index b0610a4..0776b89 100644 --- a/chrome/build/android-desktop-x64.pgo.txt +++ b/chrome/build/android-desktop-x64.pgo.txt
@@ -1 +1 @@ -chrome-android-desktop-x64-main-1758931015-65a1a5ef68386fcc73ee11ca5238e59a2af03f60-83b5728ee5389df34e3ec5762f30273474d80f94.profdata +chrome-android-desktop-x64-main-1758995345-2d0b49b9c84128939fba30c140ab27329fa5cd27-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 4ee2012..2f9751a 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1758887821-86d46083f409d45f51fb0e3a1f4e5ff85b211d2d-8f33ed4a83774b89e76819368c55ce9c1830b42f.profdata +chrome-linux-main-1758995345-058dde9b52af99c82e0b33451af817348b420fd5-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 6d0e3c64..39f9b04 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1758938169-d73c2fa6c7e72a7c184d8d968772500a942a3963-5a5883c1454cbce8605814ed5d9b848167ed4d18.profdata +chrome-mac-arm-main-1759003073-e1391304d4590c587a4125f09d03e11f9aae1845-108c9f40a970d3d5b6d60d6b8022867451cf15c4.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 8fe9fe5..62cee74 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1758931015-329ca4991e567824de92f01927e1d1254cf13da5-83b5728ee5389df34e3ec5762f30273474d80f94.profdata +chrome-mac-main-1758995345-0e57ff97a3b6481131651e41fee54e2b315ba40b-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 86484a5..64892a57 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1758931015-1f233ba938f122ab51891fdde324ed387d2f7dbe-83b5728ee5389df34e3ec5762f30273474d80f94.profdata +chrome-win-arm64-main-1758995345-5619d2858077a0a82c54f0d0091ae41f3cd42ac6-d9310cad7d8031629015eb3e77022f2ff49efa6b.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 9cf019b..961641d 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1758909570-247d70c9c68f7829ca87703254483654d6846b8a-c14da0391a173fcbf78cba83679d6c1e18575eeb.profdata +chrome-win32-main-1758985005-180d04274a3f86ec58749ebc28042a549f937bb0-c7d97773dc85ddac372f2b3ec91da962353e1edd.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 14e3de2..9bfe41d 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1758909570-37053fca9d353f9c2fb411b31befce4c35597383-c14da0391a173fcbf78cba83679d6c1e18575eeb.profdata +chrome-win64-main-1758985005-0173c0ebeab5201f886abc38abf6e7e3b64c6189-c7d97773dc85ddac372f2b3ec91da962353e1edd.profdata
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json new file mode 100644 index 0000000..9195a4c --- /dev/null +++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/_locales/en/messages.json
@@ -0,0 +1,5 @@ +{ + "color": { + "message": "red" + } +}
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json new file mode 100644 index 0000000..9d0aa508 --- /dev/null +++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/manifest.json
@@ -0,0 +1,11 @@ +{ + "name": "Test", + "version": "1.0", + "manifest_version": 3, + "web_accessible_resources": [{ + "resources": ["style.css"], + "matches": ["<all_urls>"], + "use_dynamic_url": true + }], + "default_locale": "en" +}
diff --git a/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css new file mode 100644 index 0000000..bb3612d3 --- /dev/null +++ b/chrome/test/data/extensions/api_test/content_scripts/css_l10n_dynamic/style.css
@@ -0,0 +1,7 @@ +/* Copyright 2025 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +body { + color: green; +}
diff --git a/chrome/test/data/extensions/page_with_service_worker/index.html b/chrome/test/data/extensions/page_with_service_worker/index.html new file mode 100644 index 0000000..4a2516a --- /dev/null +++ b/chrome/test/data/extensions/page_with_service_worker/index.html
@@ -0,0 +1,36 @@ +<!-- +Copyright 2025 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<!DOCTYPE html> +<html lang="en"> + <body> + Some text + </body> + <script> + // Waits for the service worker to claim this page as a client. + async function waitForClaim() { + await (new Promise((resolve) => { + // It's possible the service worker already claimed the page as a + // client. If so, resolve immediately. + if (navigator.serviceWorker.controller) { + resolve(); + return; + } + + // Wait for the service worker to take over as the controller. + navigator.serviceWorker.addEventListener( + 'controllerchange', resolve, {once: true}); + })); + } + // Register the service worker and wait for it to take control + addEventListener('load', async () => { + await navigator.serviceWorker.register('./service_worker.js'); + const registration = await navigator.serviceWorker.ready; + await waitForClaim(); + domAutomationController.send('ready'); + }); + </script> +</body> +</html>
diff --git a/chrome/test/data/extensions/page_with_service_worker/service_worker.js b/chrome/test/data/extensions/page_with_service_worker/service_worker.js new file mode 100644 index 0000000..d341e67 --- /dev/null +++ b/chrome/test/data/extensions/page_with_service_worker/service_worker.js
@@ -0,0 +1,35 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +self.addEventListener('install', event => { + // Skip waiting to activate the new service worker immediately. + self.skipWaiting(); +}); + +self.addEventListener('activate', event => { + // Take control of the open page immediately. + event.waitUntil(self.clients.claim()); +}); + +self.addEventListener('fetch', event => { + const url = new URL(event.request.url); + + // Serve the result only for the expected resource. + if (!url.pathname.endsWith('style.css')) { + event.respondWith(fetch(event.request)); + return; + } + + const cssContent = ` +body { + color: __MSG_color__; +} +`; + + const response = + new Response(cssContent, {headers: {'Content-Type': 'text/css'}}); + + // Respond to the fetch event with our custom response. + event.respondWith(response); +});
diff --git a/chromeos/ash/components/boca/boca_session_manager_unittest.cc b/chromeos/ash/components/boca/boca_session_manager_unittest.cc index d4efc61..5093162 100644 --- a/chromeos/ash/components/boca/boca_session_manager_unittest.cc +++ b/chromeos/ash/components/boca/boca_session_manager_unittest.cc
@@ -214,6 +214,8 @@ MOCK_METHOD(void, CheckConnection, (), (override)); MOCK_METHOD(void, Stop, (base::OnceCallback<void(bool)>), (override)); + + MOCK_METHOD(bool, IsPresenting, (), (override)); }; class MockTeacherScreenPresenter : public TeacherScreenPresenter {
diff --git a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc index 8d155c8..1840fa2 100644 --- a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc +++ b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request.cc
@@ -61,7 +61,8 @@ kiosk_receiver_dict->FindString(boca::kRobotEmail)) { receiver.set_robot_email(*robot_email_ptr); } - if (auto* state_ptr = kiosk_receiver_dict->FindString(boca::kReceiverState)) { + if (auto* state_ptr = + kiosk_receiver_dict->FindString(boca::kReceiverConnectionState)) { receiver.set_state(ReceiverConnectionStateProtoFromJson(*state_ptr)); }
diff --git a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc index 25f82938..020ed88 100644 --- a/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc +++ b/chromeos/ash/components/boca/receiver/get_kiosk_receiver_request_unittest.cc
@@ -48,7 +48,7 @@ })); base::Value::Dict response_dict; response_dict.Set(boca::kRobotEmail, kRobotEmail); - response_dict.Set(boca::kReceiverState, kReceiverState); + response_dict.Set(boca::kReceiverConnectionState, kReceiverState); request.OnSuccess(std::make_unique<base::Value>(std::move(response_dict))); ASSERT_TRUE(response_body.has_value());
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc index 6c5a93cd..dd3b43d 100644 --- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc +++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.cc
@@ -149,6 +149,10 @@ std::move(stop_request)); } +bool StudentScreenPresenterImpl::IsPresenting() { + return receiver_id_.has_value(); +} + void StudentScreenPresenterImpl::OnStartResponse( base::OnceCallback<void(bool)> success_cb, std::optional<std::string> connection_id) {
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h index 810875e..ffd01511 100644 --- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h +++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h
@@ -58,6 +58,7 @@ base::OnceClosure disconnected_cb) override; void CheckConnection() override; void Stop(base::OnceCallback<void(bool)> success_cb) override; + bool IsPresenting() override; private: void OnStartResponse(base::OnceCallback<void(bool)> success_cb,
diff --git a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc index a38afbb..be5935f 100644 --- a/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc +++ b/chromeos/ash/components/boca/receiver/student_screen_presenter_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "chromeos/ash/components/boca/receiver/student_screen_presenter_impl.h" #include <optional> +#include <string> #include <string_view> #include "base/functional/callback_helpers.h" @@ -37,10 +38,8 @@ constexpr std::string_view kConnectionId = "connection-id"; constexpr std::string_view kConnectionIdPair = R"({"connectionId": "connection-id"})"; -constexpr std::string_view kStateDisconnectedPair = - R"({"state": "DISCONNECTED"})"; -constexpr std::string_view kStateStopRequestedPair = - R"({"state": "STOP_REQUESTED"})"; +constexpr std::string_view kDisconnectedState = "DISCONNECTED"; +constexpr std::string_view kStopRequestedState = "STOP_REQUESTED"; class StudentScreenPresenterImplTest : public testing::Test { protected: @@ -120,6 +119,18 @@ user_identity.gaia_id()); } + std::string CheckConnectionStateJson(std::string_view connection_state) { + return base::ReplaceStringPlaceholders( + R"({"receiverConnectionState": "$1"})", {std::string(connection_state)}, + /*offsets=*/nullptr); + } + + std::string UpdateConnectionStateJson(std::string_view connection_state) { + return base::ReplaceStringPlaceholders(R"({"state": "$1"})", + {std::string(connection_state)}, + /*offsets=*/nullptr); + } + base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; AccountInfo account_info_; @@ -209,7 +220,7 @@ url_loader_factory_.AddResponse( GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); presenter.CheckConnection(); EXPECT_TRUE(disconnected_future.Wait()); @@ -236,8 +247,10 @@ EXPECT_TRUE(start_future1.Get()); url_loader_factory_.AddResponse( - GetKioskReceiverUrl(kReceiverId, kStateStopRequestedPair).spec(), - kStateStopRequestedPair); + GetKioskReceiverUrl(kReceiverId, + CheckConnectionStateJson(kStopRequestedState)) + .spec(), + CheckConnectionStateJson(kStopRequestedState)); presenter.CheckConnection(); task_environment_.RunUntilIdle(); EXPECT_FALSE(disconnected_future.IsReady()); @@ -291,10 +304,11 @@ EXPECT_TRUE(start_future1.Get()); presenter.Stop(stop_future.GetCallback()); - std::optional<base::Value::Dict> update_request = GetRequestBodyAndRespond( - GetUpdateReceiverUrl(kReceiverId, kConnectionId), kStateDisconnectedPair); + std::optional<base::Value::Dict> update_request = + GetRequestBodyAndRespond(GetUpdateReceiverUrl(kReceiverId, kConnectionId), + UpdateConnectionStateJson(kDisconnectedState)); ASSERT_TRUE(update_request.has_value()); - EXPECT_EQ(*update_request->FindString("state"), "STOP_REQUESTED"); + EXPECT_EQ(*update_request->FindString("state"), kStopRequestedState); EXPECT_TRUE(stop_future.Get()); EXPECT_FALSE(disconnected_future.IsReady()); @@ -350,17 +364,17 @@ url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateStopRequestedPair); + UpdateConnectionStateJson(kStopRequestedState)); presenter.Stop(stop_future.GetCallback()); task_environment_.RunUntilIdle(); presenter.CheckConnection(); WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId), - kStateStopRequestedPair); + CheckConnectionStateJson(kStopRequestedState)); task_environment_.FastForwardBy(base::Seconds(5)); WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); EXPECT_TRUE(stop_future.Get()); EXPECT_FALSE(disconnected_future.IsReady()); } @@ -380,13 +394,13 @@ url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateStopRequestedPair); + UpdateConnectionStateJson(kStopRequestedState)); presenter.Stop(stop_future.GetCallback()); task_environment_.RunUntilIdle(); url_loader_factory_.AddResponse( GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateStopRequestedPair); + CheckConnectionStateJson(kStopRequestedState)); task_environment_.FastForwardBy(base::Seconds(5)); EXPECT_FALSE(stop_future.Get()); } @@ -412,14 +426,14 @@ presenter.Stop(stop_future.GetCallback()); url_loader_factory_.AddResponse( GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); // Check connection should be cancelled since stop is requested. task_environment_.RunUntilIdle(); EXPECT_FALSE(stop_future.IsReady()); url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + UpdateConnectionStateJson(kDisconnectedState)); EXPECT_TRUE(stop_future.Get()); EXPECT_FALSE(disconnected_future.IsReady()); } @@ -441,7 +455,7 @@ url_loader_factory_.AddResponse( GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); presenter.Stop(stop_future.GetCallback()); // Check connection should be ignored since stop request is in progress. presenter.CheckConnection(); @@ -450,7 +464,7 @@ url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + UpdateConnectionStateJson(kDisconnectedState)); EXPECT_TRUE(stop_future.Get()); EXPECT_FALSE(disconnected_future.IsReady()); } @@ -473,13 +487,13 @@ url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateStopRequestedPair); + UpdateConnectionStateJson(kStopRequestedState)); presenter.Stop(stop_future.GetCallback()); task_environment_.RunUntilIdle(); url_loader_factory_.AddResponse( GetKioskReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); presenter.CheckConnection(); EXPECT_TRUE(stop_future.Get()); @@ -504,7 +518,7 @@ url_loader_factory_.AddResponse( GetUpdateReceiverUrl(kReceiverId, kConnectionId).spec(), - kStateStopRequestedPair); + UpdateConnectionStateJson(kStopRequestedState)); presenter.Stop(stop_future.GetCallback()); task_environment_.RunUntilIdle(); @@ -514,7 +528,7 @@ task_environment_.FastForwardBy(base::Seconds(5)); WaitAndRespond(GetKioskReceiverUrl(kReceiverId, kConnectionId), - kStateDisconnectedPair); + CheckConnectionStateJson(kDisconnectedState)); EXPECT_TRUE(stop_future.Get()); EXPECT_FALSE(disconnected_future.IsReady()); }
diff --git a/chromeos/ash/components/boca/session_api/constants.h b/chromeos/ash/components/boca/session_api/constants.h index 16c6fbf..6353368 100644 --- a/chromeos/ash/components/boca/session_api/constants.h +++ b/chromeos/ash/components/boca/session_api/constants.h
@@ -95,7 +95,7 @@ inline constexpr char kStudentStatus[] = "studentStatuses"; inline constexpr char kStudentStatusState[] = "state"; inline constexpr char kDeviceStatusState[] = "state"; -inline constexpr char kReceiverState[] = "state"; +inline constexpr char kReceiverConnectionState[] = "receiverConnectionState"; inline constexpr char kUrl[] = "url"; inline constexpr char kTitle[] = "title"; inline constexpr char kFavIcon[] = "faviconUrl";
diff --git a/chromeos/ash/components/boca/student_screen_presenter.h b/chromeos/ash/components/boca/student_screen_presenter.h index 240ad54a8..7a31725 100644 --- a/chromeos/ash/components/boca/student_screen_presenter.h +++ b/chromeos/ash/components/boca/student_screen_presenter.h
@@ -32,6 +32,8 @@ virtual void Stop(base::OnceCallback<void(bool)> success_cb) = 0; + virtual bool IsPresenting() = 0; + protected: StudentScreenPresenter() = default; };
diff --git a/clank b/clank index 1b59aa2..2503c7a 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit 1b59aa2b6c0cd8da2f566044846ef1590fe32e72 +Subproject commit 2503c7ae1f74a085503e3432fe26ff1f49397c26
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index dc2aec5..723358d 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "69.9", - "log_list_timestamp": "2025-09-26T12:53:25Z", + "version": "69.10", + "log_list_timestamp": "2025-09-27T12:53:30Z", "operators": [ { "name": "Google",
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 953b433..ab13997 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -2166,11 +2166,13 @@ DailyVisitsResult HistoryBackend::GetDailyVisitsToOrigin( const url::Origin& origin, base::Time begin_time, - base::Time end_time) { + base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits) { if (!db_) { return {}; } - return db_->GetDailyVisitsToOrigin(origin, begin_time, end_time); + return db_->GetDailyVisitsToOrigin(origin, begin_time, end_time, + policy_for_404_visits); } // Keyword visits --------------------------------------------------------------
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index b290326..32adee2 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -425,10 +425,13 @@ VisitQuery404sPolicy policy_for_404_visits); // Gets counts for total visits and days visited for pages matching `origin`. - // Counts only user-visible visits. - DailyVisitsResult GetDailyVisitsToOrigin(const url::Origin& origin, - base::Time begin_time, - base::Time end_time); + // Counts only user-visible visits. Counts or ignores visits with an HTTP + // response code of 404 based on `policy_for_404_visits`. + DailyVisitsResult GetDailyVisitsToOrigin( + const url::Origin& origin, + base::Time begin_time, + base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits); // Favicon -------------------------------------------------------------------
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index ac9b3df..17329af 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -1244,6 +1244,7 @@ const url::Origin& origin, base::Time begin_time, base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits, GetDailyVisitsToOriginCallback callback, base::CancelableTaskTracker* tracker) { DCHECK(backend_task_runner_) << "History service being called after cleanup"; @@ -1252,7 +1253,7 @@ return tracker->PostTaskAndReplyWithResult( backend_task_runner_.get(), FROM_HERE, base::BindOnce(&HistoryBackend::GetDailyVisitsToOrigin, history_backend_, - origin, begin_time, end_time), + origin, begin_time, end_time, policy_for_404_visits), std::move(callback)); }
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index c72d405..79138cd3 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -482,6 +482,7 @@ const url::Origin& origin, base::Time begin_time, base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits, GetDailyVisitsToOriginCallback callback, base::CancelableTaskTracker* tracker);
diff --git a/components/history/core/browser/visit_database.cc b/components/history/core/browser/visit_database.cc index 85fa936..aebe93e 100644 --- a/components/history/core/browser/visit_database.cc +++ b/components/history/core/browser/visit_database.cc
@@ -1218,7 +1218,8 @@ DailyVisitsResult VisitDatabase::GetDailyVisitsToOrigin( const url::Origin& origin, base::Time begin_time, - base::Time end_time) { + base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits) { DailyVisitsResult result; if (origin.opaque() || !(origin.scheme() == url::kHttpScheme || origin.scheme() == url::kHttpsScheme)) { @@ -1228,20 +1229,46 @@ std::pair<std::string, std::string> host_bounds = GetOriginSearchBounds(origin.GetURL()); - sql::Statement statement(GetDB().GetCachedStatement( - // clang-format off - SQL_FROM_HERE, - "SELECT " - "visit_time," - "transition " - "FROM visits v INNER JOIN urls u ON v.url=u.id " - "WHERE " - "u.url>=? AND " - "u.url<? AND " - "v.visit_time>=? AND " - "v.visit_time<?" - // clang-format on - )); + sql::Statement statement; + switch (policy_for_404_visits) { + case VisitQuery404sPolicy::kInclude404s: + statement.Assign(GetDB().GetCachedStatement( + // clang-format off + SQL_FROM_HERE, + "SELECT " + "visit_time," + "transition " + "FROM visits v INNER JOIN urls u ON v.url=u.id " + "WHERE " + "u.url>=? AND " + "u.url<? AND " + "v.visit_time>=? AND " + "v.visit_time<?" + // clang-format on + )); + break; + case VisitQuery404sPolicy::kExclude404s: + statement.Assign(GetDB().GetCachedStatement( + // clang-format off + SQL_FROM_HERE, + "SELECT " + "visit_time," + "transition " + "FROM visits v INNER JOIN urls u ON v.url=u.id " + "LEFT OUTER JOIN context_annotations ca ON v.id=ca.visit_id " + "WHERE " + "u.url>=? AND " + "u.url<? AND " + "v.visit_time>=? AND " + "v.visit_time<? AND " + "(" + "ca.response_code IS NULL OR " + "ca.response_code!=404" + ")" + // clang-format on + )); + break; + } statement.BindString(0, host_bounds.first); statement.BindString(1, host_bounds.second);
diff --git a/components/history/core/browser/visit_database.h b/components/history/core/browser/visit_database.h index 79748d3..e1bbf71 100644 --- a/components/history/core/browser/visit_database.h +++ b/components/history/core/browser/visit_database.h
@@ -256,10 +256,13 @@ base::Time* last_visit); // Gets counts for total visits and days visited for pages matching `origin`. - // Counts only user-visible visits. - DailyVisitsResult GetDailyVisitsToOrigin(const url::Origin& origin, - base::Time begin_time, - base::Time end_time); + // Counts only user-visible visits. Counts or ignores visits with an HTTP + // response code of 404 based on `policy_for_404_visits`. + DailyVisitsResult GetDailyVisitsToOrigin( + const url::Origin& origin, + base::Time begin_time, + base::Time end_time, + VisitQuery404sPolicy policy_for_404_visits); // Get the time of the first item in our database. bool GetStartDate(base::Time* first_visit);
diff --git a/components/history/core/browser/visit_database_unittest.cc b/components/history/core/browser/visit_database_unittest.cc index 95bf1546..3a69dd1 100644 --- a/components/history/core/browser/visit_database_unittest.cc +++ b/components/history/core/browser/visit_database_unittest.cc
@@ -1460,7 +1460,8 @@ add_visit(GURL("https://foo.com/bar"), end_time + base::Seconds(1)); DailyVisitsResult result = GetDailyVisitsToOrigin( - url::Origin::Create(GURL("https://foo.com")), begin_time, end_time); + url::Origin::Create(GURL("https://foo.com")), begin_time, end_time, + VisitQuery404sPolicy::kInclude404s); EXPECT_TRUE(result.success); EXPECT_EQ(2, result.days_with_visits); EXPECT_EQ(7, result.total_visits); @@ -1482,12 +1483,74 @@ DailyVisitsResult result = GetDailyVisitsToOrigin( url::Origin::Create(GURL("https://www.chromium.org")), begin_time, - end_time); + end_time, VisitQuery404sPolicy::kInclude404s); EXPECT_TRUE(result.success); EXPECT_EQ(0, result.days_with_visits); EXPECT_EQ(0, result.total_visits); } +TEST_F(VisitDatabaseTest, GetDailyVisitsToOrigin_404s) { + base::Time begin_time = base::Time::Now(); + base::Time end_time = begin_time + base::Days(10); + + auto add_visit = [&](const GURL& url, base::Time visit_time, + int response_code) { + VisitRow row{AddURL(URLRow(url)), + visit_time, + 0, + ui::PageTransitionFromInt(ui::PAGE_TRANSITION_LINK | + ui::PAGE_TRANSITION_CHAIN_START | + ui::PAGE_TRANSITION_CHAIN_END), + 0, + false, + 0}; + AddVisit(&row, SOURCE_BROWSED); + VisitContextAnnotations annotations; + annotations.on_visit.response_code = response_code; + AddContextAnnotationsForVisit(row.visit_id, annotations); + }; + + // `origin1` has only a single visit in the time range, and it's a 404. + url::Origin origin1 = url::Origin::Create(GURL("https://foo.com")); + add_visit(GURL("https://foo.com/404"), begin_time, 404); + + // When including 404s for `origin1`, we should get 1 day with 1 visit. + DailyVisitsResult result = GetDailyVisitsToOrigin( + origin1, begin_time, end_time, VisitQuery404sPolicy::kInclude404s); + EXPECT_TRUE(result.success); + EXPECT_EQ(1, result.days_with_visits); + EXPECT_EQ(1, result.total_visits); + + // When excluding 404s for `origin1`, we should get 0 days with visits, 0 + // visits total. + result = GetDailyVisitsToOrigin(origin1, begin_time, end_time, + VisitQuery404sPolicy::kExclude404s); + EXPECT_TRUE(result.success); + EXPECT_EQ(0, result.days_with_visits); + EXPECT_EQ(0, result.total_visits); + + // `origin2` has two visits on a single day in the time range: one is a 404 + // and the other is not. + url::Origin origin2 = url::Origin::Create(GURL("https://bar.com")); + add_visit(GURL("https://bar.com/404"), begin_time, 404); + add_visit(GURL("https://bar.com/200"), begin_time + base::Hours(1), 200); + + // When including 404s for `origin2`, we should get 1 day with 2 visits. + result = GetDailyVisitsToOrigin(origin2, begin_time, end_time, + VisitQuery404sPolicy::kInclude404s); + EXPECT_TRUE(result.success); + EXPECT_EQ(1, result.days_with_visits); + EXPECT_EQ(2, result.total_visits); + + // When excluding 404s for `origin2`, we should still get 1 day, but with only + // 1 visit. + result = GetDailyVisitsToOrigin(origin2, begin_time, end_time, + VisitQuery404sPolicy::kExclude404s); + EXPECT_TRUE(result.success); + EXPECT_EQ(1, result.days_with_visits); + EXPECT_EQ(1, result.total_visits); +} + TEST_F(VisitDatabaseTest, GetGoogleDomainVisitsFromSearchesInRange_NoVisits) { const auto begin_time = base::Time::Now(); EXPECT_THAT(GetGoogleDomainVisitsFromSearchesInRange(
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index f1344c48..9a59aa1 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1049,7 +1049,7 @@ base::UTF16ToUTF8(match->search_terms_args->search_terms)); // Append an extra header to navigations from the @gemini scope. - const TemplateURL* turl = match->GetTemplateURL(template_url_service_, false); + const TemplateURL* turl = match->GetTemplateURL(template_url_service_); if (turl && turl->starter_pack_id() == template_url_starter_pack_data::kGemini && !encoded_search_terms.empty() && @@ -1922,7 +1922,7 @@ bool is_contextual = i->IsContextualSearchSuggestion(); if (i->keyword != last_keyword || is_contextual != last_contextual) { const TemplateURL* template_url = - i->GetTemplateURL(template_url_service_, false); + i->GetTemplateURL(template_url_service_); if (template_url) { // The search keyword description is applied except in these cases: // - For extension keywords, the description is the extension name. @@ -2074,7 +2074,7 @@ for (size_t index = 0; index < result->size(); ++index) { AutocompleteMatch* match = result->match_at(index); const TemplateURL* template_url = - match->GetTemplateURL(template_url_service_, false); + match->GetTemplateURL(template_url_service_); if (!template_url || !match->search_terms_args) { continue; } @@ -2124,7 +2124,7 @@ if (action_in_suggest != nullptr) { action_in_suggest->template_action.set_action_uri( ComputeURLFromSearchTermsArgs( - match->GetTemplateURL(template_url_service_, false), + match->GetTemplateURL(template_url_service_), *search_terms_args) .spec()); } @@ -2139,7 +2139,7 @@ if (contextual_takover_action) { contextual_takover_action->set_fulfillment_url( ComputeURLFromSearchTermsArgs( - match->GetTemplateURL(template_url_service_, false), + match->GetTemplateURL(template_url_service_), *match->search_terms_args)); } }
diff --git a/components/omnibox/browser/autocomplete_match.cc b/components/omnibox/browser/autocomplete_match.cc index 75bedc1..ca30f96 100644 --- a/components/omnibox/browser/autocomplete_match.cc +++ b/components/omnibox/browser/autocomplete_match.cc
@@ -1137,7 +1137,7 @@ TemplateURLService* template_url_service) { DCHECK(template_url_service); - TemplateURL* template_url = match.GetTemplateURL(template_url_service, false); + TemplateURL* template_url = match.GetTemplateURL(template_url_service); if (!template_url) { return; } @@ -1270,8 +1270,7 @@ if (!associated_keyword) { return false; } - TemplateURL* turl = - associated_keyword->GetTemplateURL(template_url_service, false); + TemplateURL* turl = associated_keyword->GetTemplateURL(template_url_service); return turl && (turl->starter_pack_id() != 0 || turl->featured_by_policy()); } @@ -1286,9 +1285,8 @@ *is_keyword_hint ? associated_keyword->keyword : GetSubstitutingExplicitlyInvokedKeyword(template_url_service)); - *keyword_placeholder_out = - GetKeywordPlaceholder(GetTemplateURL(template_url_service, false), - is_history_embeddings_enabled); + *keyword_placeholder_out = GetKeywordPlaceholder( + GetTemplateURL(template_url_service), is_history_embeddings_enabled); } std::u16string AutocompleteMatch::GetSubstitutingExplicitlyInvokedKeyword( @@ -1298,7 +1296,7 @@ return std::u16string(); } - const TemplateURL* t_url = GetTemplateURL(template_url_service, false); + const TemplateURL* t_url = GetTemplateURL(template_url_service); return (t_url && t_url->SupportsReplacement(template_url_service->search_terms_data())) ? keyword @@ -1350,12 +1348,8 @@ } TemplateURL* AutocompleteMatch::GetTemplateURL( - TemplateURLService* template_url_service, - bool allow_fallback_to_destination_host) const { - return GetTemplateURLWithKeyword(template_url_service, keyword, - allow_fallback_to_destination_host - ? destination_url.host() - : std::string()); + TemplateURLService* template_url_service) const { + return GetTemplateURLWithKeyword(template_url_service, keyword, ""); } GURL AutocompleteMatch::ImageUrl() const {
diff --git a/components/omnibox/browser/autocomplete_match.h b/components/omnibox/browser/autocomplete_match.h index dd6e147..2330cc1 100644 --- a/components/omnibox/browser/autocomplete_match.h +++ b/components/omnibox/browser/autocomplete_match.h
@@ -620,14 +620,10 @@ const TemplateURL* template_url, bool is_history_embeddings_enabled); - // Returns the TemplateURL associated with this match. This may be NULL if - // the match has no keyword OR if the keyword no longer corresponds to a valid - // TemplateURL. See comments on |keyword| below. - // If |allow_fallback_to_destination_host| is true and the keyword does - // not map to a valid TemplateURL, we'll then check for a TemplateURL that - // corresponds to the destination_url's hostname. - TemplateURL* GetTemplateURL(TemplateURLService* template_url_service, - bool allow_fallback_to_destination_host) const; + // Returns the `TemplateURL` associated with this match. This may be nullptr + // if the match has no keyword OR if the keyword no longer corresponds to a + // valid `TemplateURL`. See comments on `keyword` below. + TemplateURL* GetTemplateURL(TemplateURLService* template_url_service) const; // Gets the URL for the match image (whether it be an answer or entity). If // there isn't an image URL, returns an empty GURL (test with is_empty()).
diff --git a/components/omnibox/browser/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc index b438182..d98cbee 100644 --- a/components/omnibox/browser/autocomplete_provider_unittest.cc +++ b/components/omnibox/browser/autocomplete_provider_unittest.cc
@@ -296,7 +296,7 @@ if (!match_keyword_.empty()) { match.keyword = match_keyword_; ASSERT_NE(nullptr, - match.GetTemplateURL(client_->GetTemplateURLService(), false)); + match.GetTemplateURL(client_->GetTemplateURLService())); } matches_.push_back(match);
diff --git a/components/omnibox/browser/base_search_provider.cc b/components/omnibox/browser/base_search_provider.cc index 7833496..7a0c032 100644 --- a/components/omnibox/browser/base_search_provider.cc +++ b/components/omnibox/browser/base_search_provider.cc
@@ -490,7 +490,7 @@ } const TemplateURL* template_url = - match.GetTemplateURL(client_->GetTemplateURLService(), false); + match.GetTemplateURL(client_->GetTemplateURLService()); // This may be nullptr if the template corresponding to the keyword has been // deleted or there is no keyword set. if (template_url != nullptr) {
diff --git a/components/omnibox/browser/shortcuts_backend.cc b/components/omnibox/browser/shortcuts_backend.cc index 20237b6..b9e3fef 100644 --- a/components/omnibox/browser/shortcuts_backend.cc +++ b/components/omnibox/browser/shortcuts_backend.cc
@@ -432,7 +432,7 @@ if (AutocompleteMatch::IsSearchType(match.type) && match.search_terms_args) { temp = BaseSearchProvider::CreateShortcutSearchSuggestion( match.search_terms_args->search_terms, match_type, - match.GetTemplateURL(template_url_service, false), *search_terms_data); + match.GetTemplateURL(template_url_service), *search_terms_data); normalized_match = &temp; } else if (!match.keyword.empty()) { // Remove the keyword from `fill_into_edit` and `transition` since
diff --git a/components/viz/service/layers/layer_context_impl.cc b/components/viz/service/layers/layer_context_impl.cc index 003ae19..2fda735 100644 --- a/components/viz/service/layers/layer_context_impl.cc +++ b/components/viz/service/layers/layer_context_impl.cc
@@ -1939,6 +1939,7 @@ property_trees.set_changed(any_tree_changed); if (any_tree_changed) { property_trees.ResetCachedData(); + layers.set_needs_update_draw_properties(); } std::vector<std::unique_ptr<cc::RenderSurfaceImpl>> old_render_surfaces;
diff --git a/extensions/common/extension_features.cc b/extensions/common/extension_features.cc index 10eabab..fa2189d 100644 --- a/extensions/common/extension_features.cc +++ b/extensions/common/extension_features.cc
@@ -58,6 +58,8 @@ BASE_FEATURE(kExtensionDisableUnsupportedDeveloper, base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kExtensionLocalizationGuid, base::FEATURE_ENABLED_BY_DEFAULT); + BASE_FEATURE(kExtensionIconVariants, base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kExtensionManifestV2Unsupported, base::FEATURE_ENABLED_BY_DEFAULT);
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h index 9781a6f..8f945f4b 100644 --- a/extensions/common/extension_features.h +++ b/extensions/common/extension_features.h
@@ -103,6 +103,10 @@ // If enabled, disables unpacked extensions if developer mode is off. BASE_DECLARE_FEATURE(kExtensionDisableUnsupportedDeveloper); +// Allow e.g. .css files to use default_locale messages in WAR files via GUID. +// TODO(crbug.com/435609878): Remove after m142. It's for safe m141 back merge. +BASE_DECLARE_FEATURE(kExtensionLocalizationGuid); + // A replacement key for declaring icons, in addition to supporting dark mode. BASE_DECLARE_FEATURE(kExtensionIconVariants);
diff --git a/extensions/renderer/extension_localization_throttle.cc b/extensions/renderer/extension_localization_throttle.cc index b332c6f..abe98687 100644 --- a/extensions/renderer/extension_localization_throttle.cc +++ b/extensions/renderer/extension_localization_throttle.cc
@@ -13,6 +13,7 @@ #include "content/public/renderer/render_frame.h" #include "content/public/renderer/render_thread.h" #include "extensions/common/constants.h" +#include "extensions/common/extension_features.h" #include "extensions/common/extension_id.h" #include "extensions/renderer/extension_frame_helper.h" #include "extensions/renderer/renderer_extension_registry.h" @@ -291,7 +292,11 @@ // `response_url.host()` is expected to be the extension id. However, it could // be a guid e.g. when a web service worker intercepts a guid fetch for css. - ExtensionId extension_id = GetExtensionIdForGurl(response_url); + ExtensionId extension_id = + base::FeatureList::IsEnabled( + extensions_features::kExtensionLocalizationGuid) + ? GetExtensionIdForGurl(response_url) + : response_url.host(); auto loader = std::make_unique<ExtensionLocalizationURLLoader>( frame_token_, extension_id, std::move(url_loader_client));
diff --git a/ios/chrome/browser/follow/model/follow_tab_helper.mm b/ios/chrome/browser/follow/model/follow_tab_helper.mm index 1e0f537..a423709 100644 --- a/ios/chrome/browser/follow/model/follow_tab_helper.mm +++ b/ios/chrome/browser/follow/model/follow_tab_helper.mm
@@ -225,6 +225,7 @@ // Get daily visit count for `url` from the history service. history_service->GetDailyVisitsToOrigin( url::Origin::Create(url), begin_time, end_time, + history::VisitQuery404sPolicy::kExclude404s, base::BindOnce(&FollowTabHelper::OnDailyVisitQueryResult, weak_ptr_factory_.GetWeakPtr(), page_load_time, recommended_url),
diff --git a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm index 1e9f521..2e16096b8 100644 --- a/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm +++ b/ios/chrome/browser/omnibox/model/omnibox_metrics_recorder.mm
@@ -188,7 +188,7 @@ omnibox::answer_data_parser::LogAnswerUsed(match.answer_type); TemplateURLService* service = _omniboxClient->GetTemplateURLService(); - TemplateURL* templateURL = match.GetTemplateURL(service, false); + TemplateURL* templateURL = match.GetTemplateURL(service); if (templateURL) { // `match` is a Search navigation; log search engine usage metrics. AutocompleteMatch::LogSearchEngineUsed(match, service);
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 index 1247103..470889c 100644 --- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -abf2effe62f94bfdefabef021705b474aed8240a \ No newline at end of file +82307b07bc15cc3dbf8a2e5681b39a7b9fe865dc \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 index 103ba6f09..aec142a9 100644 --- a/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeExtensionKeychainInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -947f16a51d2ff4045cd05ac3ff402846943a66de \ No newline at end of file +cdf14ec77d5b578e2950704e18efe690beeffe55 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 index 70e8731..9f948bda 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -1940a3d3930536b0c89af422fb1cead2e4773f60 \ No newline at end of file +7abe37d9b480e1d4e6749b22e7eaf42ac780bca6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 index 46424295..aedcf3c 100644 --- a/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -923bb0f4e621b733d3f435aca430385cc5fe0730 \ No newline at end of file +72b1da92464eb0d2012728f1691c2d4fe0a0ea69 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 index 0d8ff63..b1ac5dd 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios.zip.sha1
@@ -1 +1 @@ -921d95286c24f5705fd30e709e83d910c9386557 \ No newline at end of file +99c1fa2113df38cc7124af2a1415dec04977e69b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 index 3f98889..6cd392f3 100644 --- a/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/ChromeSSOInternal.framework.dSYM.ios_asan.zip.sha1
@@ -1 +1 @@ -85a519002aa1f2bb1c14cbb3b83b29e1f56efab2 \ No newline at end of file +ee0fbc44e25807b926457c3afbdb398d12876453 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 index de4bc7e..225cd0f 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -fe14ad107d5190d0fe67de7ac83d58d0e26b4dfa \ No newline at end of file +0d3f77743846bcce24f718191d6f068d07eea00a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 index c3ae341..1299c36 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -a1021187f7b8488f54f75ce92e3b6879800fb484 \ No newline at end of file +437cc1f810851d740df590cd5465e06addf22ba9 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 index 4d3fcddd..b7996ce 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -0be80ccd012728fddb7655649dc7d3fa249ca8f7 \ No newline at end of file +5cd0727ea061f06bf10ed4f677c5e967ee21001e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 index b4d22851..9711be5 100644 --- a/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_extension_keychain_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -4ed90592a5338a131e044785cfa3b623c5e5ec81 \ No newline at end of file +9c59bdda784fd1354e8f4858de63afa8a185e55a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 index 9521c3d8..8178e91 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -fdfe64750e289b0a49594495f9681b56afbe08fa \ No newline at end of file +5662dd57caac37c3d6602bffc9e154a718c36332 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 index 008863f..2dad7cff 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -d5196a2a8c90a985dce04c971a834c21734df501 \ No newline at end of file +1cd2881d25698e1363267a4151fdc2860acf0e9a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 index de59dc3..6d04797 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -5f7ed9548dc32d2f909e9ab92fa2554687dc6d7d \ No newline at end of file +fd203196e4ab26bba491a7b90f8af5bc13a6c504 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 index a210015..5b95de60 100644 --- a/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -876e95800f080987a7b2873028b1e07c6480c4c8 \ No newline at end of file +48a71d80299ffdaf12db0a05d415acd3d5f524d8 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 index 4efdaac8..3808f34 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -e3c6809d1e41e4adee387e30ab858c23cda5838c \ No newline at end of file +498bbc96e221628c35776be03018337a25af0d10 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 index a49574c2..355ff63 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -2bdbc451f390fb4803823ce0b05f38e61bdfc1e5 \ No newline at end of file +c41659939c9cb6bebfa030fda5428f4c88d539ce \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 index 0e484fc..b6d2de0 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -c851eaea9f186f63b890572f9cf2762da6ac4f0f \ No newline at end of file +d7576d8c15079b24c9cd48c4209477c175fc076b \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 index f0bd0f8..e76e7fe 100644 --- a/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_sso_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -fb3ed7acfa8bbb5f4c44ea279c66699046b9e29e \ No newline at end of file +0c76d690d0831718955db44d5eaf258fe8ac7ff5 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 index fe2950f7..42c22da 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -79073cd0732750f1d8fb6cb1766ee86f30f115d6 \ No newline at end of file +e5e3108e6485f35a74694ff3067ff7588f137332 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 index d1a722e..ab724ea 100644 --- a/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/chrome_test_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -0f91ba69e6c06177343bd683c82d8b308212d32d \ No newline at end of file +f86880b4fdd8268c0f5b147d8a005a2675473828 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 index c8f4b32..3c7c2ab 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -4ce8685724d0883f6c63fadbae05f0bcafdd66b1 \ No newline at end of file +fc0311807663e07c21f0df14047e00c6c3202863 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 index 93d60856..7684f8b 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -fe43d550b0cac6554c3461194147b6d1edee7171 \ No newline at end of file +2b0dfc44c552377f3f25285d6104044e8d467b8a \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 index 8e8b174..81c1912 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -84d1f34295e8b8ab93e9e64871f59f8a2d2ffe7b \ No newline at end of file +35ce353989183bf5a3e71370a2bb22aa190f0c92 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 index 694d3b30a..bf6dbdd 100644 --- a/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -a2bf19a6660b3fe29e0f75968fa1a761bc74b864 \ No newline at end of file +3f4a30efba9648dced8958b4eb341c191fa5518d \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 index 02bb8a2..491dc78 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -4634b8b8dcc23f0c87982a21e03329e06f2982dd \ No newline at end of file +723cf084bf374e20969b79afbfc84f0a89170139 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 index 6088617..3755ff3 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.ios_asan.zip.sha1
@@ -1 +1 @@ -6656f824a6d08cbe7a04551b4758d8be8d581165 \ No newline at end of file +36b7c6ca99e602529b876a09af64affd016aaee4 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 index bf8aaec7..f4bebae 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -2220c921b21615e176c9d72528ad52a7f21a37b2 \ No newline at end of file +9759c2dc3a75e52fc37a5dccc6fb4c2bfe419c9e \ No newline at end of file
diff --git a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 index 6ea1f5c..e2bcfbf 100644 --- a/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1 +++ b/ios/google_internal/frameworks/web_view_shell_internal_dynamic_framework.iossimulator_asan.zip.sha1
@@ -1 +1 @@ -e2d802853f8ced029ddac674c4fb927859916cfb \ No newline at end of file +34eb91e7ab8bfd2a79510e53b098db9763f29db8 \ No newline at end of file
diff --git a/ios_internal b/ios_internal index 70aacbf..979d503 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 70aacbfb7d3ed93f0d8681880e07b92531b29992 +Subproject commit 979d50337992bd9cb2ad58006f7e5f3722470c66
diff --git a/net/http/http_stream_pool.h b/net/http/http_stream_pool.h index 000aa40..7ad9c96 100644 --- a/net/http/http_stream_pool.h +++ b/net/http/http_stream_pool.h
@@ -154,7 +154,6 @@ class NET_EXPORT_PRIVATE AttemptManager; class NET_EXPORT_PRIVATE IPEndPointStateTracker; class NET_EXPORT_PRIVATE TcpBasedAttempt; - class NET_EXPORT_PRIVATE TcpBasedAttemptSlot; class NET_EXPORT_PRIVATE QuicAttempt; struct NET_EXPORT_PRIVATE QuicAttemptOutcome { explicit QuicAttemptOutcome(int result) : result(result) {}
diff --git a/net/http/http_stream_pool_attempt_manager.cc b/net/http/http_stream_pool_attempt_manager.cc index 3f390a16..71f8aa4 100644 --- a/net/http/http_stream_pool_attempt_manager.cc +++ b/net/http/http_stream_pool_attempt_manager.cc
@@ -360,10 +360,9 @@ // TODO(crbug.com/383824591): Consider modifying the value of // IPEndPointStateMap to track the number of in-flight attempts per // IPEndPoint, if this loop is a bottlenek. - size_t num_attempts = std::ranges::count_if( - tcp_based_attempt_slots_, [&ip_endpoint](const auto& slot) { - return slot->HasIPEndPoint(ip_endpoint); - }); + size_t num_attempts = std::ranges::count( + tcp_based_attempts_, ip_endpoint, + [](const auto& entry) { return entry->attempt()->ip_endpoint(); }); return num_attempts >= std::max(request_jobs_.size(), CalculateMaxPreconnectCount()); @@ -492,33 +491,29 @@ /*max_attempts=*/1); } -size_t HttpStreamPool::AttemptManager::NonSlowTcpBasedAttemptCount() const { - return std::ranges::count_if( - tcp_based_attempt_slots_, - [](const std::unique_ptr<TcpBasedAttemptSlot>& slot) { - return !slot->IsSlow(); - }); -} - void HttpStreamPool::AttemptManager::CancelTcpBasedAttempts( StreamSocketCloseReason reason) { - if (tcp_based_attempt_slots_.empty()) { + if (tcp_based_attempts_.empty()) { return; } - const size_t num_cancels = tcp_based_attempt_slots_.size(); + const size_t num_cancel_attempts = tcp_based_attempts_.size(); const size_t num_total_connecting_before = pool()->TotalConnectingStreamCount(); - while (!tcp_based_attempt_slots_.empty()) { - CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get(), reason); + while (!tcp_based_attempts_.empty()) { + std::unique_ptr<TcpBasedAttempt> attempt = + ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get()); + attempt->SetCancelReason(reason); + attempt.reset(); } CHECK_EQ(pool()->TotalConnectingStreamCount(), - num_total_connecting_before - num_cancels); + num_total_connecting_before - num_cancel_attempts); + CHECK_EQ(slow_tcp_based_attempt_count_, 0u); base::UmaHistogramCounts100( base::StrCat({"Net.HttpStreamPool.TcpBasedAttemptCancelCount.", StreamSocketCloseReasonToString(reason)}), - num_cancels); + num_cancel_attempts); ip_endpoint_state_tracker_.RemoveSlowAttemptingEndpoint(); @@ -624,8 +619,9 @@ LoadState load_state = LOAD_STATE_IDLE; // When there are TCP based attempts, use most advanced one. - for (const auto& slot : tcp_based_attempt_slots_) { - load_state = std::max(load_state, slot->GetLoadState()); + for (const auto& tcp_based_attempt : tcp_based_attempts_) { + load_state = + std::max(load_state, tcp_based_attempt->attempt()->GetLoadState()); // There should not be a load state later than LOAD_STATE_SSL_HANDSHAKE. if (load_state == LOAD_STATE_SSL_HANDSHAKE) { break; @@ -696,7 +692,7 @@ } std::unique_ptr<TcpBasedAttempt> tcp_based_attempt = - ExtractTcpBasedAttempt(raw_attempt, rv); + ExtractTcpBasedAttempt(raw_attempt); if (rv != OK) { HandleTcpBasedAttemptFailure(std::move(tcp_based_attempt), rv); @@ -775,6 +771,8 @@ void HttpStreamPool::AttemptManager::OnTcpBasedAttemptSlow( TcpBasedAttempt* raw_attempt) { CHECK(raw_attempt->is_slow()); + auto it = tcp_based_attempts_.find(raw_attempt); + CHECK(it != tcp_based_attempts_.end()); TRACE_EVENT_INSTANT("net.stream", "AttemptManager::OnTcpBasedAttemptSlow", track_, "ip_endpoint", @@ -786,6 +784,7 @@ raw_attempt->ip_endpoint().ToString()); }); + ++slow_tcp_based_attempt_count_; ip_endpoint_state_tracker_.OnEndpointSlow(raw_attempt->ip_endpoint()); // Don't attempt the same IP endpoint. @@ -884,8 +883,9 @@ static_cast<int>(limit_ignoring_jobs_.size())); dict.Set("job_count_notified", static_cast<int>(notified_jobs_.size())); dict.Set("preconnect_count", static_cast<int>(preconnect_jobs_.size())); - dict.Set("tcp_based_attempt_slot_count", - static_cast<int>(TcpBasedAttemptSlotCount())); + dict.Set("tcp_based_attempt_count", static_cast<int>(TcpBasedAttemptCount())); + dict.Set("slow_tcp_based_attempt_count", + static_cast<int>(slow_tcp_based_attempt_count_)); dict.Set("availability_state", static_cast<int>(availability_state_)); if (final_error_to_notify_jobs_.has_value()) { dict.Set("final_error_to_notify_job", *final_error_to_notify_jobs_); @@ -912,7 +912,19 @@ static_cast<int>(tcp_based_attempt_delay_.InMilliseconds())); dict.Set("should_block_tcp_based_attempt", should_block_tcp_based_attempt_); - dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue()); + int service_endpoint_num_waiting_callbacks = 0; + if (!tcp_based_attempts_.empty()) { + base::Value::List tcp_based_attempts; + for (const auto& entry : tcp_based_attempts_) { + if (entry->IsWaitingForServiceEndpointReady()) { + ++service_endpoint_num_waiting_callbacks; + } + tcp_based_attempts.Append(entry->GetInfoAsValue()); + } + dict.Set("tcp_based_attempts", std::move(tcp_based_attempts)); + } + dict.Set("service_endpoint_num_waiting_callbacks", + service_endpoint_num_waiting_callbacks); base::Value::List ip_endpoint_states = ip_endpoint_state_tracker_.GetInfoAsValue(); @@ -948,17 +960,16 @@ dict.Set("num_jobs", static_cast<int>(request_jobs_.size())); dict.Set("num_notified_jobs", static_cast<int>(notified_jobs_.size())); dict.Set("num_preconnects", static_cast<int>(preconnect_jobs_.size())); - dict.Set("num_tcp_based_attempt_slots", - static_cast<int>(tcp_based_attempt_slots_.size())); + dict.Set("num_tcp_based_attempts", + static_cast<int>(tcp_based_attempts_.size())); + dict.Set("num_slow_attempts", + static_cast<int>(slow_tcp_based_attempt_count_)); dict.Set("enable_ip_based_pooling_for_h2", IsIpBasedPoolingEnabledForH2()); dict.Set("enable_alternative_services", IsAlternativeServiceEnabled()); dict.Set("quic_attempt_alive", !!quic_attempt_); if (quic_attempt_result_.has_value()) { dict.Set("quic_attempt_result", *quic_attempt_result_); } - - dict.Set("tcp_based_attempt_slots", GetTcpBasedAttemptSlotsAsValue()); - return dict; } @@ -1116,7 +1127,7 @@ HandleQuicSessionReady(quic_session, StreamSocketCloseReason::kUsingExistingQuicSession); - CHECK(tcp_based_attempt_slots_.empty()); + CHECK(tcp_based_attempts_.empty()); return; } @@ -1138,7 +1149,7 @@ HandleSpdySessionReady(spdy_session, StreamSocketCloseReason::kUsingExistingSpdySession); - CHECK(tcp_based_attempt_slots_.empty()); + CHECK(tcp_based_attempts_.empty()); return; } @@ -1225,8 +1236,11 @@ // Transferring callback ownership is important to avoid accessing TCP based // attempts that could be destroyed while invoking callbacks. std::vector<CompletionOnceCallback> callbacks; - for (const auto& slot : tcp_based_attempt_slots_) { - slot->MaybeTakeSSLConfigWaitingCallbacks(callbacks); + for (const auto& attempt : tcp_based_attempts_) { + auto callback = attempt->MaybeTakeSSLConfigWaitingCallback(); + if (callback.has_value()) { + callbacks.emplace_back(std::move(*callback)); + } } for (auto& callback : callbacks) { @@ -1292,8 +1306,7 @@ ip_endpoint_state_tracker_.GetIPEndPointToAttemptTcpBased( exclude_ip_endpoint); if (!ip_endpoint.has_value()) { - if (service_endpoint_request_finished_ && - tcp_based_attempt_slots_.empty()) { + if (service_endpoint_request_finished_ && tcp_based_attempts_.empty()) { tcp_based_attempt_state_ = TcpBasedAttemptState::kAllEndpointsFailed; } if (tcp_based_attempt_state_ == @@ -1313,7 +1326,14 @@ CHECK(!preconnect_jobs_.empty() || group_->IdleStreamSocketCount() == 0); - CreateAndStartTcpBasedAttempt(using_tls, *ip_endpoint); + auto tcp_based_attempt = + std::make_unique<TcpBasedAttempt>(this, using_tls, *ip_endpoint); + auto [attempt_iterator, inserted] = + tcp_based_attempts_.emplace(std::move(tcp_based_attempt)); + CHECK(inserted); + pool()->IncrementTotalConnectingStreamCount(); + + (*attempt_iterator)->Start(); ++num_attempts; if (max_attempts.has_value() && num_attempts >= *max_attempts) { @@ -1322,51 +1342,6 @@ } } -void HttpStreamPool::AttemptManager::CreateAndStartTcpBasedAttempt( - bool using_tls, - IPEndPoint ip_endpoint) { - TcpBasedAttemptSlot* slot = FindTcpBasedAttemptSlot(ip_endpoint); - auto attempt = std::make_unique<TcpBasedAttempt>(this, slot, using_tls, - std::move(ip_endpoint)); - TcpBasedAttempt* raw_attempt = attempt.get(); - slot->AllocateAttempt(std::move(attempt)); - raw_attempt->Start(); -} - -HttpStreamPool::TcpBasedAttemptSlot* -HttpStreamPool::AttemptManager::FindTcpBasedAttemptSlot( - const IPEndPoint& ip_endpoint) { - // Prefer a new slot if there is a room for it. - if (!ShouldRespectLimits() || tcp_based_attempt_slots_.size() < - pool()->max_stream_sockets_per_group()) { - auto slot = std::make_unique<TcpBasedAttemptSlot>(); - auto [it, inserted] = tcp_based_attempt_slots_.emplace(std::move(slot)); - CHECK(inserted); - pool()->IncrementTotalConnectingStreamCount(); - return it->get(); - } - - for (auto& slot : tcp_based_attempt_slots_) { - if (ip_endpoint.address().IsIPv4() && !slot->ipv4_attempt()) { - return slot.get(); - } - if (ip_endpoint.address().IsIPv6() && !slot->ipv6_attempt()) { - return slot.get(); - } - } - NOTREACHED(); -} - -void HttpStreamPool::AttemptManager::CancelTcpBasedAttemptSlot( - TcpBasedAttemptSlot* raw_slot, - std::optional<StreamSocketCloseReason> reason) { - std::unique_ptr<TcpBasedAttemptSlot> slot = - ExtractTcpBasedAttemptSlot(raw_slot); - if (reason.has_value()) { - slot->SetCancelReason(*reason); - } -} - bool HttpStreamPool::AttemptManager::IsTcpBasedAttemptReady() { CanAttemptResult can_attempt = CanAttemptConnection(); // TODO(crbug.com/383606724): Consider removing these trace and net log event @@ -1513,6 +1488,11 @@ return max_preconnect_count; } +size_t HttpStreamPool::AttemptManager::NonSlowTcpBasedAttemptCount() const { + CHECK_GE(tcp_based_attempts_.size(), slow_tcp_based_attempt_count_); + return tcp_based_attempts_.size() - slow_tcp_based_attempt_count_; +} + std::optional<QuicEndpoint> HttpStreamPool::AttemptManager::GetQuicEndpointToAttempt() { const bool svcb_optional = IsSvcbOptional(); @@ -1568,7 +1548,7 @@ NotifyPreconnectsComplete(final_error_to_notify_jobs()); NotifyJobOfFailure(); - CHECK(tcp_based_attempt_slots_.empty()); + CHECK(tcp_based_attempts_.empty()); CHECK(request_jobs_.empty()); CHECK(preconnect_jobs_.empty()); CHECK(!quic_attempt_); @@ -1893,8 +1873,10 @@ if (ShouldRespectLimits()) { while (group_->ActiveStreamSocketCount() > pool()->max_stream_sockets_per_group() && - !tcp_based_attempt_slots_.empty()) { - CancelTcpBasedAttemptSlot(tcp_based_attempt_slots_.begin()->get()); + !tcp_based_attempts_.empty()) { + std::unique_ptr<TcpBasedAttempt> attempt = + ExtractTcpBasedAttempt(tcp_based_attempts_.begin()->get()); + attempt.reset(); } } return job; @@ -1918,28 +1900,18 @@ MaybeChangeServiceEndpointRequestPriority(); } -std::unique_ptr<HttpStreamPool::TcpBasedAttemptSlot> -HttpStreamPool::AttemptManager::ExtractTcpBasedAttemptSlot( - TcpBasedAttemptSlot* raw_slot) { - auto it = tcp_based_attempt_slots_.find(raw_slot); - std::unique_ptr<TcpBasedAttemptSlot> slot = - std::move(tcp_based_attempt_slots_.extract(it).value()); - pool()->DecrementTotalConnectingStreamCount(); - return slot; -} - std::unique_ptr<HttpStreamPool::TcpBasedAttempt> HttpStreamPool::AttemptManager::ExtractTcpBasedAttempt( - TcpBasedAttempt* raw_attempt, - int rv) { - TcpBasedAttemptSlot* slot = raw_attempt->slot(); - auto it = tcp_based_attempt_slots_.find(slot); - CHECK(it != tcp_based_attempt_slots_.end()); + TcpBasedAttempt* raw_attempt) { + auto it = tcp_based_attempts_.find(raw_attempt); + CHECK(it != tcp_based_attempts_.end()); + std::unique_ptr<TcpBasedAttempt> attempt = + std::move(tcp_based_attempts_.extract(it).value()); - std::unique_ptr<TcpBasedAttempt> attempt = slot->TakeAttempt(raw_attempt); - - if (rv == OK || slot->empty()) { - ExtractTcpBasedAttemptSlot(slot); + pool()->DecrementTotalConnectingStreamCount(); + if (attempt->is_slow()) { + CHECK_GT(slow_tcp_based_attempt_count_, 0u); + --slow_tcp_based_attempt_count_; } return attempt; @@ -1959,7 +1931,7 @@ return; } - // We already removed `tcp_based_attempt` from `tcp_based_attempt_slots_` so + // We already removed `tcp_based_attempt` from `tcp_based_attempts_` so // the active stream count is up-to-date. ProcessPreconnectsAfterAttemptComplete(rv, group_->ActiveStreamSocketCount()); @@ -2107,25 +2079,9 @@ stream_key().network_anonymization_key()); } -base::Value::Dict -HttpStreamPool::AttemptManager::GetTcpBasedAttemptSlotsAsValue() const { - base::Value::Dict dict; - dict.Set("num_slots", static_cast<int>(tcp_based_attempt_slots_.size())); - - if (!tcp_based_attempt_slots_.empty()) { - base::Value::List slots; - for (const auto& slot : tcp_based_attempt_slots_) { - slots.Append(slot->GetInfoAsValue()); - } - dict.Set("slots", std::move(slots)); - } - - return dict; -} - bool HttpStreamPool::AttemptManager::CanComplete() const { return request_jobs_.empty() && notified_jobs_.empty() && - preconnect_jobs_.empty() && tcp_based_attempt_slots_.empty() && + preconnect_jobs_.empty() && tcp_based_attempts_.empty() && !quic_attempt_; }
diff --git a/net/http/http_stream_pool_attempt_manager.h b/net/http/http_stream_pool_attempt_manager.h index 09967ab..121ce7b 100644 --- a/net/http/http_stream_pool_attempt_manager.h +++ b/net/http/http_stream_pool_attempt_manager.h
@@ -183,14 +183,8 @@ // or failure. size_t NotifiedRequestJobCount() const { return notified_jobs_.size(); } - // Returns the number of in-flight TCP based attempt slots. - size_t TcpBasedAttemptSlotCount() const { - return tcp_based_attempt_slots_.size(); - } - - // Returns the number of TCP based attempt slots that are not considered as - // slow. - size_t NonSlowTcpBasedAttemptCount() const; + // Returns the number of in-flight TCP based attempts. + size_t TcpBasedAttemptCount() const { return tcp_based_attempts_.size(); } // Cancels all in-flight TCP based attempts. void CancelTcpBasedAttempts(StreamSocketCloseReason reason); @@ -359,19 +353,6 @@ std::optional<IPEndPoint> exclude_ip_endpoint = std::nullopt, std::optional<size_t> max_attempts = std::nullopt); - // Creates and starts a TCP based attempt. - void CreateAndStartTcpBasedAttempt(bool using_tls, IPEndPoint ip_endpoint); - - // Finds or allocates a TcpBasedAttemptSlot for `ip_endpoint`. If under the - // group limit, allocates a new slot. Otherwise, uses an existing slot that - // doesn't have an attempt for the same address family as `ip_endpoint`. - TcpBasedAttemptSlot* FindTcpBasedAttemptSlot(const IPEndPoint& ip_endpoint); - - // Cancels `raw_slot` and removes it from `tcp_based_attempt_slots_`. - void CancelTcpBasedAttemptSlot( - TcpBasedAttemptSlot* raw_slot, - std::optional<StreamSocketCloseReason> reason = std::nullopt); - // Returns true if there are pending jobs and the pool and the group // haven't reached stream limits. If the pool reached the stream limit, may // close idle sockets in other groups. Also may cancel preconnects or trigger @@ -409,6 +390,9 @@ // preconnects. size_t CalculateRequiredTcpBasedAttemptForPreconnect() const; + // Returns the number of TCP based attempts that are not considered as slow. + size_t NonSlowTcpBasedAttemptCount() const; + // Returns a QUIC endpoint to make a connection attempt. See the comments in // QuicSessionPool::SelectQuicVersion() for the criteria to select a QUIC // endpoint. @@ -478,15 +462,9 @@ // limit. raw_ptr<Job> RemoveJobFromQueue(JobQueue::Pointer job_pointer); - // Transfers the ownership of `raw_slot` to the caller. - std::unique_ptr<TcpBasedAttemptSlot> ExtractTcpBasedAttemptSlot( - TcpBasedAttemptSlot* raw_slot); - - // Transfers the ownership of `raw_attempt` to the caller. If `rv` is OK, also - // removes the corresponding slot from `tcp_based_attempt_slots_`. + // Transfers the ownership of `raw_attempt` to the caller. std::unique_ptr<TcpBasedAttempt> ExtractTcpBasedAttempt( - TcpBasedAttempt* raw_attempt, - int rv); + TcpBasedAttempt* raw_attempt); void HandleTcpBasedAttemptFailure( std::unique_ptr<TcpBasedAttempt> tcp_based_attempt, @@ -517,8 +495,6 @@ // or not attempted. void MaybeMarkQuicBroken(); - base::Value::Dict GetTcpBasedAttemptSlotsAsValue() const; - // Returns true when this can complete. bool CanComplete() const; @@ -593,8 +569,10 @@ // from the newest job. std::optional<SSLConfig> base_ssl_config_; - std::set<std::unique_ptr<TcpBasedAttemptSlot>, base::UniquePtrComparator> - tcp_based_attempt_slots_; + std::set<std::unique_ptr<TcpBasedAttempt>, base::UniquePtrComparator> + tcp_based_attempts_; + // The number of in-flight TCP based attempts that are treated as slow. + size_t slow_tcp_based_attempt_count_ = 0; base::OneShotTimer spdy_throttle_timer_; bool spdy_throttle_delay_passed_ = false;
diff --git a/net/http/http_stream_pool_attempt_manager_unittest.cc b/net/http/http_stream_pool_attempt_manager_unittest.cc index 264db8c..8f7af048 100644 --- a/net/http/http_stream_pool_attempt_manager_unittest.cc +++ b/net/http/http_stream_pool_attempt_manager_unittest.cc
@@ -1375,11 +1375,11 @@ RunUntilIdle(); AttemptManager* manager = pool().GetGroupForTesting(requester.GetStreamKey())->attempt_manager(); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); ASSERT_FALSE(request->completed()); FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u); ASSERT_FALSE(request->completed()); // FastForwardBy() executes non-delayed tasks so the request finishes @@ -1402,65 +1402,6 @@ ASSERT_FALSE(requester.associated_attempt_manager()); } -TEST_F(HttpStreamPoolAttemptManagerTest, IPEndPointSlowMultipleRequests) { - constexpr size_t kMaxPerGroup = 2; - pool().set_max_stream_sockets_per_group_for_testing(kMaxPerGroup); - - base::WeakPtr<FakeServiceEndpointRequest> endpoint_request = - resolver()->AddFakeRequest(); - - // Data for blackholed endpoint (2001:db8::1). - std::vector<std::unique_ptr<SequencedSocketData>> datas; - for (size_t i = 0; i < kMaxPerGroup; ++i) { - auto data = std::make_unique<SequencedSocketData>(); - // Make the first attempt stalled. - data->set_connect_data(MockConnect(SYNCHRONOUS, ERR_IO_PENDING)); - socket_factory()->AddSocketDataProvider(data.get()); - datas.emplace_back(std::move(data)); - } - - // Data for successful endpoint (192.0.2.1). - for (size_t i = 0; i < kMaxPerGroup; ++i) { - auto data = std::make_unique<SequencedSocketData>(); - data->set_connect_data(MockConnect(ASYNC, OK)); - socket_factory()->AddSocketDataProvider(data.get()); - datas.emplace_back(std::move(data)); - } - - // Create requests up to the per-group limit. - std::vector<std::unique_ptr<StreamRequester>> requesters; - for (size_t i = 0; i < kMaxPerGroup; ++i) { - auto requester = std::make_unique<StreamRequester>(); - HttpStreamRequest* request = requester->RequestStream(pool()); - requesters.emplace_back(std::move(requester)); - ASSERT_FALSE(request->completed()); - } - - // Complete endpoint resolution with IPv4/IPv6 endpoints. This triggers - // `kMaxPerGroup` attempts for the IPv6 endpoint. - endpoint_request - ->add_endpoint(ServiceEndpointBuilder() - .add_v4("192.0.2.1") - .add_v6("2001:db8::1") - .endpoint()) - .CallOnServiceEndpointRequestFinished(OK); - - AttemptManager* manager = - pool() - .GetGroupForTesting(requesters[0]->GetStreamKey()) - ->attempt_manager(); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u); - - // Simulate IPv6 endpoint slow. It should trigger attempts for the IPv4 - // endpoint. FastForwardBy() executes non-delayed tasks so the requests finish - // immediately. - FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); - for (const auto& requester : requesters) { - ASSERT_TRUE(requester->result().has_value()); - EXPECT_THAT(requester->result(), Optional(IsOk())); - } -} - TEST_F(HttpStreamPoolAttemptManagerTest, PauseSlowTimerAfterTcpHandshakeForTls) { base::WeakPtr<FakeServiceEndpointRequest> endpoint_request = @@ -1496,7 +1437,7 @@ pool() .GetOrCreateGroupForTesting(requester.GetStreamKey()) .attempt_manager(); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); ASSERT_FALSE(requester.result().has_value()); // Complete TCP handshake after a delay that is less than the connection @@ -1506,24 +1447,24 @@ FastForwardBy(kTcpDelay); tcp_connect_completer1.Complete(OK); RunUntilIdle(); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); // Fast-forward to the connection attempt delay. Since the in-flight attempt // has completed TCP handshake and is waiting for HTTPS RR, the manager // shouldn't start another attempt. FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); // Complete DNS resolution fully. endpoint_request->set_crypto_ready(true).CallOnServiceEndpointRequestFinished( OK); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); // Fast-forward to the connection attempt delay again. This time the in-flight // attempt is still doing TLS handshake, it's treated as slow and the manager // should start another attempt. FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u); // Complete the second attempt. The request should finish successfully. tcp_connect_completer2.Complete(OK); @@ -1662,7 +1603,7 @@ AttemptManager* manager = group.attempt_manager(); ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup); ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), kMaxPerGroup); + ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup); // This request should not start an attempt as the group reached its limit. StreamRequester stalled_requester; @@ -1674,7 +1615,7 @@ ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup); ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), kMaxPerGroup); + ASSERT_EQ(manager->TcpBasedAttemptCount(), kMaxPerGroup); ASSERT_EQ(stalled_request->GetLoadState(), LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET); @@ -1682,7 +1623,7 @@ RunUntilIdle(); ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup); ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u); // Release one HttpStream and close it to make non-reusable. std::unique_ptr<StreamRequester> released_requester = @@ -1706,13 +1647,13 @@ ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup); ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); RunUntilIdle(); ASSERT_EQ(pool().TotalActiveStreamCount(), kMaxPerGroup); ASSERT_EQ(group.ActiveStreamSocketCount(), kMaxPerGroup); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u); ASSERT_TRUE(stalled_request->completed()); std::unique_ptr<HttpStream> stream = stalled_requester.ReleaseStream(); ASSERT_TRUE(stream); @@ -1788,7 +1729,7 @@ ASSERT_FALSE(request2->completed()); ASSERT_TRUE(pool().ReachedMaxStreamLimit()); ASSERT_TRUE(pool().IsPoolStalled()); - ASSERT_EQ(requester2.associated_attempt_manager()->TcpBasedAttemptSlotCount(), + ASSERT_EQ(requester2.associated_attempt_manager()->TcpBasedAttemptCount(), 0u); // Release one HttpStream from group A. It should unblock the in-flight @@ -2081,7 +2022,7 @@ } Group& group = pool().GetOrCreateGroupForTesting(stream_key); - ASSERT_GT(group.attempt_manager()->TcpBasedAttemptSlotCount(), kMaxPerGroup); + ASSERT_GT(group.attempt_manager()->TcpBasedAttemptCount(), kMaxPerGroup); // Complete requests that ignore limits. while (!limit_ignoring_requesters.empty()) { @@ -2327,16 +2268,16 @@ .GetOrCreateGroupForTesting(requester2.GetStreamKey()) .attempt_manager(); ASSERT_EQ(manager1->RequestJobCount(), 1u); - ASSERT_EQ(manager1->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager1->TcpBasedAttemptCount(), 1u); ASSERT_EQ(manager2->RequestJobCount(), 1u); - ASSERT_EQ(manager2->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager2->TcpBasedAttemptCount(), 1u); NetworkChangeNotifier::NotifyObserversOfIPAddressChangeForTests(); RunUntilIdle(); ASSERT_EQ(manager1->RequestJobCount(), 0u); - ASSERT_EQ(manager1->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager1->TcpBasedAttemptCount(), 0u); ASSERT_EQ(manager2->RequestJobCount(), 0u); - ASSERT_EQ(manager2->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager2->TcpBasedAttemptCount(), 0u); EXPECT_THAT(requester1.result(), Optional(IsError(ERR_NETWORK_CHANGED))); EXPECT_THAT(requester2.result(), Optional(IsError(ERR_NETWORK_CHANGED))); } @@ -2448,7 +2389,7 @@ ->GetWeakPtrForTesting(); ASSERT_EQ(manager->RequestJobCount(), 2u); ASSERT_EQ(manager->NotifiedRequestJobCount(), 0u); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u); // Trigger slow timers. FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); @@ -2462,7 +2403,7 @@ ASSERT_TRUE(manager->is_shutting_down()); ASSERT_EQ(manager->RequestJobCount(), 0u); ASSERT_EQ(manager->NotifiedRequestJobCount(), 0u); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u); // Trigger an SSLConfig change. This should cancel in-flight attempts. ssl_config_service()->NotifySSLContextConfigChange(); @@ -3381,7 +3322,7 @@ .CallOnServiceEndpointRequestFinished(OK); // There should be only one in-flight attempt because attempts are throttled. Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u); // This should not enter an infinite loop. pool().ProcessPendingRequestsInGroups(); @@ -3488,14 +3429,14 @@ .CallOnServiceEndpointRequestFinished(OK); // There should be only one in-flight attempt because attempts are throttled. Group& group = pool().GetOrCreateGroupForTesting(requester1.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u); FastForwardBy(AttemptManager::kSpdyThrottleDelay); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 2u); connect_completer1.Complete(OK); RunUntilIdle(); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u); connect_completer2.Complete(OK); RunUntilIdle(); @@ -3547,14 +3488,14 @@ AttemptManager* manager = pool().GetGroupForTesting(requester.GetStreamKey())->attempt_manager(); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); ASSERT_FALSE(requester.result().has_value()); // Fast-forward to the connection attempt delay. The in-flight attempt is // treated as slow. Since there is no non-slow attempt, the manager should // not be throttled and start another attempt. FastForwardBy(HttpStreamPool::GetConnectionAttemptDelay()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 2u); // Complete the second attempt. The request should finish successfully. completer2.Complete(OK); @@ -3627,7 +3568,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u); ASSERT_FALSE(preconnector.result().has_value()); RunUntilIdle(); @@ -3657,7 +3598,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams); ASSERT_FALSE(preconnector.result().has_value()); RunUntilIdle(); @@ -3703,7 +3644,7 @@ int rv = preconnector.set_num_streams(kNumPreconnectStreams).Preconnect(pool()); EXPECT_THAT(rv, IsError(ERR_IO_PENDING)); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumPreconnectStreams - 1u); ASSERT_FALSE(preconnector.result().has_value()); @@ -3740,7 +3681,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 1u); ASSERT_FALSE(preconnector.result().has_value()); RunUntilIdle(); @@ -3784,7 +3725,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), 2u); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), 2u); ASSERT_FALSE(preconnector.result().has_value()); RunUntilIdle(); @@ -3821,7 +3762,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams); ASSERT_FALSE(preconnector.result().has_value()); preconnector.WaitForResult(); @@ -3859,7 +3800,7 @@ ->add_endpoint(ServiceEndpointBuilder().add_v4("192.0.2.1").endpoint()) .CallOnServiceEndpointRequestFinished(OK); Group& group = pool().GetOrCreateGroupForTesting(preconnector.GetStreamKey()); - ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptSlotCount(), kNumStreams); + ASSERT_EQ(group.attempt_manager()->TcpBasedAttemptCount(), kNumStreams); ASSERT_FALSE(preconnector.result().has_value()); RunUntilIdle(); @@ -4019,7 +3960,7 @@ ASSERT_FALSE(requester2.result().has_value()); ASSERT_NE(requester1.associated_attempt_manager().get(), group->attempt_manager()); - ASSERT_EQ(group->attempt_manager()->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(group->attempt_manager()->TcpBasedAttemptCount(), 1u); EXPECT_EQ(request2->GetLoadState(), LOAD_STATE_CONNECTING); // Preconnect should succeed immediately as the active AttemptManager has @@ -5655,7 +5596,7 @@ endpoint_request->CallOnServiceEndpointRequestFinished(OK); ASSERT_FALSE(requester.result().has_value()); ASSERT_TRUE(manager->quic_attempt_for_testing()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 1u); // The request should complete with the TCP-based attempt. requester.WaitForResult(); @@ -5718,7 +5659,7 @@ endpoint_request->CallOnServiceEndpointRequestFinished(OK); ASSERT_FALSE(requester.result().has_value()); ASSERT_TRUE(manager->quic_attempt_for_testing()); - ASSERT_EQ(manager->TcpBasedAttemptSlotCount(), 0u); + ASSERT_EQ(manager->TcpBasedAttemptCount(), 0u); // Fire the stream attempt delay timer. The request should complete. FastForwardBy(kQuicDelay); @@ -5786,7 +5727,7 @@ EXPECT_FALSE(manager->quic_attempt_for_testing()); EXPECT_THAT(manager->GetQuicAttemptResultForTesting(), Optional(IsError(ERR_DNS_NO_MATCHING_SUPPORTED_ALPN))); - EXPECT_EQ(manager->TcpBasedAttemptSlotCount(), 1u); + EXPECT_EQ(manager->TcpBasedAttemptCount(), 1u); connect_completer.Complete(OK); preconnector.WaitForResult(); @@ -7294,8 +7235,8 @@ EXPECT_THAT(requester.result(), Optional(IsError(ERR_NETWORK_CHANGED))); // The group should not have active AttemptManager. EXPECT_FALSE(group->attempt_manager()); - EXPECT_THAT( - requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u); + EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(), + 0u); EXPECT_THAT( requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(), Optional(IsError(ERR_NETWORK_CHANGED))); @@ -7347,8 +7288,8 @@ requester.WaitForResult(); EXPECT_THAT(requester.result(), Optional(IsError(ERR_NAME_NOT_RESOLVED))); - EXPECT_THAT( - requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u); + EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(), + 0u); EXPECT_THAT( requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(), Optional(IsError(ERR_NAME_NOT_RESOLVED))); @@ -7389,8 +7330,8 @@ EXPECT_THAT(requester.result(), Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED))); quic_completer.Complete(OK); - EXPECT_THAT( - requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u); + EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(), + 0u); EXPECT_THAT( requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(), Optional(IsError(ERR_SSL_CLIENT_AUTH_CERT_NEEDED))); @@ -7426,8 +7367,8 @@ requester.WaitForResult(); EXPECT_THAT(requester.result(), Optional(IsError(ERR_CERT_DATE_INVALID))); quic_completer.Complete(OK); - EXPECT_THAT( - requester.associated_attempt_manager()->TcpBasedAttemptSlotCount(), 0u); + EXPECT_THAT(requester.associated_attempt_manager()->TcpBasedAttemptCount(), + 0u); EXPECT_THAT( requester.associated_attempt_manager()->GetQuicAttemptResultForTesting(), Optional(IsError(ERR_CERT_DATE_INVALID)));
diff --git a/net/http/http_stream_pool_group.cc b/net/http/http_stream_pool_group.cc index 777b138..2ce7086 100644 --- a/net/http/http_stream_pool_group.cc +++ b/net/http/http_stream_pool_group.cc
@@ -264,13 +264,12 @@ } size_t HttpStreamPool::Group::ConnectingStreamSocketCount() const { - return attempt_manager_ ? attempt_manager_->TcpBasedAttemptSlotCount() : 0; + return attempt_manager_ ? attempt_manager_->TcpBasedAttemptCount() : 0; } size_t HttpStreamPool::Group::ActiveStreamSocketCount() const { return handed_out_stream_count_ + idle_stream_sockets_.size() + - (attempt_manager_ ? attempt_manager_->NonSlowTcpBasedAttemptCount() - : 0); + ConnectingStreamSocketCount(); } bool HttpStreamPool::Group::ReachedMaxStreamLimit() const {
diff --git a/net/http/http_stream_pool_tcp_based_attempt.cc b/net/http/http_stream_pool_tcp_based_attempt.cc index 8535ffb..76933dc 100644 --- a/net/http/http_stream_pool_tcp_based_attempt.cc +++ b/net/http/http_stream_pool_tcp_based_attempt.cc
@@ -9,7 +9,6 @@ #include <string_view> #include "base/metrics/histogram_functions.h" -#include "base/notreached.h" #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "base/timer/timer.h" @@ -76,14 +75,12 @@ } // namespace HttpStreamPool::TcpBasedAttempt::TcpBasedAttempt(AttemptManager* manager, - TcpBasedAttemptSlot* slot, bool using_tls, IPEndPoint ip_endpoint) : manager_(manager), track_(base::trace_event::GetNextGlobalTraceId()), flow_(perfetto::Flow::ProcessScoped( - base::trace_event::GetNextGlobalTraceId())), - slot_(slot) { + base::trace_event::GetNextGlobalTraceId())) { TRACE_EVENT_INSTANT("net.stream", "TcpBasedAttemptStart", manager_->track(), flow_); TRACE_EVENT_BEGIN("net.stream", "TcpBasedAttempt::TcpBasedAttempt", track_, @@ -275,126 +272,4 @@ manager_->OnTcpBasedAttemptComplete(this, rv); } -// TcpBasedAttemptSlot - -HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot() = default; - -HttpStreamPool::TcpBasedAttemptSlot::~TcpBasedAttemptSlot() = default; - -HttpStreamPool::TcpBasedAttemptSlot::TcpBasedAttemptSlot( - TcpBasedAttemptSlot&&) = default; - -HttpStreamPool::TcpBasedAttemptSlot& -HttpStreamPool::TcpBasedAttemptSlot::operator=(TcpBasedAttemptSlot&&) = default; - -void HttpStreamPool::TcpBasedAttemptSlot::AllocateAttempt( - std::unique_ptr<TcpBasedAttempt> attempt) { - if (attempt->ip_endpoint().address().IsIPv4()) { - CHECK(!ipv4_attempt_); - ipv4_attempt_ = std::move(attempt); - } else { - CHECK(attempt->ip_endpoint().address().IsIPv6()); - CHECK(!ipv6_attempt_); - ipv6_attempt_ = std::move(attempt); - } -} - -std::unique_ptr<HttpStreamPool::TcpBasedAttempt> -HttpStreamPool::TcpBasedAttemptSlot::TakeAttempt(TcpBasedAttempt* raw_attempt) { - auto take_attempt = [&]() { - if (ipv4_attempt_.get() == raw_attempt) { - return std::move(ipv4_attempt_); - } - if (ipv6_attempt_.get() == raw_attempt) { - return std::move(ipv6_attempt_); - } - NOTREACHED(); - }; - - std::unique_ptr<TcpBasedAttempt> attempt = take_attempt(); - // Reset slot to avoid dangling pointer. - attempt->ResetSlot(); - return attempt; -} - -LoadState HttpStreamPool::TcpBasedAttemptSlot::GetLoadState() const { - if (ipv4_attempt_ && ipv6_attempt_) { - CHECK(ipv4_attempt_->attempt()); - CHECK(ipv6_attempt_->attempt()); - return std::max(ipv4_attempt_->attempt()->GetLoadState(), - ipv6_attempt_->attempt()->GetLoadState()); - } - if (ipv4_attempt_) { - CHECK(ipv4_attempt_->attempt()); - return ipv4_attempt_->attempt()->GetLoadState(); - } - if (ipv6_attempt_) { - CHECK(ipv6_attempt_->attempt()); - return ipv6_attempt_->attempt()->GetLoadState(); - } - NOTREACHED(); -} - -void HttpStreamPool::TcpBasedAttemptSlot::MaybeTakeSSLConfigWaitingCallbacks( - std::vector<CompletionOnceCallback>& callbacks) { - auto take_callback = [&](TcpBasedAttempt* attempt) { - auto callback = attempt->MaybeTakeSSLConfigWaitingCallback(); - if (callback.has_value()) { - callbacks.emplace_back(std::move(*callback)); - } - }; - - if (ipv4_attempt_) { - take_callback(ipv4_attempt_.get()); - } - if (ipv6_attempt_) { - take_callback(ipv6_attempt_.get()); - } -} - -bool HttpStreamPool::TcpBasedAttemptSlot::IsSlow() const { - if (ipv4_attempt_ && ipv6_attempt_) { - return ipv4_attempt_->is_slow() && ipv6_attempt_->is_slow(); - } - if (ipv4_attempt_) { - return ipv4_attempt_->is_slow(); - } - if (ipv6_attempt_) { - return ipv6_attempt_->is_slow(); - } - NOTREACHED(); -} - -bool HttpStreamPool::TcpBasedAttemptSlot::HasIPEndPoint( - const IPEndPoint& ip_endpoint) const { - if (ipv4_attempt_ && ipv4_attempt_->ip_endpoint() == ip_endpoint) { - return true; - } - if (ipv6_attempt_ && ipv6_attempt_->ip_endpoint() == ip_endpoint) { - return true; - } - return false; -} - -void HttpStreamPool::TcpBasedAttemptSlot::SetCancelReason( - StreamSocketCloseReason reason) { - if (ipv4_attempt_) { - ipv4_attempt_->SetCancelReason(reason); - } - if (ipv6_attempt_) { - ipv6_attempt_->SetCancelReason(reason); - } -} - -base::Value::Dict HttpStreamPool::TcpBasedAttemptSlot::GetInfoAsValue() const { - base::Value::Dict dict; - if (ipv4_attempt_) { - dict.Set("ipv4_attempt", ipv4_attempt_->GetInfoAsValue()); - } - if (ipv6_attempt_) { - dict.Set("ipv6_attempt", ipv6_attempt_->GetInfoAsValue()); - } - return dict; -} - } // namespace net
diff --git a/net/http/http_stream_pool_tcp_based_attempt.h b/net/http/http_stream_pool_tcp_based_attempt.h index 200aa3c..6db3fa0 100644 --- a/net/http/http_stream_pool_tcp_based_attempt.h +++ b/net/http/http_stream_pool_tcp_based_attempt.h
@@ -26,7 +26,6 @@ class HttpStreamPool::TcpBasedAttempt : public TlsStreamAttempt::Delegate { public: TcpBasedAttempt(AttemptManager* manager, - TcpBasedAttemptSlot* slot, bool using_tls, IPEndPoint ip_endpoint); @@ -39,10 +38,6 @@ void SetCancelReason(StreamSocketCloseReason reason); - TcpBasedAttemptSlot* slot() const { return slot_; } - - void ResetSlot() { slot_ = nullptr; } - StreamAttempt* attempt() { return attempt_.get(); } base::TimeTicks start_time() const { return start_time_; } @@ -81,7 +76,6 @@ const raw_ptr<AttemptManager> manager_; const perfetto::Track track_; const perfetto::Flow flow_; - raw_ptr<TcpBasedAttemptSlot> slot_; std::unique_ptr<StreamAttempt> attempt_; base::TimeTicks start_time_; std::optional<int> result_; @@ -100,63 +94,6 @@ base::WeakPtrFactory<TcpBasedAttempt> weak_ptr_factory_{this}; }; -// Groups at most two concurrent TCP-based attempts (one IPv4, one IPv6) into a -// single “slot” counted against pool limits. Used to work around cases where -// both address families are available but one is much slower than the other. In -// such cases, the slow attempt may time out, causing the whole pool to stall, -// even if the fast attempt would have succeeded. By grouping attempts by -// address family, we can ensure that at most one attempt per address family is -// in-flight at any time. -// TODO(crbug.com/383606724): Figure out a better solution by improving endpoint -// selection. -class HttpStreamPool::TcpBasedAttemptSlot { - public: - TcpBasedAttemptSlot(); - ~TcpBasedAttemptSlot(); - - TcpBasedAttemptSlot(const TcpBasedAttemptSlot&) = delete; - TcpBasedAttemptSlot& operator=(const TcpBasedAttemptSlot&) = delete; - TcpBasedAttemptSlot(TcpBasedAttemptSlot&&); - TcpBasedAttemptSlot& operator=(TcpBasedAttemptSlot&&); - - // Allocates `attempt` to either IPv4 or IPv6 attempt slot based on its IP - // address. - void AllocateAttempt(std::unique_ptr<TcpBasedAttempt> attempt); - - // Transfers ownership of the attempt matching `raw_attempt` to the caller. - std::unique_ptr<TcpBasedAttempt> TakeAttempt(TcpBasedAttempt* raw_attempt); - - TcpBasedAttempt* ipv4_attempt() const { return ipv4_attempt_.get(); } - TcpBasedAttempt* ipv6_attempt() const { return ipv6_attempt_.get(); } - - // Returns true if this slot has no attempts. - bool empty() const { return !ipv4_attempt() && !ipv6_attempt(); } - - // Returns the most advanced load state of the attempts in this slot. - LoadState GetLoadState() const; - - // Transfers SSLConfig waiting callbacks from attempts in this slot to - // `callbacks`, if attempts are waiting for SSLConfig. - void MaybeTakeSSLConfigWaitingCallbacks( - std::vector<CompletionOnceCallback>& callbacks); - - // Returns true when this slot is slow. A slot is considered slow when either - // IPv4 or IPv6 attempt is slow. - bool IsSlow() const; - - // Returns true if either IPv4 or IPv6 attempt has the given `ip_endpoint`. - bool HasIPEndPoint(const IPEndPoint& ip_endpoint) const; - - // Sets the cancel reason of both attempts in this slot. - void SetCancelReason(StreamSocketCloseReason reason); - - base::Value::Dict GetInfoAsValue() const; - - private: - std::unique_ptr<TcpBasedAttempt> ipv4_attempt_; - std::unique_ptr<TcpBasedAttempt> ipv6_attempt_; -}; - } // namespace net #endif // NET_HTTP_HTTP_STREAM_POOL_TCP_BASED_ATTEMPT_H_
diff --git a/remoting/host/BUILD.gn b/remoting/host/BUILD.gn index 0f8c016..3fbf2c5 100644 --- a/remoting/host/BUILD.gn +++ b/remoting/host/BUILD.gn
@@ -846,6 +846,11 @@ sources -= [ "input_monitor/local_input_monitor_unittest.cc" ] } + # TODO(447203893): Re-enable this on Linux once the bug is fixed. + if (is_linux) { + sources -= [ "host_power_save_blocker_unittest.cc" ] + } + configs += [ "//remoting/build/config:version" ] deps = [
diff --git a/remoting/host/host_power_save_blocker.cc b/remoting/host/host_power_save_blocker.cc index acd1c8a..00dff119 100644 --- a/remoting/host/host_power_save_blocker.cc +++ b/remoting/host/host_power_save_blocker.cc
@@ -9,6 +9,7 @@ #include "base/check.h" #include "base/task/single_thread_task_runner.h" +#include "build/build_config.h" #include "remoting/host/host_status_monitor.h" #include "services/device/public/mojom/wake_lock.mojom.h" @@ -27,10 +28,13 @@ } void HostPowerSaveBlocker::OnClientConnected(const std::string& jid) { + // TODO(447203893): Re-enable this on Linux once the bug is fixed. +#if !BUILDFLAG(IS_LINUX) blocker_ = std::make_unique<device::PowerSaveBlocker>( device::mojom::WakeLockType::kPreventDisplaySleep, device::mojom::WakeLockReason::kOther, "Remoting session is active", ui_task_runner_); +#endif } void HostPowerSaveBlocker::OnClientDisconnected(const std::string& jid) {
diff --git a/remoting/host/it2me/it2me_host.cc b/remoting/host/it2me/it2me_host.cc index fced4808..d6b7b408 100644 --- a/remoting/host/it2me/it2me_host.cc +++ b/remoting/host/it2me/it2me_host.cc
@@ -865,7 +865,10 @@ } // Check the client domain policy. - if (!required_client_domain_list_.empty()) { + // Skip this check for class management sessions, as they use the device + // specific robot account as client, and we should not expect the customers to + // add this internal account to their client domain list. + if (!required_client_domain_list_.empty() && !is_class_management_session()) { bool matched = false; for (const auto& domain : required_client_domain_list_) { if (base::EndsWith(client_username, std::string("@") + domain, @@ -883,6 +886,15 @@ } } + if (is_class_management_session() && authorized_helper_.empty()) { + LOG(ERROR) << "Rejecting class management connection request from (" + << client_username << "as an authorized_helper was not provided"; + std::move(result_callback) + .Run(ValidationResult::ERROR_UNAUTHORIZED_ACCOUNT); + DisconnectOnNetworkThread(); + return; + } + if (!authorized_helper_.empty() && !gaia::AreEmailsSame(authorized_helper_, client_username)) { LOG(ERROR) << "Rejecting connection request from (" << client_username
diff --git a/remoting/host/it2me/it2me_host.h b/remoting/host/it2me/it2me_host.h index 0f7245c..d7761cf 100644 --- a/remoting/host/it2me/it2me_host.h +++ b/remoting/host/it2me/it2me_host.h
@@ -112,6 +112,13 @@ bool is_enterprise_session() const { return chrome_os_enterprise_params_.has_value(); } + // Indicates whether this support session was initiated by Class tools + // for a managed Chrome OS device. + bool is_class_management_session() const { + return chrome_os_enterprise_params_.has_value() && + chrome_os_enterprise_params_->request_origin == + remoting::ChromeOsEnterpriseRequestOrigin::kClassManagement; + } // If set, only |authorized_helper| will be allowed to connect to this host. void set_authorized_helper(const std::string& authorized_helper);
diff --git a/remoting/host/it2me/it2me_host_unittest.cc b/remoting/host/it2me/it2me_host_unittest.cc index d0c6b48..6c99b43 100644 --- a/remoting/host/it2me/it2me_host_unittest.cc +++ b/remoting/host/it2me/it2me_host_unittest.cc
@@ -112,11 +112,17 @@ return std::make_unique<HostEventReporterStub>(); } -ChromeOsEnterpriseParams GetDefaultEnterpriseParamsWithRequestOrigin() { +ChromeOsEnterpriseParams GetDefaultEnterpriseParamsForEnterpriseAdmin() { ChromeOsEnterpriseParams params; params.request_origin = ChromeOsEnterpriseRequestOrigin::kEnterpriseAdmin; return params; } + +ChromeOsEnterpriseParams GetDefaultEnterpriseParamsForClassManagement() { + ChromeOsEnterpriseParams params; + params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement; + return params; +} #endif // BUILDFLAG(IS_CHROMEOS) } // namespace @@ -995,7 +1001,7 @@ #if BUILDFLAG(IS_CHROMEOS) TEST_F(It2MeHostTest, ConnectRespectsSuppressDialogsParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.suppress_user_dialogs = true; StartHost(std::move(params)); @@ -1006,7 +1012,7 @@ TEST_F(It2MeHostTest, ConnectRespectsSuppressNotificationsParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.suppress_notifications = true; StartHost(std::move(params)); @@ -1016,7 +1022,7 @@ TEST_F(It2MeHostTest, ConnectRespectsTerminateUponInputParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.terminate_upon_input = true; StartHost(std::move(params)); @@ -1031,7 +1037,7 @@ TEST_F(It2MeHostTest, ConnectRespectsMaximumSessionDurationParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.maximum_session_duration = base::Hours(8); StartHost(std::move(params)); @@ -1041,7 +1047,7 @@ TEST_F(It2MeHostTest, ConnectRespectsEnableCurtainingParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.curtain_local_user_session = true; StartHost(std::move(params)); @@ -1050,7 +1056,7 @@ TEST_F(It2MeHostTest, ConnectRespectsAllowRemoteInputParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.allow_remote_input = false; StartHost(std::move(params)); @@ -1059,7 +1065,7 @@ TEST_F(It2MeHostTest, ConnectRespectsAllowClipboardSyncParameter) { ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.allow_clipboard_sync = false; StartHost(std::move(params)); @@ -1077,7 +1083,7 @@ base::Value(true)}}); ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.allow_file_transfer = true; StartHost(std::move(params)); @@ -1089,7 +1095,7 @@ base::Value(false)}}); ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.allow_file_transfer = true; StartHost(std::move(params)); @@ -1110,7 +1116,7 @@ SetPolicies({}); ChromeOsEnterpriseParams params( - GetDefaultEnterpriseParamsWithRequestOrigin()); + GetDefaultEnterpriseParamsForEnterpriseAdmin()); params.allow_file_transfer = true; StartHost(std::move(params)); @@ -1128,7 +1134,7 @@ SetPolicies({{policy::key::kRemoteAccessHostAllowRemoteSupportConnections, base::Value(false)}}); - StartHost(GetDefaultEnterpriseParamsWithRequestOrigin()); + StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin()); ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); ShutdownHost(); @@ -1140,7 +1146,7 @@ SetPolicies({{policy::key::kRemoteAccessHostDomainList, MakeList({"other-domain.com"})}}); - StartHost(GetDefaultEnterpriseParamsWithRequestOrigin()); + StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin()); ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); ShutdownHost(); @@ -1155,7 +1161,7 @@ {{policy::key::kRemoteAccessHostAllowEnterpriseRemoteSupportConnections, base::Value(false)}}); - StartHost(GetDefaultEnterpriseParamsWithRequestOrigin()); + StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin()); ASSERT_EQ(It2MeHostState::kError, last_host_state_); ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_); } @@ -1172,7 +1178,7 @@ } TEST_F(It2MeHostTest, EnterpriseSessionsShouldNotDisconnectOnPolicyChange) { - StartHost(GetDefaultEnterpriseParamsWithRequestOrigin()); + StartHost(GetDefaultEnterpriseParamsForEnterpriseAdmin()); const It2MeHostState initial_state = last_host_state_; ASSERT_EQ(initial_state, It2MeHostState::kReceivedAccessCode); @@ -1190,9 +1196,7 @@ base::Value(false)}, {policy::key::kClassManagementEnabled, base::Value("student")}}); - ChromeOsEnterpriseParams params; - params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement; - StartHost(params); + StartHost(GetDefaultEnterpriseParamsForClassManagement()); ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); } @@ -1201,9 +1205,7 @@ base::Value(false)}, {policy::key::kClassManagementEnabled, base::Value("teacher")}}); - ChromeOsEnterpriseParams params; - params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement; - StartHost(params); + StartHost(GetDefaultEnterpriseParamsForClassManagement()); ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); } @@ -1213,21 +1215,60 @@ SetPolicies( {{policy::key::kClassManagementEnabled, base::Value("disabled")}}); - ChromeOsEnterpriseParams params; - params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement; - StartHost(params); + StartHost(GetDefaultEnterpriseParamsForClassManagement()); ASSERT_EQ(It2MeHostState::kError, last_host_state_); ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_); } TEST_F(It2MeHostTest, EnterpriseClassManagementSessionsFailsWhenClassManagementPolicyUnset) { - ChromeOsEnterpriseParams params; - params.request_origin = ChromeOsEnterpriseRequestOrigin::kClassManagement; - StartHost(params); + StartHost(GetDefaultEnterpriseParamsForClassManagement()); ASSERT_EQ(It2MeHostState::kError, last_host_state_); ASSERT_EQ(ErrorCode::DISALLOWED_BY_POLICY, last_error_code_); } + +TEST_F(It2MeHostTest, + EnterpriseClassManagementSessionsShouldNotCheckHostDomain) { + SetPolicies({{policy::key::kRemoteAccessHostDomainList, + MakeList({"other-domain.com"})}, + {policy::key::kClassManagementEnabled, base::Value("student")}}); + + StartHost(GetDefaultEnterpriseParamsForClassManagement()); + ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); + + ShutdownHost(); + ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); + ASSERT_EQ(ErrorCode::OK, last_error_code_); +} + +TEST_F(It2MeHostTest, + EnterpriseClassManagementSessionsShouldNotCheckClientDomain) { + SetPolicies({{policy::key::kRemoteAccessHostClientDomainList, + MakeList({"other-domain.com"})}, + {policy::key::kClassManagementEnabled, base::Value("student")}}); + + authorized_helper_ = kTestClientUsername; + StartHost(GetDefaultEnterpriseParamsForClassManagement()); + ASSERT_EQ(It2MeHostState::kReceivedAccessCode, last_host_state_); + RunValidationCallback(kTestClientJid); + ASSERT_EQ(ValidationResult::SUCCESS, validation_result_); + ASSERT_EQ(It2MeHostState::kConnecting, last_host_state_); + + ShutdownHost(); + ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); + ASSERT_EQ(ErrorCode::OK, last_error_code_); +} + +TEST_F(It2MeHostTest, + EnterpriseClassManagementSessionsFailWithoutAuthorizedUser) { + SetPolicies({{policy::key::kClassManagementEnabled, base::Value("student")}}); + + StartHost(GetDefaultEnterpriseParamsForClassManagement()); + RunValidationCallback(kTestClientJid); + ASSERT_EQ(ValidationResult::ERROR_UNAUTHORIZED_ACCOUNT, validation_result_); + RunUntilStateChanged(It2MeHostState::kDisconnected); + ASSERT_EQ(It2MeHostState::kDisconnected, last_host_state_); +} #endif } // namespace remoting
diff --git a/sandbox/win/src/filesystem_dispatcher.cc b/sandbox/win/src/filesystem_dispatcher.cc index 0b3479f..2b6a31f 100644 --- a/sandbox/win/src/filesystem_dispatcher.cc +++ b/sandbox/win/src/filesystem_dispatcher.cc
@@ -254,12 +254,11 @@ } EvalResult FilesystemDispatcher::EvalPolicy(IpcTag ipc_tag, - const std::wstring& name, + std::wstring_view name, uint32_t desired_access, bool open_only) { CountedParameterSet<OpenFile> params; - const wchar_t* name_ptr = name.c_str(); - params[OpenFile::NAME] = ParamPickerMake(name_ptr); + params[OpenFile::NAME] = ParamPickerMake(name); params[OpenFile::ACCESS] = ParamPickerMake(desired_access); uint32_t open_only_int = open_only; params[OpenFile::OPENONLY] = ParamPickerMake(open_only_int);
diff --git a/sandbox/win/src/filesystem_dispatcher.h b/sandbox/win/src/filesystem_dispatcher.h index 4600ca7..21ab084 100644 --- a/sandbox/win/src/filesystem_dispatcher.h +++ b/sandbox/win/src/filesystem_dispatcher.h
@@ -8,6 +8,7 @@ #include <stdint.h> #include <string> +#include <string_view> #include "base/memory/raw_ptr.h" #include "sandbox/win/src/crosscall_server.h" @@ -73,7 +74,7 @@ // Evaluate the sandbox policy for the file system call. EvalResult EvalPolicy(IpcTag ipc_tag, - const std::wstring& name, + std::wstring_view name, uint32_t desired_access = 0, bool open_only = true);
diff --git a/sandbox/win/src/filesystem_interception.cc b/sandbox/win/src/filesystem_interception.cc index 88ccb41..70652136 100644 --- a/sandbox/win/src/filesystem_interception.cc +++ b/sandbox/win/src/filesystem_interception.cc
@@ -30,23 +30,20 @@ // - The path looks like a short-name path. // - Whether the details match the policy. bool ShouldAskBroker(IpcTag ipc_tag, - const std::unique_ptr<wchar_t, NtAllocDeleter>& name, - size_t name_len, + std::wstring_view name, uint32_t desired_access = 0, bool open_only = true) { - const wchar_t* name_ptr = name.get(); - if (name_len >= 4 && name_ptr[0] == L'\\' && name_ptr[1] == L'?' && - name_ptr[2] == L'?' && name_ptr[3] == L'\\') { + if (name.size() >= 4 && name[0] == L'\\' && name[1] == L'?' && + name[2] == L'?' && name[3] == L'\\') { return true; } - for (size_t index = 0; index < name_len; ++index) { - if (name_ptr[index] == L'~') - return true; + if (name.find(L'~') != std::wstring_view::npos) { + return true; } CountedParameterSet<OpenFile> params; - params[OpenFile::NAME] = ParamPickerMake(name_ptr); + params[OpenFile::NAME] = ParamPickerMake(name); params[OpenFile::ACCESS] = ParamPickerMake(desired_access); uint32_t open_only_int = open_only; params[OpenFile::OPENONLY] = ParamPickerMake(open_only_int); @@ -106,7 +103,8 @@ if (!NT_SUCCESS(ret) || !name || !name_len) { break; } - if (!ShouldAskBroker(IpcTag::NTCREATEFILE, name, name_len, desired_access, + std::wstring_view name_view(name.get(), name_len); + if (!ShouldAskBroker(IpcTag::NTCREATEFILE, name_view, desired_access, disposition == FILE_OPEN)) { break; } @@ -115,8 +113,7 @@ CrossCallReturn answer = {0}; // The following call must match in the parameters with // FilesystemDispatcher::ProcessNtCreateFile. - ResultCode code = CrossCall(ipc, IpcTag::NTCREATEFILE, - std::wstring_view(name.get(), name_len), + ResultCode code = CrossCall(ipc, IpcTag::NTCREATEFILE, name_view, attributes, desired_access, file_attributes, sharing, disposition, options, &answer); if (SBOX_ALL_OK != code) { @@ -175,16 +172,15 @@ CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes); if (!NT_SUCCESS(ret) || !name || !name_len) break; - if (!ShouldAskBroker(IpcTag::NTOPENFILE, name, name_len, desired_access, - true)) { + std::wstring_view name_view(name.get(), name_len); + if (!ShouldAskBroker(IpcTag::NTOPENFILE, name_view, desired_access, true)) { break; } SharedMemIPCClient ipc(memory); CrossCallReturn answer = {0}; - ResultCode code = CrossCall( - ipc, IpcTag::NTOPENFILE, std::wstring_view(name.get(), name_len), - attributes, desired_access, sharing, options, &answer); + ResultCode code = CrossCall(ipc, IpcTag::NTOPENFILE, name_view, attributes, + desired_access, sharing, options, &answer); if (SBOX_ALL_OK != code) break; @@ -233,15 +229,16 @@ CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes); if (!NT_SUCCESS(ret) || !name || !name_len) break; - if (!ShouldAskBroker(IpcTag::NTQUERYATTRIBUTESFILE, name, name_len)) + std::wstring_view name_view(name.get(), name_len); + if (!ShouldAskBroker(IpcTag::NTQUERYATTRIBUTESFILE, name_view)) { break; + } InOutCountedBuffer file_info(file_attributes, sizeof(FILE_BASIC_INFORMATION)); SharedMemIPCClient ipc(memory); CrossCallReturn answer = {0}; - ResultCode code = CrossCall(ipc, IpcTag::NTQUERYATTRIBUTESFILE, - std::wstring_view(name.get(), name_len), + ResultCode code = CrossCall(ipc, IpcTag::NTQUERYATTRIBUTESFILE, name_view, attributes, file_info, &answer); if (SBOX_ALL_OK != code) @@ -284,16 +281,17 @@ CopyNameAndAttributes(object_attributes, &name, &name_len, &attributes); if (!NT_SUCCESS(ret) || !name || !name_len) break; - if (!ShouldAskBroker(IpcTag::NTQUERYFULLATTRIBUTESFILE, name, name_len)) + std::wstring_view name_view(name.get(), name_len); + if (!ShouldAskBroker(IpcTag::NTQUERYFULLATTRIBUTESFILE, name_view)) { break; + } InOutCountedBuffer file_info(file_attributes, sizeof(FILE_NETWORK_OPEN_INFORMATION)); SharedMemIPCClient ipc(memory); CrossCallReturn answer = {0}; ResultCode code = CrossCall(ipc, IpcTag::NTQUERYFULLATTRIBUTESFILE, - std::wstring_view(name.get(), name_len), - attributes, file_info, &answer); + name_view, attributes, file_info, &answer); if (SBOX_ALL_OK != code) break; @@ -356,8 +354,10 @@ NTSTATUS ret = CopyNameAndAttributes(&object_attributes, &name, &name_len); if (!NT_SUCCESS(ret) || !name || !name_len) break; - if (!ShouldAskBroker(IpcTag::NTSETINFO_RENAME, name, name_len)) + std::wstring_view name_view(name.get(), name_len); + if (!ShouldAskBroker(IpcTag::NTSETINFO_RENAME, name_view)) { break; + } InOutCountedBuffer io_status_buffer(io_status, sizeof(IO_STATUS_BLOCK)); // This is actually not an InOut buffer, only In, but using InOut facility
diff --git a/sandbox/win/src/policy_engine_opcodes.cc b/sandbox/win/src/policy_engine_opcodes.cc index 78f1e29a..a2a3efdf 100644 --- a/sandbox/win/src/policy_engine_opcodes.cc +++ b/sandbox/win/src/policy_engine_opcodes.cc
@@ -17,25 +17,25 @@ #include "sandbox/win/src/sandbox_nt_util.h" #include "sandbox/win/src/sandbox_types.h" -namespace { -const unsigned short kMaxUniStrSize = 0xfffc / sizeof(wchar_t); +namespace sandbox { -bool InitStringUnicode(const wchar_t* source, - size_t length, - UNICODE_STRING* ustring) { - if (length > kMaxUniStrSize) { - return false; +namespace { + +// Match strings case insensitively. +// Returns `EVAL_TRUE` if `match_str` is a prefix of `source_str` or the +// two strings are equal. +EvalResult MatchStrings(std::wstring_view match_str, + std::wstring_view source_str) { + std::optional<bool> result = + EqualUnicodeString(match_str, source_str.substr(0, match_str.size())); + if (!result) { + return EVAL_ERROR; } - ustring->Buffer = const_cast<wchar_t*>(source); - ustring->Length = static_cast<USHORT>(length) * sizeof(wchar_t); - ustring->MaximumLength = source ? ustring->Length + sizeof(wchar_t) : 0; - return true; + return *result ? EVAL_TRUE : EVAL_FALSE; } } // namespace -namespace sandbox { - // Note: The opcodes are implemented as functions (as opposed to classes derived // from PolicyOpcode) because you should not add more member variables to the // PolicyOpcode class since it would cause object slicing on the target. So to @@ -195,25 +195,22 @@ // Argument 3 is the string matching options (true if last token, 0 otherwise). PolicyOpcode* OpcodeFactory::MakeOpWStringMatch(uint8_t selected_param, - const wchar_t* match_str, + std::wstring_view match_str, int start_position, uint32_t options, bool last_token) { - if (!match_str) + if (match_str.empty()) { return nullptr; - if ('\0' == match_str[0]) - return nullptr; - - size_t length = wcslen(match_str); + } PolicyOpcode* opcode = MakeBase(OP_WSTRING_MATCH, options, selected_param); if (!opcode) return nullptr; - ptrdiff_t delta_str = AllocRelative(opcode, match_str, length + 1); + ptrdiff_t delta_str = AllocRelative(opcode, match_str); if (0 == delta_str) return nullptr; opcode->SetArgument(0, delta_str); - opcode->SetArgument(1, length); + opcode->SetArgument(1, match_str.size()); opcode->SetArgument(2, start_position); opcode->SetArgument(3, last_token ? 1 : 0); return opcode; @@ -226,13 +223,16 @@ if (!context) { return EVAL_ERROR; } - const wchar_t* source_str = nullptr; - if (!param->Get(&source_str)) + + std::wstring_view source_str; + if (!param->Get(&source_str)) { return EVAL_ERROR; - // Assume we won't want to match when a nullptr parameter is passed to the - // hooked function. - if (!source_str) + } + + // Assume we won't want to match when an empty string is passed. + if (source_str.empty()) { return EVAL_FALSE; + } int start_position = 0; size_t match_len = 0; @@ -241,18 +241,18 @@ opcode->GetArgument(2, &start_position); opcode->GetArgument(3, &last_token); - const wchar_t* match_str = opcode->GetRelativeString(0); + std::wstring_view match_str(opcode->GetRelativeString(0), match_len); + // Advance the source string to the last successfully evaluated position // according to the match context. - source_str = &source_str[context->position]; - size_t source_len = GetNtExports()->wcslen(source_str); - - if (0 == source_len) { + source_str.remove_prefix(context->position); + if (source_str.empty()) { // If we reached the end of the source string there is nothing we can // match against. return EVAL_FALSE; } - if (match_len > source_len) { + + if (match_str.size() > source_str.size()) { // There can't be a positive match when the target string is bigger than // the source string return EVAL_FALSE; @@ -262,60 +262,44 @@ // Case 1. We skip N characters and compare once. // Case 2: We skip to the end and compare once. // Case 3: We match the first substring (if we find any). + EvalResult result = EVAL_FALSE; + size_t start_offset = 0; if (start_position >= 0) { - size_t start_offset = static_cast<size_t>(start_position); + start_offset = static_cast<size_t>(start_position); if (kSeekToEnd == start_position) { - start_offset = static_cast<size_t>(source_len - match_len); + start_offset = static_cast<size_t>(source_str.size() - match_str.size()); } else if (last_token) { // A sub-case of case 3 is that the final token needs a full match. - if ((match_len + start_offset) != source_len) { + if ((match_str.size() + start_offset) != source_str.size()) { return EVAL_FALSE; } } - // Advance start_pos characters. Warning! this does not consider + // Advance start_offset characters. Warning! this does not consider // utf16 encodings (surrogate pairs) or other Unicode 'features'. - source_str += start_offset; + source_str.remove_prefix(start_offset); // Since we skipped, lets reevaluate just the lengths again. - if ((match_len + start_offset) > source_len) { + if (match_str.size() > source_str.size()) { return EVAL_FALSE; } - UNICODE_STRING match_ustr; - UNICODE_STRING source_ustr; - if (!InitStringUnicode(match_str, match_len, &match_ustr) || - !InitStringUnicode(source_str, match_len, &source_ustr)) - return EVAL_ERROR; - - if (0 == GetNtExports()->RtlCompareUnicodeString(&match_ustr, &source_ustr, - TRUE)) { - // Match! update the match context. - context->position += start_offset + match_len; - return EVAL_TRUE; - } else { - return EVAL_FALSE; - } + result = MatchStrings(match_str, source_str); } else if (start_position < 0) { - UNICODE_STRING match_ustr; - UNICODE_STRING source_ustr; - if (!InitStringUnicode(match_str, match_len, &match_ustr) || - !InitStringUnicode(source_str, match_len, &source_ustr)) - return EVAL_ERROR; - do { - if (0 == GetNtExports()->RtlCompareUnicodeString(&match_ustr, - &source_ustr, TRUE)) { - // Match! update the match context. - context->position += - static_cast<size_t>(source_ustr.Buffer - source_str) + match_len; - return EVAL_TRUE; + result = MatchStrings(match_str, source_str); + if (result != EVAL_FALSE) { + break; } - ++source_ustr.Buffer; - --source_len; - } while (source_len >= match_len); + source_str.remove_prefix(1); + start_offset++; + } while (source_str.size() >= match_str.size()); } - return EVAL_FALSE; + if (result == EVAL_TRUE) { + // Match! update the match context. + context->position += start_offset + match_str.size(); + } + return result; } ////////////////////////////////////////////////////////////////////////////// @@ -348,10 +332,8 @@ return opcode; } -ptrdiff_t OpcodeFactory::AllocRelative(void* start, - const wchar_t* str, - size_t length) { - size_t bytes = length * sizeof(wchar_t); +ptrdiff_t OpcodeFactory::AllocRelative(void* start, std::wstring_view str) { + size_t bytes = str.size() * sizeof(wchar_t); if (memory_size() < bytes) return 0; memory_bottom_ -= bytes; @@ -359,7 +341,7 @@ // TODO(cpu) replace this for something better. ::DebugBreak(); } - memcpy(memory_bottom_, str, bytes); + memcpy(memory_bottom_, str.data(), bytes); ptrdiff_t delta = memory_bottom_ - reinterpret_cast<char*>(start); return delta; }
diff --git a/sandbox/win/src/policy_engine_opcodes.h b/sandbox/win/src/policy_engine_opcodes.h index 81e435b..cd9a819 100644 --- a/sandbox/win/src/policy_engine_opcodes.h +++ b/sandbox/win/src/policy_engine_opcodes.h
@@ -322,7 +322,7 @@ // current implementation. // All comparisons are case-insensitive. PolicyOpcode* MakeOpWStringMatch(uint8_t selected_param, - const wchar_t* match_str, + std::wstring_view match_str, int start_position, uint32_t options, bool final_token); @@ -343,9 +343,9 @@ uint32_t options, uint8_t selected_param); - // Allocates (and copies) a string (of size length) inside the buffer and - // returns the displacement with respect to start. - ptrdiff_t AllocRelative(void* start, const wchar_t* str, size_t length); + // Allocates (and copies) a string inside the buffer and returns the + // displacement with respect to start. + ptrdiff_t AllocRelative(void* start, std::wstring_view str); // Points to the lowest currently available address of the memory // used to make the opcodes. This pointer increments as opcodes are made.
diff --git a/sandbox/win/src/policy_engine_params.h b/sandbox/win/src/policy_engine_params.h index 6714189..bc23d9a 100644 --- a/sandbox/win/src/policy_engine_params.h +++ b/sandbox/win/src/policy_engine_params.h
@@ -12,6 +12,8 @@ #include <stdint.h> +#include <string_view> + #include "base/memory/raw_ptr.h" #include "sandbox/win/src/internal_types.h" #include "sandbox/win/src/nt_internals.h" @@ -82,12 +84,12 @@ return true; } - // Retrieve the stored parameter. If the type does not match wchar_t* fail. - bool Get(const wchar_t** destination) const { + // Retrieve the stored parameter. If the type does not match the call fails. + bool Get(std::wstring_view* destination) const { if (real_type_ != WCHAR_TYPE) { return false; } - *destination = Void2TypePointerCopy<const wchar_t*>(); + *destination = Void2TypePointerCopy<std::wstring_view>(); return true; } @@ -142,14 +144,7 @@ }; template <> -class ParameterSetEx<wchar_t*> : public ParameterSet { - public: - explicit ParameterSetEx(const void* address) - : ParameterSet(WCHAR_TYPE, address) {} -}; - -template <> -class ParameterSetEx<wchar_t const*> : public ParameterSet { +class ParameterSetEx<std::wstring_view> : public ParameterSet { public: explicit ParameterSetEx(const void* address) : ParameterSet(WCHAR_TYPE, address) {}
diff --git a/sandbox/win/src/policy_engine_unittest.cc b/sandbox/win/src/policy_engine_unittest.cc index 696fb403..6bb612d 100644 --- a/sandbox/win/src/policy_engine_unittest.cc +++ b/sandbox/win/src/policy_engine_unittest.cc
@@ -57,7 +57,8 @@ opcode_maker.MakeOpAction(FAKE_ACCESS_DENIED, kPolNone); policy->opcode_count = 7; - const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; + std::wstring_view filename = + L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; uint32_t creation_mode = OPEN_EXISTING; uint32_t flags = FILE_ATTRIBUTE_NORMAL; void* security_descriptor = nullptr; @@ -94,7 +95,7 @@ EXPECT_EQ(FAKE_ACCESS_DENIED, pol_ev.GetAction()); // Cope ok with nullptr string fields. - filename = nullptr; + filename = std::wstring_view(); pr = pol_ev.Evaluate(kShortEval, eval_params, _countof(eval_params)); EXPECT_EQ(NO_POLICY_MATCH, pr);
diff --git a/sandbox/win/src/policy_low_level_unittest.cc b/sandbox/win/src/policy_low_level_unittest.cc index f8976e46..844e5fd 100644 --- a/sandbox/win/src/policy_low_level_unittest.cc +++ b/sandbox/win/src/policy_low_level_unittest.cc
@@ -62,7 +62,7 @@ EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = L"Z:\\Directory\\domo.txt"; + std::wstring_view filename = L"Z:\\Directory\\domo.txt"; POLPARAMS_BEGIN(eval_params) POLPARAM(filename) // Argument 0 @@ -93,7 +93,7 @@ EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = nullptr; + std::wstring_view filename; POLPARAMS_BEGIN(eval_params) POLPARAM(filename) // Argument 0 POLPARAMS_END; @@ -129,7 +129,7 @@ EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = nullptr; + std::wstring_view filename; POLPARAMS_BEGIN(eval_params) POLPARAM(filename) // Argument 0 POLPARAMS_END; @@ -160,7 +160,7 @@ EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = nullptr; + std::wstring_view filename; POLPARAMS_BEGIN(eval_params) POLPARAM(filename) // Argument 0 POLPARAMS_END; @@ -197,7 +197,7 @@ EXPECT_TRUE(policyGen.AddRule(kFakeService, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = nullptr; + std::wstring_view filename; uint32_t access = 0; POLPARAMS_BEGIN(eval_params) POLPARAM(filename) // Argument 0 @@ -247,7 +247,8 @@ EXPECT_TRUE(policyGen.AddRule(kNtFakeCreateFile, &pr)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* filename = L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; + std::wstring_view filename = + L"c:\\Documents and Settings\\Microsoft\\BLAH.txt"; uint32_t creation_mode = OPEN_EXISTING; uint32_t flags = FILE_ATTRIBUTE_NORMAL; void* security_descriptor = nullptr; @@ -402,7 +403,7 @@ // Test the policy evaluation. - const wchar_t* filename = L""; + std::wstring_view filename = L""; uint32_t creation_mode = OPEN_EXISTING; uint32_t flags = FILE_ATTRIBUTE_NORMAL; void* security_descriptor = nullptr; @@ -494,7 +495,7 @@ EXPECT_TRUE(policyGen.AddRule(IpcTag::PING2, &pr_copy)); EXPECT_TRUE(policyGen.Done()); - const wchar_t* name = nullptr; + std::wstring_view name; POLPARAMS_BEGIN(eval_params) POLPARAM(name) POLPARAMS_END; @@ -552,7 +553,7 @@ policy->entry[static_cast<size_t>(IpcTag::PING2)]->opcode_count); // Confirm the rules work as before. - const wchar_t* name = nullptr; + std::wstring_view name; POLPARAMS_BEGIN(eval_params) POLPARAM(name) POLPARAMS_END;
diff --git a/sandbox/win/src/policy_opcodes_unittest.cc b/sandbox/win/src/policy_opcodes_unittest.cc index 564f2f6..507091a 100644 --- a/sandbox/win/src/policy_opcodes_unittest.cc +++ b/sandbox/win/src/policy_opcodes_unittest.cc
@@ -41,11 +41,11 @@ EXPECT_EQ(number, result2); // Test that we can store and retrieve a string: - const wchar_t* txt = L"S231L"; + std::wstring_view txt = L"S231L"; ParameterSet pset4 = ParamPickerMake(txt); - const wchar_t* result3 = nullptr; + std::wstring_view result3; EXPECT_TRUE(pset4.Get(&result3)); - EXPECT_EQ(0, UNSAFE_TODO(wcscmp(txt, result3))); + EXPECT_EQ(txt, result3); } TEST(PolicyEngineTest, OpcodeConstraints) { @@ -132,15 +132,16 @@ // supplied buffer. It should only be able to make 'count' opcodes. // The difference with the previous test is that this opcodes allocate // the string 'txt2' inside the same buffer. - const wchar_t* txt1 = L"1234"; - const wchar_t txt2[] = L"123"; + std::wstring_view txt1 = L"1234"; + std::wstring_view txt2 = L"123"; ParameterSet ppb1 = ParamPickerMake(txt1); MatchContext mc1; char memory[kOpcodeMemory]; OpcodeFactory opcode_maker(memory, sizeof(memory)); - size_t count = sizeof(memory) / (sizeof(PolicyOpcode) + sizeof(txt2)); + size_t count = + sizeof(memory) / (sizeof(PolicyOpcode) + txt2.size() * sizeof(wchar_t)); // Test that it does not overrun the buffer. for (size_t ix = 0; ix != count; ++ix) { @@ -157,7 +158,7 @@ } TEST(PolicyEngineTest, IntegerOpcodes) { - const wchar_t* txt = L"abcdef"; + std::wstring_view txt = L"abcdef"; uint32_t num1 = 42; uint32_t num2 = 113377; @@ -204,12 +205,12 @@ } TEST(PolicyEngineTest, WCharOpcodes1) { - const wchar_t* txt1 = L"the quick fox jumps over the lazy dog"; - const wchar_t txt2[] = L"the quick"; - const wchar_t txt3[] = L" fox jumps"; - const wchar_t txt4[] = L"the lazy dog"; - const wchar_t txt5[] = L"jumps over"; - const wchar_t txt6[] = L"g"; + std::wstring_view txt1 = L"the quick fox jumps over the lazy dog"; + std::wstring_view txt2 = L"the quick"; + std::wstring_view txt3 = L" fox jumps"; + std::wstring_view txt4 = L"the lazy dog"; + std::wstring_view txt5 = L"jumps over"; + std::wstring_view txt6 = L"g"; ParameterSet pp_tc1 = ParamPickerMake(txt1); char memory[kOpcodeMemory]; @@ -223,11 +224,11 @@ // and the match context should be updated. MatchContext mc1; EXPECT_EQ(EVAL_TRUE, op1->Evaluate(&pp_tc1, 1, &mc1)); - EXPECT_TRUE(_countof(txt2) == mc1.position + 1); + EXPECT_EQ(txt2.size(), mc1.position); // Matching again should fail and the context should be unmodified. EXPECT_EQ(EVAL_FALSE, op1->Evaluate(&pp_tc1, 1, &mc1)); - EXPECT_TRUE(_countof(txt2) == mc1.position + 1); + EXPECT_EQ(txt2.size(), mc1.position); // Using the same match context we should continue where we left // in the previous successful match, @@ -235,7 +236,7 @@ opcode_maker.MakeOpWStringMatch(0, txt3, 0, kPolNone, false); ASSERT_NE(nullptr, op3); EXPECT_EQ(EVAL_TRUE, op3->Evaluate(&pp_tc1, 1, &mc1)); - EXPECT_TRUE(_countof(txt3) + _countof(txt2) == mc1.position + 2); + EXPECT_EQ(txt3.size() + txt2.size(), mc1.position); // We now keep on matching but now we skip 6 characters which means // we skip the string ' over '. And we zero the match context. This is
diff --git a/sandbox/win/src/sandbox_nt_util.cc b/sandbox/win/src/sandbox_nt_util.cc index 26158cc..8b3c8335 100644 --- a/sandbox/win/src/sandbox_nt_util.cc +++ b/sandbox/win/src/sandbox_nt_util.cc
@@ -13,12 +13,13 @@ #include <stddef.h> #include <stdint.h> +#include <optional> #include <string> -#include <optional> #include "base/compiler_specific.h" #include "base/containers/span.h" #include "base/win/pe_image.h" +#include "base/win/win_util.h" #include "sandbox/win/src/internal_types.h" #include "sandbox/win/src/nt_internals.h" #include "sandbox/win/src/sandbox_factory.h" @@ -630,6 +631,19 @@ return out_string; } +std::optional<bool> EqualUnicodeString(std::wstring_view left, + std::wstring_view right) { + UNICODE_STRING left_ustr; + UNICODE_STRING right_ustr; + if (!base::win::ViewToUnicodeString(left, left_ustr) || + !base::win::ViewToUnicodeString(right, right_ustr)) { + return std::nullopt; + } + + return GetNtExports()->RtlCompareUnicodeString(&left_ustr, &right_ustr, + TRUE) == 0; +} + NTSTATUS AutoProtectMemory::ChangeProtection(void* address, size_t bytes, ULONG protect) {
diff --git a/sandbox/win/src/sandbox_nt_util.h b/sandbox/win/src/sandbox_nt_util.h index 11c3d99..65a5152 100644 --- a/sandbox/win/src/sandbox_nt_util.h +++ b/sandbox/win/src/sandbox_nt_util.h
@@ -16,6 +16,7 @@ #include <memory> #include <optional> +#include <string_view> #include "base/containers/span.h" #include "base/memory/raw_ptr_exclusion.h" @@ -190,6 +191,14 @@ // Converts an ansi string to an UNICODE_STRING. UNICODE_STRING* AnsiToUnicode(const char* string); +// Use the RtlCompareUnicodeString API to compares two strings for equality. The +// comparison always ignores case. +// Returns true if equal. Returns std::nullopt if either string is too large to +// be represented as a UNICODE_STRING. This has the advantage of working inside +// function hooks where calling the standard library could be impossible. +std::optional<bool> EqualUnicodeString(std::wstring_view left, + std::wstring_view right); + // Provides a simple way to temporarily change the protection of a memory page. class AutoProtectMemory { public:
diff --git a/sandbox/win/src/sandbox_nt_util_unittest.cc b/sandbox/win/src/sandbox_nt_util_unittest.cc index 91b275a89..7f948c2 100644 --- a/sandbox/win/src/sandbox_nt_util_unittest.cc +++ b/sandbox/win/src/sandbox_nt_util_unittest.cc
@@ -344,5 +344,20 @@ reinterpret_cast<LPVOID>(::GetCurrentThreadId())); } +TEST(SandboxNtUtil, EqualUnicodeString) { + EXPECT_TRUE(*EqualUnicodeString({}, {})); + EXPECT_TRUE(*EqualUnicodeString(L"", L"")); + EXPECT_TRUE(*EqualUnicodeString(L"ABC", L"ABC")); + EXPECT_TRUE(*EqualUnicodeString(L"ABC", L"abc")); + EXPECT_FALSE(*EqualUnicodeString(L"ABC", L"XYZ")); + EXPECT_FALSE(*EqualUnicodeString(L"", L"ABC")); + EXPECT_FALSE(*EqualUnicodeString(L"ABC", L"")); + std::wstring long_str(UINT16_MAX / sizeof(WCHAR), L'A'); + EXPECT_TRUE(*EqualUnicodeString(long_str, long_str)); + long_str += L"A"; + EXPECT_FALSE(EqualUnicodeString(long_str, L"ABC")); + EXPECT_FALSE(EqualUnicodeString(L"ABC", long_str)); +} + } // namespace } // namespace sandbox
diff --git a/sandbox/win/src/signed_dispatcher.cc b/sandbox/win/src/signed_dispatcher.cc index b934513..7efc7bf4 100644 --- a/sandbox/win/src/signed_dispatcher.cc +++ b/sandbox/win/src/signed_dispatcher.cc
@@ -59,7 +59,7 @@ auto path = GetPathFromHandle(local_handle.get()); if (!path) return false; - const wchar_t* module_name = path->c_str(); + std::wstring_view module_name(*path); CountedParameterSet<NameBased> params; params[NameBased::NAME] = ParamPickerMake(module_name);
diff --git a/sandbox/win/src/signed_interception.cc b/sandbox/win/src/signed_interception.cc index 05581224d..e11bb1af 100644 --- a/sandbox/win/src/signed_interception.cc +++ b/sandbox/win/src/signed_interception.cc
@@ -7,6 +7,7 @@ #include <ntstatus.h> #include <stdint.h> +#include "base/win/win_util.h" #include "sandbox/win/src/crosscall_client.h" #include "sandbox/win/src/ipc_tags.h" #include "sandbox/win/src/policy_params.h" @@ -69,7 +70,9 @@ } CountedParameterSet<NameBased> params; - params[NameBased::NAME] = ParamPickerMake(path->ObjectName.Buffer); + std::wstring_view object_name = + base::win::UnicodeStringToView(path->ObjectName); + params[NameBased::NAME] = ParamPickerMake(object_name); // Check if this will be sent to the broker. if (!QueryBroker(IpcTag::NTCREATESECTION, params.GetBase()))
diff --git a/third_party/androidx/build.gradle b/third_party/androidx/build.gradle index ba14677..6f8197b 100644 --- a/third_party/androidx/build.gradle +++ b/third_party/androidx/build.gradle
@@ -314,7 +314,7 @@ google() maven { // This URL is generated by the fetch_all_androidx.py script. - url 'https://androidx.dev/snapshots/builds/14176386/artifacts/repository' + url 'https://androidx.dev/snapshots/builds/14178711/artifacts/repository' } mavenCentral() }
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium index 0cb740b3..39df17a 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Short Name: activity -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity/1.12.0-SNAPSHOT/activity-1.12.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity/1.12.0-SNAPSHOT/activity-1.12.0-20250927.084818-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium index acf26bd..d5972e5 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity_compose/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Compose Short Name: activity-compose -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity-compose/1.12.0-SNAPSHOT/activity-compose-1.12.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity-compose/1.12.0-SNAPSHOT/activity-compose-1.12.0-20250927.084818-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium index 64f9770..f79f8cf 100644 --- a/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_activity_activity_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Activity Kotlin Extensions Short Name: activity-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/activity/activity-ktx/1.12.0-SNAPSHOT/activity-ktx-1.12.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/activity/activity-ktx/1.12.0-SNAPSHOT/activity-ktx-1.12.0-20250927.084818-1.aar Version: 1.12.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium index 35bdd64..120657c1 100644 --- a/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium +++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_experimental/README.chromium
@@ -1,6 +1,6 @@ Name: Experimental annotation Short Name: annotation-experimental -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/annotation/annotation-experimental/1.6.0-SNAPSHOT/annotation-experimental-1.6.0-20250927.084818-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium index 243d186d..f15dd87d 100644 --- a/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_annotation_annotation_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: Annotation Short Name: annotation-jvm -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/annotation/annotation-jvm/1.10.0-SNAPSHOT/annotation-jvm-1.10.0-20250927.084818-1.jar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium index 19bb201b..5d0b71ad 100644 --- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat/README.chromium
@@ -1,6 +1,6 @@ Name: AppCompat Short Name: appcompat -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appcompat/appcompat/1.8.0-SNAPSHOT/appcompat-1.8.0-20250927.084818-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium index ffc525e..f88fcf211 100644 --- a/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appcompat_appcompat_resources/README.chromium
@@ -1,6 +1,6 @@ Name: AppCompat Resources Short Name: appcompat-resources -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appcompat/appcompat-resources/1.8.0-SNAPSHOT/appcompat-resources-1.8.0-20250927.084818-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium index 0474d97..38fc54fb 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Short Name: appsearch -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch/1.2.0-SNAPSHOT/appsearch-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium index 65d5bc57..fecb67ee 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_builtin_types/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Builtin Types Short Name: appsearch-builtin-types -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch-builtin-types/1.2.0-SNAPSHOT/appsearch-builtin-types-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium index 839d5ad..6c85ef7 100644 --- a/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium +++ b/third_party/androidx/committed/libs/androidx_appsearch_appsearch_platform_storage/README.chromium
@@ -1,6 +1,6 @@ Name: AppSearch Platform Storage Short Name: appsearch-platform-storage -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/appsearch/appsearch-platform-storage/1.2.0-SNAPSHOT/appsearch-platform-storage-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium index 9b1608da..8e7872f3 100644 --- a/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium +++ b/third_party/androidx/committed/libs/androidx_arch_core_core_common/README.chromium
@@ -1,6 +1,6 @@ Name: Arch-Common Short Name: core-common -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/arch/core/core-common/2.3.0-SNAPSHOT/core-common-2.3.0-20250927.084818-1.jar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium index cf92238..8a8b5f2b 100644 --- a/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium +++ b/third_party/androidx/committed/libs/androidx_arch_core_core_runtime/README.chromium
@@ -1,6 +1,6 @@ Name: Arch-Runtime Short Name: core-runtime -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/arch/core/core-runtime/2.3.0-SNAPSHOT/core-runtime-2.3.0-20250927.084818-1.aar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium index 7f26682..6482cad 100644 --- a/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium +++ b/third_party/androidx/committed/libs/androidx_autofill_autofill/README.chromium
@@ -1,6 +1,6 @@ Name: Autofill Short Name: autofill -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/autofill/autofill/1.4.0-SNAPSHOT/autofill-1.4.0-20250927.084818-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium index b2d8cb5..99f06ad 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_common/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Common Short Name: benchmark-common -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-common/1.5.0-SNAPSHOT/benchmark-common-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium index 44cc53b..66f06cf 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_junit4/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - JUnit4 Short Name: benchmark-junit4 -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-junit4/1.5.0-SNAPSHOT/benchmark-junit4-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium index db2a732..a4e0c9e 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Macrobenchmark Short Name: benchmark-macro -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-macro/1.5.0-SNAPSHOT/benchmark-macro-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium index f43739c..cf8b512c 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_macro_junit4/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark - Macrobenchmark JUnit4 Short Name: benchmark-macro-junit4 -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-macro-junit4/1.5.0-SNAPSHOT/benchmark-macro-junit4-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium index 4f7a2b4..9526bf1eb 100644 --- a/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_benchmark_benchmark_traceprocessor_android/README.chromium
@@ -1,6 +1,6 @@ Name: Benchmark TraceProcessor Short Name: benchmark-traceprocessor-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/benchmark/benchmark-traceprocessor-android/1.5.0-SNAPSHOT/benchmark-traceprocessor-android-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium index af026d9..c511a67f 100644 --- a/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium +++ b/third_party/androidx/committed/libs/androidx_biometric_biometric/README.chromium
@@ -1,6 +1,6 @@ Name: Biometric Short Name: biometric -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/biometric/biometric/1.4.0-SNAPSHOT/biometric-1.4.0-20250927.084818-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium index 1fdfd21c..ac553d2b 100644 --- a/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium +++ b/third_party/androidx/committed/libs/androidx_browser_browser/README.chromium
@@ -1,6 +1,6 @@ Name: Browser Short Name: browser -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/browser/browser/1.10.0-SNAPSHOT/browser-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium index c6b4539..b62b3aa6 100644 --- a/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium +++ b/third_party/androidx/committed/libs/androidx_cardview_cardview/README.chromium
@@ -1,6 +1,6 @@ Name: CardView Short Name: cardview -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/cardview/cardview/1.1.0-SNAPSHOT/cardview-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium index cab46536..3704bbf 100644 --- a/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_collection_collection_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: collections Short Name: collection-jvm -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/collection/collection-jvm/1.6.0-SNAPSHOT/collection-jvm-1.6.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/collection/collection-jvm/1.6.0-SNAPSHOT/collection-jvm-1.6.0-20250927.084818-1.jar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium index 5a4c8c3..c1d62523 100644 --- a/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_collection_collection_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Collections Kotlin Extensions Short Name: collection-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/collection/collection-ktx/1.6.0-SNAPSHOT/collection-ktx-1.6.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/collection/collection-ktx/1.6.0-SNAPSHOT/collection-ktx-1.6.0-20250927.084818-1.jar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium index 6b98ece..91d20a6 100644 --- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Animation Short Name: animation-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/animation/animation-android/1.10.0-SNAPSHOT/animation-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/animation/animation-android/1.10.0-SNAPSHOT/animation-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium index be8978c6..5d7135d 100644 --- a/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_animation_animation_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Animation Core Short Name: animation-core-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/animation/animation-core-android/1.10.0-SNAPSHOT/animation-core-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/animation/animation-core-android/1.10.0-SNAPSHOT/animation-core-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium index fe7d1a9e..e87db0b 100644 --- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Foundation Short Name: foundation-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/foundation/foundation-android/1.10.0-SNAPSHOT/foundation-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/foundation/foundation-android/1.10.0-SNAPSHOT/foundation-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium index f437480..6b9c275 100644 --- a/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_foundation_foundation_layout_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Layouts Short Name: foundation-layout-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.10.0-SNAPSHOT/foundation-layout-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/foundation/foundation-layout-android/1.10.0-SNAPSHOT/foundation-layout-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium index 52139af..8c72cdc 100644 --- a/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_material3_material3_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Material3 Components Short Name: material3-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/material3/material3-android/1.5.0-SNAPSHOT/material3-android-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium index d0c2dde..25a7668 100644 --- a/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_material_material_ripple_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Material Ripple Short Name: material-ripple-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/material/material-ripple-android/1.10.0-SNAPSHOT/material-ripple-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/material/material-ripple-android/1.10.0-SNAPSHOT/material-ripple-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium index 6685b53..fb09d83 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Short Name: runtime-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-android/1.10.0-SNAPSHOT/runtime-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-android/1.10.0-SNAPSHOT/runtime-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium index bdbbb8ea..72d71f82 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_annotation_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Annotation Short Name: runtime-annotation-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.10.0-SNAPSHOT/runtime-annotation-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-annotation-android/1.10.0-SNAPSHOT/runtime-annotation-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium index b653a90..3eb58d90 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_retain_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Runtime Retain Short Name: runtime-retain-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.10.0-SNAPSHOT/runtime-retain-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-retain-android/1.10.0-SNAPSHOT/runtime-retain-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium index 1d2fb78..ba2e494 100644 --- a/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_runtime_runtime_saveable_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Saveable Short Name: runtime-saveable-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.10.0-SNAPSHOT/runtime-saveable-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/runtime/runtime-saveable-android/1.10.0-SNAPSHOT/runtime-saveable-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium index 84421b3..0884557 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose UI Short Name: ui-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-android/1.10.0-SNAPSHOT/ui-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-android/1.10.0-SNAPSHOT/ui-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium index 8d36a795..9ca16f0d 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_geometry_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Geometry Short Name: ui-geometry-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.10.0-SNAPSHOT/ui-geometry-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-geometry-android/1.10.0-SNAPSHOT/ui-geometry-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium index cc9573a7..0382592 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_graphics_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Graphics Short Name: ui-graphics-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.10.0-SNAPSHOT/ui-graphics-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-graphics-android/1.10.0-SNAPSHOT/ui-graphics-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium index 02caea8c..f7e19a81 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing Short Name: ui-test-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-android/1.10.0-SNAPSHOT/ui-test-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-android/1.10.0-SNAPSHOT/ui-test-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium index e591faa..bfeb361 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_junit4_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing for JUnit4 Short Name: ui-test-junit4-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.10.0-SNAPSHOT/ui-test-junit4-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-junit4-android/1.10.0-SNAPSHOT/ui-test-junit4-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium index ba2d28ff..848f1ff 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_test_manifest/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Testing manifest dependency Short Name: ui-test-manifest -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.10.0-SNAPSHOT/ui-test-manifest-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-test-manifest/1.10.0-SNAPSHOT/ui-test-manifest-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium index 72df54a4..239e7e9 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose UI Text Short Name: ui-text-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-text-android/1.10.0-SNAPSHOT/ui-text-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-text-android/1.10.0-SNAPSHOT/ui-text-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium index 73e9465..6798003 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_text_google_fonts/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Google Fonts integration Short Name: ui-text-google-fonts -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.10.0-SNAPSHOT/ui-text-google-fonts-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-text-google-fonts/1.10.0-SNAPSHOT/ui-text-google-fonts-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium index 7d092ccd..b057339 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_unit_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Unit Short Name: ui-unit-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-unit-android/1.10.0-SNAPSHOT/ui-unit-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-unit-android/1.10.0-SNAPSHOT/ui-unit-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium index 3bdc03b..317049e2 100644 --- a/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_compose_ui_ui_util_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Util Short Name: ui-util-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/compose/ui/ui-util-android/1.10.0-SNAPSHOT/ui-util-android-1.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/compose/ui/ui-util-android/1.10.0-SNAPSHOT/ui-util-android-1.10.0-20250927.084818-1.aar Version: 1.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium index 28d7ea4..6d62738 100644 --- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout/README.chromium
@@ -1,6 +1,6 @@ Name: ConstraintLayout Short Name: constraintlayout -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/constraintlayout/constraintlayout/2.3.0-SNAPSHOT/constraintlayout-2.3.0-20250927.084818-1.aar Version: 2.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium index 467ba93..bd3b0a98 100644 --- a/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_constraintlayout_constraintlayout_core/README.chromium
@@ -1,6 +1,6 @@ Name: ConstraintLayout Core Short Name: constraintlayout-core -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/constraintlayout/constraintlayout-core/1.2.0-SNAPSHOT/constraintlayout-core-1.2.0-20250927.084818-1.jar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core/README.chromium b/third_party/androidx/committed/libs/androidx_core_core/README.chromium index 92383ec..af8ea9a2 100644 --- a/third_party/androidx/committed/libs/androidx_core_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core/README.chromium
@@ -1,6 +1,6 @@ Name: Core Short Name: core -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core/1.18.0-SNAPSHOT/core-1.18.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core/1.18.0-SNAPSHOT/core-1.18.0-20250927.084818-1.aar Version: 1.18.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium index 077aa1c..54f267e 100644 --- a/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Core Kotlin Extensions Short Name: core-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core-ktx/1.18.0-SNAPSHOT/core-ktx-1.18.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core-ktx/1.18.0-SNAPSHOT/core-ktx-1.18.0-20250927.084818-1.aar Version: 1.18.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium index eb252c55..276b4e3 100644 --- a/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium +++ b/third_party/androidx/committed/libs/androidx_core_core_viewtree/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.core:core-viewtree Short Name: core-viewtree -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/core/core-viewtree/1.1.0-SNAPSHOT/core-viewtree-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium index 25f5932..e754a15c 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_credentials/README.chromium
@@ -1,6 +1,6 @@ Name: Credentials Short Name: credentials -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/credentials/1.6.0-SNAPSHOT/credentials-1.6.0-20250927.084818-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium index 50d4a2d0..9d5565f7 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_credentials_play_services_auth/README.chromium
@@ -1,6 +1,6 @@ Name: Credentials Play Services Auth Short Name: credentials-play-services-auth -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/credentials-play-services-auth/1.6.0-SNAPSHOT/credentials-play-services-auth-1.6.0-20250927.084818-1.aar Version: 1.6.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium index 4d6992f..727615d 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.credentials.registry:registry-provider Short Name: registry-provider -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/registry/registry-provider/1.0.0-SNAPSHOT/registry-provider-1.0.0-20250927.084818-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium index bfcc42cc..c1f39a1 100644 --- a/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium +++ b/third_party/androidx/committed/libs/androidx_credentials_registry_registry_provider_play_services/README.chromium
@@ -1,6 +1,6 @@ Name: androidx.credentials.registry:registry-provider-play-services Short Name: registry-provider-play-services -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/credentials/registry/registry-provider-play-services/1.0.0-SNAPSHOT/registry-provider-play-services-1.0.0-20250927.084818-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium index 12397d4..50d1b0c4 100644 --- a/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium +++ b/third_party/androidx/committed/libs/androidx_cursoradapter_cursoradapter/README.chromium
@@ -1,6 +1,6 @@ Name: Cursor Adapter Short Name: cursoradapter -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/cursoradapter/cursoradapter/1.1.0-SNAPSHOT/cursoradapter-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium index 4404745..11ff131 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_android/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Short Name: datastore-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-android/1.2.0-SNAPSHOT/datastore-android-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-android/1.2.0-SNAPSHOT/datastore-android-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium index f7a001b..e41839f 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Core Short Name: datastore-core-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-core-android/1.2.0-SNAPSHOT/datastore-core-android-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-core-android/1.2.0-SNAPSHOT/datastore-core-android-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium index ebb56c1..02e0190 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_core_okio_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: DataStore Core Okio Short Name: datastore-core-okio-jvm -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.2.0-SNAPSHOT/datastore-core-okio-jvm-1.2.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-core-okio-jvm/1.2.0-SNAPSHOT/datastore-core-okio-jvm-1.2.0-20250927.084818-1.jar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium index ea82e78f..31901bc 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_android/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Short Name: datastore-preferences-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-android/1.2.0-SNAPSHOT/datastore-preferences-android-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-android/1.2.0-SNAPSHOT/datastore-preferences-android-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium index 783e24a..f1ea3fa8 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_core_android/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Core Short Name: datastore-preferences-core-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.2.0-SNAPSHOT/datastore-preferences-core-android-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-core-android/1.2.0-SNAPSHOT/datastore-preferences-core-android-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium index 528a42c6..a1bf438 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_external_protobuf/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences External Protobuf Short Name: datastore-preferences-external-protobuf -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.2.0-SNAPSHOT/datastore-preferences-external-protobuf-1.2.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-external-protobuf/1.2.0-SNAPSHOT/datastore-preferences-external-protobuf-1.2.0-20250927.084818-1.jar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: BSD-3-Clause
diff --git a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium index 3bcbccc..2a032a8 100644 --- a/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium +++ b/third_party/androidx/committed/libs/androidx_datastore_datastore_preferences_proto/README.chromium
@@ -1,6 +1,6 @@ Name: Preferences DataStore Proto Short Name: datastore-preferences-proto -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.2.0-SNAPSHOT/datastore-preferences-proto-1.2.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/datastore/datastore-preferences-proto/1.2.0-SNAPSHOT/datastore-preferences-proto-1.2.0-20250927.084818-1.jar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium index 06e0b74..118f1d42 100644 --- a/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_drawerlayout_drawerlayout/README.chromium
@@ -1,6 +1,6 @@ Name: Drawer Layout Short Name: drawerlayout -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/drawerlayout/drawerlayout/1.3.0-SNAPSHOT/drawerlayout-1.3.0-20250927.084818-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium b/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium index 623afb0..d08940c 100644 --- a/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium +++ b/third_party/androidx/committed/libs/androidx_emoji_emoji/README.chromium
@@ -1,6 +1,6 @@ Name: Emoji Short Name: emoji -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/emoji/emoji/1.2.0-SNAPSHOT/emoji-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/emoji/emoji/1.2.0-SNAPSHOT/emoji-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0, SIL Open Font License, Version 1.1, Unicode, Inc. License
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium index 04e6744..37426622 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment/README.chromium
@@ -1,6 +1,6 @@ Name: fragment Short Name: fragment -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment/1.9.0-SNAPSHOT/fragment-1.9.0-20250927.084818-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium index 00f6d28e..2eefb957 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_compose/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Compose Short Name: fragment-compose -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-compose/1.9.0-SNAPSHOT/fragment-compose-1.9.0-20250927.084818-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium index 509a4d7b..dc7e78c 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Kotlin Extensions Short Name: fragment-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-ktx/1.9.0-SNAPSHOT/fragment-ktx-1.9.0-20250927.084818-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium index 40ad791..3cf5a7b8 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Testing Extensions Short Name: fragment-testing -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-testing/1.9.0-SNAPSHOT/fragment-testing-1.9.0-20250927.084818-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium index baf49ed5..ab331ce 100644 --- a/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium +++ b/third_party/androidx/committed/libs/androidx_fragment_fragment_testing_manifest/README.chromium
@@ -1,6 +1,6 @@ Name: Fragment Testing Manifest dependency Short Name: fragment-testing-manifest -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/fragment/fragment-testing-manifest/1.9.0-SNAPSHOT/fragment-testing-manifest-1.9.0-20250927.084818-1.aar Version: 1.9.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium index 81218fc6..904b3e46 100644 --- a/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium +++ b/third_party/androidx/committed/libs/androidx_graphics_graphics_path/README.chromium
@@ -1,6 +1,6 @@ Name: Android Graphics Path Short Name: graphics-path -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/graphics/graphics-path/1.1.0-SNAPSHOT/graphics-path-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium b/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium index 0609297..ec973bc 100644 --- a/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_graphics_graphics_shapes_android/README.chromium
@@ -1,6 +1,6 @@ Name: Graphics Shapes Short Name: graphics-shapes-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/graphics/graphics-shapes-android/1.1.0-SNAPSHOT/graphics-shapes-android-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/graphics/graphics-shapes-android/1.1.0-SNAPSHOT/graphics-shapes-android-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium index 639db776..3e7a5203 100644 --- a/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium +++ b/third_party/androidx/committed/libs/androidx_interpolator_interpolator/README.chromium
@@ -1,6 +1,6 @@ Name: Interpolators Short Name: interpolator -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/interpolator/interpolator/1.1.0-SNAPSHOT/interpolator-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium index c43dee9a1e..29d3244 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_java8/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle-Common for Java 8 Short Name: lifecycle-common-java8 -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.10.0-SNAPSHOT/lifecycle-common-java8-2.10.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-common-java8/2.10.0-SNAPSHOT/lifecycle-common-java8-2.10.0-20250927.084818-1.jar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium index 8c411d3..befd4cb 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_common_jvm/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle-Common Short Name: lifecycle-common-jvm -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.10.0-SNAPSHOT/lifecycle-common-jvm-2.10.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-common-jvm/2.10.0-SNAPSHOT/lifecycle-common-jvm-2.10.0-20250927.084818-1.jar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium index f3fdfd81..a722345 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle LiveData Short Name: lifecycle-livedata -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.10.0-SNAPSHOT/lifecycle-livedata-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata/2.10.0-SNAPSHOT/lifecycle-livedata-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium index 81087fb..e4249a0 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle LiveData Core Short Name: lifecycle-livedata-core -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.10.0-SNAPSHOT/lifecycle-livedata-core-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core/2.10.0-SNAPSHOT/lifecycle-livedata-core-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium index e32d3a7b..a78e3c7 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_core_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: LiveData Core Kotlin Extensions Short Name: lifecycle-livedata-core-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-core-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-core-ktx-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium index 31d659c..373c0e85 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_livedata_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: LiveData Kotlin Extensions Short Name: lifecycle-livedata-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-ktx-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-livedata-ktx/2.10.0-SNAPSHOT/lifecycle-livedata-ktx-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium index 57efaa5..2c4eb68 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_process/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Process Short Name: lifecycle-process -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-process/2.10.0-SNAPSHOT/lifecycle-process-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-process/2.10.0-SNAPSHOT/lifecycle-process-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium index e3df1c7d..a0ee0a8 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Runtime Short Name: lifecycle-runtime-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.10.0-SNAPSHOT/lifecycle-runtime-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-android/2.10.0-SNAPSHOT/lifecycle-runtime-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium index 5f7e6a1d..b6513d7b 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Runtime Compose Short Name: lifecycle-runtime-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.10.0-SNAPSHOT/lifecycle-runtime-compose-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-compose-android/2.10.0-SNAPSHOT/lifecycle-runtime-compose-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium index b4c80a41..68eecdda 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_runtime_ktx_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Kotlin Extensions Short Name: lifecycle-runtime-ktx-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.10.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-runtime-ktx-android/2.10.0-SNAPSHOT/lifecycle-runtime-ktx-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium index 198c4ffc..5b6186f0 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_service/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle Service Short Name: lifecycle-service -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-service/2.10.0-SNAPSHOT/lifecycle-service-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-service/2.10.0-SNAPSHOT/lifecycle-service-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium index a606d679..40aee92 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Short Name: lifecycle-viewmodel-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium index 9a3194e..5c4655b 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Compose Short Name: lifecycle-viewmodel-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-compose-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-compose-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium index 1afdb4e..707f476 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel Kotlin Extensions Short Name: lifecycle-viewmodel-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.10.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-ktx/2.10.0-SNAPSHOT/lifecycle-viewmodel-ktx-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium index 2a547a8..b7d6b07 100644 --- a/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_lifecycle_lifecycle_viewmodel_savedstate_android/README.chromium
@@ -1,6 +1,6 @@ Name: Lifecycle ViewModel with SavedState Short Name: lifecycle-viewmodel-savedstate-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/lifecycle/lifecycle-viewmodel-savedstate-android/2.10.0-SNAPSHOT/lifecycle-viewmodel-savedstate-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium index 49cdd77..69f73f72 100644 --- a/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium +++ b/third_party/androidx/committed/libs/androidx_loader_loader/README.chromium
@@ -1,6 +1,6 @@ Name: loader Short Name: loader -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/loader/loader/1.2.0-SNAPSHOT/loader-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_media_media/README.chromium b/third_party/androidx/committed/libs/androidx_media_media/README.chromium index 7ffeca2..192131f 100644 --- a/third_party/androidx/committed/libs/androidx_media_media/README.chromium +++ b/third_party/androidx/committed/libs/androidx_media_media/README.chromium
@@ -1,6 +1,6 @@ Name: Media Short Name: media -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/media/media/1.8.0-SNAPSHOT/media-1.8.0-20250927.084818-1.aar Version: 1.8.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium index 9fbd0cd3..d385ce1 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_common_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Common Short Name: navigation-common-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-common-android/2.10.0-SNAPSHOT/navigation-common-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium index 4a5474a5..d9f3051 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Compose Navigation Short Name: navigation-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-compose-android/2.10.0-SNAPSHOT/navigation-compose-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium index 8728b2a..d8a76d7 100644 --- a/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigation_navigation_runtime_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Runtime Short Name: navigation-runtime-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigation/navigation-runtime-android/2.10.0-SNAPSHOT/navigation-runtime-android-2.10.0-20250927.084818-1.aar Version: 2.10.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium index 66e4f241..2b15887 100644 --- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_android/README.chromium
@@ -1,6 +1,6 @@ Name: Navigation Event Short Name: navigationevent-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigationevent/navigationevent-android/1.0.0-SNAPSHOT/navigationevent-android-1.0.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigationevent/navigationevent-android/1.0.0-SNAPSHOT/navigationevent-android-1.0.0-20250927.084818-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium index f847e02..6617ef4 100644 --- a/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_navigationevent_navigationevent_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: NavigationEvent Compose Short Name: navigationevent-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.0.0-SNAPSHOT/navigationevent-compose-android-1.0.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/navigationevent/navigationevent-compose-android/1.0.0-SNAPSHOT/navigationevent-compose-android-1.0.0-20250927.084818-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium index def1d2f..3374f12 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_android/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Common Short Name: paging-common-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-common-android/3.4.0-SNAPSHOT/paging-common-android-3.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-common-android/3.4.0-SNAPSHOT/paging-common-android-3.4.0-20250927.084818-1.aar Version: 3.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium index bba6ccc..f2aef89 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_common_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Common Kotlin Extensions Short Name: paging-common-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-common-ktx/3.4.0-SNAPSHOT/paging-common-ktx-3.4.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-common-ktx/3.4.0-SNAPSHOT/paging-common-ktx-3.4.0-20250927.084818-1.jar Version: 3.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium index 298e580..52ce1144 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Compose Short Name: paging-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-compose-android/3.4.0-SNAPSHOT/paging-compose-android-3.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-compose-android/3.4.0-SNAPSHOT/paging-compose-android-3.4.0-20250927.084818-1.aar Version: 3.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium index 845e9757..a065e29 100644 --- a/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium +++ b/third_party/androidx/committed/libs/androidx_paging_paging_runtime/README.chromium
@@ -1,6 +1,6 @@ Name: Paging-Runtime Short Name: paging-runtime -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/paging/paging-runtime/3.4.0-SNAPSHOT/paging-runtime-3.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/paging/paging-runtime/3.4.0-SNAPSHOT/paging-runtime-3.4.0-20250927.084818-1.aar Version: 3.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium index 8971521..515cff9 100644 --- a/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium +++ b/third_party/androidx/committed/libs/androidx_palette_palette/README.chromium
@@ -1,6 +1,6 @@ Name: Palette Short Name: palette -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/palette/palette/1.1.0-SNAPSHOT/palette-1.1.0-20250927.084818-1.aar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium index 6fed9a2b..0846342 100644 --- a/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium +++ b/third_party/androidx/committed/libs/androidx_preference_preference/README.chromium
@@ -1,6 +1,6 @@ Name: Preference Short Name: preference -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/preference/preference/1.3.0-SNAPSHOT/preference-1.3.0-20250927.084818-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium index b28ee268..52bcc96 100644 --- a/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium +++ b/third_party/androidx/committed/libs/androidx_profileinstaller_profileinstaller/README.chromium
@@ -1,6 +1,6 @@ Name: Profile Installer Short Name: profileinstaller -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/profileinstaller/profileinstaller/1.5.0-SNAPSHOT/profileinstaller-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium index e07ede34..d16ec34 100644 --- a/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium +++ b/third_party/androidx/committed/libs/androidx_recyclerview_recyclerview/README.chromium
@@ -1,6 +1,6 @@ Name: RecyclerView Short Name: recyclerview -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/recyclerview/recyclerview/1.5.0-SNAPSHOT/recyclerview-1.5.0-20250927.084818-1.aar Version: 1.5.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium index 7c7fdbd0..7ed5498 100644 --- a/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium +++ b/third_party/androidx/committed/libs/androidx_resourceinspection_resourceinspection_annotation/README.chromium
@@ -1,6 +1,6 @@ Name: Resource Inspection - Annotations Short Name: resourceinspection-annotation -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20250926.202706-1.jar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/resourceinspection/resourceinspection-annotation/1.1.0-SNAPSHOT/resourceinspection-annotation-1.1.0-20250927.084818-1.jar Version: 1.1.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium index 048b3677..406ca8c 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_android/README.chromium
@@ -1,6 +1,6 @@ Name: Saved State Short Name: savedstate-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-android/1.4.0-SNAPSHOT/savedstate-android-1.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-android/1.4.0-SNAPSHOT/savedstate-android-1.4.0-20250927.084818-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium index f26215b..db0d1e65a 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_compose_android/README.chromium
@@ -1,6 +1,6 @@ Name: Saved State Compose Short Name: savedstate-compose-android -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.4.0-SNAPSHOT/savedstate-compose-android-1.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-compose-android/1.4.0-SNAPSHOT/savedstate-compose-android-1.4.0-20250927.084818-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium index 774578e..72dc4c2 100644 --- a/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium +++ b/third_party/androidx/committed/libs/androidx_savedstate_savedstate_ktx/README.chromium
@@ -1,6 +1,6 @@ Name: SavedState Kotlin Extensions Short Name: savedstate-ktx -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/savedstate/savedstate-ktx/1.4.0-SNAPSHOT/savedstate-ktx-1.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/savedstate/savedstate-ktx/1.4.0-SNAPSHOT/savedstate-ktx-1.4.0-20250927.084818-1.aar Version: 1.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium index ad0305ab..85c4e385 100644 --- a/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_slidingpanelayout_slidingpanelayout/README.chromium
@@ -1,6 +1,6 @@ Name: Sliding Pane Layout Short Name: slidingpanelayout -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/slidingpanelayout/slidingpanelayout/1.3.0-SNAPSHOT/slidingpanelayout-1.3.0-20250927.084818-1.aar Version: 1.3.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium b/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium index 25ffbcb..9365afe 100644 --- a/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium +++ b/third_party/androidx/committed/libs/androidx_swiperefreshlayout_swiperefreshlayout/README.chromium
@@ -1,6 +1,6 @@ Name: Swipe Refresh Layout Short Name: swiperefreshlayout -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/swiperefreshlayout/swiperefreshlayout/1.2.0-SNAPSHOT/swiperefreshlayout-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/swiperefreshlayout/swiperefreshlayout/1.2.0-SNAPSHOT/swiperefreshlayout-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium index 7e3048ad..722bab1 100644 --- a/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium +++ b/third_party/androidx/committed/libs/androidx_test_uiautomator_uiautomator/README.chromium
@@ -1,6 +1,6 @@ Name: UIAutomator Short Name: uiautomator -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/test/uiautomator/uiautomator/2.4.0-SNAPSHOT/uiautomator-2.4.0-20250927.084818-1.aar Version: 2.4.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium b/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium index 99f561d..3e42528 100644 --- a/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium +++ b/third_party/androidx/committed/libs/androidx_transition_transition/README.chromium
@@ -1,6 +1,6 @@ Name: Transition Short Name: transition -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/transition/transition/1.7.0-SNAPSHOT/transition-1.7.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/transition/transition/1.7.0-SNAPSHOT/transition-1.7.0-20250927.084818-1.aar Version: 1.7.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium index e6f9213..e9dd5ef3 100644 --- a/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium +++ b/third_party/androidx/committed/libs/androidx_viewpager2_viewpager2/README.chromium
@@ -1,6 +1,6 @@ Name: ViewPager2 Short Name: viewpager2 -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/viewpager2/viewpager2/1.2.0-SNAPSHOT/viewpager2-1.2.0-20250927.084818-1.aar Version: 1.2.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium index 594388c..ecad736 100644 --- a/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium +++ b/third_party/androidx/committed/libs/androidx_webkit_webkit/README.chromium
@@ -1,6 +1,6 @@ Name: WebKit Short Name: webkit -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/webkit/webkit/1.15.0-SNAPSHOT/webkit-1.15.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/webkit/webkit/1.15.0-SNAPSHOT/webkit-1.15.0-20250927.084818-1.aar Version: 1.15.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium index 0ccd155..2b12207 100644 --- a/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium +++ b/third_party/androidx/committed/libs/androidx_window_sidecar_sidecar/README.chromium
@@ -1,6 +1,6 @@ Name: WindowManager Sidecar Short Name: sidecar -URL: https://androidx.dev/snapshots/builds/14176386/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20250926.202706-1.aar +URL: https://androidx.dev/snapshots/builds/14178711/artifacts/repository/androidx/window/sidecar/sidecar/1.0.0-SNAPSHOT/sidecar-1.0.0-20250927.084818-1.aar Version: 1.0.0-SNAPSHOT Update Mechanism: Autoroll License: Apache-2.0
diff --git a/third_party/blink/renderer/core/css/css_selector.cc b/third_party/blink/renderer/core/css/css_selector.cc index 6646d17..8cad051 100644 --- a/third_party/blink/renderer/core/css/css_selector.cc +++ b/third_party/blink/renderer/core/css/css_selector.cc
@@ -1945,14 +1945,6 @@ return false; } -bool CSSSelector::FollowsSlotted() const { - const CSSSelector* previous = NextSimpleSelector(); - if (!previous) { - return false; - } - return previous->GetPseudoType() == kPseudoSlotted; -} - bool CSSSelector::CrossesTreeScopes() const { for (const CSSSelector* s = this; s; s = s->NextSimpleSelector()) { switch (s->Relation()) {
diff --git a/third_party/blink/renderer/core/css/css_selector.h b/third_party/blink/renderer/core/css/css_selector.h index 6c75e83..27f8975 100644 --- a/third_party/blink/renderer/core/css/css_selector.h +++ b/third_party/blink/renderer/core/css/css_selector.h
@@ -642,9 +642,6 @@ static bool IsElementBackedPseudoElement(CSSSelector::PseudoType pseudo); bool IsAllowedAfterPart() const; - // Returns true if the immediately preceding simple selector is ::slotted. - bool FollowsSlotted() const; - // Returns true if any preceding selectors have combinators that cross tree // scopes. bool CrossesTreeScopes() const;
diff --git a/third_party/blink/renderer/core/css/rule_set.cc b/third_party/blink/renderer/core/css/rule_set.cc index ee5b893..715c7ca 100644 --- a/third_party/blink/renderer/core/css/rule_set.cc +++ b/third_party/blink/renderer/core/css/rule_set.cc
@@ -326,8 +326,9 @@ AtomicString custom_pseudo_element_name; AtomicString tag_name; AtomicString part_name; - AtomicString picker_name; + AtomicString ua_shadow_pseudo; CSSSelector::PseudoType pseudo_type = CSSSelector::kPseudoUnknown; + bool has_slotted = false; }; } // namespace @@ -375,6 +376,9 @@ case CSSSelector::kPseudoActiveViewTransition: // Pseudo classes. values.pseudo_type = selector->GetPseudoType(); + if (values.pseudo_type == CSSSelector::kPseudoSlotted) { + values.has_slotted = true; + } break; case CSSSelector::kPseudoPlaceholder: case CSSSelector::kPseudoDetailsContent: @@ -389,6 +393,9 @@ // (in particular, :host). if (values.pseudo_type == CSSSelector::kPseudoUnknown) { values.pseudo_type = selector->GetPseudoType(); + values.ua_shadow_pseudo = + shadow_element_utils::StringForUAShadowPseudoId( + CSSSelector::GetPseudoId(values.pseudo_type)); } break; case CSSSelector::kPseudoWebKitCustomElement: @@ -399,7 +406,9 @@ values.part_name = selector->Value(); break; case CSSSelector::kPseudoPicker: - values.picker_name = selector->Argument(); + if (selector->Argument() == "select") { + values.ua_shadow_pseudo = shadow_element_names::kPickerSelect; + } break; case CSSSelector::kPseudoIs: case CSSSelector::kPseudoWhere: @@ -472,23 +481,49 @@ // For a (possibly compound) selector, extract the values used for determining // its buckets (e.g. for “.foo[baz]”, will return foo for class_name and -// baz for attr_name). Returns the last subselector in the group, which is also -// the one given the highest priority. -static const CSSSelector* ExtractBestBucketingValues( - const CSSSelector& component, - const StyleScope* style_scope, - BucketingValues& values) { - const CSSSelector* it = &component; - for (; it && it->Relation() == CSSSelector::kSubSelector; - it = it->NextSimpleSelector()) { +// baz for attr_name). +static void ExtractBestBucketingValues(const CSSSelector& component, + const StyleScope* style_scope, + BucketingValues& values) { + for (const CSSSelector* it = &component; it; it = it->NextSimpleSelector()) { if (!ExtractBucketingValues(it, style_scope, values)) { - return it; + return; + } + switch (it->Relation()) { + case CSSSelector::kSubSelector: + continue; + case CSSSelector::kUAShadow: { + // Any selector containing ::slotted() currently *must* go in + // the slotted bucket. Since we allow UA-shadow pseudo-element + // selectors after ::slotted(), and because such selectors exist + // in a different compound from ::slotted() (effectively [1]), + // we have to check if the originating compound contains ::slotted() + // as well. + // + // Note that the same is not true for ::part(); selectors on + // on the form ::part(p)::ua-shadow must bucket according + // to ::ua-shadow. + // + // This discrepancy comes from the fact that StyleResolver:: + // MatchOuterScopeRules (which handles parts and UA shadow + // pseudos) does look in the UA shadow bucket across trees, + // but MatchSlottedRules *only* looks in the slotted bucket. + // TODO(crbug.com/40068507): This discrepancy is weird. + // + // [1] CSSSelectorParser::SplitCompoundAtImplicitCombinator + const CSSSelector* originating = it->NextSimpleSelector(); + CHECK(originating); + BucketingValues originating_values; + ExtractBestBucketingValues(*originating, style_scope, + originating_values); + values.has_slotted |= originating_values.has_slotted; + return; + }; + default: + // We reached the end of the compound selector. + return; } } - if (it) { - ExtractBucketingValues(it, style_scope, values); - } - return it; } template <class Func> @@ -538,55 +573,79 @@ all_rules_.push_back(rule_data); #endif // DCHECK_IS_ON() - const CSSSelector* it = - ExtractBestBucketingValues(component, style_scope, values); + ExtractBestBucketingValues(component, style_scope, values); - // Prefer rule sets in order of most likely to apply infrequently. + // ::slotted() selectors *must* go in the slotted-bucket; we only look + // for rules in that bucket across shadows. + if (values.has_slotted) { + AddToBucket(slotted_pseudo_element_rules_, rule_data); + return; + } - // NOTE: For ::part:focus and similar, we need to go into the ::part bucket - // (see below). This isn't a problem for #id::part and similar, since there is - // a hidden combinator that stops ExtractBestBucketingValues() before it finds - // the #id. - if (values.part_name.empty()) { - if (values.pseudo_type == CSSSelector::kPseudoFocus) { - if (bucket_coverage == BucketCoverage::kCompute) { - MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { - return selector.Match() == CSSSelector::kPseudoClass && - selector.GetPseudoType() == CSSSelector::kPseudoFocus; - }); - } - AddToBucket(focus_pseudo_class_rules_, rule_data); - return; + // Similarly, UA-shadow pseudo-element selectors and ::part() selectors + // must go in their respective buckets, even when there's another selector + // that is normally considered more specific for bucketing, e.g. + // ::part(a):hover. + + if (!values.ua_shadow_pseudo.empty()) { + // Note that `ua_shadow_pseudo` and `part_name` may never be set + // at the same time due to the implicit combinators [1] inserted before + // such selectors. This means that it doesn't matter if we try to bucket + // for `ua_shadow_pseudo` first or for `part_name` first. + // [1] CSSSelectorParser:: SplitCompoundAtImplicitCombinator. + CHECK(values.part_name.empty()); + AddToBucket(values.ua_shadow_pseudo, ua_shadow_pseudo_element_rules_, + rule_data); + return; + } + + if (!values.part_name.empty()) { + CHECK(values.ua_shadow_pseudo.empty()); // See ua_shadow_pseudo branch above. + // TODO: Mark as covered by bucketing? + AddToBucket(part_pseudo_rules_, rule_data); + return; + } + + // Prefer buckets in order of most likely to apply infrequently. + + if (values.pseudo_type == CSSSelector::kPseudoFocus) { + if (bucket_coverage == BucketCoverage::kCompute) { + MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { + return selector.Match() == CSSSelector::kPseudoClass && + selector.GetPseudoType() == CSSSelector::kPseudoFocus; + }); } - if (values.pseudo_type == CSSSelector::kPseudoFocusVisible) { - if (bucket_coverage == BucketCoverage::kCompute) { - MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { - return selector.Match() == CSSSelector::kPseudoClass && - selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible; - }); - } - AddToBucket(focus_visible_pseudo_class_rules_, rule_data); - return; + AddToBucket(focus_pseudo_class_rules_, rule_data); + return; + } + if (values.pseudo_type == CSSSelector::kPseudoFocusVisible) { + if (bucket_coverage == BucketCoverage::kCompute) { + MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { + return selector.Match() == CSSSelector::kPseudoClass && + selector.GetPseudoType() == CSSSelector::kPseudoFocusVisible; + }); } - if (values.pseudo_type == CSSSelector::kPseudoScrollbarButton || - values.pseudo_type == CSSSelector::kPseudoScrollbarCorner || - values.pseudo_type == CSSSelector::kPseudoScrollbarThumb || - values.pseudo_type == CSSSelector::kPseudoScrollbarTrack || - values.pseudo_type == CSSSelector::kPseudoScrollbarTrackPiece) { - AddToBucket(scrollbar_rules_, rule_data); - return; + AddToBucket(focus_visible_pseudo_class_rules_, rule_data); + return; + } + if (values.pseudo_type == CSSSelector::kPseudoScrollbarButton || + values.pseudo_type == CSSSelector::kPseudoScrollbarCorner || + values.pseudo_type == CSSSelector::kPseudoScrollbarThumb || + values.pseudo_type == CSSSelector::kPseudoScrollbarTrack || + values.pseudo_type == CSSSelector::kPseudoScrollbarTrackPiece) { + AddToBucket(scrollbar_rules_, rule_data); + return; + } + if (values.pseudo_type == CSSSelector::kPseudoActiveViewTransition) { + if (bucket_coverage == BucketCoverage::kCompute) { + MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { + return selector.Match() == CSSSelector::kPseudoClass && + selector.GetPseudoType() == + CSSSelector::kPseudoActiveViewTransition; + }); } - if (values.pseudo_type == CSSSelector::kPseudoActiveViewTransition) { - if (bucket_coverage == BucketCoverage::kCompute) { - MarkAsCoveredByBucketing(component, [](const CSSSelector& selector) { - return selector.Match() == CSSSelector::kPseudoClass && - selector.GetPseudoType() == - CSSSelector::kPseudoActiveViewTransition; - }); - } - AddToBucket(active_view_transition_rules_, rule_data); - return; - } + AddToBucket(active_view_transition_rules_, rule_data); + return; } if (!values.id.empty()) { @@ -645,41 +704,6 @@ return; } - auto get_ua_shadow_pseudo = [&]() -> const AtomicString& { - if (values.picker_name == "select") { - return shadow_element_names::kPickerSelect; - } else if (values.pseudo_type != CSSSelector::kPseudoUnknown) { - return shadow_element_utils::StringForUAShadowPseudoId( - CSSSelector::GetPseudoId(values.pseudo_type)); - } - return g_null_atom; - }; - - AtomicString ua_shadow_pseudo = get_ua_shadow_pseudo(); - - // Any selector with or following ::part() or a UA shadow pseudo-element - // must go in the bucket for the *innermost* such pseudo-element. - - // TODO(dbaron): Should this eventually check kShadowSlot as well? - if (values.part_name.empty() && ua_shadow_pseudo == g_null_atom && it && - (it->Relation() == CSSSelector::RelationType::kUAShadow || - it->Relation() == CSSSelector::RelationType::kShadowPart)) { - const CSSSelector* previous = it->NextSimpleSelector(); - if (previous->Match() == CSSSelector::kPseudoElement) { - ExtractBucketingValues(previous, style_scope, values); - ua_shadow_pseudo = get_ua_shadow_pseudo(); - } - } - - // Any selector with or following ::part() must go in the part bucket, - // because we look in that bucket in higher scopes to find rules that need - // to match inside the shadow tree. - if (!values.part_name.empty()) { - // TODO: Mark as covered by bucketing? - AddToBucket(part_pseudo_rules_, rule_data); - return; - } - if (!values.custom_pseudo_element_name.empty()) { // Custom pseudos come before ids and classes in the order of // NextSimpleSelector(), and have a relation of ShadowPseudo between them. @@ -693,19 +717,6 @@ return; } - if (ua_shadow_pseudo != g_null_atom) { - // TODO(dbaron): This needs further work to support multiple - // pseudo-elements after ::slotted(). This likely requires reorganization - // of how MatchSlottedRules interacts with MatchOuterScopeRules. - CHECK(it); - if (it->FollowsSlotted()) { - AddToBucket(slotted_pseudo_element_rules_, rule_data); - } else { - AddToBucket(ua_shadow_pseudo, ua_shadow_pseudo_element_rules_, rule_data); - } - return; - } - switch (values.pseudo_type) { case CSSSelector::kPseudoCue: AddToBucket(cue_pseudo_rules_, rule_data); @@ -740,7 +751,8 @@ AddToBucket(shadow_host_rules_, rule_data); return; case CSSSelector::kPseudoSlotted: - AddToBucket(slotted_pseudo_element_rules_, rule_data); + // Handled above. + NOTREACHED(); return; case CSSSelector::kPseudoRoot: if (bucket_coverage == BucketCoverage::kCompute) {
diff --git a/third_party/blink/renderer/core/css/rule_set_test.cc b/third_party/blink/renderer/core/css/rule_set_test.cc index f51863b4..4079f472 100644 --- a/third_party/blink/renderer/core/css/rule_set_test.cc +++ b/third_party/blink/renderer/core/css/rule_set_test.cc
@@ -331,6 +331,56 @@ ASSERT_EQ(0u, part_rules.size()); } +TEST(RuleSetTest, FindBestBucketAndAdd_PartBefore) { + test::TaskEnvironment task_environment; + css_test_helpers::TestStyleSheet sheet; + + sheet.AddCSSRules("::part(p)::before { }"); + RuleSet& rule_set = sheet.GetRuleSet(); + const base::span<const RuleData> part_rules = rule_set.PartPseudoRules(); + ASSERT_EQ(1u, part_rules.size()); +} + +TEST(RuleSetTest, FindBestBucketAndAdd_PartFocus) { + test::TaskEnvironment task_environment; + css_test_helpers::TestStyleSheet sheet; + + sheet.AddCSSRules("::part(p):focus { }"); + RuleSet& rule_set = sheet.GetRuleSet(); + const base::span<const RuleData> part_rules = rule_set.PartPseudoRules(); + ASSERT_EQ(1u, part_rules.size()); +} + +TEST(RuleSetTest, FindBestBucketAndAdd_Slotted) { + test::TaskEnvironment task_environment; + css_test_helpers::TestStyleSheet sheet; + + sheet.AddCSSRules("::slotted(.a) { }"); + RuleSet& rule_set = sheet.GetRuleSet(); + const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules(); + ASSERT_EQ(1u, rules.size()); +} + +TEST(RuleSetTest, FindBestBucketAndAdd_SlottedBefore) { + test::TaskEnvironment task_environment; + css_test_helpers::TestStyleSheet sheet; + + sheet.AddCSSRules("::slotted(.a)::before { }"); + RuleSet& rule_set = sheet.GetRuleSet(); + const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules(); + ASSERT_EQ(1u, rules.size()); +} + +TEST(RuleSetTest, FindBestBucketAndAdd_SlottedUAShadow) { + test::TaskEnvironment task_environment; + css_test_helpers::TestStyleSheet sheet; + + sheet.AddCSSRules("::slotted(.a)::file-selector-button { }"); + RuleSet& rule_set = sheet.GetRuleSet(); + const base::span<const RuleData> rules = rule_set.SlottedPseudoElementRules(); + ASSERT_EQ(1u, rules.size()); +} + TEST(RuleSetTest, FindBestBucketAndAdd_IsSingleArg) { test::TaskEnvironment task_environment; css_test_helpers::TestStyleSheet sheet;
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc index ea98871..6a62f3eb2 100644 --- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc +++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry.cc
@@ -27,6 +27,8 @@ #include "third_party/blink/renderer/platform/heap/trace_traits.h" #include "third_party/blink/renderer/platform/wtf/functional.h" #include "third_party/blink/renderer/platform/wtf/key_value_pair.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" +#include "third_party/blink/renderer/core/html_names.h" namespace blink { @@ -506,7 +508,8 @@ MutationObserverInit* init = MutationObserverInit::Create(); init->setAttributes(true); - init->setAttributeFilter(Vector<String>{"name", "content"}); + init->setAttributeFilter( + {html_names::kNameAttr.LocalName(), html_names::kContentAttr.LocalName()}); DummyExceptionStateForTesting exception_state; attribute_observer->observe(meta, init, exception_state); DCHECK(!exception_state.HadException()); @@ -527,7 +530,7 @@ MutationObserverInit* init = MutationObserverInit::Create(); init->setAttributes(true); - init->setAttributeFilter(Vector<String>{"type"}); + init->setAttributeFilter({html_names::kTypeAttr.LocalName()}); init->setChildList(true); // For text content changes. DummyExceptionStateForTesting exception_state; attribute_observer->observe(script, init, exception_state); @@ -595,8 +598,12 @@ for (HTMLMetaElement& meta : Traversal<HTMLMetaElement>::ChildrenOf(*head)) { const String& name = meta.GetName(); + String content = meta.Content(); + if (content.IsNull()) { + content = String(""); + } if (!name.IsNull() && all_metatag_name_counts_.Contains(name)) { - name_to_content_map.Set(name, meta.Content()); + name_to_content_map.Set(name, content); } } }
diff --git a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc index f251dd0..b2a0eef 100644 --- a/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc +++ b/third_party/blink/renderer/modules/content_extraction/frame_metadata_observer_registry_unittest.cc
@@ -101,6 +101,12 @@ EXPECT_EQ(meta_tags[0]->content, "Gary"); } + void VerifyAuthorMetaTagNoContent(const Vector<mojom::blink::MetaTagPtr>& meta_tags) { + ASSERT_EQ(meta_tags.size(), 1u); + EXPECT_EQ(meta_tags[0]->name, "author"); + EXPECT_EQ(meta_tags[0]->content, ""); + } + protected: test::TaskEnvironment task_environment_; frame_test_helpers::WebViewHelper helper_; @@ -444,6 +450,28 @@ VerifyAuthorMetaTag(observer.future().Take()); } +TEST_F(FrameMetadataObserverRegistryTest, MetaTagsWithNoContent) { + LoadHTML(R"HTML( + <head> + <meta charset="UTF-8"> + <meta name="author"> + </head> + <body></body> + )HTML"); + BindRegistry(); + + MockMetaTagsObserver observer; + Vector<String> names_to_observe; + names_to_observe.push_back("author"); + + registry_->AddMetaTagsObserver(names_to_observe, + observer.BindNewPipeAndPassRemote()); + test::RunPendingTasks(); + + ASSERT_TRUE(observer.future().IsReady()); + VerifyAuthorMetaTagNoContent(observer.future().Take()); +} + // Re-enable this test once we support observing head elements that are added // dynamically. TEST_F(FrameMetadataObserverRegistryTest, MetaTagsAddedWithHead) {
diff --git a/third_party/compiler-rt/src b/third_party/compiler-rt/src index 0214529..45b0d10 160000 --- a/third_party/compiler-rt/src +++ b/third_party/compiler-rt/src
@@ -1 +1 @@ -Subproject commit 02145296c3a848274a6146176a74d0e468452e68 +Subproject commit 45b0d106857b21348a01c292cb30a261ef968b7e
diff --git a/third_party/crossbench b/third_party/crossbench index 0f26144..9355cb1 160000 --- a/third_party/crossbench +++ b/third_party/crossbench
@@ -1 +1 @@ -Subproject commit 0f26144e3635a33fc18bdb726a6439090dc9e990 +Subproject commit 9355cb1425d7c25994b2e945fb39c54350651176
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 77804ac..ad8438e 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 77804ac0072e8c287727e6d393eafb49374c46e3 +Subproject commit ad8438edb0fff5b4a87669fe237ec2ae7d30c86e
diff --git a/third_party/libc++/src b/third_party/libc++/src index bcc74d7..0cb7f02 160000 --- a/third_party/libc++/src +++ b/third_party/libc++/src
@@ -1 +1 @@ -Subproject commit bcc74d7745a74dae059f1a4ca97e2979f5f77661 +Subproject commit 0cb7f02f783ef23ba0a9f73d632a5ae95af042c5
diff --git a/third_party/skia b/third_party/skia index fed805f..beb6739 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit fed805fe6ee67e7f5252b9faecc6741c057464d8 +Subproject commit beb6739688027fa5d1e1da5a946defa18217f171
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 14f79df..8571c2c 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 14f79df6f67f644d2b26ddc5d690ffa8f2030e6b +Subproject commit 8571c2cb2137af5bb8754d5e501aae90831fb7e1
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src index 5e817f0..e7ba8af 160000 --- a/third_party/vulkan-validation-layers/src +++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@ -Subproject commit 5e817f0563ce8c6d9c023f85133ad0628d0dfc05 +Subproject commit e7ba8af40a7e9b8e5d24eb8c5459d0bdd8101498
diff --git a/third_party/webrtc b/third_party/webrtc index c412d47..8d5c61b 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit c412d4776ca54546b9dd41be15eeaf9147a2f753 +Subproject commit 8d5c61bb7ab3464a8dc3354bc54c78100eb92335
diff --git a/tools/metrics/common/enums.py b/tools/metrics/common/enums.py index ec15a85c..a0926cd 100644 --- a/tools/metrics/common/enums.py +++ b/tools/metrics/common/enums.py
@@ -17,6 +17,7 @@ _METRIC_FILES_WITH_ENUMS = [ path_util.GetInputFile('tools/metrics/ukm/ukm.xml'), + path_util.GetInputFile('tools/metrics/private_metrics/dkm.xml'), path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml'), ] @@ -59,7 +60,7 @@ metric_enum_names = ( _get_enums_referenced_by_metric_nodes(_METRIC_FILES_WITH_ENUMS)) - logging.info(f'Found {len(metric_enum_names)} enums from ukm and dwa.') + logging.info(f'Found {len(metric_enum_names)} enums from ukm, dkm, and dwa.') enum_names.update(metric_enum_names) logging.info(f'Found {len(enum_names)} enums total.')
diff --git a/tools/metrics/common/presubmit_util.py b/tools/metrics/common/presubmit_util.py index 3347b2e..2a8b774 100644 --- a/tools/metrics/common/presubmit_util.py +++ b/tools/metrics/common/presubmit_util.py
@@ -137,7 +137,7 @@ cwd = input_api.PresubmitLocalPath() pretty_print_args = [ - input_api.python3_executable, 'pretty_print.py', '--presubmit' + input_api.python3_executable, 'pretty_print.py', '--presubmit', xml_file ] exit_code = input_api.subprocess.call(pretty_print_args, cwd=cwd) @@ -148,7 +148,8 @@ ] validate_format_args = [ - input_api.python3_executable, 'validate_format.py', '--presubmit' + input_api.python3_executable, 'validate_format.py', '--presubmit', + xml_file ] exit_code = input_api.subprocess.call(validate_format_args, cwd=cwd) if exit_code != 0:
diff --git a/tools/metrics/histograms/histogram_paths.py b/tools/metrics/histograms/histogram_paths.py index 0a13d69..7a2e04aaf 100755 --- a/tools/metrics/histograms/histogram_paths.py +++ b/tools/metrics/histograms/histogram_paths.py
@@ -51,6 +51,7 @@ ENUMS_XMLS = [path_util.GetInputFile(f) for f in _ENUMS_XML_RELATIVE] UKM_XML = path_util.GetInputFile('tools/metrics/ukm/ukm.xml') DWA_XML = path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml') +DKM_XML = path_util.GetInputFile('tools/metrics/private_metrics/dkm.xml') HISTOGRAMS_XMLS = [path_util.GetInputFile(f) for f in _HISTOGRAMS_XMLS_RELATIVE] ALL_XMLS = [path_util.GetInputFile(f) for f in ALL_XMLS_RELATIVE]
diff --git a/tools/metrics/private_metrics/PRESUBMIT.py b/tools/metrics/private_metrics/PRESUBMIT.py index 513557c..b479588 100644 --- a/tools/metrics/private_metrics/PRESUBMIT.py +++ b/tools/metrics/private_metrics/PRESUBMIT.py
@@ -1,7 +1,7 @@ # Copyright 2024 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -"""Presubmit script for dwa.xml. +"""Presubmit script for Private Metrics XML configuration. See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for more details on the presubmit API built into gcl. @@ -14,12 +14,19 @@ os.path.join(os.path.dirname(os.path.abspath('__file__')), '..', 'common')) import presubmit_util -_DWA_XML = 'dwa.xml' +DWA_XML = 'dwa.xml' +DKM_XML = 'dkm.xml' def CheckChangeOnUpload(input_api, output_api): - return presubmit_util.CheckChange(_DWA_XML, input_api, output_api) + result = [] + result.extend(presubmit_util.CheckChange(DWA_XML, input_api, output_api)) + result.extend(presubmit_util.CheckChange(DKM_XML, input_api, output_api)) + return result def CheckChangeOnCommit(input_api, output_api): - return presubmit_util.CheckChange(_DWA_XML, input_api, output_api) + result = [] + result.extend(presubmit_util.CheckChange(DWA_XML, input_api, output_api)) + result.extend(presubmit_util.CheckChange(DKM_XML, input_api, output_api)) + return result
diff --git a/tools/metrics/private_metrics/dkm.xml b/tools/metrics/private_metrics/dkm.xml new file mode 100644 index 0000000..e02ffae --- /dev/null +++ b/tools/metrics/private_metrics/dkm.xml
@@ -0,0 +1,16 @@ +<!-- +Copyright 2025 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<!-- +This file is used to generate a comprehensive list of Chrome DKM metrics +along with a detailed description for each metric. + +Events may be marked with the attribute singular="True" to indicate that +the event will only occur once per source, and multiple entries will just +be describing additional metrics about the same event. +--> + +<dkm-configuration/>
diff --git a/tools/metrics/private_metrics/dkm_model.py b/tools/metrics/private_metrics/dkm_model.py new file mode 100644 index 0000000..bf9a5e17 --- /dev/null +++ b/tools/metrics/private_metrics/dkm_model.py
@@ -0,0 +1,22 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Model objects for dkm.xml contents.""" + +import private_metrics_model_shared + +DKM_XML_TYPE = private_metrics_model_shared.create_event_based_document_type( + 'dkm-configuration') + + +def prettify_xml(original_xml): + """Parses the original xml and return a pretty printed version. + + Args: + original_xml: A string containing the original xml file contents. + + Returns: + A pretty-printed xml string, or None if the config contains errors. + """ + config = DKM_XML_TYPE.Parse(original_xml) + return DKM_XML_TYPE.PrettyPrint(config)
diff --git a/tools/metrics/private_metrics/pretty_print.py b/tools/metrics/private_metrics/pretty_print.py index 96f9a5b5..e128e1ff 100755 --- a/tools/metrics/private_metrics/pretty_print.py +++ b/tools/metrics/private_metrics/pretty_print.py
@@ -7,6 +7,7 @@ import sys import argparse +import dkm_model import dwa_model sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) @@ -14,7 +15,7 @@ def main(): - """Pretty-prints the DWA Chrome metrics in dwa.xml file. + """Pretty-prints Private Metrics' XML configuration files. Args: --non-interactive: (Optional) Does not print log info messages and does not @@ -28,6 +29,7 @@ pretty_print.py --diff --cleanup """ parser = argparse.ArgumentParser() + parser.add_argument('filepath', help="relative path to XML file") # The following optional flags are used by common/presubmit_util.py parser.add_argument('--non-interactive', action="store_true") parser.add_argument('--presubmit', action="store_true") @@ -36,9 +38,22 @@ action="store_true", help="Remove the backup file after a successful run.") - presubmit_util.DoPresubmitMain(sys.argv, 'dwa.xml', 'dwa.old.xml', - dwa_model.PrettifyXML) + args = parser.parse_args() + filepath = args.filepath + + status = 0 + if filepath.endswith('dwa.xml'): + status = presubmit_util.DoPresubmit(sys.argv, filepath, 'dwa.old.xml', + dwa_model.PrettifyXML) + elif filepath.endswith('dkm.xml'): + status = presubmit_util.DoPresubmit(sys.argv, filepath, 'dkm.old.xml', + dkm_model.prettify_xml) + else: + print(f'Unsupported file: {filepath}', file=sys.stderr) + return 1 + + return status if __name__ == '__main__': sys.exit(main())
diff --git a/tools/metrics/private_metrics/private_metrics_validations.py b/tools/metrics/private_metrics/private_metrics_validations.py index 28c5ac3..0ffb004 100644 --- a/tools/metrics/private_metrics/private_metrics_validations.py +++ b/tools/metrics/private_metrics/private_metrics_validations.py
@@ -53,6 +53,18 @@ return (is_success, errors) +class DkmXmlValidation(EventBasedXmlValidation): + """Validations for the content of dkm.xml.""" + + def __init__(self, dkm_config: xml.dom.minidom.Element) -> None: + """Attributes: + + dkm_config: A XML minidom Element representing the root node of the DKM + config tree. + """ + super().__init__(dkm_config, "DKM") + + class DwaXmlValidation(EventBasedXmlValidation): """Validations for the content of dwa.xml."""
diff --git a/tools/metrics/private_metrics/validate_format.py b/tools/metrics/private_metrics/validate_format.py index 363c46d64..048eec7 100755 --- a/tools/metrics/private_metrics/validate_format.py +++ b/tools/metrics/private_metrics/validate_format.py
@@ -4,23 +4,37 @@ # found in the LICENSE file. """Verifies that the DWA XML file is well-formatted.""" -import os import sys -import private_metrics_validations - -sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'common')) -import path_util - +import argparse from xml.dom import minidom -_DWA_XML = path_util.GetInputFile('tools/metrics/private_metrics/dwa.xml') +import private_metrics_validations def main(): - with open(_DWA_XML, 'r') as config_file: + parser = argparse.ArgumentParser() + parser.add_argument('filepath', help="relative path to XML file") + # The following optional flags are used by common/presubmit_util.py + parser.add_argument('--presubmit', action="store_true") + + args = parser.parse_args() + + filepath = args.filepath + + if filepath.endswith('dwa.xml'): + root_tag = 'dwa-configuration' + validation = private_metrics_validations.DwaXmlValidation + elif filepath.endswith('dkm.xml'): + root_tag = 'dkm-configuration' + validation = private_metrics_validations.DkmXmlValidation + else: + print(f'Unsupported file: {filepath}', file=sys.stderr) + sys.exit(1) + + with open(filepath, 'r') as config_file: document = minidom.parse(config_file) - [config] = document.getElementsByTagName('dwa-configuration') - validator = private_metrics_validations.DwaXmlValidation(config) + [config] = document.getElementsByTagName(root_tag) + validator = validation(config) owner_check_success, owner_check_errors = validator.checkEventsHaveOwners() metric_check_success, metric_check_errors = (
diff --git a/v8 b/v8 index f5fc76f..ec517fdf 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit f5fc76fe8c184b0173d3e88a4a038fdf0cd05734 +Subproject commit ec517fdfbd438e98cc95d6d9fd93816c710e9dc8