diff --git a/DEPS b/DEPS index db023dcf..743da05 100644 --- a/DEPS +++ b/DEPS
@@ -297,7 +297,7 @@ # 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': 'a57f08a14e90e565377441f390c215457a02b641', + 'skia_revision': 'aa244737b2fdc7c9f1d7cb6b20c039aa68046768', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -305,7 +305,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': '67e0c6fcc974b89c408af988ecfc98d2ef892e1b', + 'angle_revision': '4cdabfb1459c15d5631179741b76b813e292cd39', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -324,7 +324,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # and whatever else without interference from each other. - 'fuchsia_version': 'version:9.20220811.2.1', + 'fuchsia_version': 'version:9.20220812.0.1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling google-toolbox-for-mac # and whatever else without interference from each other. @@ -376,7 +376,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': '11d846e74fd2d90a4d45355dab45cd95e2fce0e4', + 'devtools_frontend_revision': '7983c9e9bc06eefa7a56df9a7b8c4b97420eaa57', # 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. @@ -412,7 +412,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '15719a22f352a41c487f1ad6c83ffd989d46408e', + 'dawn_revision': '727f27d4d3e485aa298a6bae8b49ef6d0cc8e8bd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -460,7 +460,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libunwind_revision': 'a097a1ada6ca6a585f90299b934695dffb88914c', + 'libunwind_revision': '754d0167693b7b7ca0f5df6a448a153af916e39e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -862,7 +862,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'TkDDiu4byTvUZ76oFHCKypWsXZ-AtiKVvT8Ma4E2e1YC', + 'version': 'S4G81p35MbG6mbSYDSwSEeoqjLxDXGiqVK7v0RaeDHcC', }, ], 'dep_type': 'cipd', @@ -873,7 +873,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'WBTAImq5mN_jfX-oLpNn_P3VJ_MbJjXvN-VRik9nnMoC', + 'version': 'BgCZ3HPWHKYfWom26zjBX0NBDrQA2SsmVhVHjTWY3bUC', }, ], 'dep_type': 'cipd', @@ -884,7 +884,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': '-c_y5EwlBtcXnUPTSUNco2EAboFvb4a1djS6MxeuNk8C', + 'version': 'Ui4F6DNu6njygGsdGMXPqtMD6N_3mJg9a6nNQbLd8icC', }, ], 'dep_type': 'cipd', @@ -1102,7 +1102,7 @@ Var('boringssl_git') + '/boringssl.git' + '@' + Var('boringssl_revision'), 'src/third_party/breakpad/breakpad': - Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'a7a8b9c3002dc4027708f6a644496496877a4b62', + Var('chromium_git') + '/breakpad/breakpad.git' + '@' + 'e085b3b50bde862d0cf3ce4594e3f391bcf5faec', 'src/third_party/byte_buddy': { 'packages': [ @@ -1465,7 +1465,7 @@ Var('chromium_git') + '/webm/libwebp.git' + '@' + '7366f7f394af26de814296152c50e673ed0a832f', 'src/third_party/libyuv': - Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '9b17af9bef41aec80373a7d4689bb77bac33eab5', + Var('chromium_git') + '/libyuv/libyuv.git' + '@' + '1c5a8bb17ac4092da557e55cf519bf4df105d8f1', 'src/third_party/lighttpd': { 'url': Var('chromium_git') + '/chromium/deps/lighttpd.git' + '@' + Var('lighttpd_revision'), @@ -1693,7 +1693,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@03dd80c1d5794532420768c320fc026f3454cb5a', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@1a96e7007f49e93b018d1d203dbc61c1b1c33ad3', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@ed1a0193217e10a16e1bc6d575582f360cf5ca1c', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@9e32ad5eb6bed7cdf00320a3a78112448090fcf4', 'condition': 'checkout_src_internal', }, @@ -1846,7 +1846,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'bAPQB4uga7IANwJKxF7MpHYTuOtkjc-Oa2Ugg2FlebgC', + 'version': 'vXWn_L_Ioc8TrAtpmtyQwuzBoazLCVo_B-wGbr2XbOwC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/browser/tracing/aw_tracing_delegate.cc b/android_webview/browser/tracing/aw_tracing_delegate.cc index d270791b..322dce22 100644 --- a/android_webview/browser/tracing/aw_tracing_delegate.cc +++ b/android_webview/browser/tracing/aw_tracing_delegate.cc
@@ -92,9 +92,9 @@ return true; } -absl::optional<base::Value> AwTracingDelegate::GenerateMetadataDict() { - base::Value metadata_dict(base::Value::Type::DICTIONARY); - metadata_dict.SetStringKey("revision", version_info::GetLastChange()); +absl::optional<base::Value::Dict> AwTracingDelegate::GenerateMetadataDict() { + base::Value::Dict metadata_dict; + metadata_dict.Set("revision", version_info::GetLastChange()); return metadata_dict; }
diff --git a/android_webview/browser/tracing/aw_tracing_delegate.h b/android_webview/browser/tracing/aw_tracing_delegate.h index 5972f48..b943d09a 100644 --- a/android_webview/browser/tracing/aw_tracing_delegate.h +++ b/android_webview/browser/tracing/aw_tracing_delegate.h
@@ -31,7 +31,7 @@ const content::BackgroundTracingConfig& config, bool requires_anonymized_data, bool is_crash_scenario) override; - absl::optional<base::Value> GenerateMetadataDict() override; + absl::optional<base::Value::Dict> GenerateMetadataDict() override; }; } // namespace android_webview
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java index d34e38ea..16f5fae 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwWebContentsObserverTest.java
@@ -203,7 +203,7 @@ isRendererInitiated, null /* initiatorOrigin */, transition, false /* isPost */, false /* hasUserGesture */, false /* isRedirect */, false /* isExternalProtocol */, 0 /* navigationId */, false /* isPageActivation */, false /* isReload */); - mWebContentsObserver.didStartNavigation(navigation); + mWebContentsObserver.didStartNavigationInPrimaryMainFrame(navigation); navigation.didFinish(gurl, isErrorPage, true /* hasCommitted */, isFragmentNavigation, false /* isDownload */, false /* isValidSearchFormUrl */, transition,
diff --git a/android_webview/lib/aw_main_delegate.cc b/android_webview/lib/aw_main_delegate.cc index b55223f..6e60608 100644 --- a/android_webview/lib/aw_main_delegate.cc +++ b/android_webview/lib/aw_main_delegate.cc
@@ -64,6 +64,7 @@ #include "gpu/config/gpu_finch_features.h" #include "media/base/media_switches.h" #include "media/media_buildflags.h" +#include "net/base/features.h" #include "services/network/public/cpp/features.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "third_party/blink/public/common/features.h" @@ -323,6 +324,9 @@ // TODO(crbug.com/1292622): Enable the feature on Webview. features.DisableIfNotSet(::translate::kTFLiteLanguageDetectionEnabled); + // Disable key pinning enforcement on webview. + features.DisableIfNotSet(net::features::kStaticKeyPinningEnforcement); + // Have the network service in the browser process even if we have separate // renderer processes. See also: switches::kInProcessGPU above. features.EnableIfNotSet(::features::kNetworkServiceInProcess);
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index 2d39d94..6a2dd56 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -2542,6 +2542,7 @@ "ambient/ui/media_string_view_unittest.cc", "ambient/ui/photo_view_unittest.cc", "ambient/util/ambient_util_unittest.cc", + "app_menu/app_menu_model_adapter_unittest.cc", "app_menu/notification_menu_controller_unittest.cc", "app_menu/notification_menu_view_unittest.cc", "app_menu/notification_overflow_view_unittest.cc",
diff --git a/ash/app_menu/app_menu_model_adapter.cc b/ash/app_menu/app_menu_model_adapter.cc index 2757c4f..a60f815 100644 --- a/ash/app_menu/app_menu_model_adapter.cc +++ b/ash/app_menu/app_menu_model_adapter.cc
@@ -6,6 +6,7 @@ #include "ash/app_menu/notification_menu_controller.h" #include "ash/constants/ash_features.h" +#include "ash/public/cpp/app_menu_constants.h" #include "ash/public/cpp/shelf_model.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" @@ -105,8 +106,19 @@ // example, for search result menus, the command could open an app window // causing the app list search to get cleared, destroying non-zero state // search results. + auto weak_self = weak_ptr_factory_.GetWeakPtr(); RecordExecuteCommandHistogram(GetCommandIdForHistograms(id)); views::MenuModelAdapter::ExecuteCommand(id, mouse_event_flags); + + if (!weak_self) + return; + + if (id >= USE_LAUNCH_TYPE_COMMAND_START && + id <= USE_LAUNCH_TYPE_COMMAND_END) { + // Rebuild the menu to ensure that the `LAUNCH_NEW` menu item is refreshed + // after changing the app launch type. + BuildMenu(root_); + } } void AppMenuModelAdapter::OnMenuClosed(views::MenuItemView* menu) { @@ -124,6 +136,13 @@ std::move(on_menu_closed_callback_).Run(); } +bool AppMenuModelAdapter::ShouldExecuteCommandWithoutClosingMenu( + int id, + const ui::Event& event) { + return id >= USE_LAUNCH_TYPE_COMMAND_START && + id <= USE_LAUNCH_TYPE_COMMAND_END; +} + void AppMenuModelAdapter::RecordExecuteCommandHistogram(int command_id) { const bool is_not_from_app = app_id().empty(); base::UmaHistogramSparse(is_not_from_app ? kNonAppContextMenuExecuteCommand
diff --git a/ash/app_menu/app_menu_model_adapter.h b/ash/app_menu/app_menu_model_adapter.h index 7a73afd..e8e6166 100644 --- a/ash/app_menu/app_menu_model_adapter.h +++ b/ash/app_menu/app_menu_model_adapter.h
@@ -65,6 +65,8 @@ // views::MenuModelAdapter: void ExecuteCommand(int id, int mouse_event_flags) override; void OnMenuClosed(views::MenuItemView* menu) override; + bool ShouldExecuteCommandWithoutClosingMenu(int id, + const ui::Event& event) override; ui::SimpleMenuModel* model() { return model_.get(); } views::MenuItemView* root_for_testing() { return root_; } @@ -114,6 +116,8 @@ // Whether tablet mode is active. bool is_tablet_mode_; + + base::WeakPtrFactory<AppMenuModelAdapter> weak_ptr_factory_{this}; }; } // namespace ash
diff --git a/ash/app_menu/app_menu_model_adapter_unittest.cc b/ash/app_menu/app_menu_model_adapter_unittest.cc new file mode 100644 index 0000000..5db6572 --- /dev/null +++ b/ash/app_menu/app_menu_model_adapter_unittest.cc
@@ -0,0 +1,141 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/app_menu/app_menu_model_adapter.h" + +#include <memory> + +#include "ash/public/cpp/app_menu_constants.h" +#include "ash/test/ash_test_base.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/models/simple_menu_model.h" +#include "ui/events/base_event_utils.h" +#include "ui/events/types/event_type.h" +#include "ui/views/controls/menu/menu_item_view.h" +#include "ui/views/controls/menu/submenu_view.h" +#include "ui/views/test/menu_test_utils.h" + +namespace ash { +namespace { + +class TestAppMenuModelAdapter : public AppMenuModelAdapter { + public: + explicit TestAppMenuModelAdapter(std::unique_ptr<ui::SimpleMenuModel> model) + : AppMenuModelAdapter("test-app-id", + std::move(model), + nullptr, + ui::MENU_SOURCE_TYPE_LAST, + base::OnceClosure(), + false) {} + TestAppMenuModelAdapter(const TestAppMenuModelAdapter&) = delete; + TestAppMenuModelAdapter& operator=(const TestAppMenuModelAdapter&) = delete; + ~TestAppMenuModelAdapter() override = default; + + private: + void RecordHistogramOnMenuClosed() override {} +}; + +} // namespace + +class AppMenuModelAdapterTest : public AshTestBase { + public: + AppMenuModelAdapterTest() = default; + AppMenuModelAdapterTest(const AppMenuModelAdapterTest&) = delete; + AppMenuModelAdapterTest& operator=(const AppMenuModelAdapterTest&) = delete; + ~AppMenuModelAdapterTest() override = default; + + // AshTestBase: + void SetUp() override { + AshTestBase::SetUp(); + + views::test::DisableMenuClosureAnimations(); + + auto menu_model = std::make_unique<ui::SimpleMenuModel>(nullptr); + submenu_model_ = std::make_unique<ui::SimpleMenuModel>(nullptr); + menu_model->AddItem(MENU_CLOSE, u"item 0"); + submenu_model_->AddItem(USE_LAUNCH_TYPE_REGULAR, u"item 2"); + menu_model->AddActionableSubMenu(LAUNCH_NEW, u"item 1", + submenu_model_.get()); + app_menu_model_adapter_ = + std::make_unique<TestAppMenuModelAdapter>(std::move(menu_model)); + } + + void ClickOnMenuItemForCommandId(int command_id) { + auto* menu_item_view = app_menu_model_adapter_->root_for_testing(); + auto* target_menu_item = menu_item_view->GetMenuItemByID(command_id); + auto location = target_menu_item->bounds().CenterPoint(); + ui::MouseEvent press_event(ui::ET_MOUSE_PRESSED, location, location, + ui::EventTimeForNow(), ui::EF_LEFT_MOUSE_BUTTON, + 0); + ui::MouseEvent release_event(ui::ET_MOUSE_RELEASED, location, location, + ui::EventTimeForNow(), + ui::EF_LEFT_MOUSE_BUTTON, 0); + auto* source = target_menu_item->GetParentMenuItem()->GetSubmenu(); + menu_item_view->GetMenuController()->OnMousePressed(source, press_event); + menu_item_view->GetMenuController()->OnMouseReleased(source, release_event); + } + + bool IsShowingSubmenuForCommandId(int command_id) { + return app_menu_model_adapter() + ->root_for_testing() + ->GetMenuItemByID(command_id) + ->SubmenuIsShowing(); + } + + void OpenMenu() { + app_menu_model_adapter_->Run(gfx::Rect(), + views::MenuAnchorPosition::kBottomCenter, + views::MenuRunner::CONTEXT_MENU | + views::MenuRunner::USE_ASH_SYS_UI_LAYOUT | + views::MenuRunner::FIXED_ANCHOR); + } + + void ShowSubmenuForCommandId(int command_id) { + auto* menu_item_view = app_menu_model_adapter_->root_for_testing(); + menu_item_view->GetMenuController()->SelectItemAndOpenSubmenu( + menu_item_view->GetMenuItemByID(command_id)); + } + + TestAppMenuModelAdapter* app_menu_model_adapter() { + return app_menu_model_adapter_.get(); + } + + private: + std::unique_ptr<TestAppMenuModelAdapter> app_menu_model_adapter_; + std::unique_ptr<ui::SimpleMenuModel> submenu_model_; +}; + +TEST_F(AppMenuModelAdapterTest, ShouldCloseMenuOnNonUseLaunchTypeCommand) { + EXPECT_FALSE(app_menu_model_adapter()->IsShowingMenu()); + OpenMenu(); + EXPECT_TRUE(app_menu_model_adapter()->IsShowingMenu()); + + ClickOnMenuItemForCommandId(MENU_CLOSE); + EXPECT_FALSE(app_menu_model_adapter()->IsShowingMenu()); +} + +TEST_F(AppMenuModelAdapterTest, ShouldCloseMenuOnLaunchNewCommand) { + EXPECT_FALSE(app_menu_model_adapter()->IsShowingMenu()); + OpenMenu(); + EXPECT_TRUE(app_menu_model_adapter()->IsShowingMenu()); + + ClickOnMenuItemForCommandId(LAUNCH_NEW); + EXPECT_FALSE(app_menu_model_adapter()->IsShowingMenu()); +} + +TEST_F(AppMenuModelAdapterTest, ShouldKeepMenuOpenOnUseLaunchTypeCommand) { + EXPECT_FALSE(app_menu_model_adapter()->IsShowingMenu()); + OpenMenu(); + EXPECT_TRUE(app_menu_model_adapter()->IsShowingMenu()); + + EXPECT_FALSE(IsShowingSubmenuForCommandId(LAUNCH_NEW)); + ShowSubmenuForCommandId(LAUNCH_NEW); + EXPECT_TRUE(IsShowingSubmenuForCommandId(LAUNCH_NEW)); + + ClickOnMenuItemForCommandId(USE_LAUNCH_TYPE_REGULAR); + EXPECT_FALSE(IsShowingSubmenuForCommandId(LAUNCH_NEW)); + EXPECT_TRUE(app_menu_model_adapter()->IsShowingMenu()); +} + +} // namespace ash
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index 78e1886..dc773a30e 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -5144,6 +5144,11 @@ <message name="IDS_DEFERRED_UPDATE_DIALOG_UPDATE_SHUT_DOWN" desc="Update and shut down button."> Update and shut down </message> + + <!-- Multitask menu --> + <message name="IDS_MULTITASK_MENU_NUDGE_TEXT" desc="Text that is shown when the multitask menu nudge is displayed."> + Keep hovering for more layout options + </message> </messages> </release> </grit>
diff --git a/ash/ash_strings_grd/IDS_MULTITASK_MENU_NUDGE_TEXT.png.sha1 b/ash/ash_strings_grd/IDS_MULTITASK_MENU_NUDGE_TEXT.png.sha1 new file mode 100644 index 0000000..b3eae60 --- /dev/null +++ b/ash/ash_strings_grd/IDS_MULTITASK_MENU_NUDGE_TEXT.png.sha1
@@ -0,0 +1 @@ +24e5903d9eed1ced06525560c92ede3ff097aa58 \ No newline at end of file
diff --git a/ash/components/arc/net/arc_net_host_impl.cc b/ash/components/arc/net/arc_net_host_impl.cc index 14f1c1a..0fa98bd 100644 --- a/ash/components/arc/net/arc_net_host_impl.cc +++ b/ash/components/arc/net/arc_net_host_impl.cc
@@ -343,7 +343,7 @@ if (const auto* device = GetStateHandler()->GetDeviceState(network_state->device_path())) { mojo->network_interface = device->interface(); - for (const auto kv : device->ip_configs().DictItems()) + for (const auto kv : device->ip_configs()) AddIpConfiguration(mojo.get(), &kv.second); }
diff --git a/ash/components/hid_detection/bluetooth_hid_detector_impl.cc b/ash/components/hid_detection/bluetooth_hid_detector_impl.cc index 8f90bc1..e711d45 100644 --- a/ash/components/hid_detection/bluetooth_hid_detector_impl.cc +++ b/ash/components/hid_detection/bluetooth_hid_detector_impl.cc
@@ -358,11 +358,13 @@ current_pairing_device_.value()->id, device_pairing_delegate_receiver_.BindNewPipeAndPassRemote(), base::BindOnce(&BluetoothHidDetectorImpl::OnPairDevice, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), + std::make_unique<base::ElapsedTimer>())); NotifyBluetoothHidDetectionStatusChanged(); } void BluetoothHidDetectorImpl::OnPairDevice( + std::unique_ptr<base::ElapsedTimer> pairing_timer, chromeos::bluetooth_config::mojom::PairingResult pairing_result) { DCHECK(current_pairing_device_) << "OnPairDevice() called with no |current_pairing_device_|"; @@ -372,10 +374,15 @@ << ", result: " << pairing_result << ", [" << queue_->size() << "] devices still in queue."; + const bool success = + pairing_result == + chromeos::bluetooth_config::mojom::PairingResult::kSuccess; + hid_detection::RecordBluetoothPairingResult(success, + pairing_timer->Elapsed()); + // If pairing has succeeded, wait for SetInputDevicesStatus() to be called // with the corresponding HID type no longer missing. - if (pairing_result == - chromeos::bluetooth_config::mojom::PairingResult::kSuccess) { + if (success) { HID_LOG(EVENT) << "Pairing succeeded, waiting for input devices status to update."; return;
diff --git a/ash/components/hid_detection/bluetooth_hid_detector_impl.h b/ash/components/hid_detection/bluetooth_hid_detector_impl.h index 63efb3b..f892f21 100644 --- a/ash/components/hid_detection/bluetooth_hid_detector_impl.h +++ b/ash/components/hid_detection/bluetooth_hid_detector_impl.h
@@ -10,6 +10,7 @@ #include "base/containers/flat_set.h" #include "base/containers/queue.h" #include "base/memory/weak_ptr.h" +#include "base/timer/elapsed_timer.h" #include "chromeos/services/bluetooth_config/public/mojom/cros_bluetooth_config.mojom.h" #include "mojo/public/cpp/bindings/receiver.h" #include "mojo/public/cpp/bindings/remote.h" @@ -98,6 +99,7 @@ void ProcessQueue(); void OnPairDevice( + std::unique_ptr<base::ElapsedTimer> pairing_timer, chromeos::bluetooth_config::mojom::PairingResult pairing_result); // Removes any state related to the current pairing device. This will cancel
diff --git a/ash/components/hid_detection/bluetooth_hid_detector_impl_unittest.cc b/ash/components/hid_detection/bluetooth_hid_detector_impl_unittest.cc index 648b8e19..be42c377 100644 --- a/ash/components/hid_detection/bluetooth_hid_detector_impl_unittest.cc +++ b/ash/components/hid_detection/bluetooth_hid_detector_impl_unittest.cc
@@ -5,6 +5,7 @@ #include "ash/components/hid_detection/bluetooth_hid_detector_impl.h" #include "ash/constants/ash_features.h" +#include "base/strings/strcat.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" @@ -35,6 +36,7 @@ const char kTestPinCode[] = "123456"; const uint32_t kTestPasskey = 123456; +const base::TimeDelta kTestDuration = base::Milliseconds(3000); class FakeBluetoothHidDetectorDelegate : public BluetoothHidDetector::Delegate { public: @@ -56,11 +58,16 @@ } // namespace class BluetoothHidDetectorImplTest : public testing::Test { - protected: - BluetoothHidDetectorImplTest() = default; + public: BluetoothHidDetectorImplTest(const BluetoothHidDetectorImplTest&) = delete; BluetoothHidDetectorImplTest& operator=(const BluetoothHidDetectorImplTest&) = delete; + + protected: + BluetoothHidDetectorImplTest() + : task_environment_( + base::test::SingleThreadTaskEnvironment::MainThreadType::UI, + base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} ~BluetoothHidDetectorImplTest() override = default; // testing::Test: @@ -157,6 +164,9 @@ const std::string& device_id, FakeDevicePairingHandler* device_pairing_handler, absl::optional<device::ConnectionFailureReason> failure_reason) { + // Mock time passing to measure pairing duration. + task_environment_.FastForwardBy(kTestDuration); + unpaired_devices_.erase( std::remove_if(unpaired_devices_.begin(), unpaired_devices_.end(), [device_id](BluetoothDevicePropertiesPtr const& device) { @@ -202,6 +212,15 @@ } } + void AssertBluetoothPairingResult(bool success, int count) { + histogram_tester_.ExpectTimeBucketCount( + base::StrCat({"OOBE.HidDetectionScreen.BluetoothPairing.Duration.", + success ? "Success" : "Failure"}), + kTestDuration, count); + histogram_tester_.ExpectBucketCount( + "OOBE.HidDetectionScreen.BluetoothPairing.Result", success, count); + } + void AssertBluetoothPairingAttemptsCount(int bucket, int count, int total_count) { @@ -506,6 +525,7 @@ AssertBluetoothHidDetectionStatus( BluetoothHidMetadata(device_id1, BluetoothHidType::kPointer), /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/0); // Mock |device_id1| being paired. BluetoothHidDetectorImpl should not inform // the delegate or move to the next device in queue until the input devices @@ -527,6 +547,7 @@ AssertBluetoothHidDetectionStatus( /*current_pairing_device=*/absl::nullopt, /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/1); std::string device_id2; AddUnpairedDevice(&device_id2, DeviceType::kKeyboard); @@ -565,6 +586,7 @@ std::string device_id2; AddUnpairedDevice(&device_id2, DeviceType::kKeyboardMouseCombo); EXPECT_EQ(1u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/0); // Mock |device_id1| being paired. BluetoothHidDetectorImpl should not inform // the delegate or move to the next device in queue until the input devices @@ -583,10 +605,28 @@ EXPECT_EQ(device_id2, GetDevicePairingHandlers()[0]->current_pairing_device_id()); EXPECT_EQ(3u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/1); AssertBluetoothHidDetectionStatus( BluetoothHidMetadata(device_id2, BluetoothHidType::kKeyboardPointerCombo), /*pairing_state=*/absl::nullopt); + // Mock |device_id2| being registered as connected. Two devices should be + // paired successfully. + MockPairDeviceFinished(device_id2, GetDevicePairingHandlers()[0], + /*failure_reason=*/absl::nullopt); + EXPECT_EQ(3u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothHidDetectionStatus( + BluetoothHidMetadata(device_id2, BluetoothHidType::kKeyboardPointerCombo), + /*pairing_state=*/absl::nullopt); + + SetInputDevicesStatus( + {.pointer_is_missing = false, .keyboard_is_missing = false}); + EXPECT_EQ(4u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothHidDetectionStatus( + /*current_pairing_device=*/absl::nullopt, + /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/2); + StopBluetoothHidDetection(/*is_using_bluetooth=*/false); AssertBluetoothPairingAttemptsCount(/*bucket=*/2, /*count=*/1, /*total_count=*/1); @@ -613,6 +653,7 @@ AssertBluetoothHidDetectionStatus( BluetoothHidMetadata(device_id1, BluetoothHidType::kPointer), /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/0); // Mock |device_id1| being paired. BluetoothHidDetectorImpl should not inform // the delegate or move to the next device in queue until the input devices @@ -634,6 +675,8 @@ AssertBluetoothHidDetectionStatus( BluetoothHidMetadata(device_id3, BluetoothHidType::kKeyboard), /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/1); + AssertBluetoothPairingResult(/*success=*/false, /*count=*/0); // Mock |device_id3| pairing failing. BluetoothHidDetectorImpl should move to // the next device in the queue immediately. @@ -643,6 +686,7 @@ AssertBluetoothHidDetectionStatus( /*current_pairing_device=*/absl::nullopt, /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/false, /*count=*/1); StopBluetoothHidDetection(/*is_using_bluetooth=*/false); AssertBluetoothPairingAttemptsCount(/*bucket=*/2, /*count=*/1, @@ -1064,6 +1108,7 @@ BluetoothHidPairingState(kTestPinCode, num_keys_entered)); } EXPECT_EQ(8u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/0); // Mock |device_id1| being paired. BluetoothHidDetectorImpl should not inform // the delegate or move to the next device in queue until the input devices @@ -1085,6 +1130,7 @@ AssertBluetoothHidDetectionStatus( BluetoothHidMetadata(device_id2, BluetoothHidType::kPointer), /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/true, /*count=*/1); // Simulate "DisplayPasskey" authorization required. GetDevicePairingHandlers()[0]->SimulateDisplayPasskey(kTestPasskey); @@ -1109,6 +1155,7 @@ BluetoothHidPairingState(kTestPinCode, num_keys_entered)); } EXPECT_EQ(17u, delegate->num_bluetooth_hid_status_changed_calls()); + AssertBluetoothPairingResult(/*success=*/false, /*count=*/0); // Mock |device_id2| pairing failing. MockPairDeviceFinished(device_id2, GetDevicePairingHandlers()[0], @@ -1116,6 +1163,7 @@ EXPECT_EQ(18u, delegate->num_bluetooth_hid_status_changed_calls()); AssertBluetoothHidDetectionStatus(/*current_pairing_device=*/absl::nullopt, /*pairing_state=*/absl::nullopt); + AssertBluetoothPairingResult(/*success=*/false, /*count=*/1); StopBluetoothHidDetection(/*is_using_bluetooth=*/false); AssertBluetoothPairingAttemptsCount(/*bucket=*/2, /*count=*/1,
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 32b81a95..58e3d06 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -140,10 +140,14 @@ const base::Feature kArcFuseBoxFileSharing{"ArcFuseBoxFileSharing", base::FEATURE_ENABLED_BY_DEFAULT}; -// Controls whether to enable support for ARC Input Overlay. +// Controls whether to enable support for ARC Input Overlay Alpha. const base::Feature kArcInputOverlay{"ArcInputOverlay", base::FEATURE_ENABLED_BY_DEFAULT}; +// Controls whether to enable support for ARC Input Overlay Beta. +const base::Feature kArcInputOverlayBeta{"ArcInputOverlayBeta", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Controls whether to enable support for ARC ADB sideloading for managed // accounts and/or devices. const base::Feature kArcManagedAdbSideloadingSupport{ @@ -872,6 +876,11 @@ "HoldingSpaceInProgressNotificationSuppression", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables rebranding of holding space to convey the relationship with +// Files to simplify feature comprehension. +const base::Feature kHoldingSpaceRebrand{"HoldingSpaceRebrand", + base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables suggestions in the pinned files section of Holding Space. const base::Feature kHoldingSpaceSuggestions{"HoldingSpaceSuggestions", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -1771,6 +1780,10 @@ return base::FeatureList::IsEnabled(kArcInputOverlay); } +bool IsArcInputOverlayBetaEnabled() { + return base::FeatureList::IsEnabled(kArcInputOverlayBeta); +} + bool IsArcNetworkDiagnosticsButtonEnabled() { return IsNetworkingInDiagnosticsAppEnabled(); } @@ -2016,6 +2029,10 @@ kHoldingSpaceInProgressDownloadsNotificationSuppression); } +bool IsHoldingSpaceRebrandEnabled() { + return base::FeatureList::IsEnabled(kHoldingSpaceRebrand); +} + bool IsHoldingSpaceSuggestionsEnabled() { return base::FeatureList::IsEnabled(kHoldingSpaceSuggestions); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index 987443f..008b0b8 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -71,6 +71,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kArcFuseBoxFileSharing; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kArcInputOverlay; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kArcInputOverlayBeta; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kArcAndGuestOsFileTasksUseAppService; COMPONENT_EXPORT(ASH_CONSTANTS) @@ -363,6 +364,8 @@ extern const base::Feature kHoldingSpaceInProgressDownloadsNotificationSuppression; COMPONENT_EXPORT(ASH_CONSTANTS) +extern const base::Feature kHoldingSpaceRebrand; +COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kHoldingSpaceSuggestions; COMPONENT_EXPORT(ASH_CONSTANTS) extern const base::Feature kHotspot; @@ -691,6 +694,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAppNotificationsPageEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsArcFuseBoxFileSharingEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsArcInputOverlayEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsArcInputOverlayBetaEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsArcNetworkDiagnosticsButtonEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAssistantNativeIconsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsAssistiveMultiWordEnabled(); @@ -756,6 +760,7 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHideShelfControlsInTabletModeEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceInProgressDownloadsNotificationSuppressionEnabled(); +COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceRebrandEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHoldingSpaceSuggestionsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHostnameSettingEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsHotspotEnabled();
diff --git a/ash/projector/projector_metrics.cc b/ash/projector/projector_metrics.cc index 8e5eae1..97f6458 100644 --- a/ash/projector/projector_metrics.cc +++ b/ash/projector/projector_metrics.cc
@@ -34,6 +34,9 @@ constexpr char kProjectorPendingScreencastChangeIntervalHistogramName[] = "Ash.Projector.PendingScreencastChangeInterval"; +constexpr char kProjectorPolicyChangeHandlingErrorHistogramName[] = + "Ash.Projector.PolicyChangeHandlingError"; + // Appends the proper suffix to |prefix| based on whether the user is in tablet // mode or not. std::string GetHistogramName(const std::string& prefix) { @@ -83,6 +86,13 @@ GetHistogramName(kProjectorCreationFlowErrorHistogramName), error); } +ASH_EXPORT void RecordPolicyChangeHandlingError( + ProjectorPolicyChangeHandlingError error) { + base::UmaHistogramEnumeration( + GetHistogramName(kProjectorPolicyChangeHandlingErrorHistogramName), + error); +} + ASH_EXPORT void RecordPendingScreencastBatchIOTaskDuration( const base::TimeDelta duration) { // We don't normally expect the duration is longer than 10s. If this limit is
diff --git a/ash/projector/projector_metrics.h b/ash/projector/projector_metrics.h index 436672f..8d884172 100644 --- a/ash/projector/projector_metrics.h +++ b/ash/projector/projector_metrics.h
@@ -93,6 +93,19 @@ kMaxValue = kTranscriptionError }; +// These enum values represent potential error that occurs at policy value +// change handling and log to UMA. Entries should not be renumbered and numeric +// values should never be reused. Please keep in sync with +// "ProjectorPolicyChangeHandlingError" in +// src/tools/metrics/histograms/enums.xml. +enum class ProjectorPolicyChangeHandlingError { + kSwaManager = 0, + kWebAppProvider = 1, + kWebAppProviderOnRegistryReady = 2, + kSyncBridge = 3, + kMaxValue = kSyncBridge +}; + // Records the buttons the user presses on the Projector toolbar. void RecordToolbarMetrics(ProjectorToolbar button); @@ -115,6 +128,11 @@ // Records the interval between the UI changes of pending screencasts. void RecordPendingScreencastChangeInterval(const base::TimeDelta interval); +// Records potential error occurs at policy change. +// TODO(b/240497023): remove this once confirmed the nullptr should never +// occurs and the nullptr check is converted to DCEHCK. +void RecordPolicyChangeHandlingError(ProjectorPolicyChangeHandlingError error); + } // namespace ash #endif // ASH_PROJECTOR_PROJECTOR_METRICS_H_
diff --git a/ash/shelf/scrollable_shelf_view_pixeltest.cc b/ash/shelf/scrollable_shelf_view_pixeltest.cc index 66c2c3ae..d9715dab 100644 --- a/ash/shelf/scrollable_shelf_view_pixeltest.cc +++ b/ash/shelf/scrollable_shelf_view_pixeltest.cc
@@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "ash/shelf/scrollable_shelf_view.h" #include "ash/shelf/test/scrollable_shelf_test_base.h" #include "ash/test/ash_pixel_diff_test_helper.h" #include "ash/test/ash_pixel_test_init_params.h" @@ -45,4 +46,50 @@ AshPixelDiffTestHelper::UiComponent::kShelfWidget)); } +class ScrollableShelfViewWithGuestModePixelTest + : public ScrollableShelfTestBase, + public testing::WithParamInterface<bool /*use_guest_mode=*/> { + public: + ScrollableShelfViewWithGuestModePixelTest() { + set_start_session(false); + PrepareForPixelDiffTest(); + } + ScrollableShelfViewWithGuestModePixelTest( + const ScrollableShelfViewWithGuestModePixelTest&) = delete; + ScrollableShelfViewWithGuestModePixelTest& operator=( + const ScrollableShelfViewWithGuestModePixelTest&) = delete; + ~ScrollableShelfViewWithGuestModePixelTest() override = default; + + // ScrollableShelfTestBase: + void SetUp() override { + ScrollableShelfTestBase::SetUp(); + pixel_test_helper_.InitSkiaGoldPixelDiff( + "scrollable_shelf_view_with_guest_mode_pixel"); + + if (GetParam()) + SimulateGuestLogin(); + else + SimulateUserLogin("user@gmail.com"); + StabilizeUIForPixelTest(); + } + + AshPixelDiffTestHelper pixel_test_helper_; +}; + +INSTANTIATE_TEST_SUITE_P(EnableGuestMode, + ScrollableShelfViewWithGuestModePixelTest, + testing::Bool()); + +// Verifies the shelf context menu. +TEST_P(ScrollableShelfViewWithGuestModePixelTest, VerifyShelfContextMenu) { + // Move the mouse to the shelf center then right-click. + const gfx::Point shelf_center = + scrollable_shelf_view_->GetBoundsInScreen().CenterPoint(); + GetEventGenerator()->MoveMouseTo(shelf_center); + GetEventGenerator()->PressRightButton(); + + EXPECT_TRUE(pixel_test_helper_.ComparePrimaryFullScreen( + GetParam() ? "shelf_context_menu_in_guest_mode" : "shelf_context_menu")); +} + } // namespace ash
diff --git a/ash/test/ash_test_base.cc b/ash/test/ash_test_base.cc index c270c0f..c93105b 100644 --- a/ash/test/ash_test_base.cc +++ b/ash/test/ash_test_base.cc
@@ -346,6 +346,13 @@ pixel_diff_init_params_ = params; } +void AshTestBase::StabilizeUIForPixelTest() { + // This function should only be used in a pixel test. + CHECK(pixel_diff_init_params_); + + ash_test_helper_->StabilizeUIForPixelTest(); +} + void AshTestBase::SetUserPref(const std::string& user_email, const std::string& path, const base::Value& value) {
diff --git a/ash/test/ash_test_base.h b/ash/test/ash_test_base.h index 6425d774a..0ed4225 100644 --- a/ash/test/ash_test_base.h +++ b/ash/test/ash_test_base.h
@@ -196,6 +196,11 @@ // call this function before `setup_called_` becomes true. void SetPixelTestInitParam(const pixel_test::InitParams& params); + // Stabilizes the variable UI components (such as the battery view). It should + // be called after the active user changes since some UI components are + // associated with the active account. + void StabilizeUIForPixelTest(); + // Returns the EventGenerator that uses screen coordinates and works // across multiple displays. It creates a new generator if it // hasn't been created yet. @@ -280,23 +285,33 @@ // behavior where |AccountId|s are compared, prefer the method of the same // name that takes an |AccountId| created with a valid storage key instead. // See the documentation for|AccountId::GetUserEmail| for discussion. + // NOTE: call `StabilizeUIForPixelTest()` after using this function in a pixel + // test. void SimulateUserLogin( const std::string& user_email, user_manager::UserType user_type = user_manager::USER_TYPE_REGULAR); // Simulates a user sign-in. It creates a new user session, adds it to // existing user sessions and makes it the active user session. + // NOTE: call `StabilizeUIForPixelTest()` after using this function in a pixel + // test. void SimulateUserLogin( const AccountId& account_id, user_manager::UserType user_type = user_manager::USER_TYPE_REGULAR); // Simular to SimulateUserLogin but for a newly created user first ever login. + // NOTE: call `StabilizeUIForPixelTest()` after using this function in a pixel + // test. void SimulateNewUserFirstLogin(const std::string& user_email); // Similar to SimulateUserLogin but for a guest user. + // NOTE: call `StabilizeUIForPixelTest()` after using this function in a pixel + // test. void SimulateGuestLogin(); // Simulates kiosk mode. |user_type| must correlate to a kiosk type user. + // NOTE: call `StabilizeUIForPixelTest()` after using this function in a pixel + // test. void SimulateKioskMode(user_manager::UserType user_type); // Simulates setting height of the accessibility panel.
diff --git a/ash/test/ash_test_helper.cc b/ash/test/ash_test_helper.cc index 920478d..cd4a0e4 100644 --- a/ash/test/ash_test_helper.cc +++ b/ash/test/ash_test_helper.cc
@@ -375,13 +375,11 @@ AccelerometerReader::GetInstance()->SetECLidAngleDriverStatusForTesting( ECLidAngleDriverStatus::NOT_SUPPORTED); + // Call `StabilizeUIForPixelTest()` after the user session is activated (if + // any) in the test setup. if (ui_stabilizer_) { DCHECK(init_params.pixel_test_init_params); - const gfx::Size primary_display_size = - display::Screen::GetScreen() - ->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow()) - .size(); - ui_stabilizer_->StabilizeUi(primary_display_size); + StabilizeUIForPixelTest(); } } @@ -399,4 +397,12 @@ session_manager::SessionState::ACTIVE); } +void AshTestHelper::StabilizeUIForPixelTest() { + const gfx::Size primary_display_size = + display::Screen::GetScreen() + ->GetDisplayNearestWindow(Shell::GetPrimaryRootWindow()) + .size(); + ui_stabilizer_->StabilizeUi(primary_display_size); +} + } // namespace ash
diff --git a/ash/test/ash_test_helper.h b/ash/test/ash_test_helper.h index ac1a8dba..b5124d5 100644 --- a/ash/test/ash_test_helper.h +++ b/ash/test/ash_test_helper.h
@@ -114,10 +114,15 @@ // Simulates a user sign-in. It creates a new user session, adds it to // existing user sessions and makes it the active user session. + // NOTE: call `StabilizeUIForPixelTest()` after calling this function in a + // pixel test. void SimulateUserLogin( const AccountId& account_id, user_manager::UserType user_type = user_manager::USER_TYPE_REGULAR); + // Stabilizes the variable UI components (such as the battery view). + void StabilizeUIForPixelTest(); + TestSessionControllerClient* test_session_controller_client() { return session_controller_client_.get(); }
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.html b/ash/webui/os_feedback_ui/resources/share_data_page.html index 0b056899..7094f6e 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.html +++ b/ash/webui/os_feedback_ui/resources/share_data_page.html
@@ -187,10 +187,12 @@ <select id="userEmailDropDown" class="md-select" aria-label="[[i18n('userEmailAriaLabel')]]"> <option value$="[[feedbackContext.email]]" + aria-label="user email" class="email-dropdown"> [[feedbackContext.email]] </option> - <option value="" id="anonymousUser" class="email-dropdown"> + <option value="" aria-label="anonymous user" + id="anonymousUser" class="email-dropdown"> [[i18n('anonymousUser')]] </option> </select>
diff --git a/ash/webui/shimless_rma/resources/shimless_rma.js b/ash/webui/shimless_rma/resources/shimless_rma.js index 7d7b63a5..ce1713e 100644 --- a/ash/webui/shimless_rma/resources/shimless_rma.js +++ b/ash/webui/shimless_rma/resources/shimless_rma.js
@@ -531,6 +531,22 @@ if (this.handleStandardAndCriticalError_(stateResult.stateResult.error)) { return; } + + // This is a special case for showing the reboot page when the platform + // sends the error code for expecting a reboot. + if (stateResult.stateResult.error === RmadErrorCode.kExpectReboot) { + const rebootState = { + stateResult: { + state: State.kReboot, + canExit: false, + canGoBack: false, + error: stateResult.stateResult.error, + }, + }; + this.showState_(rebootState); + return; + } + this.showState_(stateResult); }
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 2d792586..873ea777 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -528,7 +528,11 @@ // Don't trigger an a11y alert when the source is kLaunchTemplate because // CreateNewDeskForTemplate will trigger an alert instead. - if (source != DesksCreationRemovalSource::kLaunchTemplate) { + // Dont trigger when the source is kSaveAndRecall because the + // DESK_TEMPLATES_MODE_ENTERED alert triggered in + // OverviewSession::ShowDesksTemplatesGrids should be shown instead. + if (source != DesksCreationRemovalSource::kLaunchTemplate && + source != DesksCreationRemovalSource::kSaveAndRecall) { auto* shell = Shell::Get(); shell->accessibility_controller()->TriggerAccessibilityAlertWithMessage( l10n_util::GetStringFUTF8(IDS_ASH_VIRTUAL_DESKS_ALERT_NEW_DESK_CREATED,
diff --git a/ash/wm/desks/templates/saved_desk_item_view.cc b/ash/wm/desks/templates/saved_desk_item_view.cc index 615b9c5e..e4d472ce 100644 --- a/ash/wm/desks/templates/saved_desk_item_view.cc +++ b/ash/wm/desks/templates/saved_desk_item_view.cc
@@ -737,8 +737,8 @@ delay = base::Seconds(3); #endif - saved_desk_util::GetSavedDeskPresenter()->LaunchDeskTemplate( - desk_template_->uuid().AsLowercaseString(), delay, + saved_desk_util::GetSavedDeskPresenter()->LaunchSavedDesk( + desk_template_->Clone(), delay, GetWidget()->GetNativeWindow()->GetRootWindow()); }
diff --git a/ash/wm/desks/templates/saved_desk_presenter.cc b/ash/wm/desks/templates/saved_desk_presenter.cc index b06bbbb..b78a4b66 100644 --- a/ash/wm/desks/templates/saved_desk_presenter.cc +++ b/ash/wm/desks/templates/saved_desk_presenter.cc
@@ -364,9 +364,10 @@ weak_ptr_factory_.GetWeakPtr(), uuid, record_for_type)); } -void SavedDeskPresenter::LaunchDeskTemplate(const std::string& template_uuid, - base::TimeDelta delay, - aura::Window* root_window) { +void SavedDeskPresenter::LaunchSavedDesk( + std::unique_ptr<DeskTemplate> saved_desk, + base::TimeDelta delay, + aura::Window* root_window) { // If we are at the max desk limit (currently is 8), a new desk // cannot be created, and a toast will be displayed to the user. if (!DesksController::Get()->CanCreateDesks()) { @@ -381,13 +382,21 @@ return; } - weak_ptr_factory_.InvalidateWeakPtrs(); + // Copy fields we need from `desk_template` since we're about to move it. Also + // be very careful about doing anything after `CreateNewDeskForTemplate` since + // it may exit overview (and thus destroy `this`). + // See https://crbug.com/1284138. + const auto saved_desk_name = saved_desk->template_name(); + const auto saved_desk_type = saved_desk->type(); + const bool activate_desk = saved_desk_type == DeskTemplateType::kTemplate; + DesksController::Get()->CreateNewDeskForTemplate( + activate_desk, + base::BindOnce(&SavedDeskPresenter::OnNewDeskCreatedForTemplate, + weak_ptr_factory_.GetWeakPtr(), std::move(saved_desk), + base::Time::Now(), delay, root_window), + saved_desk_name); - GetDeskModel()->GetEntryByUUID( - template_uuid, - base::BindOnce(&SavedDeskPresenter::OnGetTemplateForDeskLaunch, - weak_ptr_factory_.GetWeakPtr(), base::Time::Now(), delay, - root_window)); + RecordLaunchSavedDeskHistogram(saved_desk_type); } void SavedDeskPresenter::MaybeSaveActiveDeskAsTemplate( @@ -505,36 +514,6 @@ RemoveUIEntries({uuid}); } -void SavedDeskPresenter::OnGetTemplateForDeskLaunch( - base::Time time_launch_started, - base::TimeDelta delay, - aura::Window* root_window, - desks_storage::DeskModel::GetEntryByUuidStatus status, - std::unique_ptr<DeskTemplate> entry) { - if (status != desks_storage::DeskModel::GetEntryByUuidStatus::kOk) - return; - - // `CreateAndActivateNewDeskForTemplate` may destroy `this`. Copy the member - // variables to a local to prevent UAF. See https://crbug.com/1284138. - base::OnceClosure on_update_ui_closure_for_testing = - std::move(on_update_ui_closure_for_testing_); - - const auto saved_desk_name = entry->template_name(); - const auto saved_desk_type = entry->type(); - const bool activate_desk = saved_desk_type == DeskTemplateType::kTemplate; - DesksController::Get()->CreateNewDeskForTemplate( - activate_desk, - base::BindOnce(&SavedDeskPresenter::OnNewDeskCreatedForTemplate, - weak_ptr_factory_.GetWeakPtr(), std::move(entry), - time_launch_started, delay, root_window), - saved_desk_name); - - if (on_update_ui_closure_for_testing) - std::move(on_update_ui_closure_for_testing).Run(); - - RecordLaunchSavedDeskHistogram(saved_desk_type); -} - void SavedDeskPresenter::OnNewDeskCreatedForTemplate( std::unique_ptr<DeskTemplate> desk_template, base::Time time_launch_started,
diff --git a/ash/wm/desks/templates/saved_desk_presenter.h b/ash/wm/desks/templates/saved_desk_presenter.h index 902da4f..c9b6ab9 100644 --- a/ash/wm/desks/templates/saved_desk_presenter.h +++ b/ash/wm/desks/templates/saved_desk_presenter.h
@@ -65,11 +65,11 @@ void DeleteEntry(const std::string& uuid, absl::optional<DeskTemplateType> record_for_type); - // Launches the desk template with 'template_uuid' as a new desk. `delay` is - // the time between each app launch, used for debugging. - void LaunchDeskTemplate(const std::string& template_uuid, - base::TimeDelta delay, - aura::Window* root_window); + // Launches `saved_desk` into a new desk. `delay` is the time between each app + // launch, used for debugging. + void LaunchSavedDesk(std::unique_ptr<DeskTemplate> saved_desk, + base::TimeDelta delay, + aura::Window* root_window); // Calls the DeskModel to capture the active desk as a `template_type`, with a // callback to `OnAddOrUpdateEntry`. If there are unsupported apps on the @@ -110,14 +110,6 @@ absl::optional<DeskTemplateType> record_for_type, desks_storage::DeskModel::DeleteEntryStatus status); - // Launches DeskTemplate after retrieval from storage. - void OnGetTemplateForDeskLaunch( - base::Time time_launch_started, - base::TimeDelta delay, - aura::Window* const root_window, - desks_storage::DeskModel::GetEntryByUuidStatus status, - std::unique_ptr<DeskTemplate> entry); - // Callback after creating a new desk for launching a template. void OnNewDeskCreatedForTemplate(std::unique_ptr<DeskTemplate> desk_template, base::Time time_launch_started,
diff --git a/ash/wm/desks/templates/saved_desk_unittest.cc b/ash/wm/desks/templates/saved_desk_unittest.cc index c4ae226..232404c 100644 --- a/ash/wm/desks/templates/saved_desk_unittest.cc +++ b/ash/wm/desks/templates/saved_desk_unittest.cc
@@ -1288,7 +1288,6 @@ // Click on the grid item to launch the template. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - WaitForDesksTemplatesUI(); // Verify that we have created and activated a new desk. EXPECT_EQ(2ul, desks_controller->desks().size()); @@ -1305,7 +1304,6 @@ SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid( /*grid_item_index=*/0); ClickOnView(SavedDeskItemViewTestApi(item_view).launch_button()); - WaitForDesksTemplatesUI(); EXPECT_EQ(3ul, desks_controller->desks().size()); EXPECT_EQ(2, desks_controller->GetActiveDeskIndex()); @@ -1327,7 +1325,6 @@ SavedDeskItemView* item_view = GetItemViewFromTemplatesGrid( /*grid_item_index=*/0); ClickOnView(SavedDeskItemViewTestApi(item_view).launch_button()); - WaitForDesksTemplatesUI(); // Verify that we have created and activated a new desk. EXPECT_EQ(2ul, desks_controller->desks().size()); @@ -2287,8 +2284,6 @@ // Click on the grid item to launch the template. We should remain in overview // and there should be no crash. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - // Launching a template fetches it from the desk model asynchronously. - WaitForDesksTemplatesUI(); EXPECT_TRUE(InOverviewSession()); } @@ -2314,8 +2309,6 @@ // Click on the grid item to launch the template. There should be no crash. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - // Launching a template fetches it from the desk model asynchronously. - WaitForDesksTemplatesUI(); EXPECT_TRUE(InOverviewSession()); } @@ -2343,7 +2336,6 @@ // Click on the grid item to launch the template. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - WaitForDesksTemplatesUI(); EXPECT_TRUE(InOverviewSession()); // Go back to the library view and verify that we have the same amount of @@ -3052,7 +3044,6 @@ // Click on the grid item to launch the template. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - WaitForDesksTemplatesUI(); // Verify that we have created and activated a new desk. EXPECT_EQ(2ul, desks_controller->desks().size()); @@ -3398,7 +3389,6 @@ // Launch a new desk. ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - WaitForDesksTemplatesUI(); views::Widget* library_widget = GetOverviewGridList()[0]->saved_desk_library_widget(); @@ -3531,7 +3521,6 @@ ASSERT_EQ(1ul, GetAllEntries().size()); ClickOnView(GetItemViewFromTemplatesGrid(/*grid_item_index=*/0)); - WaitForDesksTemplatesUI(); // Test that overview is still active and there is no crash. EXPECT_TRUE(Shell::Get()->overview_controller()->InOverviewSession()); @@ -3680,7 +3669,6 @@ GetItemViewFromTemplatesGrid(/*grid_item_index=*/0); DCHECK(template_item); ClickOnView(template_item); - WaitForDesksTemplatesUI(); ASSERT_EQ(2, controller->GetNumberOfDesks()); // The visible on all desks window belongs to the active desk, and has an @@ -4272,7 +4260,6 @@ GetItemViewFromTemplatesGrid(/*grid_item_index=*/0); ASSERT_TRUE(template_item); ClickOnView(template_item); - WaitForDesksTemplatesUI(); // Verify that a new desk has been created and that it has the name of the // saved desk.
diff --git a/ash/wm/float/float_controller.cc b/ash/wm/float/float_controller.cc index 16dce3cc..0d341455 100644 --- a/ash/wm/float/float_controller.cc +++ b/ash/wm/float/float_controller.cc
@@ -219,7 +219,7 @@ return true; } -void FloatController::MaybeTuckFloatedWindow() { +void FloatController::MaybeTuckFloatedWindowForTablet() { if (scoped_window_tucker_) return; @@ -228,11 +228,11 @@ UpdateWindowBoundsForTablet(float_window_); } -void FloatController::MaybeUntuckFloatedWindow() { +void FloatController::MaybeUntuckFloatedWindowForTablet() { scoped_window_tucker_.reset(); } -void FloatController::OnDragCompleted( +void FloatController::OnDragCompletedForTablet( const gfx::PointF& last_location_in_parent) { DCHECK(float_window_); @@ -262,7 +262,7 @@ UpdateWindowBoundsForTablet(float_window_); } -void FloatController::OnFlingOrSwipe(bool left, bool up) { +void FloatController::OnFlingOrSwipeForTablet(bool left, bool up) { DCHECK(float_window_); if (left && up) { magnetism_corner_ = MagnetismCorner::kTopLeft; @@ -275,7 +275,7 @@ magnetism_corner_ = MagnetismCorner::kBottomRight; } - MaybeTuckFloatedWindow(); + MaybeTuckFloatedWindowForTablet(); } void FloatController::OnWindowDestroying(aura::Window* window) {
diff --git a/ash/wm/float/float_controller.h b/ash/wm/float/float_controller.h index b83d11b..b74abd8 100644 --- a/ash/wm/float/float_controller.h +++ b/ash/wm/float/float_controller.h
@@ -62,19 +62,19 @@ // Tucks or untucks `float_window_`. Does nothing if the window is already // tucked or untucked. - void MaybeTuckFloatedWindow(); - void MaybeUntuckFloatedWindow(); + void MaybeTuckFloatedWindowForTablet(); + void MaybeUntuckFloatedWindowForTablet(); // Called by the resizer when a drag is completed. This assumes the dragged // window associated with the resizer is `float_window_`. Updates the bounds // and magnetism of the floated window. - void OnDragCompleted(const gfx::PointF& last_location_in_parent); + void OnDragCompletedForTablet(const gfx::PointF& last_location_in_parent); // Called by the resizer when a drag is completed by a fling or swipe gesture // event. Updates the magnetism of the window and then tucks the window // offscreen. `left` and `up` are used to determine the direction of the fling // or swipe gesture. - void OnFlingOrSwipe(bool left, bool up); + void OnFlingOrSwipeForTablet(bool left, bool up); // aura::WindowObserver: void OnWindowDestroying(aura::Window* window) override;
diff --git a/ash/wm/float/float_controller_unittest.cc b/ash/wm/float/float_controller_unittest.cc index 3fa734f..139e3cd2 100644 --- a/ash/wm/float/float_controller_unittest.cc +++ b/ash/wm/float/float_controller_unittest.cc
@@ -33,6 +33,18 @@ namespace ash { +// Gets the frame for `window` and prepares it for dragging. +NonClientFrameViewAsh* SetUpAndGetFrame(aura::Window* window) { + // Exiting immersive mode because of float does not seem to trigger a layout + // like it does in production code. Here we force a layout, otherwise the + // client view will remain the size of the widget, and dragging it will give + // us HTCLIENT. + auto* frame = NonClientFrameViewAsh::Get(window); + DCHECK(frame); + frame->Layout(); + return frame; +} + class WindowFloatTest : public AshTestBase { public: WindowFloatTest() = default; @@ -352,13 +364,7 @@ Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - - // Exiting immersive mode because of float does not seem to trigger a layout - // like it does in production code. Here we force a layout, otherwise the - // client view will remain the size of the widget, and dragging it will give - // us HTCLIENT. - auto* frame = NonClientFrameViewAsh::Get(window.get()); - frame->Layout(); + NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); const int padding = FloatController::kFloatWindowPaddingDp; const int shelf_size = ShelfConfig::Get()->shelf_size(); @@ -367,22 +373,20 @@ EXPECT_EQ(gfx::Point(1600 - padding, 1000 - padding - shelf_size), window->bounds().bottom_right()); + // Move the mouse somewhere in the top right, but not too right that it falls + // into the snap region. Test that on release, it magnetizes to the top right. HeaderView* header_view = frame->GetHeaderView(); auto* event_generator = GetEventGenerator(); event_generator->set_current_screen_location( header_view->GetBoundsInScreen().CenterPoint()); - event_generator->PressLeftButton(); - event_generator->MoveMouseTo(1590, 10); - event_generator->ReleaseLeftButton(); + event_generator->DragMouseTo(1490, 10); EXPECT_EQ(gfx::Point(1600 - padding, padding), window->bounds().top_right()); - // Move the mouse to somewhere in the top left. Test that on release, it - // magnetizes to the top left. + // Move the mouse to somewhere in the top left, but not too left that it falls + // into the snap region. Test that on release, it magnetizes to the top left. event_generator->set_current_screen_location( header_view->GetBoundsInScreen().CenterPoint()); - event_generator->PressLeftButton(); - event_generator->MoveMouseTo(10, 10); - event_generator->ReleaseLeftButton(); + event_generator->DragMouseTo(110, 10); EXPECT_EQ(gfx::Point(padding, padding), window->bounds().origin()); // Switch to portrait orientation and move the mouse somewhere in the bottom @@ -390,26 +394,55 @@ UpdateDisplay("1000x1600"); event_generator->set_current_screen_location( header_view->GetBoundsInScreen().CenterPoint()); - event_generator->PressLeftButton(); - event_generator->MoveMouseTo(10, 1590); - event_generator->ReleaseLeftButton(); + event_generator->DragMouseTo(110, 1590); EXPECT_EQ(gfx::Point(padding, 1600 - shelf_size - padding), window->bounds().bottom_left()); } +// Tests that if a floating window is dragged to the edges, it will snap. +TEST_F(TabletWindowFloatTest, DraggingSnapping) { + // Use a set display size so we can drag to specific spots. + UpdateDisplay("1600x1000"); + + Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); + + std::unique_ptr<aura::Window> window = CreateFloatedWindow(); + NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); + + auto* split_view_controller = + SplitViewController::Get(Shell::GetPrimaryRootWindow()); + ASSERT_FALSE(split_view_controller->left_window()); + ASSERT_FALSE(split_view_controller->right_window()); + + // Move the mouse to towards the right edge. Test that on release, it snaps + // right. + HeaderView* header_view = frame->GetHeaderView(); + auto* event_generator = GetEventGenerator(); + event_generator->set_current_screen_location( + header_view->GetBoundsInScreen().CenterPoint()); + event_generator->DragMouseTo(1580, 500); + EXPECT_EQ(split_view_controller->right_window(), window.get()); + ASSERT_TRUE(WindowState::Get(window.get())->IsSnapped()); + + // Float the window so we can drag it again. + PressAndReleaseKey(ui::VKEY_F, ui::EF_ALT_DOWN | ui::EF_COMMAND_DOWN); + ASSERT_TRUE(WindowState::Get(window.get())->IsFloated()); + + // Move the mouse to towards the left edge. Test that on release, it snaps + // left. + event_generator->set_current_screen_location( + header_view->GetBoundsInScreen().CenterPoint()); + event_generator->DragMouseTo(20, 500); + EXPECT_EQ(split_view_controller->left_window(), window.get()); +} + // Tests the functionality of tucking a window in tablet mode. Tucking a window // is hiding partially offscreen to the side. TEST_F(TabletWindowFloatTest, TuckedWindow) { Shell::Get()->tablet_mode_controller()->SetEnabledForTest(true); std::unique_ptr<aura::Window> window = CreateFloatedWindow(); - - // Exiting immersive mode because of float does not seem to trigger a layout - // like it does in production code. Here we force a layout, otherwise the - // client view will remain the size of the widget, and dragging it will give - // us HTCLIENT. - auto* frame = NonClientFrameViewAsh::Get(window.get()); - frame->Layout(); + NonClientFrameViewAsh* frame = SetUpAndGetFrame(window.get()); // Generate a fling to the top left corner. Tests that the window is tucked, // and 100 pixels are visible to the user.
diff --git a/ash/wm/float/tablet_mode_float_window_resizer.cc b/ash/wm/float/tablet_mode_float_window_resizer.cc index 1cff32e..f20cef2a 100644 --- a/ash/wm/float/tablet_mode_float_window_resizer.cc +++ b/ash/wm/float/tablet_mode_float_window_resizer.cc
@@ -5,19 +5,45 @@ #include "ash/wm/float/tablet_mode_float_window_resizer.h" #include "ash/shell.h" +#include "ash/wm/drag_details.h" #include "ash/wm/float/float_controller.h" +#include "ash/wm/splitview/split_view_drag_indicators.h" +#include "ash/wm/splitview/split_view_utils.h" #include "ash/wm/window_state.h" #include "chromeos/ui/wm/features.h" #include "ui/aura/window.h" +#include "ui/wm/core/coordinate_conversion.h" namespace ash { +namespace { + +// TODO(crbug.com/1351562): The following constants are the same the drag window +// from shelf feature. They need to be changed for this feature, or moved to a +// shared location. + +// If the window drag starts within `kDistanceFromEdge` from screen edge, it +// will get snapped if the drag ends in the snap region, no matter how far the +// window has been dragged. +constexpr int kDistanceFromEdge = 8; + +// A window has to be dragged toward the direction of the edge of the screen for +// a minimum of `kMinDragDistance` to a point within `kScreenEdgeInsetForSnap` +// of the edge of the screen, or dragged inside `kDistanceEdge` from edge to be +// snapped. +constexpr int kMinDragDistance = 96; +constexpr int kScreenEdgeInsetForSnap = 48; + +} // namespace + TabletModeFloatWindowResizer::TabletModeFloatWindowResizer( WindowState* window_state) - : WindowResizer(window_state) { + : WindowResizer(window_state), + split_view_drag_indicators_(std::make_unique<SplitViewDragIndicators>( + window_state->window()->GetRootWindow())) { DCHECK(chromeos::wm::features::IsFloatWindowEnabled()); // TODO(sophiewen): Remove this once the untuck window widget is implemented. - Shell::Get()->float_controller()->MaybeUntuckFloatedWindow(); + Shell::Get()->float_controller()->MaybeUntuckFloatedWindowForTablet(); } TabletModeFloatWindowResizer::~TabletModeFloatWindowResizer() { @@ -28,16 +54,52 @@ int event_flags) { last_location_in_parent_ = location_in_parent; + aura::Window* window = GetTarget(); gfx::Rect bounds = CalculateBoundsForDrag(location_in_parent); - if (bounds != GetTarget()->bounds()) + if (bounds != window->bounds()) SetBoundsDuringResize(bounds); + + // Update `snap_position_` and the snap drag indicators. + gfx::PointF location_in_screen = location_in_parent; + gfx::PointF initial_location_in_screen = details().initial_location_in_parent; + wm::ConvertPointToScreen(window->parent(), &location_in_screen); + wm::ConvertPointToScreen(window->parent(), &initial_location_in_screen); + + snap_position_ = GetSnapPosition( + window->GetRootWindow(), window, gfx::ToRoundedPoint(location_in_screen), + gfx::ToRoundedPoint(initial_location_in_screen), + /*snap_distance_from_edge=*/kDistanceFromEdge, + /*minimum_drag_distance=*/kMinDragDistance, + /*horizontal_edge_inset=*/kScreenEdgeInsetForSnap, + /*vertical_edge_inset=*/kScreenEdgeInsetForSnap); + // TODO(crbug.com/1351562): Ensure that this works for all orientations. + split_view_drag_indicators_->SetWindowDraggingState( + SplitViewDragIndicators::ComputeWindowDraggingState( + /*is_dragging=*/true, + SplitViewDragIndicators::WindowDraggingState::kFromFloat, + snap_position_)); } void TabletModeFloatWindowResizer::CompleteDrag() { aura::Window* float_window = GetTarget(); + if (snap_position_ != SplitViewController::NONE) { + // Let `SplitViewController` handle windows that should be snapped. + auto* split_view_controller = + SplitViewController::Get(Shell::GetPrimaryRootWindow()); + DCHECK(split_view_controller->CanSnapWindow(float_window)); + gfx::PointF location_in_screen = last_location_in_parent_; + wm::ConvertPointToScreen(float_window->parent(), &location_in_screen); + // TODO(crbug.com/1351562): Ensure that this works for all orientations. + split_view_controller->OnWindowDragEnded( + float_window, snap_position_, gfx::ToRoundedPoint(location_in_screen)); + return; + } + + // `FloatController` will magnetize windows to one of the corners if it + // remains in float state and not tucked. auto* float_controller = Shell::Get()->float_controller(); DCHECK(WindowState::Get(float_window)->IsFloated()); - float_controller->OnDragCompleted(last_location_in_parent_); + float_controller->OnDragCompletedForTablet(last_location_in_parent_); } void TabletModeFloatWindowResizer::RevertDrag() { @@ -56,7 +118,7 @@ up = details.swipe_up(); } - Shell::Get()->float_controller()->OnFlingOrSwipe(left, up); + Shell::Get()->float_controller()->OnFlingOrSwipeForTablet(left, up); } } // namespace ash
diff --git a/ash/wm/float/tablet_mode_float_window_resizer.h b/ash/wm/float/tablet_mode_float_window_resizer.h index b007853..9284fdd 100644 --- a/ash/wm/float/tablet_mode_float_window_resizer.h +++ b/ash/wm/float/tablet_mode_float_window_resizer.h
@@ -5,10 +5,12 @@ #ifndef ASH_WM_FLOAT_TABLET_MODE_FLOAT_WINDOW_RESIZER_H_ #define ASH_WM_FLOAT_TABLET_MODE_FLOAT_WINDOW_RESIZER_H_ +#include "ash/wm/splitview/split_view_controller.h" #include "ash/wm/window_resizer.h" namespace ash { +class SplitViewDragIndicators; class WindowState; // WindowResizer implementation for floated windows in tablet mode. @@ -29,8 +31,16 @@ void FlingOrSwipe(ui::GestureEvent* event) override; private: + // Responsible for showing an indication of whether the dragged window will be + // snapped on drag complete. + std::unique_ptr<SplitViewDragIndicators> split_view_drag_indicators_; + // The location in parent passed to `Drag()`. gfx::PointF last_location_in_parent_; + + // The snap position computed in `Drag()`. It is then cached for use in + // `CompleteDrag()`. + SplitViewController::SnapPosition snap_position_ = SplitViewController::NONE; }; } // namespace ash
diff --git a/ash/wm/multitask_menu_nudge_controller.cc b/ash/wm/multitask_menu_nudge_controller.cc index c69c871..07ca0cb 100644 --- a/ash/wm/multitask_menu_nudge_controller.cc +++ b/ash/wm/multitask_menu_nudge_controller.cc
@@ -4,9 +4,10 @@ #include "ash/wm/multitask_menu_nudge_controller.h" -#include "ash/resources/vector_icons/vector_icons.h" #include "ash/session/session_controller_impl.h" #include "ash/shell.h" +#include "ash/strings/grit/ash_strings.h" +#include "ash/style/system_toast_style.h" #include "ash/wm/tablet_mode/tablet_mode_controller.h" #include "ash/wm/window_util.h" #include "chromeos/ui/frame/caption_buttons/frame_caption_button_container_view.h" @@ -15,21 +16,17 @@ #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user_type.h" +#include "ui/aura/client/aura_constants.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/compositor/layer.h" #include "ui/gfx/geometry/transform_util.h" -#include "ui/gfx/paint_vector_icon.h" #include "ui/views/animation/animation_builder.h" -#include "ui/views/background.h" -#include "ui/views/controls/image_view.h" -#include "ui/views/controls/label.h" -#include "ui/views/layout/box_layout_view.h" #include "ui/views/widget/widget.h" #include "ui/views/window/frame_caption_button.h" #include "ui/wm/core/coordinate_conversion.h" namespace ash { -constexpr int kNudgeCornerRadius = 16; constexpr base::TimeDelta kNudgeDismissTimeout = base::Seconds(6); // The name of an integer pref that counts the number of times we have shown the @@ -49,6 +46,8 @@ constexpr base::TimeDelta kFadeDuration = base::Milliseconds(50); +constexpr int kNudgeDistanceFromAnchor = 8; + // The max pulse size will be three times the size of the maximize/restore // button. constexpr float kPulseSizeMultiplier = 3.0f; @@ -72,28 +71,10 @@ params.parent = parent; auto widget = std::make_unique<views::Widget>(std::move(params)); - - // The contents view is a view that contains an icon and a label. - // TODO(crbug.com/1329233): The values, colors and text are all placeholders - // until the spec is received. - auto contents_view = - views::Builder<views::BoxLayoutView>() - .SetOrientation(views::BoxLayout::Orientation::kHorizontal) - .SetBackground(views::CreateRoundedRectBackground(SK_ColorGRAY, - kNudgeCornerRadius)) - .SetInsideBorderInsets(gfx::Insets(5)) - .SetBetweenChildSpacing(10) - .AddChildren( - views::Builder<views::ImageView>() - .SetPreferredSize(gfx::Size(30, 30)) - .SetImage(gfx::CreateVectorIcon( - kPersistentDesksBarFeedbackIcon, 30, SK_ColorWHITE)), - views::Builder<views::Label>() - .SetHorizontalAlignment(gfx::ALIGN_LEFT) - .SetText( - u"Keep hovering on maximize for more layout options")) - .Build(); - widget->SetContentsView(std::move(contents_view)); + widget->SetContentsView(std::make_unique<SystemToastStyle>( + base::DoNothing(), + l10n_util::GetStringUTF16(IDS_MULTITASK_MENU_NUDGE_TEXT), + /*dismiss_text=*/u"", /*is_managed=*/false)); return widget; } @@ -173,7 +154,7 @@ // Create the layer which pulses on the maximize/restore button. pulse_layer_ = std::make_unique<ui::Layer>(ui::LAYER_SOLID_COLOR); - pulse_layer_->SetColor(SK_ColorBLUE); + pulse_layer_->SetColor(SK_ColorGRAY); window_->parent()->layer()->Add(pulse_layer_.get()); UpdateWidgetAndPulse(); @@ -315,7 +296,8 @@ const gfx::Size size = nudge_widget_->GetContentsView()->GetPreferredSize(); const gfx::Rect bounds_in_screen( anchor_bounds_in_screen.CenterPoint().x() - size.width() / 2, - anchor_bounds_in_screen.bottom(), size.width(), size.height()); + anchor_bounds_in_screen.bottom() + kNudgeDistanceFromAnchor, size.width(), + size.height()); nudge_widget_->SetBounds(bounds_in_screen); // The circular pulse should be a square that matches the smaller dimension of @@ -345,8 +327,8 @@ pulse_layer_->SetOpacity(1.0f); pulse_layer_->SetTransform(gfx::Transform()); - // Note that `views::AnimationBuilder::Repeatedly` does not work when one of - // the animation sequences has zero duration. + // Note that `views::AnimationBuilder::Repeatedly` works here as well, but + // causes tests to hang. views::AnimationBuilder builder; builder .SetPreemptionStrategy(
diff --git a/ash/wm/overview/overview_grid.cc b/ash/wm/overview/overview_grid.cc index abd2a14..ac0d4f9 100644 --- a/ash/wm/overview/overview_grid.cc +++ b/ash/wm/overview/overview_grid.cc
@@ -331,6 +331,9 @@ case SplitViewDragIndicators::WindowDraggingState::kFromTop: case SplitViewDragIndicators::WindowDraggingState::kFromShelf: return 1.f; + case SplitViewDragIndicators::WindowDraggingState::kFromFloat: + NOTREACHED(); + return 0.f; } }
diff --git a/ash/wm/overview/overview_test_base.cc b/ash/wm/overview/overview_test_base.cc index 6312230..323198d9 100644 --- a/ash/wm/overview/overview_test_base.cc +++ b/ash/wm/overview/overview_test_base.cc
@@ -177,7 +177,15 @@ cache_ = std::make_unique<apps::AppRegistryCache>(); desk_model_ = std::make_unique<desks_storage::LocalDeskDataManager>( user_data_temp_dir_.GetPath(), account_id_); - base::RunLoop().RunUntilIdle(); + + // Wait for desk model to become ready. + while (!desk_model_->IsReady()) { + base::RunLoop run_loop; + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( + FROM_HERE, run_loop.QuitClosure(), base::Milliseconds(50)); + run_loop.Run(); + } + desk_model_->SetExcludeSaveAndRecallDeskInMaxEntryCountForTesting(false); desks_storage::desk_test_util::PopulateAppRegistryCache(account_id_, cache_.get());
diff --git a/ash/wm/splitview/split_view_drag_indicators.h b/ash/wm/splitview/split_view_drag_indicators.h index 0a297e48..3734af5 100644 --- a/ash/wm/splitview/split_view_drag_indicators.h +++ b/ash/wm/splitview/split_view_drag_indicators.h
@@ -32,10 +32,11 @@ kRightText = 8 }; -// An overlay in overview mode which guides users while they are attempting to -// enter splitview. Displays text and highlights when dragging an overview -// window. Displays a highlight of where the window will end up when an overview -// window has entered a snap region. +// An overlay in which guides users while they are attempting to enter +// splitview. Displays text and highlights when dragging an overview window. +// Displays a highlight of where the window will end up when a window has +// entered a snap region. Shown when the user is dragging an overview window, +// dragging a floated window, or dragging a window from the shelf. class ASH_EXPORT SplitViewDragIndicators { public: // Enum for purposes of providing |SplitViewDragIndicators| with information @@ -64,6 +65,12 @@ // snapped in split view. kFromShelf, + // Started dragging from the float window state via the caption. Split view + // is supported. If this is the state, the window will not be snapped when + // released; it will either not be in the snapping region, or in the + // snapping region but not snappable. + kFromFloat, + // Currently dragging in the |SplitViewController::LEFT| snap area, and the // dragged window is eligible to be snapped in split view. kToSnapLeft,
diff --git a/base/BUILD.gn b/base/BUILD.gn index a707f0b..741cd65 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -4489,6 +4489,7 @@ robolectric_binary("base_junit_tests") { sources = [ "android/junit/src/org/chromium/base/ApplicationStatusTest.java", + "android/junit/src/org/chromium/base/BuildInfoTest.java", "android/junit/src/org/chromium/base/CallbackControllerTest.java", "android/junit/src/org/chromium/base/CollectionUtilTest.java", "android/junit/src/org/chromium/base/DiscardableReferencePoolTest.java",
diff --git a/base/android/build_info.cc b/base/android/build_info.cc index 15ae0c5a..1786ae3 100644 --- a/base/android/build_info.cc +++ b/base/android/build_info.cc
@@ -81,7 +81,8 @@ is_tv_(GetIntParam(params, 23)), version_incremental_(StrDupParam(params, 24)), hardware_(StrDupParam(params, 25)), - is_at_least_t_(GetIntParam(params, 26)) {} + is_at_least_t_(GetIntParam(params, 26)), + is_automotive_(GetIntParam(params, 27)) {} // static BuildInfo* BuildInfo::GetInstance() {
diff --git a/base/android/build_info.h b/base/android/build_info.h index 294f9740..d788b5d 100644 --- a/base/android/build_info.h +++ b/base/android/build_info.h
@@ -142,6 +142,8 @@ bool is_at_least_t() const { return is_at_least_t_; } + bool is_automotive() const { return is_automotive_; } + private: friend struct BuildInfoSingletonTraits; @@ -179,6 +181,7 @@ const char* const version_incremental_; const char* const hardware_; const bool is_at_least_t_; + const bool is_automotive_; }; } // namespace android
diff --git a/base/android/early_trace_event_binding.cc b/base/android/early_trace_event_binding.cc index 811bdea8..5d2057d 100644 --- a/base/android/early_trace_event_binding.cc +++ b/base/android/early_trace_event_binding.cc
@@ -104,12 +104,12 @@ jlong id, jlong time_ns) { std::string name = ConvertJavaStringToUTF8(env, jname); - - TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP_AND_FLAGS0( - internal::kJavaTraceCategory, name.c_str(), - TRACE_ID_LOCAL(static_cast<uint64_t>(id)), - TimeTicks::FromJavaNanoTime(time_ns), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr, + perfetto::Track(static_cast<uint64_t>(id)), + TimeTicks::FromJavaNanoTime(time_ns), + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(name.c_str()); + }); } static void JNI_EarlyTraceEvent_RecordEarlyAsyncEndEvent( @@ -118,12 +118,8 @@ jlong id, jlong time_ns) { std::string name = ConvertJavaStringToUTF8(env, jname); - - TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP_AND_FLAGS0( - internal::kJavaTraceCategory, name.c_str(), - TRACE_ID_LOCAL(static_cast<uint64_t>(id)), - TimeTicks::FromJavaNanoTime(time_ns), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_END(internal::kJavaTraceCategory, + perfetto::Track(static_cast<uint64_t>(id))); } bool GetBackgroundStartupTracingFlag() {
diff --git a/base/android/java/src/org/chromium/base/BuildInfo.java b/base/android/java/src/org/chromium/base/BuildInfo.java index 6df960e..3b3b6cc0 100644 --- a/base/android/java/src/org/chromium/base/BuildInfo.java +++ b/base/android/java/src/org/chromium/base/BuildInfo.java
@@ -17,6 +17,7 @@ import android.text.TextUtils; import androidx.annotation.OptIn; +import androidx.annotation.VisibleForTesting; import androidx.core.os.BuildCompat; import org.chromium.base.annotations.CalledByNative; @@ -62,12 +63,19 @@ public final String resourcesVersion; /** Whether we're running on Android TV or not */ public final boolean isTV; + /** Whether we're running on an Android Automotive OS device or not. */ + public final boolean isAutomotive; private static class Holder { private static BuildInfo sInstance = new BuildInfo(); } @CalledByNative private static String[] getAll() { - BuildInfo buildInfo = getInstance(); + return BuildInfo.getInstance().getAllProperties(); + } + + /** Returns a serialized string array of all properties of this class. */ + @VisibleForTesting + String[] getAllProperties() { String hostPackageName = ContextUtils.getApplicationContext().getPackageName(); return new String[] { Build.BRAND, @@ -79,25 +87,26 @@ Build.TYPE, Build.BOARD, hostPackageName, - String.valueOf(buildInfo.hostVersionCode), - buildInfo.hostPackageLabel, - buildInfo.packageName, - String.valueOf(buildInfo.versionCode), - buildInfo.versionName, - buildInfo.androidBuildFingerprint, - buildInfo.gmsVersionCode, - buildInfo.installerPackageName, - buildInfo.abiString, + String.valueOf(hostVersionCode), + hostPackageLabel, + packageName, + String.valueOf(versionCode), + versionName, + androidBuildFingerprint, + gmsVersionCode, + installerPackageName, + abiString, sFirebaseAppId, - buildInfo.customThemes, - buildInfo.resourcesVersion, + customThemes, + resourcesVersion, String.valueOf( ContextUtils.getApplicationContext().getApplicationInfo().targetSdkVersion), isDebugAndroid() ? "1" : "0", - buildInfo.isTV ? "1" : "0", + isTV ? "1" : "0", Build.VERSION.INCREMENTAL, Build.HARDWARE, isAtLeastT() ? "1" : "0", + isAutomotive ? "1" : "0", }; } @@ -136,7 +145,8 @@ return Holder.sInstance; } - private BuildInfo() { + @VisibleForTesting + BuildInfo() { sInitialized = true; try { Context appContext = ContextUtils.getApplicationContext(); @@ -215,6 +225,9 @@ isTV = uiModeManager != null && uiModeManager.getCurrentModeType() == Configuration.UI_MODE_TYPE_TELEVISION; + isAutomotive = appContext.getPackageManager().hasSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE); + } catch (NameNotFoundException e) { throw new RuntimeException(e); }
diff --git a/base/android/junit/src/org/chromium/base/BuildInfoTest.java b/base/android/junit/src/org/chromium/base/BuildInfoTest.java new file mode 100644 index 0000000..a62f4c0e --- /dev/null +++ b/base/android/junit/src/org/chromium/base/BuildInfoTest.java
@@ -0,0 +1,82 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import android.content.Context; +import android.content.pm.PackageManager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.Shadows; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowPackageManager; + +import org.chromium.base.test.BaseRobolectricTestRunner; + +/** Unit tests for {@link BuildInfo}. */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class BuildInfoTest { + private ShadowPackageManager mShadowPackageManager; + + @Before + public void setUp() { + Context context = ContextUtils.getApplicationContext(); + mShadowPackageManager = Shadows.shadowOf(context.getPackageManager()); + } + + @Test + public void testIsAutomotive_trueIfFeatureAutomotiveTrue() { + mShadowPackageManager.setSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true); + + BuildInfo buildInfo = new BuildInfo(); + + assertTrue(buildInfo.isAutomotive); + } + + @Test + public void testIsAutomotive_falseIfFeatureAutomotiveFalse() { + mShadowPackageManager.setSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false); + + BuildInfo buildInfo = new BuildInfo(); + + assertFalse(buildInfo.isAutomotive); + } + + @Test + public void testIsAutomotive_isTrue_setsGetAllPropertesTo1() { + mShadowPackageManager.setSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ true); + + BuildInfo buildInfo = new BuildInfo(); + String[] properties = buildInfo.getAllProperties(); + + // This index matches the value in the constructor of base/android/build_info.cc. + int isAutomotiveIndex = 27; + + assertEquals("1", properties[isAutomotiveIndex]); + } + + @Test + public void testIsAutomotive_isFalse_setsGetAllPropertesTo0() { + mShadowPackageManager.setSystemFeature( + PackageManager.FEATURE_AUTOMOTIVE, /* supported= */ false); + + BuildInfo buildInfo = new BuildInfo(); + String[] properties = buildInfo.getAllProperties(); + + // This index matches the value in the constructor of base/android/build_info.cc. + int isAutomotiveIndex = 27; + + assertEquals("0", properties[isAutomotiveIndex]); + } +}
diff --git a/base/android/task_scheduler/task_runner_android.cc b/base/android/task_scheduler/task_runner_android.cc index 9fbed8d..ccd15d67 100644 --- a/base/android/task_scheduler/task_runner_android.cc +++ b/base/android/task_scheduler/task_runner_android.cc
@@ -92,13 +92,10 @@ // JNIEnv is thread specific, but we don't know which thread we'll be run on // so we must look it up. std::string event_name = base::StrCat({"JniPostTask: ", runnable_class_name}); - TRACE_EVENT_BEGIN_WITH_FLAGS0( - "toplevel", event_name.c_str(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT("toplevel", nullptr, [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(event_name.c_str()); + }); JNI_Runnable::Java_Runnable_run(base::android::AttachCurrentThread(), task); - TRACE_EVENT_END_WITH_FLAGS0( - "toplevel", event_name.c_str(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); } } // namespace
diff --git a/base/android/trace_event_binding.cc b/base/android/trace_event_binding.cc index f562d985..1000721 100644 --- a/base/android/trace_event_binding.cc +++ b/base/android/trace_event_binding.cc
@@ -187,7 +187,7 @@ // Return saved values to pass to TRACE_EVENT macros. const char* name() { return name_.c_str(); } const char* arg_name() { return has_arg_ ? "arg" : nullptr; } - const char* arg() { return has_arg_ ? arg_.c_str() : nullptr; } + const std::string& arg() { return arg_; } private: std::string name_; @@ -201,17 +201,17 @@ const JavaParamRef<jstring>& jname, const JavaParamRef<jstring>& jarg) { TraceEventDataConverter converter(env, jname, jarg); - if (converter.arg()) { - TRACE_EVENT_INSTANT_WITH_FLAGS1( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY | - TRACE_EVENT_SCOPE_THREAD, - converter.arg_name(), converter.arg()); + if (converter.arg_name()) { + TRACE_EVENT_INSTANT(internal::kJavaTraceCategory, nullptr, + converter.arg_name(), converter.arg(), + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(converter.name()); + }); } else { - TRACE_EVENT_INSTANT_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY | - TRACE_EVENT_SCOPE_THREAD); + TRACE_EVENT_INSTANT(internal::kJavaTraceCategory, nullptr, + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(converter.name()); + }); } } @@ -233,15 +233,17 @@ const JavaParamRef<jstring>& jname, const JavaParamRef<jstring>& jarg) { TraceEventDataConverter converter(env, jname, jarg); - if (converter.arg()) { - TRACE_EVENT_BEGIN_WITH_FLAGS1( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY, - converter.arg_name(), converter.arg()); + if (converter.arg_name()) { + TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr, + converter.arg_name(), converter.arg(), + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(converter.name()); + }); } else { - TRACE_EVENT_BEGIN_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr, + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(converter.name()); + }); } } @@ -249,52 +251,46 @@ const JavaParamRef<jstring>& jname, const JavaParamRef<jstring>& jarg) { TraceEventDataConverter converter(env, jname, jarg); - if (converter.arg()) { - TRACE_EVENT_END_WITH_FLAGS1( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY, - converter.arg_name(), converter.arg()); + if (converter.arg_name()) { + TRACE_EVENT_END(internal::kJavaTraceCategory, converter.arg_name(), + converter.arg()); } else { - TRACE_EVENT_END_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_END(internal::kJavaTraceCategory); } } static void JNI_TraceEvent_BeginToplevel(JNIEnv* env, const JavaParamRef<jstring>& jtarget) { std::string target = ConvertJavaStringToUTF8(env, jtarget); - TRACE_EVENT_BEGIN_WITH_FLAGS0( - internal::kToplevelTraceCategory, target.c_str(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_BEGIN(internal::kToplevelTraceCategory, nullptr, + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(target.c_str()); + }); } static void JNI_TraceEvent_EndToplevel(JNIEnv* env, const JavaParamRef<jstring>& jtarget) { std::string target = ConvertJavaStringToUTF8(env, jtarget); - TRACE_EVENT_END_WITH_FLAGS0( - internal::kToplevelTraceCategory, target.c_str(), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_END(internal::kToplevelTraceCategory); } static void JNI_TraceEvent_StartAsync(JNIEnv* env, const JavaParamRef<jstring>& jname, jlong jid) { TraceEventDataConverter converter(env, jname, nullptr); - TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), - TRACE_ID_LOCAL(static_cast<uint64_t>(jid)), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_BEGIN(internal::kJavaTraceCategory, nullptr, + perfetto::Track(static_cast<uint64_t>(jid)), + [&](::perfetto::EventContext& ctx) { + ctx.event()->set_name(converter.name()); + }); } static void JNI_TraceEvent_FinishAsync(JNIEnv* env, const JavaParamRef<jstring>& jname, jlong jid) { TraceEventDataConverter converter(env, jname, nullptr); - TRACE_EVENT_NESTABLE_ASYNC_END_WITH_FLAGS0( - internal::kJavaTraceCategory, converter.name(), - TRACE_ID_LOCAL(static_cast<uint64_t>(jid)), - TRACE_EVENT_FLAG_JAVA_STRING_LITERALS | TRACE_EVENT_FLAG_COPY); + TRACE_EVENT_END(internal::kJavaTraceCategory, + perfetto::Track(static_cast<uint64_t>(jid))); } } // namespace android
diff --git a/base/values.cc b/base/values.cc index c6f102d..e0880ae 100644 --- a/base/values.cc +++ b/base/values.cc
@@ -44,51 +44,6 @@ static_cast<size_t>(Value::Type::LIST) + 1, "kTypeNames Has Wrong Size"); -std::unique_ptr<Value> CopyWithoutEmptyChildren(const Value& node); - -// Make a deep copy of |node|, but don't include empty lists or dictionaries -// in the copy. It's possible for this function to return NULL and it -// expects |node| to always be non-NULL. -std::unique_ptr<Value> CopyListWithoutEmptyChildren(const Value& list) { - Value copy(Value::Type::LIST); - for (const auto& entry : list.GetListDeprecated()) { - std::unique_ptr<Value> child_copy = CopyWithoutEmptyChildren(entry); - if (child_copy) - copy.Append(std::move(*child_copy)); - } - return copy.GetListDeprecated().empty() - ? nullptr - : std::make_unique<Value>(std::move(copy)); -} - -std::unique_ptr<DictionaryValue> CopyDictionaryWithoutEmptyChildren( - const DictionaryValue& dict) { - std::unique_ptr<DictionaryValue> copy; - for (auto it : dict.DictItems()) { - std::unique_ptr<Value> child_copy = CopyWithoutEmptyChildren(it.second); - if (child_copy) { - if (!copy) - copy = std::make_unique<DictionaryValue>(); - copy->SetKey(it.first, std::move(*child_copy)); - } - } - return copy; -} - -std::unique_ptr<Value> CopyWithoutEmptyChildren(const Value& node) { - switch (node.type()) { - case Value::Type::LIST: - return CopyListWithoutEmptyChildren(static_cast<const ListValue&>(node)); - - case Value::Type::DICTIONARY: - return CopyDictionaryWithoutEmptyChildren( - static_cast<const DictionaryValue&>(node)); - - default: - return std::make_unique<Value>(node.Clone()); - } -} - // Helper class to enumerate the path components from a StringPiece // without performing heap allocations. Components are simply separated // by single dots (e.g. "foo.bar.baz" -> ["foo", "bar", "baz"]). @@ -1713,15 +1668,6 @@ const_cast<const ListValue**>(out_value)); } -std::unique_ptr<DictionaryValue> DictionaryValue::DeepCopyWithoutEmptyChildren() - const { - std::unique_ptr<DictionaryValue> copy = - CopyDictionaryWithoutEmptyChildren(*this); - if (!copy) - copy = std::make_unique<DictionaryValue>(); - return copy; -} - void DictionaryValue::Swap(DictionaryValue* other) { CHECK(other->is_dict()); dict().swap(other->dict());
diff --git a/base/values.h b/base/values.h index 8c92cb3..5a7f62416 100644 --- a/base/values.h +++ b/base/values.h
@@ -1355,10 +1355,6 @@ bool GetList(StringPiece path, const ListValue** out_value) const; bool GetList(StringPiece path, ListValue** out_value); - // Makes a copy of `this` but doesn't include empty dictionaries and lists in - // the copy. This never returns NULL, even if `this` itself is empty. - std::unique_ptr<DictionaryValue> DeepCopyWithoutEmptyChildren() const; - // Swaps contents with the `other` dictionary. void Swap(DictionaryValue* other);
diff --git a/base/values_unittest.cc b/base/values_unittest.cc index 88185c2..3485b01 100644 --- a/base/values_unittest.cc +++ b/base/values_unittest.cc
@@ -2094,85 +2094,6 @@ EXPECT_EQ(*list_weak, *copy_list); } -TEST(ValuesTest, RemoveEmptyChildren) { - auto root = std::make_unique<DictionaryValue>(); - // Remove empty lists and dictionaries. - root->SetKey("empty_dict", DictionaryValue()); - root->SetKey("empty_list", ListValue()); - root->SetPath("a.b.c.d.e", DictionaryValue()); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_TRUE(root->DictEmpty()); - - // Make sure we don't prune too much. - root->SetBoolKey("bool", true); - root->SetKey("empty_dict", DictionaryValue()); - root->SetStringKey("empty_string", std::string()); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - - // Should do nothing. - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - - // Nested test cases. These should all reduce back to the bool and string - // set above. - { - root->SetPath("a.b.c.d.e", DictionaryValue()); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - } - { - Value inner(Value::Type::DICTIONARY); - inner.SetKey("empty_dict", DictionaryValue()); - inner.SetKey("empty_list", ListValue()); - root->SetKey("dict_with_empty_children", std::move(inner)); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - } - { - ListValue inner; - inner.Append(Value(Value::Type::DICTIONARY)); - inner.Append(Value(Value::Type::LIST)); - root->SetKey("list_with_empty_children", std::move(inner)); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - } - - // Nested with siblings. - { - ListValue inner; - inner.Append(Value(Value::Type::DICTIONARY)); - inner.Append(Value(Value::Type::LIST)); - root->SetKey("list_with_empty_children", std::move(inner)); - DictionaryValue inner2; - inner2.SetKey("empty_dict", DictionaryValue()); - inner2.SetKey("empty_list", ListValue()); - root->SetKey("dict_with_empty_children", std::move(inner2)); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(2U, root->DictSize()); - } - - // Make sure nested values don't get pruned. - { - ListValue inner; - ListValue inner2; - inner2.Append("hello"); - inner.Append(Value(Value::Type::DICTIONARY)); - inner.Append(std::move(inner2)); - root->SetKey("list_with_empty_children", std::move(inner)); - root = root->DeepCopyWithoutEmptyChildren(); - EXPECT_EQ(3U, root->DictSize()); - - ListValue* inner_value; - EXPECT_TRUE(root->GetList("list_with_empty_children", &inner_value)); - ASSERT_EQ( - 1U, inner_value->GetListDeprecated().size()); // Dictionary was pruned. - const Value& inner_value2 = inner_value->GetListDeprecated()[0]; - ASSERT_TRUE(inner_value2.is_list()); - EXPECT_EQ(1U, inner_value2.GetListDeprecated().size()); - } -} - TEST(ValuesTest, MergeDictionary) { std::unique_ptr<DictionaryValue> base(new DictionaryValue); base->SetStringKey("base_key", "base_key_value_base");
diff --git a/build/android/pylib/gtest/gtest_config.py b/build/android/pylib/gtest/gtest_config.py index 3ac1955..3297a81 100644 --- a/build/android/pylib/gtest/gtest_config.py +++ b/build/android/pylib/gtest/gtest_config.py
@@ -22,7 +22,6 @@ 'android_webview_unittests', 'base_unittests', 'blink_unittests', - 'breakpad_unittests', 'cc_unittests', 'components_unittests', 'content_browsertests', @@ -48,7 +47,6 @@ # Tests fail in component=shared_library build, which is required for ASan. # http://crbug.com/344868 ASAN_EXCLUDED_TEST_SUITES = [ - 'breakpad_unittests', 'sandbox_linux_unittests', # The internal ASAN recipe cannot run step "unit_tests_apk", this is the
diff --git a/build/check_gn_headers_whitelist.txt b/build/check_gn_headers_whitelist.txt index 45c6504..9b64787 100644 --- a/build/check_gn_headers_whitelist.txt +++ b/build/check_gn_headers_whitelist.txt
@@ -25,7 +25,6 @@ chrome/browser/ash/login/signin/oauth2_token_fetcher.h chrome/browser/ash/profiles/profile_helper.h chrome/browser/ash/settings/cros_settings.h -chrome/browser/certificate_provider/certificate_info.h chrome/browser/certificate_provider/certificate_provider.h chrome/browser/certificate_provider/certificate_provider_service.h chrome/browser/certificate_provider/certificate_provider_service_factory.h
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 80123154..262a32c 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -9.20220811.1.1 +9.20220812.0.1
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java index d019ed9b..f44d1f19 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogView.java
@@ -217,14 +217,16 @@ final int screenHeightPx = ViewUtils.dpToPx( getContext(), getContext().getResources().getConfiguration().screenHeightDp); - mYTranslateAnimation = ObjectAnimator.ofFloat(mDialogContainerView, View.TRANSLATION_Y, - mDialogContainerView.getY(), screenHeightPx); + final float mDialogInitYPos = mDialogContainerView.getY(); + mYTranslateAnimation = ObjectAnimator.ofFloat( + mDialogContainerView, View.TRANSLATION_Y, mDialogInitYPos, screenHeightPx); mYTranslateAnimation.setInterpolator(Interpolators.EMPHASIZED_ACCELERATE); mYTranslateAnimation.setDuration(Y_TRANSLATE_DURATION_MS); mYTranslateAnimation.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { updateItemViewAlpha(); + mDialogContainerView.setY(mDialogInitYPos); } });
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 08ca85c..7063524d 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -481,9 +481,9 @@ private final TabObserver mTabObserver = new EmptyTabObserver() { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - if (UrlUtilities.isNTPUrl(tab.getUrl())) return; - if (navigationHandle.isSameDocument() || !navigationHandle.isInPrimaryMainFrame()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { + if (navigationHandle.isSameDocument() || UrlUtilities.isNTPUrl(tab.getUrl())) { return; } if (mModel.indexFromId(tab.getId()) == TabModel.INVALID_TAB_INDEX) return; @@ -493,6 +493,11 @@ } @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + + @Override public void onTitleUpdated(Tab updatedTab) { int index = mModel.indexFromId(updatedTab.getId()); // TODO(crbug.com/1098100) The null check for tab here should be redundant once we have
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java index 6db7e998f..5165408 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
@@ -17,6 +17,7 @@ import androidx.annotation.CallSuper; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.annotation.StyleRes; import androidx.appcompat.app.AppCompatActivity; @@ -132,6 +133,13 @@ } @Override + @RequiresApi(Build.VERSION_CODES.O) + public void onMultiWindowModeChanged(boolean inMultiWindowMode, Configuration configuration) { + super.onMultiWindowModeChanged(inMultiWindowMode, configuration); + onMultiWindowModeChanged(inMultiWindowMode); + } + + @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); NightModeUtils.updateConfigurationForNightMode(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 7db688f..617b2d9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -666,6 +666,7 @@ public void multipleTabsPendingClosure(List<Tab> tabs, boolean isAllTabs) { if (!isAllTabs) return; NewTabPageUma.recordNTPImpression(NewTabPageUma.NTP_IMPESSION_POTENTIAL_NOTAB); + openTabletTabSwitcherIfNoTabs(); } }; } finally {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java index cfabdad4..ea0103b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkManager.java
@@ -536,7 +536,7 @@ public void openSearchUI() { setState(BookmarkUIState.createSearchState()); mSelectableListLayout.onStartSearch(R.string.bookmark_no_result); - mToolbar.showSearchView(); + mToolbar.showSearchView(true); } @Override
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java index 733861a..bfdbf16 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -374,8 +374,8 @@ } @Override - public void didStartNavigation(NavigationHandle navigation) { - if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { + if (!navigation.isSameDocument()) { String url = navigation.getUrl().getSpec(); mContentDelegate.onMainFrameLoadStarted( url, !TextUtils.equals(url, mLoadedUrl)); @@ -383,6 +383,11 @@ } @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void titleWasSet(String title) { mContentDelegate.onTitleUpdated(title); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java index d213035b..fdfca9c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/ephemeraltab/EphemeralTabMediator.java
@@ -96,8 +96,8 @@ } @Override - public void didStartNavigation(NavigationHandle navigation) { - if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { + if (!navigation.isSameDocument()) { GURL url = navigation.getUrl(); if (url.equals(mCurrentUrl)) return; @@ -117,6 +117,11 @@ } @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void titleWasSet(String title) { mSheetContent.updateTitle(title); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java index 9c45de9..8f1543c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -405,8 +405,8 @@ private int mLastDistillerPageIndex; @Override - public void didStartNavigation(NavigationHandle navigation) { - if (!navigation.isInPrimaryMainFrame() || navigation.isSameDocument()) return; + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { + if (navigation.isSameDocument()) return; // Reader Mode should not pollute the navigation stack. To avoid this, watch for // navigations and prepare to remove any that are "chrome-distiller" urls. @@ -429,6 +429,11 @@ } @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void didFinishNavigation(NavigationHandle navigation) { // TODO(cjhopman): This should possibly ignore navigations that replace the entry // (like those from history.replaceState()).
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java index 17268e6..8da62ff 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -439,7 +439,7 @@ return true; } else if (item.getItemId() == R.id.search_menu_id) { mContentManager.removeHeader(); - mToolbar.showSearchView(); + mToolbar.showSearchView(true); String searchEmptyString = getSearchEmptyString(); mSelectableListLayout.onStartSearch(searchEmptyString); recordUserAction("Search");
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java index 8257ff9..afa0c68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/InfoBarContainer.java
@@ -91,14 +91,20 @@ /** Resets the state of the InfoBarContainer when the user navigates. */ private final TabObserver mTabObserver = new EmptyTabObserver() { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { // Make sure Y translation is reset on navigation. - if (mInfoBarContainerView != null && navigationHandle.isInPrimaryMainFrame()) { + if (mInfoBarContainerView != null) { mInfoBarContainerView.setTranslationY(0); } } @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + + @Override public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) { if (navigation.hasCommitted() && navigation.isInPrimaryMainFrame()) { setHidden(false);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java index bc38e9b..035f930d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiWindowUtils.java
@@ -706,12 +706,12 @@ SharedPreferencesManager prefs = SharedPreferencesManager.getInstance(); long startTime = prefs.readLong(ChromePreferenceKeys.MULTI_WINDOW_START_TIME); if (startTime == 0) { - RecordUserAction.record("Android.MultiWindowMode.Enter"); + RecordUserAction.record("Android.MultiWindowMode.Enter2"); long current = System.currentTimeMillis(); prefs.writeLong(ChromePreferenceKeys.MULTI_WINDOW_START_TIME, current); } } else { - RecordUserAction.record("Android.MultiWindowMode.Enter"); + RecordUserAction.record("Android.MultiWindowMode.Enter2"); } } else { if (mMultiInstanceApi31Enabled) { @@ -719,13 +719,13 @@ long startTime = prefs.readLong(ChromePreferenceKeys.MULTI_WINDOW_START_TIME); if (startTime > 0) { long current = System.currentTimeMillis(); - RecordUserAction.record("Android.MultiWindowMode.Exit"); + RecordUserAction.record("Android.MultiWindowMode.Exit2"); RecordHistogram.recordLongTimesHistogram( "Android.MultiWindowMode.TotalDuration", current - startTime); prefs.writeLong(ChromePreferenceKeys.MULTI_WINDOW_START_TIME, 0); } } else { - RecordUserAction.record("Android.MultiWindowMode.Exit"); + RecordUserAction.record("Android.MultiWindowMode.Exit2"); } } } else {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java index f24e6ec6..199bbb5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediator.java
@@ -100,12 +100,17 @@ } @Override - public void didStartNavigation(NavigationHandle navigation) { - if (!navigation.isInPrimaryMainFrame() || navigation.isSameDocument()) return; + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { + if (navigation.isSameDocument()) return; setSecurityState(ConnectionSecurityLevel.NONE); } @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void titleWasSet(String title) { mModel.set(PaymentHandlerToolbarProperties.TITLE, title); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java index a3a8872b..7ec8e9f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestUI.java
@@ -57,7 +57,6 @@ import org.chromium.components.signin.base.CoreAccountInfo; import org.chromium.components.signin.identitymanager.ConsentLevel; import org.chromium.components.signin.identitymanager.IdentityManager; -import org.chromium.components.version_info.VersionInfo; import org.chromium.ui.text.NoUnderlineClickableSpan; import org.chromium.ui.text.SpanApplier; import org.chromium.ui.text.SpanApplier.SpanInfo; @@ -302,7 +301,6 @@ */ private final DimmingDialog mDialog; private final EditorDialog mEditorDialog; - private final EditorDialog mCardEditorDialog; private final ViewGroup mRequestView; private final Callback<PaymentInformation> mUpdateSectionsCallback; private final ShippingStrings mShippingStrings; @@ -346,10 +344,6 @@ * * @param activity The activity on top of which the UI should be displayed. * @param client The consumer of the PaymentRequest UI. - * @param canAddCards Whether the UI should show the [+ADD CARD] button. This can be - * false, for example, when the merchant does not accept credit - * cards, so there's no point in adding cards within PaymentRequest - * UI. * @param showDataSource Whether the UI should describe the source of Autofill data. * @param title The title to show at the top of the UI. This can be, for * example, the <title> of the merchant website. If the @@ -362,9 +356,8 @@ * @param shippingStrings The string resource identifiers to use in the shipping sections. * @param profile The current profile that creates the PaymentRequestUI. */ - public PaymentRequestUI(Activity activity, Client client, boolean canAddCards, - boolean showDataSource, String title, String origin, int securityLevel, - ShippingStrings shippingStrings, + public PaymentRequestUI(Activity activity, Client client, boolean showDataSource, String title, + String origin, int securityLevel, ShippingStrings shippingStrings, PaymentUisShowStateReconciler paymentUisShowStateReconciler, Profile profile) { mContext = activity; mClient = client; @@ -413,19 +406,11 @@ mRequestView = (ViewGroup) LayoutInflater.from(mContext).inflate(R.layout.payment_request, null); - prepareRequestView(mContext, title, origin, securityLevel, canAddCards, profile); + prepareRequestView(mContext, title, origin, securityLevel, profile); mEditorDialog = new EditorDialog(activity, /*deleteRunnable =*/null, profile); DimmingDialog.setVisibleStatusBarIconColor(mEditorDialog.getWindow()); - mCardEditorDialog = new EditorDialog(activity, /*deleteRunnable =*/null, profile); - DimmingDialog.setVisibleStatusBarIconColor(mCardEditorDialog.getWindow()); - - // Allow screenshots of the credit card number in Canary, Dev, and developer builds. - if (VersionInfo.isBetaBuild() || VersionInfo.isStableBuild()) { - mCardEditorDialog.disableScreenshots(); - } - mDialog = new DimmingDialog(activity, this); mPaymentUisShowStateReconciler = paymentUisShowStateReconciler; } @@ -488,11 +473,10 @@ * @param title Title of the page. * @param origin The RFC6454 origin of the page. * @param securityLevel The security level of the page that invoked PaymentRequest. - * @param canAddCards Whether new cards can be added. * @param profile The current profile to pass PaymentRequestHeader. */ - private void prepareRequestView(Context context, String title, String origin, int securityLevel, - boolean canAddCards, Profile profile) { + private void prepareRequestView( + Context context, String title, String origin, int securityLevel, Profile profile) { mSpinnyLayout = mRequestView.findViewById(R.id.payment_request_spinny); assert mSpinnyLayout.getVisibility() == View.VISIBLE; mIsShowingSpinner = true; @@ -538,9 +522,9 @@ // the cost in the right summary text view on bottom sheet. mShippingOptionSection.setSplitSummaryInDisplayModeNormal(true); - // Some sections conditionally allow adding new options. + // The user cannot add new shipping options or payment methods. mShippingOptionSection.setCanAddItems(false); - mPaymentMethodSection.setCanAddItems(canAddCards); + mPaymentMethodSection.setCanAddItems(false); // Put payment method section on top of address section for // WEB_PAYMENTS_METHOD_SECTION_ORDER_V2. @@ -619,15 +603,6 @@ } /** - * Disables adding new cards during retry. - */ - public void disableAddingNewCardsDuringRetry() { - assert mPaymentMethodSection != null; - mPaymentMethodSection.setCanAddItems(false); - mPaymentMethodSection.update(mPaymentMethodSectionInformation); - } - - /** * Sets the icon in the top left of the UI. This can be, for example, the favicon of the * merchant website. This is not a part of the constructor because favicon retrieval is * asynchronous. @@ -885,12 +860,6 @@ return mEditorDialog; } - /** @return The card editor user interface. Distinct from the common editor user interface, - * because the credit card editor can launch the address editor. */ - public EditorDialog getCardEditorDialog() { - return mCardEditorDialog; - } - /** * Called when user clicks anything in the dialog. */ @@ -1246,7 +1215,6 @@ public void onDismiss() { mIsClosing = true; if (mEditorDialog.isShowing()) mEditorDialog.dismiss(); - if (mCardEditorDialog.isShowing()) mCardEditorDialog.dismiss(); if (sEditorObserverForTest != null) sEditorObserverForTest.onEditorDismiss(); if (!mIsClientClosing) mClient.onDismiss(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java index fd31415..340be292 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentUiService.java
@@ -524,7 +524,6 @@ /* selection = */ 0, new ArrayList<>(Arrays.asList(selectedApp))); mPaymentRequestUI.updateSection( PaymentRequestUI.DataType.PAYMENT_METHODS, mPaymentMethodsSection); - mPaymentRequestUI.disableAddingNewCardsDuringRetry(); // Go back to the payment sheet mPaymentRequestUI.onPayButtonProcessingCancelled(); @@ -1101,8 +1100,8 @@ } mPaymentRequestUI = new PaymentRequestUI(activity, /*client=*/this, - /*canAddCards=*/false, !PaymentPreferencesUtil.isPaymentCompleteOnce(), - mMerchantName, mTopLevelOriginFormattedForDisplay, + !PaymentPreferencesUtil.isPaymentCompleteOnce(), mMerchantName, + mTopLevelOriginFormattedForDisplay, SecurityStateModel.getSecurityLevelForWebContents(mWebContents), new ShippingStrings(mParams.getPaymentOptions().shippingType), mPaymentUisShowStateReconciler, Profile.fromWebContents(mWebContents));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/AutofillSessionLifetimeController.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/AutofillSessionLifetimeController.java index dfeb1ce..bdb8701 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/AutofillSessionLifetimeController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/AutofillSessionLifetimeController.java
@@ -38,8 +38,8 @@ * 3. when browser-initiated navigation occurs: * As opposed to renderer-initiated navigation (e.g., submitting a form), navigation initiated by * browser controls should never trigger save UI. In order to cancel the session before web - * content views become invisible, we have to use onDidStartNavigation rather than one of the - * later events. + * content views become invisible, we have to use onDidStartNavigationInPrimaryMainFrame rather + * than one of the later events. */ public class AutofillSessionLifetimeController implements DestroyObserver { private Activity mActivity; @@ -52,9 +52,9 @@ mActivity = activity; mActivityTabObserver = new ActivityTabProvider.ActivityTabTabObserver(activityTabProvider) { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - if (navigationHandle.isInPrimaryMainFrame() - && !navigationHandle.isRendererInitiated()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isRendererInitiated()) { ApiHelperForO.cancelAutofillSession(mActivity); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index 672884e..7a77111 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -235,14 +235,22 @@ } @Override - public void didStartNavigation(NavigationHandle navigation) { - if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { + if (!navigation.isSameDocument()) { mTab.didStartPageLoad(navigation.getUrl()); } RewindableIterator<TabObserver> observers = mTab.getTabObservers(); while (observers.hasNext()) { - observers.next().onDidStartNavigation(mTab, navigation); + observers.next().onDidStartNavigationInPrimaryMainFrame(mTab, navigation); + } + } + + @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + RewindableIterator<TabObserver> observers = mTab.getTabObservers(); + while (observers.hasNext()) { + observers.next().onDidStartNavigationNoop(mTab, navigation); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java index cc7817ce..108a433 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/JourneyManager.java
@@ -112,8 +112,9 @@ } @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - if (!navigationHandle.isInPrimaryMainFrame() || navigationHandle.isSameDocument()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { + if (navigationHandle.isSameDocument()) { return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index 13807af..f975dec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -792,8 +792,8 @@ } @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigation) { - if (!navigation.isInPrimaryMainFrame()) return; + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigation) { // Update URL as soon as it becomes available when it's a new tab. // But we want to update only when it's a new tab. So we check whether the current // navigation entry is initial, meaning whether it has the same target URL as the @@ -806,6 +806,11 @@ } @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void onDidFinishNavigation(Tab tab, NavigationHandle navigation) { if (navigation.hasCommitted() && navigation.isInPrimaryMainFrame() && !navigation.isSameDocument()) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java index c7980e5..7e405ef3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -811,7 +811,8 @@ final WebContentsObserver observer = TestThreadUtils.runOnUiThreadBlocking(() -> { return new WebContentsObserver(sActivityTestRule.getWebContents()) { @Override - public void didStartNavigation(NavigationHandle navigationHandle) { + public void didStartNavigationInPrimaryMainFrame( + NavigationHandle navigationHandle) { if (navigationHandle.getUrl().getHost().equals("www.example.com")) { onDidStartNavigationHelper.notifyCalled(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java index ae86c7d..6624a9f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestCanMakePaymentMetricsTest.java
@@ -4,10 +4,6 @@ package org.chromium.chrome.browser.payments; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.DECEMBER; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.FIRST_BILLING_ADDRESS; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.NEXT_YEAR; - import androidx.test.filters.MediumTest; import org.junit.Assert; @@ -113,14 +109,16 @@ // Add a new credit card. mPaymentRequestTestRule.clickInPaymentMethodAndWait( R.id.payments_section, mPaymentRequestTestRule.getReadyToEdit()); - mPaymentRequestTestRule.setSpinnerSelectionsInCardEditorAndWait( - new int[] {DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS}, - mPaymentRequestTestRule.getBillingAddressChangeProcessed()); - mPaymentRequestTestRule.setTextInCardEditorAndWait( - new String[] {"4111111111111111", "Jon Doe"}, - mPaymentRequestTestRule.getEditorTextUpdate()); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToPay()); + // TODO(crbug.com/1209835): This test will also need migrated away from basic-card before + // being re-enabled. + // mPaymentRequestTestRule.setSpinnerSelectionsInCardEditorAndWait( + // new int[] {DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS}, + // mPaymentRequestTestRule.getBillingAddressChangeProcessed()); + // mPaymentRequestTestRule.setTextInCardEditorAndWait( + // new String[] {"4111111111111111", "Jon Doe"}, + // mPaymentRequestTestRule.getEditorTextUpdate()); + // mPaymentRequestTestRule.clickInCardEditorAndWait( + // R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToPay()); // Complete the transaction. mPaymentRequestTestRule.clickAndWait(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java index 80a3ee93..f925c98 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestNoShippingTest.java
@@ -4,10 +4,6 @@ package org.chromium.chrome.browser.payments; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.DECEMBER; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.FIRST_BILLING_ADDRESS; -import static org.chromium.chrome.browser.payments.PaymentRequestTestRule.NEXT_YEAR; - import androidx.test.filters.MediumTest; import org.junit.Assert; @@ -135,172 +131,6 @@ new String[] {"Jon Doe", "4111111111111111", "12", "2050", "basic-card", "123"}); } - /** Attempt to add an invalid credit card number and cancel payment. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testAddInvalidCardNumberAndCancel() throws TimeoutException { - // Attempting to add an invalid card and cancelling out of the flow will result in the user - // still being ready to pay with the previously selected credit card. - fillNewCardForm("123", "Bob", DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getEditorValidationError()); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.close_button, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"User closed the Payment Request UI."}); - } - - /** Attempt to add a credit card with an empty name on card and cancel payment. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testAddEmptyNameOnCardAndCancel() throws TimeoutException { - fillNewCardForm("5454-5454-5454-5454", "", DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getEditorValidationError()); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyForInput()); - mPaymentRequestTestRule.clickAndWait( - R.id.close_button, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"User closed the Payment Request UI."}); - } - - /** Save a new card on disk and pay. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testSaveNewCardAndPay() throws TimeoutException { - fillNewCardForm("5454-5454-5454-5454", "Bob", DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS); - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); - mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( - R.id.card_unmask_input, "123", mPaymentRequestTestRule.getReadyToUnmask()); - mPaymentRequestTestRule.clickCardUnmaskButtonAndWait( - ModalDialogProperties.ButtonType.POSITIVE, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"5454545454545454", "12", "Bob"}); - } - - /** Use a temporary credit card to complete payment. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testAddTemporaryCardAndPay() throws TimeoutException { - fillNewCardForm("5454-5454-5454-5454", "Bob", DECEMBER, NEXT_YEAR, FIRST_BILLING_ADDRESS); - - // Uncheck the "Save this card on this device" checkbox, so the card is temporary. - mPaymentRequestTestRule.selectCheckboxAndWait( - R.id.payments_edit_checkbox, false, mPaymentRequestTestRule.getReadyToEdit()); - - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); - mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( - R.id.card_unmask_input, "123", mPaymentRequestTestRule.getReadyToUnmask()); - mPaymentRequestTestRule.clickCardUnmaskButtonAndWait( - ModalDialogProperties.ButtonType.POSITIVE, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"5454545454545454", "12", "Bob"}); - } - - private void fillNewCardForm(String cardNumber, String nameOnCard, int month, int year, - int billingAddress) throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_add_option_button, mPaymentRequestTestRule.getReadyToEdit()); - mPaymentRequestTestRule.setTextInCardEditorAndWait(new String[] {cardNumber, nameOnCard}, - mPaymentRequestTestRule.getEditorTextUpdate()); - mPaymentRequestTestRule.setSpinnerSelectionsInCardEditorAndWait( - new int[] {month, year, billingAddress}, - mPaymentRequestTestRule.getBillingAddressChangeProcessed()); - } - - /** Add a new card together with a new billing address and pay. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testSaveNewCardAndNewBillingAddressAndPay() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_add_option_button, mPaymentRequestTestRule.getReadyToEdit()); - mPaymentRequestTestRule.setTextInCardEditorAndWait( - new String[] {"5454 5454 5454 5454", "Bob"}, - mPaymentRequestTestRule.getEditorTextUpdate()); - - // Select December of next year for expiration and [Add address] in the billing address - // dropdown. - int addBillingAddress = 2; - mPaymentRequestTestRule.setSpinnerSelectionsInCardEditorAndWait( - new int[] {DECEMBER, NEXT_YEAR, addBillingAddress}, - mPaymentRequestTestRule.getReadyToEdit()); - mPaymentRequestTestRule.setTextInEditorAndWait( - new String[] {"Bob", "Google", "1600 Amphitheatre Pkwy", "Mountain View", "CA", - "94043", "650-253-0000"}, - mPaymentRequestTestRule.getEditorTextUpdate()); - mPaymentRequestTestRule.clickInEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToEdit()); - - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.editor_dialog_done_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.button_primary, mPaymentRequestTestRule.getReadyForUnmaskInput()); - mPaymentRequestTestRule.setTextInCardUnmaskDialogAndWait( - R.id.card_unmask_input, "123", mPaymentRequestTestRule.getReadyToUnmask()); - mPaymentRequestTestRule.clickCardUnmaskButtonAndWait( - ModalDialogProperties.ButtonType.POSITIVE, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"5454545454545454", "12", "Bob", "Google", "1600 Amphitheatre Pkwy", - "Mountain View", "CA", "94043", "+16502530000"}); - } - - /** Quickly pressing on "add card" and then [X] should not crash. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testQuickAddCardAndCloseShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); - - // Quickly press on "add card" and then [X]. - int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.close_button) - .performClick(); - }); - mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); - - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.close_button, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"User closed the Payment Request UI."}); - } - /** Quickly pressing on [X] and then "add card" should not crash. */ @Test @MediumTest @@ -329,38 +159,6 @@ new String[] {"User closed the Payment Request UI."}); } - /** Quickly pressing on "add card" and then "cancel" should not crash. */ - @Test - @MediumTest - @FlakyTest(message = "crbug.com/1182234") - @Feature({"Payments"}) - public void testQuickAddCardAndCancelShouldNotCrash() throws TimeoutException { - mPaymentRequestTestRule.triggerUIAndWait(mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickInPaymentMethodAndWait( - R.id.payments_section, mPaymentRequestTestRule.getReadyForInput()); - - // Quickly press on "add card" and then "cancel." - int callCount = mPaymentRequestTestRule.getReadyToEdit().getCallCount(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mPaymentRequestTestRule.getPaymentRequestUI() - .getPaymentMethodSectionForTest() - .findViewById(R.id.payments_add_option_button) - .performClick(); - mPaymentRequestTestRule.getPaymentRequestUI() - .getDialogForTest() - .findViewById(R.id.button_secondary) - .performClick(); - }); - mPaymentRequestTestRule.getReadyToEdit().waitForCallback(callCount); - - mPaymentRequestTestRule.clickInCardEditorAndWait( - R.id.payments_edit_cancel_button, mPaymentRequestTestRule.getReadyToPay()); - mPaymentRequestTestRule.clickAndWait( - R.id.close_button, mPaymentRequestTestRule.getDismissed()); - mPaymentRequestTestRule.expectResultContains( - new String[] {"User closed the Payment Request UI."}); - } - /** Quickly pressing on "cancel" and then "add card" should not crash. */ @Test @MediumTest
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java index 1b430c3..f8116e704 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
@@ -7,9 +7,7 @@ import android.os.Handler; import android.view.KeyEvent; import android.view.View; -import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; -import android.widget.CheckBox; import android.widget.EditText; import android.widget.Spinner; import android.widget.TextView; @@ -40,7 +38,6 @@ import org.chromium.chrome.browser.payments.ui.PaymentRequestUI.PaymentRequestObserverForTest; import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.components.autofill.prefeditor.EditorObserverForTest; -import org.chromium.components.autofill.prefeditor.EditorTextField; import org.chromium.components.payments.AbortReason; import org.chromium.components.payments.PayerData; import org.chromium.components.payments.PaymentApp; @@ -454,15 +451,6 @@ helper.waitForCallback(callCount); } - /** Clicks on an element in the editor UI for credit cards. */ - protected void clickInCardEditorAndWait(final int resourceId, CallbackHelper helper) - throws TimeoutException { - int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking( - () -> { mUI.getCardEditorDialog().findViewById(resourceId).performClick(); }); - helper.waitForCallback(callCount); - } - /** Clicks on an element in the editor UI. */ protected void clickInEditorAndWait(final int resourceId, CallbackHelper helper) throws TimeoutException { @@ -667,11 +655,6 @@ }); } - /** Returns the focused view in the card editor view. */ - protected View getCardEditorFocusedView() { - return mUI.getCardEditorDialog().getCurrentFocus(); - } - /** * Clicks on the label corresponding to the shipping address suggestion at the specified * |suggestionIndex|. @@ -780,57 +763,11 @@ .getOptionRowAtIndex(index)); } - /** Returns the selected spinner value in the editor UI for credit cards. */ - protected String getSpinnerSelectionTextInCardEditor(final int dropdownIndex) { - return ThreadUtils.runOnUiThreadBlockingNoException( - () - -> mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getSelectedItem() - .toString()); - } - - /** Returns the spinner value at the specified position in the editor UI for credit cards. */ - protected String getSpinnerTextAtPositionInCardEditor( - final int dropdownIndex, final int itemPosition) { - return ThreadUtils.runOnUiThreadBlockingNoException( - () - -> mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getItemAtPosition(itemPosition) - .toString()); - } - - /** Returns the number of items offered by the spinner in the editor UI for credit cards. */ - protected int getSpinnerItemCountInCardEditor(final int dropdownIndex) { - return ThreadUtils.runOnUiThreadBlockingNoException( - () - -> mUI.getCardEditorDialog() - .getDropdownFieldsForTest() - .get(dropdownIndex) - .getCount()); - } - /** Returns the error message visible to the user in the credit card unmask prompt. */ protected String getUnmaskPromptErrorMessage() { return mCardUnmaskPrompt.getErrorMessage(); } - /** Selects the spinner value in the editor UI for credit cards. */ - protected void setSpinnerSelectionsInCardEditorAndWait( - final int[] selections, CallbackHelper helper) throws TimeoutException { - int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(() -> { - List<Spinner> fields = mUI.getCardEditorDialog().getDropdownFieldsForTest(); - for (int i = 0; i < selections.length && i < fields.size(); i++) { - fields.get(i).setSelection(selections[i]); - } - }); - helper.waitForCallback(callCount); - } - /** Selects the spinner value in the editor UI. */ protected void setSpinnerSelectionInEditorAndWait(final int selection, CallbackHelper helper) throws TimeoutException { @@ -842,23 +779,6 @@ helper.waitForCallback(callCount); } - /** Directly sets the text in the editor UI for credit cards. */ - protected void setTextInCardEditorAndWait(final String[] values, CallbackHelper helper) - throws TimeoutException { - int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking(() -> { - ViewGroup contents = (ViewGroup) mUI.getCardEditorDialog().findViewById(R.id.contents); - Assert.assertNotNull(contents); - for (int i = 0, j = 0; i < contents.getChildCount() && j < values.length; i++) { - View view = contents.getChildAt(i); - if (view instanceof EditorTextField) { - ((EditorTextField) view).getEditText().setText(values[j++]); - } - } - }); - helper.waitForCallback(callCount); - } - /** Directly sets the text in the editor UI. */ protected void setTextInEditorAndWait(final String[] values, CallbackHelper helper) throws TimeoutException { @@ -873,17 +793,6 @@ helper.waitForCallback(callCount); } - /** Directly sets the checkbox selection in the editor UI for credit cards. */ - protected void selectCheckboxAndWait(final int resourceId, final boolean isChecked, - CallbackHelper helper) throws TimeoutException { - int callCount = helper.getCallCount(); - ThreadUtils.runOnUiThreadBlocking( - () - -> ((CheckBox) mUI.getCardEditorDialog().findViewById(resourceId)) - .setChecked(isChecked)); - helper.waitForCallback(callCount); - } - /** Directly sets the text in the card unmask UI. */ protected void setTextInCardUnmaskDialogAndWait(final int resourceId, final String input, CallbackHelper helper) throws TimeoutException {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java index 071cadf01..7016079 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabDataTest.java
@@ -367,24 +367,20 @@ MockTab tab = new MockTab(1, false); mockEndpointResponse(EMPTY_ENDPOINT_RESPONSE); NavigationHandle navigationHandle = mock(NavigationHandle.class); - for (boolean isInPrimaryMainFrame : new boolean[] {false, true}) { - for (boolean isSameDocument : new boolean[] {false, true}) { - CouponPersistedTabData.Coupon coupon = new CouponPersistedTabData.Coupon( - EXPECTED_NAME_GENERAL_CASE_AMOUNT, EXPECTED_NAME_GENERAL_CASE_AMOUNT, - EXPECTED_TYPE_GENERAL_CASE_AMOUNT, EXPECTED_UNITS_GENERAL_CASE_AMOUNT, - SERIALIZE_DESERIALIZE_DISCOUNT_TYPE); - CouponPersistedTabData couponPersistedTabData = - new CouponPersistedTabData(tab, coupon); + for (boolean isSameDocument : new boolean[] {false, true}) { + CouponPersistedTabData.Coupon coupon = new CouponPersistedTabData.Coupon( + EXPECTED_NAME_GENERAL_CASE_AMOUNT, EXPECTED_NAME_GENERAL_CASE_AMOUNT, + EXPECTED_TYPE_GENERAL_CASE_AMOUNT, EXPECTED_UNITS_GENERAL_CASE_AMOUNT, + SERIALIZE_DESERIALIZE_DISCOUNT_TYPE); + CouponPersistedTabData couponPersistedTabData = new CouponPersistedTabData(tab, coupon); + Assert.assertNotNull(couponPersistedTabData.getCoupon()); + doReturn(isSameDocument).when(navigationHandle).isSameDocument(); + couponPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); + if (!isSameDocument) { + Assert.assertNull(couponPersistedTabData.getCoupon()); + } else { Assert.assertNotNull(couponPersistedTabData.getCoupon()); - doReturn(isInPrimaryMainFrame).when(navigationHandle).isInPrimaryMainFrame(); - doReturn(isSameDocument).when(navigationHandle).isSameDocument(); - couponPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); - if (isInPrimaryMainFrame && !isSameDocument) { - Assert.assertNull(couponPersistedTabData.getCoupon()); - } else { - Assert.assertNotNull(couponPersistedTabData.getCoupon()); - } } } } @@ -444,12 +440,12 @@ EXPECTED_UNITS_GENERAL_CASE_AMOUNT, SERIALIZE_DESERIALIZE_DISCOUNT_TYPE); CouponPersistedTabData couponPersistedTabData = new CouponPersistedTabData(tab, coupon); Assert.assertNotNull(couponPersistedTabData.getCoupon()); - couponPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); + couponPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); Assert.assertNotNull(couponPersistedTabData.getCoupon()); doReturn(VALID_URL_2).when(navigationHandle).getUrl(); - couponPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); + couponPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); Assert.assertNull(couponPersistedTabData.getCoupon()); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java index 601eb3b..a4549c0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataTest.java
@@ -498,25 +498,21 @@ HintsProto.OptimizationType.SHOPPING_PAGE_PREDICTOR.getNumber(), OptimizationGuideDecision.TRUE, null); NavigationHandle navigationHandle = mock(NavigationHandle.class); - for (boolean isInPrimaryMainFrame : new boolean[] {false, true}) { - for (boolean isSameDocument : new boolean[] {false, true}) { - ShoppingPersistedTabData shoppingPersistedTabData = - new ShoppingPersistedTabData(tab); - shoppingPersistedTabData.setPriceMicros(42_000_000L); - shoppingPersistedTabData.setPreviousPriceMicros(60_000_000L); - shoppingPersistedTabData.setCurrencyCode("USD"); - shoppingPersistedTabData.setPriceDropGurl( - ShoppingPersistedTabDataTestUtils.DEFAULT_GURL); + for (boolean isSameDocument : new boolean[] {false, true}) { + ShoppingPersistedTabData shoppingPersistedTabData = new ShoppingPersistedTabData(tab); + shoppingPersistedTabData.setPriceMicros(42_000_000L); + shoppingPersistedTabData.setPreviousPriceMicros(60_000_000L); + shoppingPersistedTabData.setCurrencyCode("USD"); + shoppingPersistedTabData.setPriceDropGurl( + ShoppingPersistedTabDataTestUtils.DEFAULT_GURL); + Assert.assertNotNull(shoppingPersistedTabData.getPriceDrop()); + doReturn(isSameDocument).when(navigationHandle).isSameDocument(); + shoppingPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); + if (!isSameDocument) { + Assert.assertNull(shoppingPersistedTabData.getPriceDrop()); + } else { Assert.assertNotNull(shoppingPersistedTabData.getPriceDrop()); - doReturn(isInPrimaryMainFrame).when(navigationHandle).isInPrimaryMainFrame(); - doReturn(isSameDocument).when(navigationHandle).isSameDocument(); - shoppingPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); - if (isInPrimaryMainFrame && !isSameDocument) { - Assert.assertNull(shoppingPersistedTabData.getPriceDrop()); - } else { - Assert.assertNotNull(shoppingPersistedTabData.getPriceDrop()); - } } } } @@ -551,12 +547,12 @@ shoppingPersistedTabData.setCurrencyCode("USD"); shoppingPersistedTabData.setPriceDropGurl(gurl1); Assert.assertNotNull(shoppingPersistedTabData.getPriceDrop()); - shoppingPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); + shoppingPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); Assert.assertNotNull(shoppingPersistedTabData.getPriceDrop()); doReturn(gurl2).when(navigationHandle).getUrl(); - shoppingPersistedTabData.getUrlUpdatedObserverForTesting().onDidStartNavigation( - tab, navigationHandle); + shoppingPersistedTabData.getUrlUpdatedObserverForTesting() + .onDidStartNavigationInPrimaryMainFrame(tab, navigationHandle); Assert.assertNull(shoppingPersistedTabData.getPriceDrop()); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/controller/CurrentPageVerifierTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/controller/CurrentPageVerifierTest.java index 1a136ba..896ce97 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/controller/CurrentPageVerifierTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/controller/CurrentPageVerifierTest.java
@@ -193,7 +193,7 @@ false /* isExternalProtocol */, 0 /* navigationId */, false /* isPageActivation */, false /* isReload */); for (CustomTabTabObserver tabObserver : mTabObserverCaptor.getAllValues()) { - tabObserver.onDidStartNavigation(mTab, navigation); + tabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); } navigation.didFinish(gurl, false /* isErrorPage */, true /* hasCommitted */,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java index 877a90f..c89877d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManagerTest.java
@@ -260,7 +260,7 @@ when(mNavigationHandle.hasCommitted()).thenReturn(true); when(mNavigationHandle.getUrl()).thenReturn(MOCK_URL); - mWebContentsObserver.didStartNavigation(mNavigationHandle); + mWebContentsObserver.didStartNavigationInPrimaryMainFrame(mNavigationHandle); mWebContentsObserver.didFinishNavigation(mNavigationHandle); // Distiller entry should have been removed. @@ -279,7 +279,7 @@ when(mNavigationHandle.isSameDocument()).thenReturn(false); when(mNavigationHandle.getUrl()).thenReturn(MOCK_DISTILLER_URL); - mWebContentsObserver.didStartNavigation(mNavigationHandle); + mWebContentsObserver.didStartNavigationInPrimaryMainFrame(mNavigationHandle); mWebContentsObserver.didFinishNavigation(mNavigationHandle); assertEquals("Distillation should have started.", DistillationStatus.STARTED, @@ -297,7 +297,7 @@ when(mNavigationHandle.isSameDocument()).thenReturn(true); when(mNavigationHandle.getUrl()).thenReturn(MOCK_URL); - mWebContentsObserver.didStartNavigation(mNavigationHandle); + mWebContentsObserver.didStartNavigationInPrimaryMainFrame(mNavigationHandle); mWebContentsObserver.didFinishNavigation(mNavigationHandle); assertEquals("Distillation should not be possible.", DistillationStatus.NOT_POSSIBLE,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java index 7710cc3..9d8b02c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediatorTest.java
@@ -517,26 +517,47 @@ @Test public void testToggleClusterVisibility() { PropertyModel clusterModel = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); + PropertyModel clusterModel2 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); PropertyModel visitModel1 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); PropertyModel visitModel2 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); - PropertyModel clusterModel2 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); + PropertyModel visitModel3 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); + PropertyModel visitModel4 = new PropertyModel(HistoryClustersItemProperties.ALL_KEYS); List<ListItem> visitItemsToHide = Arrays.asList(new ListItem(ItemType.VISIT, visitModel1), new ListItem(ItemType.VISIT, visitModel2)); - mModelList.add(new ListItem(ItemType.CLUSTER, clusterModel)); + List<ListItem> visitItemsToHide2 = Arrays.asList(new ListItem(ItemType.VISIT, visitModel3), + new ListItem(ItemType.VISIT, visitModel4)); + ListItem clusterItem1 = new ListItem(ItemType.CLUSTER, clusterModel); + ListItem clusterItem2 = new ListItem(ItemType.CLUSTER, clusterModel2); + mModelList.add(clusterItem1); mModelList.addAll(visitItemsToHide); - mModelList.add(new ListItem(ItemType.CLUSTER, clusterModel2)); + mModelList.add(clusterItem2); + mModelList.addAll(visitItemsToHide2); - mMediator.hideCluster(clusterModel, visitItemsToHide); + mMediator.hideCluster(clusterItem1, visitItemsToHide); assertEquals(mModelList.indexOf(visitItemsToHide.get(0)), -1); assertEquals(mModelList.indexOf(visitItemsToHide.get(1)), -1); - assertEquals(2, mModelList.size()); + assertEquals(4, mModelList.size()); assertEquals(ClusterViewAccessibilityState.EXPANDABLE, clusterModel.get(HistoryClustersItemProperties.ACCESSIBILITY_STATE)); - mMediator.showCluster(clusterModel, visitItemsToHide, 1); + mMediator.hideCluster(clusterItem2, visitItemsToHide2); + assertEquals(mModelList.indexOf(visitItemsToHide2.get(0)), -1); + assertEquals(mModelList.indexOf(visitItemsToHide2.get(1)), -1); + assertEquals(2, mModelList.size()); + assertEquals(ClusterViewAccessibilityState.EXPANDABLE, + clusterModel2.get(HistoryClustersItemProperties.ACCESSIBILITY_STATE)); + + mMediator.showCluster(clusterItem2, visitItemsToHide2); + assertEquals(mModelList.indexOf(visitItemsToHide2.get(0)), 2); + assertEquals(mModelList.indexOf(visitItemsToHide2.get(1)), 3); + assertEquals(4, mModelList.size()); + assertEquals(ClusterViewAccessibilityState.COLLAPSIBLE, + clusterModel2.get(HistoryClustersItemProperties.ACCESSIBILITY_STATE)); + + mMediator.showCluster(clusterItem1, visitItemsToHide); assertEquals(mModelList.indexOf(visitItemsToHide.get(0)), 1); assertEquals(mModelList.indexOf(visitItemsToHide.get(1)), 2); - assertEquals(4, mModelList.size()); + assertEquals(6, mModelList.size()); assertEquals(ClusterViewAccessibilityState.COLLAPSIBLE, clusterModel.get(HistoryClustersItemProperties.ACCESSIBILITY_STATE)); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java index 21213d8..d9a905b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestTabHolder.java
@@ -131,8 +131,8 @@ null /* initiatorOrigin */, 0 /* pageTransition */, false /* isPost */, false /* hasUserGesture */, false /* isRedirect */, false /* isExternalProtocol */, 0 /* navigationId */, false /* isPageActivation */, false /* isReload */); - mMediaSessionTabHelper.mMediaSessionHelper.mWebContentsObserver.didStartNavigation( - navigation); + mMediaSessionTabHelper.mMediaSessionHelper.mWebContentsObserver + .didStartNavigationInPrimaryMainFrame(navigation); navigation.didFinish(gurl, false /* isErrorPage */, true /* hasCommitted */, false /* isFragmentNavigation */, false /* isDownload */,
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 4c8322a0..da934f52 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -331,11 +331,6 @@ <part file="whats_new_strings.grdp" /> </if> - <!-- Password Manager strings --> - <if expr="not is_android"> - <part file="password_manager_strings.grdp" /> - </if> - <!-- Printing specific strings --> <if expr="enable_basic_printing"> <part file="printing_strings.grdp" />
diff --git a/chrome/app/password_manager_strings.grdp b/chrome/app/password_manager_strings.grdp deleted file mode 100644 index 6df2e3b4..0000000 --- a/chrome/app/password_manager_strings.grdp +++ /dev/null
@@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<grit-part> - <message name="IDS_PASSWORD_MANAGER_TITLE" desc="Title of the Password Manager page"> - Password Manager - </message> -</grit-part>
diff --git a/chrome/app/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_TITLE.png.sha1 b/chrome/app/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_TITLE.png.sha1 deleted file mode 100644 index f80837e..0000000 --- a/chrome/app/password_manager_strings_grdp/IDS_PASSWORD_MANAGER_TITLE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -8a6bb290e529b355103563c24426569a3d79f4f4 \ No newline at end of file
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index caeac96..b82c3a1 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -619,8 +619,8 @@ <message name="IDS_SETTINGS_PASSWORD_ADD_FOOTNOTE" desc="A footnote for the dialog which allows the user to add a new password."> Make sure you're saving your current password for this site </message> - <message name="IDS_SETTINGS_PASSWORD_ADD_STORE_OPTION_ACCOUNT" desc="An option of the store picker shown in the add password dialog if saving to the account"> - Save in your Google Account (<ph name="EMAIL">$1<ex>username@gmail.com</ex></ph>) + <message name="IDS_SETTINGS_PASSWORD_STORE_PICKER_OPTION_ACCOUNT" desc="An option of the store picker shown in the add password dialog if saving to the Google Password Manager"> + Save to Google Password Manager (<ph name="EMAIL">$1<ex>username@gmail.com</ex></ph>) </message> <message name="IDS_SETTINGS_PASSWORD_COPY" desc="Label for a context menu item that allows to copy the selected password into clipboard."> Copy password @@ -783,14 +783,28 @@ <message name="IDS_SETTINGS_PASSWORDS_IMPORT_CHOOSE_FILE" desc="A button in the dialog for importing passwords from Chrome. Passwords will be imported from the file, which the user will be asked to choose after initiating this action."> Choose file </message> - <message name="IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_GENERIC" desc="Text shown to the user on the dialog for importing passwords, before the user has chosen the file to import passwords from."> - To import passwords, select a CSV file. + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_ACCOUNT_STORE_USERS" desc="Text shown to the account store users (who has the option to store passwords localy or in Google Password manager) on the dialog for importing passwords, before the user has chosen the file to import passwords from."> + To import passwords, select a CSV file + </message> + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SYNCING_USERS" desc="Text shown to the signed in user (whose passwords are synced with Google Password Manager) on the dialog for importing passwords, before the user has chosen the file to import passwords from."> + To import passwords to your Google Password Manager, select a CSV file + </message> + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SIGNEDOUT_USERS" desc="Text shown to the user (whose passwords are store locally on their device) on the dialog for importing passwords, before the user has chosen the file to import passwords from."> + To import passwords to this device, select a CSV file </message> <message name="IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_DEVICE" desc="Text on the dialog for importing passwords that shows how many passwords have been stored on the user device, after the user has chosen the file to import passwords from."> {NUM_PASSWORDS, plural, =1 {1 password imported to this device} other {{NUM_PASSWORDS} passwords imported to this device}} </message> + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_ACCOUNT" desc="Text on the dialog for importing passwords that shows how many passwords have been saved to Google Password Manager, after the user has chosen the file to import passwords from."> + {NUM_PASSWORDS, plural, + =1 {1 password imported to your Google Password Manager (<ph name="USER_EMAIL"><ex>elisa.g.becket@gmail.com</ex>$1</ph>)} + other {{NUM_PASSWORDS} passwords imported to your Google Password Manager (<ph name="USER_EMAIL"><ex>elisa.g.becket@gmail.com</ex>$1</ph>)}} + </message> + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_STORE_PICKER_ACCESSIBLE_NAME" desc="Accessible name of destination dropdown in the passwords import dialog"> + Select where to import your passwords + </message> <message name="IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_TIP" desc="Message is shown on the dialog for importing passwords, after a successful import. It is an advice for the user, that they should consider deleting the file, which they used for importing passwords from."> Consider deleting <ph name="FILENAME"><ex>file_name.csv</ex>$1</ph>, so others who use this device can't see your passwords. </message> @@ -824,6 +838,9 @@ <message name="IDS_SETTINGS_PASSWORDS_IMPORT_FAILURES_SUMMARY" desc="Message is shown on the dialog for importing passwords if some passwords weren't imported."> Passwords not imported (<ph name="COUNT"><ex>42</ex>$1</ph>) </message> + <message name="IDS_SETTINGS_PASSWORDS_IMPORT_ALREADY_ACTIVE" desc="Message is shown on the dialog for importing passwords if there is the import process is already running in another tab."> + You're already importing passwords in another tab + </message> <message name="IDS_SETTINGS_PASSWORDS_EXPORT_MENU_ITEM" desc="A menu item in the More Actions menu above the password list in Chrome's settings. Selecting this action will open a dialog, through which the user can export their passwords outside of Chrome."> Export passwords... </message>
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_ALREADY_ACTIVE.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_ALREADY_ACTIVE.png.sha1 new file mode 100644 index 0000000..666fee66 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_ALREADY_ACTIVE.png.sha1
@@ -0,0 +1 @@ +228df42d51fd620141f659e2df8c835851c18e0e \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_ACCOUNT_STORE_USERS.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_ACCOUNT_STORE_USERS.png.sha1 new file mode 100644 index 0000000..2cff491 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_ACCOUNT_STORE_USERS.png.sha1
@@ -0,0 +1 @@ +989f00e0f5598e9726402b52e9dcbb065b865ad1 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_GENERIC.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_GENERIC.png.sha1 deleted file mode 100644 index 8ff37877..0000000 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_GENERIC.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -a0dc6329506c5d03cf7f6065dea2706d00eacebb \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SIGNEDOUT_USERS.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SIGNEDOUT_USERS.png.sha1 new file mode 100644 index 0000000..73cb4c4 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SIGNEDOUT_USERS.png.sha1
@@ -0,0 +1 @@ +ee8359a47b3bdbf966f14069fae44cf6f5889570 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SYNCING_USERS.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SYNCING_USERS.png.sha1 new file mode 100644 index 0000000..3c6ee339 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SYNCING_USERS.png.sha1
@@ -0,0 +1 @@ +09d00cc3a44661e9eda2df5182ed7fb3f8060418 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_STORE_PICKER_ACCESSIBLE_NAME.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_STORE_PICKER_ACCESSIBLE_NAME.png.sha1 new file mode 100644 index 0000000..4e4f6e17 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_STORE_PICKER_ACCESSIBLE_NAME.png.sha1
@@ -0,0 +1 @@ +954d138a0bd0e267b45c28b3e4a3736dc8e30cba \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_ACCOUNT.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_ACCOUNT.png.sha1 new file mode 100644 index 0000000..cb21a0e --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_ACCOUNT.png.sha1
@@ -0,0 +1 @@ +7f24fdbaeca765a58c61874426356ff9dfc5c4ac \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_ADD_STORE_OPTION_ACCOUNT.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_ADD_STORE_OPTION_ACCOUNT.png.sha1 deleted file mode 100644 index 78bccfd..0000000 --- a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_ADD_STORE_OPTION_ACCOUNT.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -50fe0091c3715ec871184fe999481706b4d63a20 \ No newline at end of file
diff --git a/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_STORE_PICKER_OPTION_ACCOUNT.png.sha1 b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_STORE_PICKER_OPTION_ACCOUNT.png.sha1 new file mode 100644 index 0000000..fdb1e63 --- /dev/null +++ b/chrome/app/settings_strings_grdp/IDS_SETTINGS_PASSWORD_STORE_PICKER_OPTION_ACCOUNT.png.sha1
@@ -0,0 +1 @@ +628019d6df3c9b83533710ef720be5645c8fbe7a \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 63309c0..850c4524 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -5659,8 +5659,6 @@ "apps/intent_helper/supported_links_infobar_prefs_service_factory.h", "browser_process_platform_part_chromeos.cc", "browser_process_platform_part_chromeos.h", - "certificate_provider/certificate_info.cc", - "certificate_provider/certificate_info.h", "certificate_provider/certificate_provider.h", "certificate_provider/certificate_provider_service.cc", "certificate_provider/certificate_provider_service.h", @@ -5762,6 +5760,7 @@ "//chrome/browser/webshare:storage", "//chrome/common/chromeos/extensions", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", + "//chromeos/components/certificate_provider:certificate_provider", "//chromeos/components/disks:prefs", "//chromeos/components/onc:onc", "//chromeos/components/quick_answers:quick_answers",
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 60ff85eb..551bfdf 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -501,7 +501,6 @@ "+chrome/browser/performance_manager/chrome_browser_main_extra_parts_performance_manager.h", "+chrome/browser/performance_manager/chrome_content_browser_client_performance_manager_part.h", "+chrome/browser/performance_manager/metrics/metrics_provider.h", - "+chrome/browser/performance_manager/policies/policy_features.h", # Explicitly disallow using SyncMessageFilter to prevent browser from # sending synchronous IPC messages on non-UI threads.
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 32f6e36..b5fa2f0 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -45,7 +45,6 @@ #include "chrome/browser/net/stub_resolver_config_reader.h" #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/browser/notifications/scheduler/public/features.h" -#include "chrome/browser/performance_manager/policies/policy_features.h" #include "chrome/browser/permissions/notifications_permission_revocation_config.h" #include "chrome/browser/permissions/quiet_notification_permission_ui_config.h" #include "chrome/browser/predictors/loading_predictor_config.h" @@ -3820,9 +3819,6 @@ {"sim-lock-policy", flag_descriptions::kSimLockPolicyName, flag_descriptions::kSimLockPolicyDescription, kOsCrOS, FEATURE_VALUE_TYPE(chromeos::features::kSimLockPolicy)}, - {"trim-on-memory-pressure", flag_descriptions::kTrimOnMemoryPressureName, - flag_descriptions::kTrimOnMemoryPressureDescription, kOsCrOS, - FEATURE_VALUE_TYPE(performance_manager::features::kTrimOnMemoryPressure)}, {"stylus-battery-status", flag_descriptions::kStylusBatteryStatusName, flag_descriptions::kStylusBatteryStatusDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kStylusBatteryStatus)}, @@ -4764,6 +4760,13 @@ kFeedCloseRefreshVariations, "FeedCloseRefresh")}, #endif // BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ + BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) + {"following-feed-sidepanel", flag_descriptions::kFollowingFeedSidepanelName, + flag_descriptions::kFollowingFeedSidepanelDescription, kOsDesktop, + FEATURE_VALUE_TYPE(feed::kWebUiFeed)}, +#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || + // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_FUCHSIA) {"password-import", flag_descriptions::kPasswordImportName, flag_descriptions::kPasswordImportDescription, kOsAll, FEATURE_VALUE_TYPE(password_manager::features::kPasswordImport)}, @@ -5177,6 +5180,12 @@ FEATURE_WITH_PARAMS_VALUE_TYPE(omnibox::kOmniboxAssistantVoiceSearch, kOmniboxAssistantVoiceSearchVariations, "OmniboxAssistantVoiceSearch")}, + + {"omnibox-header-padding-update", + flag_descriptions::kOmniboxHeaderPaddingUpdateName, + flag_descriptions::kOmniboxHeaderPaddingUpdateDescription, kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxHeaderPaddingUpdate)}, + {"omnibox-modernize-visual-update", flag_descriptions::kOmniboxModernizeVisualUpdateName, flag_descriptions::kOmniboxModernizeVisualUpdateDescription, kOsAndroid, @@ -5202,6 +5211,12 @@ kOmniboxRemoveSuggestionHeaderChevronVariations, "OmniboxRemoveSuggestionHeaderChevron")}, + {"omnibox-most-visited-tiles-fading-on-tablet", + flag_descriptions::kOmniboxMostVisitedTilesFadingOnTabletName, + flag_descriptions::kOmniboxMostVisitedTilesFadingOnTabletDescription, + kOsAndroid, + FEATURE_VALUE_TYPE(omnibox::kOmniboxMostVisitedTilesFadingOnTablet)}, + {"omnibox-most-visited-tiles-on-srp", flag_descriptions::kOmniboxMostVisitedTilesOnSrpName, flag_descriptions::kOmniboxMostVisitedTilesOnSrpDescription, kOsAndroid, @@ -6363,10 +6378,6 @@ flag_descriptions::kArcWindowPredictorDescription, kOsCrOS, FEATURE_VALUE_TYPE(full_restore::features::kArcWindowPredictor)}, - {"arc-input-overlay", flag_descriptions::kArcInputOverlayName, - flag_descriptions::kArcInputOverlayDescription, kOsCrOS, - FEATURE_VALUE_TYPE(ash::features::kArcInputOverlay)}, - {"full-restore-for-lacros", flag_descriptions::kFullRestoreForLacrosName, flag_descriptions::kFullRestoreForLacrosDescription, kOsCrOS, FEATURE_VALUE_TYPE(full_restore::features::kFullRestoreForLacros)}, @@ -6377,6 +6388,16 @@ FEATURE_VALUE_TYPE(media::kUseFakeDeviceForMediaStream)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) +#if BUILDFLAG(IS_CHROMEOS_ASH) + {"arc-input-overlay", flag_descriptions::kArcInputOverlayName, + flag_descriptions::kArcInputOverlayDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kArcInputOverlay)}, + + {"arc-input-overlay-beta", flag_descriptions::kArcInputOverlayNameBeta, + flag_descriptions::kArcInputOverlayDescriptionBeta, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kArcInputOverlayBeta)}, +#endif // BUILDFLAG(IS_CHROMEOS_ASH) + #if BUILDFLAG(IS_CHROMEOS) && BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) {"chromeos-direct-video-decoder", flag_descriptions::kChromeOSDirectVideoDecoderName, @@ -8725,6 +8746,15 @@ flag_descriptions::kProjectorExcludeTranscriptName, flag_descriptions::kProjectorExcludeTranscriptDescription, kOsCrOS, FEATURE_VALUE_TYPE(ash::features::kProjectorExcludeTranscript)}, + + {"enable-projector-local-playback", + flag_descriptions::kProjectorLocalPlaybackName, + flag_descriptions::kProjectorLocalPlaybackDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kProjectorLocalPlayback)}, + + {"enable-projector-app-debug", flag_descriptions::kProjectorAppDebugName, + flag_descriptions::kProjectorAppDebugDescription, kOsCrOS, + FEATURE_VALUE_TYPE(ash::features::kProjectorAppDebug)}, #endif // BUILDFLAG(IS_CHROMEOS_ASH) {"web-sql-access", flag_descriptions::kWebSQLAccessName, @@ -9094,12 +9124,6 @@ FEATURE_VALUE_TYPE(::features::kReduceGpuPriorityOnBackground)}, #endif -#if !BUILDFLAG(IS_ANDROID) - {"password-manager-redesign", - flag_descriptions::kPasswordManagerRedesignName, - flag_descriptions::kPasswordManagerRedesignDescription, kOsDesktop, - FEATURE_VALUE_TYPE(password_manager::features::kPasswordManagerRedesign)}, -#endif // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/accessibility/ax_screen_ai_annotator.cc b/chrome/browser/accessibility/ax_screen_ai_annotator.cc index 5dbe39ab..83be0878 100644 --- a/chrome/browser/accessibility/ax_screen_ai_annotator.cc +++ b/chrome/browser/accessibility/ax_screen_ai_annotator.cc
@@ -9,7 +9,7 @@ #include "components/services/screen_ai/public/cpp/screen_ai_service_router.h" #include "components/services/screen_ai/public/cpp/screen_ai_service_router_factory.h" #include "content/public/browser/web_contents.h" -#include "ui/accessibility/ax_tree_manager_map.h" +#include "ui/accessibility/ax_tree_manager.h" #include "ui/gfx/image/image.h" #include "ui/snapshot/snapshot.h" @@ -76,8 +76,7 @@ const ui::AXTreeUpdate& updates) { VLOG(2) << "AxScreenAIAnnotator received:\n" << updates.ToString(); - ui::AXTreeManager* manager = - ui::AXTreeManagerMap::GetInstance().GetManager(ax_tree_id); + ui::AXTreeManager* manager = ui::AXTreeManager::FromID(ax_tree_id); if (!manager) { VLOG(1) << "ScreenAI annotations received, but the corresponding AxTree "
diff --git a/chrome/browser/android/history_report/data_observer.cc b/chrome/browser/android/history_report/data_observer.cc index 57a51c7f..9da2cbc 100644 --- a/chrome/browser/android/history_report/data_observer.cc +++ b/chrome/browser/android/history_report/data_observer.cc
@@ -94,21 +94,19 @@ } void DataObserver::OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { - if (row.hidden() || ui::PageTransitionIsRedirect(transition)) + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + if (url_row.hidden() || ui::PageTransitionIsRedirect(new_visit.transition)) return; - delta_file_service_->PageAdded(row.url()); + delta_file_service_->PageAdded(url_row.url()); // TODO(haaawk): check if this is really a data change not just a // visit of already seen page. data_changed_callback_.Run(); - std::string id = DeltaFileEntryWithData::UrlToId(row.url().spec()); + std::string id = DeltaFileEntryWithData::UrlToId(url_row.url().spec()); usage_reports_buffer_service_->AddVisit( - id, - visit_time.ToJavaTime(), - usage_report_util::IsTypedVisit(transition)); + id, new_visit.visit_time.ToJavaTime(), + usage_report_util::IsTypedVisit(new_visit.transition)); // We stop any usage reporting to wait for gmscore to query the provider // for this url. We do not want to report usage for a URL which might // not be known to gmscore.
diff --git a/chrome/browser/android/history_report/data_observer.h b/chrome/browser/android/history_report/data_observer.h index 89046fd..1483daff 100644 --- a/chrome/browser/android/history_report/data_observer.h +++ b/chrome/browser/android/history_report/data_observer.h
@@ -73,9 +73,8 @@ // HistoryServiceObserver implementation. void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsDeleted(history::HistoryService* history_service, const history::DeletionInfo& deletion_info) override; void HistoryServiceBeingDeleted(
diff --git a/chrome/browser/android/history_report/data_observer_unittest.cc b/chrome/browser/android/history_report/data_observer_unittest.cc index fcddf9f..443b123 100644 --- a/chrome/browser/android/history_report/data_observer_unittest.cc +++ b/chrome/browser/android/history_report/data_observer_unittest.cc
@@ -105,9 +105,10 @@ EXPECT_CALL(*(delta_file_service_.get()), PageAdded(GURL())); EXPECT_CALL(*(usage_report_service_.get()), AddVisit(_, _, _)); - data_observer_->OnURLVisited(history_service_.get(), - ui::PageTransition::PAGE_TRANSITION_LINK, - history::URLRow(GURL()), Time::Now()); + auto visit_row = history::VisitRow(); + visit_row.transition = ui::PageTransition::PAGE_TRANSITION_LINK; + data_observer_->OnURLVisited(history_service_.get(), history::URLRow(GURL()), + visit_row); } TEST_F(DataObserverTest, VisitRedirectShouldNotBeLogged) { @@ -115,10 +116,10 @@ EXPECT_CALL(*(delta_file_service_.get()), PageAdded(_)).Times(0); EXPECT_CALL(*(usage_report_service_.get()), AddVisit(_, _, _)).Times(0); - data_observer_->OnURLVisited( - history_service_.get(), - ui::PageTransition::PAGE_TRANSITION_CLIENT_REDIRECT, - history::URLRow(GURL()), Time::Now()); + auto visit_row = history::VisitRow(); + visit_row.transition = ui::PageTransition::PAGE_TRANSITION_CLIENT_REDIRECT; + data_observer_->OnURLVisited(history_service_.get(), history::URLRow(GURL()), + visit_row); } } // namespace history_report
diff --git a/chrome/browser/apps/app_service/menu_util.cc b/chrome/browser/apps/app_service/menu_util.cc index 3f2fbae..31aa6f5e 100644 --- a/chrome/browser/apps/app_service/menu_util.cc +++ b/chrome/browser/apps/app_service/menu_util.cc
@@ -8,11 +8,13 @@ #include "ash/public/cpp/app_menu_constants.h" #include "base/check.h" +#include "base/notreached.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h" #include "build/chromeos_buildflags.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" +#include "chrome/browser/extensions/menu_manager.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" @@ -22,7 +24,6 @@ #include "ui/base/models/image_model.h" #include "ui/color/color_id.h" #include "ui/gfx/image/image_skia.h" -#include "ui/gfx/vector_icon_types.h" namespace { const int kInvalidRadioGroupId = -1; @@ -90,17 +91,18 @@ menu_item->command_id = ash::LAUNCH_NEW; menu_item->string_id = string_id; - menu_item->submenu.push_back( - CreateRadioItem(ash::USE_LAUNCH_TYPE_REGULAR, - IDS_APP_LIST_CONTEXT_MENU_NEW_TAB, kGroupId)); - menu_item->submenu.push_back( - CreateRadioItem(ash::USE_LAUNCH_TYPE_WINDOW, - IDS_APP_LIST_CONTEXT_MENU_NEW_WINDOW, kGroupId)); + menu_item->submenu.push_back(CreateRadioItem( + ash::USE_LAUNCH_TYPE_REGULAR, + StringIdForUseLaunchTypeCommand(ash::USE_LAUNCH_TYPE_REGULAR), kGroupId)); + menu_item->submenu.push_back(CreateRadioItem( + ash::USE_LAUNCH_TYPE_WINDOW, + StringIdForUseLaunchTypeCommand(ash::USE_LAUNCH_TYPE_WINDOW), kGroupId)); if (base::FeatureList::IsEnabled(features::kDesktopPWAsTabStrip) && base::FeatureList::IsEnabled(features::kDesktopPWAsTabStripSettings)) { - menu_item->submenu.push_back( - CreateRadioItem(ash::USE_LAUNCH_TYPE_TABBED_WINDOW, - IDS_APP_LIST_CONTEXT_MENU_NEW_TABBED_WINDOW, kGroupId)); + menu_item->submenu.push_back(CreateRadioItem( + ash::USE_LAUNCH_TYPE_TABBED_WINDOW, + StringIdForUseLaunchTypeCommand(ash::USE_LAUNCH_TYPE_TABBED_WINDOW), + kGroupId)); } menu_item->radio_group_id = kInvalidRadioGroupId; @@ -147,7 +149,7 @@ const std::vector<apps::mojom::MenuItemPtr>& menu_items, ui::SimpleMenuModel* model, ui::SimpleMenuModel* submenu, - GetVectorIconCallback get_vector_icon) { + int* launch_new_string_id) { if (menu_items.empty()) { return false; } @@ -156,26 +158,20 @@ if (item->command_id != ash::LAUNCH_NEW) return false; - const ui::ColorId color_id = GetColorIdForMenuItemIcon(); + if (launch_new_string_id) + *launch_new_string_id = item->string_id; + switch (item->type) { case apps::mojom::MenuItemType::kCommand: { - const gfx::VectorIcon& icon = - std::move(get_vector_icon).Run(item->command_id, item->string_id); - model->AddItemWithStringIdAndIcon( - item->command_id, item->string_id, - ui::ImageModel::FromVectorIcon(icon, color_id, - ash::kAppContextMenuIconSize)); + model->AddItemWithStringId(item->command_id, item->string_id); break; } case apps::mojom::MenuItemType::kSubmenu: if (!item->submenu.empty()) { PopulateRadioItemFromMojoMenuItems(item->submenu, submenu); - const gfx::VectorIcon& icon = - std::move(get_vector_icon).Run(item->command_id, item->string_id); - model->AddActionableSubmenuWithStringIdAndIcon( - item->command_id, item->string_id, submenu, - ui::ImageModel::FromVectorIcon(icon, color_id, - ash::kAppContextMenuIconSize)); + model->AddActionableSubMenu(item->command_id, + l10n_util::GetStringUTF16(item->string_id), + submenu); } break; case apps::mojom::MenuItemType::kRadio: @@ -260,4 +256,57 @@ #endif } +bool MenuItemHasLauncherContext(const extensions::MenuItem* item) { + return item->contexts().Contains(extensions::MenuItem::LAUNCHER); +} + +uint32_t StringIdForUseLaunchTypeCommand(uint32_t command_id) { + DCHECK(command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && + command_id < ash::USE_LAUNCH_TYPE_COMMAND_END); + switch (command_id) { + case ash::USE_LAUNCH_TYPE_REGULAR: + return IDS_APP_LIST_CONTEXT_MENU_NEW_TAB; + case ash::USE_LAUNCH_TYPE_WINDOW: + return IDS_APP_LIST_CONTEXT_MENU_NEW_WINDOW; + case ash::USE_LAUNCH_TYPE_TABBED_WINDOW: + return IDS_APP_LIST_CONTEXT_MENU_NEW_TABBED_WINDOW; + default: + NOTREACHED(); + return 0; + } +} + +extensions::LaunchType ConvertLaunchTypeCommandToExtensionLaunchType( + uint32_t command_id) { + DCHECK(command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && + command_id < ash::USE_LAUNCH_TYPE_COMMAND_END); + switch (command_id) { + case ash::USE_LAUNCH_TYPE_PINNED: + return extensions::LAUNCH_TYPE_PINNED; + case ash::USE_LAUNCH_TYPE_REGULAR: + return extensions::LAUNCH_TYPE_REGULAR; + case ash::USE_LAUNCH_TYPE_WINDOW: + return extensions::LAUNCH_TYPE_WINDOW; + case ash::USE_LAUNCH_TYPE_FULLSCREEN: + return extensions::LAUNCH_TYPE_FULLSCREEN; + default: + return extensions::LAUNCH_TYPE_INVALID; + } +} + +apps::WindowMode ConvertLaunchTypeCommandToWindowMode(uint32_t command_id) { + DCHECK(command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && + command_id < ash::USE_LAUNCH_TYPE_COMMAND_END); + switch (command_id) { + case ash::USE_LAUNCH_TYPE_REGULAR: + return apps::WindowMode::kBrowser; + case ash::USE_LAUNCH_TYPE_WINDOW: + return apps::WindowMode::kWindow; + case ash::USE_LAUNCH_TYPE_TABBED_WINDOW: + return apps::WindowMode::kTabbedWindow; + default: + return apps::WindowMode::kUnknown; + } +} + } // namespace apps
diff --git a/chrome/browser/apps/app_service/menu_util.h b/chrome/browser/apps/app_service/menu_util.h index 0d2a6de..4a9abbed 100644 --- a/chrome/browser/apps/app_service/menu_util.h +++ b/chrome/browser/apps/app_service/menu_util.h
@@ -10,15 +10,20 @@ #include <string> #include <vector> -#include "base/callback.h" #include "base/strings/string_piece.h" #include "chrome/browser/apps/app_service/app_shortcut_item.h" +#include "components/services/app_service/public/cpp/app_types.h" #include "components/services/app_service/public/mojom/types.mojom.h" +#include "extensions/common/constants.h" #include "ui/base/models/menu_separator_types.h" #include "ui/base/models/simple_menu_model.h" class Profile; +namespace extensions { +class MenuItem; +} + namespace gfx { class ImageSkia; } @@ -29,9 +34,6 @@ namespace apps { -using GetVectorIconCallback = - base::OnceCallback<const gfx::VectorIcon&(int command_id, int string_id)>; - // Adds a command menu item to |menu_items|. void AddCommandItem(uint32_t command_id, uint32_t string_id, @@ -72,13 +74,14 @@ Profile* profile); // Populates the LAUNCH_NEW menu item to a simple menu model |model| from mojo -// menu items |menu_items|. Returns true if the LAUNCH_NEW menu item is added to +// menu items |menu_items|. Also sets initial string id value to +// |launch_new_string_id|. Returns true if the LAUNCH_NEW menu item is added to // |model|, otherwise returns false. bool PopulateNewItemFromMojoMenuItems( const std::vector<apps::mojom::MenuItemPtr>& menu_items, ui::SimpleMenuModel* model, ui::SimpleMenuModel* submenu, - GetVectorIconCallback get_vector_icon); + int* launch_new_string_id); // Populates the menu item to a simple menu model |model| from mojo // menu items |menu_items|. @@ -98,6 +101,19 @@ ui::ColorId GetColorIdForMenuItemIcon(); +// Returns `true` if the provided menu item has a launcher context. +bool MenuItemHasLauncherContext(const extensions::MenuItem* item); + +// Converts `USE_LAUNCH_TYPE_*` commands to associated string ids. +uint32_t StringIdForUseLaunchTypeCommand(uint32_t command_id); + +// Converts `USE_LAUNCH_TYPE_*` commands to `extensions::LaunchType`. +extensions::LaunchType ConvertLaunchTypeCommandToExtensionLaunchType( + uint32_t command_id); + +// Converts `USE_LAUNCH_TYPE_*` commands to `apps::WindowMode`. +apps::WindowMode ConvertLaunchTypeCommandToWindowMode(uint32_t command_id); + } // namespace apps #endif // CHROME_BROWSER_APPS_APP_SERVICE_MENU_UTIL_H_
diff --git a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc index 683b72b..8505df2 100644 --- a/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc +++ b/chrome/browser/ash/app_restore/full_restore_app_launch_handler_browsertest.cc
@@ -250,8 +250,6 @@ void ClickTemplateItem(int index) { ClickButton(ash::GetTemplateItemButton(/*index=*/0)); - // We need to wait for the template to be fetched from the model. - ash::WaitForDesksTemplatesUI(); } } // namespace
diff --git a/chrome/browser/ash/login/security_token_session_controller.cc b/chrome/browser/ash/login/security_token_session_controller.cc index a5170e9e..c07e70e 100644 --- a/chrome/browser/ash/login/security_token_session_controller.cc +++ b/chrome/browser/ash/login/security_token_session_controller.cc
@@ -22,7 +22,6 @@ #include "chrome/browser/ash/crosapi/browser_util.h" #include "chrome/browser/ash/login/lock/screen_locker.h" #include "chrome/browser/browser_process.h" -#include "chrome/browser/certificate_provider/certificate_info.h" #include "chrome/browser/certificate_provider/certificate_provider.h" #include "chrome/browser/certificate_provider/certificate_provider_service.h" #include "chrome/browser/certificate_provider/certificate_provider_service_factory.h" @@ -33,6 +32,7 @@ #include "chrome/browser/ui/ash/security_token_session_restriction_view.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/components/certificate_provider/certificate_info.h" #include "chromeos/ui/vector_icons/vector_icons.h" #include "components/prefs/pref_change_registrar.h" #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/ash/net/network_portal_detector_impl.cc b/chrome/browser/ash/net/network_portal_detector_impl.cc index a35e9bc2..d66cecd2 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl.cc +++ b/chrome/browser/ash/net/network_portal_detector_impl.cc
@@ -384,6 +384,9 @@ // Take into account shill's detection results. status = CAPTIVE_PORTAL_STATUS_PORTAL; } else { + // We should only get here if Shill does not detect a portal but the + // Chrome detector does not receive a response. Use 'offline' to + // trigger continued detection. status = CAPTIVE_PORTAL_STATUS_OFFLINE; } break; @@ -414,8 +417,8 @@ UMA_HISTOGRAM_ENUMERATION("CaptivePortal.NetworkPortalDetectorType", type); } - if (last_detection_result_ != status) { - last_detection_result_ = status; + if (last_detection_status_ != status) { + last_detection_status_ = status; same_detection_result_count_ = 1; net::BackoffEntry::Policy policy = strategy_->policy(); if (status == CAPTIVE_PORTAL_STATUS_ONLINE) { @@ -436,9 +439,20 @@ else no_response_result_count_ = 0; - if (status != CAPTIVE_PORTAL_STATUS_OFFLINE || - same_detection_result_count_ >= kMaxOfflineResultsBeforeReport) { + if (status == CAPTIVE_PORTAL_STATUS_ONLINE || + status == CAPTIVE_PORTAL_STATUS_PORTAL || + status == CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED) { + // Chrome positively identified an online, portal or proxy auth state. + // No need to continue detection. DetectionCompleted(network, status, response_code); + return; + } + + if (same_detection_result_count_ >= kMaxOfflineResultsBeforeReport) { + NET_LOG(EVENT) << "Max identical portal detection results reached: " + << same_detection_result_count_ << " Status: " << status; + DetectionCompleted(network, status, response_code); + return; } // Observers (via DetectionCompleted) may already schedule a new attempt. @@ -487,7 +501,7 @@ } void NetworkPortalDetectorImpl::ResetStrategyAndCounters() { - last_detection_result_ = CAPTIVE_PORTAL_STATUS_UNKNOWN; + last_detection_status_ = CAPTIVE_PORTAL_STATUS_UNKNOWN; same_detection_result_count_ = 0; no_response_result_count_ = 0; strategy_->Reset();
diff --git a/chrome/browser/ash/net/network_portal_detector_impl.h b/chrome/browser/ash/net/network_portal_detector_impl.h index 8286877..e73e1425 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl.h +++ b/chrome/browser/ash/net/network_portal_detector_impl.h
@@ -166,11 +166,6 @@ time_ticks_for_testing_ = time_ticks; } - // Advances current test time ticks. Used by unit tests. - void advance_time_ticks_for_testing(const base::TimeDelta& delta) { - time_ticks_for_testing_ += delta; - } - const std::string& default_network_id_for_testing() const { return default_network_id_; } @@ -217,7 +212,7 @@ std::unique_ptr<PortalDetectorStrategy> strategy_; // Last received result from captive portal detector. - CaptivePortalStatus last_detection_result_ = CAPTIVE_PORTAL_STATUS_UNKNOWN; + CaptivePortalStatus last_detection_status_ = CAPTIVE_PORTAL_STATUS_UNKNOWN; // Number of detection attempts with same result in a row. int same_detection_result_count_ = 0;
diff --git a/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc b/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc index 5d183b5..7016950 100644 --- a/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc +++ b/chrome/browser/ash/net/network_portal_detector_impl_unittest.cc
@@ -152,19 +152,25 @@ guid == default_network_id; } - void CheckRequestTimeoutAndCompleteAttempt( + bool CheckRequestTimeoutAndCompleteAttempt( int expected_same_detection_result_count, int expected_no_response_result_count, int expected_request_timeout_sec, int net_error, int status_code) { - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - ASSERT_EQ(expected_same_detection_result_count, + EXPECT_EQ(expected_same_detection_result_count, same_detection_result_count()); - ASSERT_EQ(expected_no_response_result_count, no_response_result_count()); - ASSERT_EQ(base::Seconds(expected_request_timeout_sec), + EXPECT_EQ(expected_no_response_result_count, no_response_result_count()); + EXPECT_EQ(base::Seconds(expected_request_timeout_sec), get_next_attempt_timeout()); + if (same_detection_result_count() != expected_same_detection_result_count || + no_response_result_count() != expected_no_response_result_count || + get_next_attempt_timeout() != + base::Seconds(expected_request_timeout_sec)) { + return false; + } CompleteURLFetch(net_error, status_code, nullptr); + return true; } Profile* profile() { return profile_; } @@ -229,10 +235,6 @@ network_portal_detector()->set_time_ticks_for_testing(time_ticks); } - void advance_time_ticks(const base::TimeDelta& delta) { - network_portal_detector()->advance_time_ticks_for_testing(delta); - } - void SetBehindPortal(const std::string& service_path) { ShillServiceClient::Get()->SetProperty( dbus::ObjectPath(service_path), shill::kStateProperty, @@ -297,54 +299,46 @@ TEST_F(NetworkPortalDetectorImplTest, NoPortal) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); + // Check HTTP 204 response code. SetConnected(kStubWireless1); - - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, - kStubWireless1)); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 204, nullptr); - - EXPECT_NE(State::STATE_IDLE, state()); - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, - kStubWireless1)); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE); } -TEST_F(NetworkPortalDetectorImplTest, Portal) { +TEST_F(NetworkPortalDetectorImplTest, Portal200) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); // Check HTTP 200 response code. SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 200, nullptr); - - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1)); +} - // Check HTTP 301 response code. - SetConnected(kStubWireless2); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - - CompleteURLFetch(net::OK, 301, nullptr); - - EXPECT_NE(State::STATE_IDLE, state()); - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 301, - kStubWireless2)); +TEST_F(NetworkPortalDetectorImplTest, Portal302) { + ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); // Check HTTP 302 response code. SetConnected(kStubEthernet); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 302, nullptr); - - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE(CheckPortalState( NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 302, kStubEthernet)); } @@ -359,7 +353,7 @@ EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_EQ(observer().status(), NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE); @@ -374,35 +368,39 @@ TEST_F(NetworkPortalDetectorImplTest, NetworkChanged) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); SetConnected(kStubWireless1); // WiFi is in portal state. - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); // Active network is changed during portal detection for WiFi. SetConnected(kStubEthernet); // Portal detection for WiFi is cancelled, portal detection for // ethernet is initiated. - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); // ethernet is in online state. CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE(CheckPortalState( NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubEthernet)); } TEST_F(NetworkPortalDetectorImplTest, NetworkStateReconnect) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(observer().status(), + NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN); SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); @@ -410,11 +408,11 @@ // Triggering a connect to the same network will trigger another portal check // with the same results. SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); @@ -425,31 +423,31 @@ ASSERT_EQ(State::STATE_IDLE, state()); SetBehindPortal(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 200, nullptr); - ASSERT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1)); SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); SetBehindPortal(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::OK, 200, nullptr); - ASSERT_NE(State::STATE_IDLE, state()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1)); @@ -466,7 +464,6 @@ ASSERT_EQ(0, no_response_result_count()); SetConnected(kStubWireless1); - base::RunLoop().RunUntilIdle(); // First portal detection timeouts, next portal detection is // scheduled. @@ -513,26 +510,27 @@ TEST_F(NetworkPortalDetectorImplTest, FirstAttemptFailed) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(0, no_response_result_count()); set_delay_till_next_attempt(base::TimeDelta()); const char retry_after[] = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; - ASSERT_EQ(State::STATE_IDLE, state()); - ASSERT_EQ(0, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_EQ(0, no_response_result_count()); SetConnected(kStubWireless1); CompleteURLFetch(net::OK, 503, retry_after); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - ASSERT_EQ(1, no_response_result_count()); - ASSERT_EQ(base::Seconds(0), next_attempt_delay()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(1, no_response_result_count()); + EXPECT_EQ(base::Seconds(0), next_attempt_delay()); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); CompleteURLFetch(net::OK, 204, nullptr); - EXPECT_NE(State::STATE_IDLE, state()); - ASSERT_EQ(0, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_EQ(0, no_response_result_count()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); @@ -540,34 +538,35 @@ TEST_F(NetworkPortalDetectorImplTest, AllAttemptsFailed) { ASSERT_EQ(State::STATE_IDLE, state()); + ASSERT_EQ(0, no_response_result_count()); set_delay_till_next_attempt(base::TimeDelta()); const char retry_after[] = "HTTP/1.1 503 OK\nRetry-After: 0\n\n"; - ASSERT_EQ(State::STATE_IDLE, state()); - ASSERT_EQ(0, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_EQ(0, no_response_result_count()); SetConnected(kStubWireless1); CompleteURLFetch(net::OK, 503, retry_after); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - ASSERT_EQ(1, no_response_result_count()); - ASSERT_EQ(base::Seconds(0), next_attempt_delay()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(1, no_response_result_count()); + EXPECT_EQ(base::Seconds(0), next_attempt_delay()); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); CompleteURLFetch(net::OK, 503, retry_after); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - ASSERT_EQ(2, no_response_result_count()); - ASSERT_EQ(base::Seconds(0), next_attempt_delay()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(2, no_response_result_count()); + EXPECT_EQ(base::Seconds(0), next_attempt_delay()); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); CompleteURLFetch(net::OK, 503, retry_after); - EXPECT_NE(State::STATE_IDLE, state()); - ASSERT_EQ(3, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_EQ(3, no_response_result_count()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_OFFLINE, 503, kStubWireless1)); @@ -579,18 +578,11 @@ SetConnected(kStubWireless1); CompleteURLFetch(net::OK, 407, nullptr); - ASSERT_EQ(1, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(1, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); + // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); - CompleteURLFetch(net::OK, 407, nullptr); - ASSERT_EQ(2, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - - base::RunLoop().RunUntilIdle(); - CompleteURLFetch(net::OK, 407, nullptr); - ASSERT_EQ(3, no_response_result_count()); - EXPECT_NE(State::STATE_IDLE, state()); EXPECT_TRUE(CheckPortalState( NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PROXY_AUTH_REQUIRED, 407, @@ -602,26 +594,15 @@ set_delay_till_next_attempt(base::TimeDelta()); SetBehindPortal(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 0, nullptr); - ASSERT_EQ(1, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(1, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); - CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 0, nullptr); - ASSERT_EQ(2, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - - // To run CaptivePortalDetector::DetectCaptivePortal(). - base::RunLoop().RunUntilIdle(); - - CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 0, nullptr); - ASSERT_EQ(3, no_response_result_count()); - EXPECT_NE(State::STATE_IDLE, state()); - EXPECT_TRUE(CheckPortalState( NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 0, kStubWireless1)); } @@ -631,7 +612,7 @@ ASSERT_EQ(State::STATE_IDLE, state()); set_no_response_result_count(3); enable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); disable_error_screen_strategy(); // To run CaptivePortalDetector::DetectCaptivePortal(). @@ -646,34 +627,21 @@ enable_error_screen_strategy(); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); - CompleteURLFetch(net::OK, 204, nullptr); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + CompleteURLFetch(net::OK, 204, nullptr); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); - // To run CaptivePortalDetector::DetectCaptivePortal(). - base::RunLoop().RunUntilIdle(); - - CompleteURLFetch(net::OK, 204, nullptr); - - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, - kStubWireless1)); - - // To run CaptivePortalDetector::DetectCaptivePortal(). - base::RunLoop().RunUntilIdle(); - disable_error_screen_strategy(); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); // To run CaptivePortalDetector::DetectCaptivePortal(). base::RunLoop().RunUntilIdle(); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - CompleteURLFetch(net::OK, 204, nullptr); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + CompleteURLFetch(net::OK, 204, nullptr); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, kStubWireless1)); @@ -687,8 +655,8 @@ SetConnected(kStubWireless1); CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 0, nullptr); - ASSERT_EQ(1, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(1, no_response_result_count()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1)); @@ -697,8 +665,8 @@ base::RunLoop().RunUntilIdle(); CompleteURLFetch(net::ERR_CONNECTION_CLOSED, 0, nullptr); - ASSERT_EQ(2, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(2, no_response_result_count()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1)); @@ -707,18 +675,15 @@ base::RunLoop().RunUntilIdle(); CompleteURLFetch(net::OK, 200, nullptr); - ASSERT_EQ(0, no_response_result_count()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(0, no_response_result_count()); + EXPECT_EQ(State::STATE_IDLE, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, kStubWireless1)); - // To run CaptivePortalDetector::DetectCaptivePortal(). - base::RunLoop().RunUntilIdle(); - disable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, 200, kStubWireless1)); @@ -729,49 +694,20 @@ set_delay_till_next_attempt(base::TimeDelta()); SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); + EXPECT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1)); stop_detection(); - ASSERT_EQ(State::STATE_IDLE, state()); - ASSERT_TRUE(attempt_timeout_is_cancelled()); + EXPECT_EQ(State::STATE_IDLE, state()); + EXPECT_TRUE(attempt_timeout_is_cancelled()); EXPECT_TRUE( CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN, -1, kStubWireless1)); } -TEST_F(NetworkPortalDetectorImplTest, TestDetectionRestart) { - ASSERT_EQ(State::STATE_IDLE, state()); - set_delay_till_next_attempt(base::TimeDelta()); - - // First portal detection attempts determines ONLINE state. - SetConnected(kStubWireless1); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - StartPortalDetection(); - - CompleteURLFetch(net::OK, 204, nullptr); - - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_ONLINE, 204, - kStubWireless1)); - EXPECT_NE(State::STATE_IDLE, state()); - - // First portal detection attempts determines PORTAL state. - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - - base::RunLoop().RunUntilIdle(); - ASSERT_EQ(State::STATE_CHECKING_FOR_PORTAL, state()); - CompleteURLFetch(net::OK, 200, nullptr); - - EXPECT_TRUE( - CheckPortalState(NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL, 200, - kStubWireless1)); - EXPECT_NE(State::STATE_IDLE, state()); -} - TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts) { ASSERT_EQ(State::STATE_IDLE, state()); set_delay_till_next_attempt(base::TimeDelta()); @@ -779,69 +715,69 @@ SetConnected(kStubWireless1); // First portal detection attempt uses 5sec timeout. - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, - 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); + 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); // Second portal detection attempt uses 10sec timeout. - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 1 /* expected_same_detection_result_count */, 1 /* expected_no_response_result_count */, - 10 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); + 10 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); // Third portal detection attempt uses 15sec timeout. - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 2 /* expected_same_detection_result_count */, 2 /* expected_no_response_result_count */, - 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - - EXPECT_NE(State::STATE_IDLE, state()); + 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_IDLE, state()); // Check that on the error screen 15sec timeout is used. enable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, - 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); + 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); disable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); SetNetworkDeviceEnabled(shill::kTypeWifi, true); SetConnected(kStubWireless1); // First portal detection attempt for wifi1 uses 5sec timeout. - CheckRequestTimeoutAndCompleteAttempt( + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, - 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); + 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); // Second portal detection attempt for wifi1 also uses 5sec timeout. - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 1 /* expected_same_detection_result_count */, 1 /* expected_no_response_result_count */, - 10 /* expected_request_timeout_sec */, net::OK, 204); - EXPECT_NE(State::STATE_IDLE, state()); + 10 /* expected_request_timeout_sec */, net::OK, 204)); + EXPECT_EQ(State::STATE_IDLE, state()); // Check that in error screen strategy detection for wifi1 15sec // timeout is used. enable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, - 15 /* expected_request_timeout_sec */, net::OK, 204); + 15 /* expected_request_timeout_sec */, net::OK, 204)); disable_error_screen_strategy(); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); } TEST_F(NetworkPortalDetectorImplTest, RequestTimeouts2) { @@ -850,44 +786,29 @@ SetConnected(kStubWireless1); // First portal detection attempt for wifi1 uses 5sec timeout. - CheckRequestTimeoutAndCompleteAttempt( + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 0 /* expected_same_detection_result_count */, 0 /* expected_no_response_result_count */, - 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - base::RunLoop().RunUntilIdle(); + 5 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); // Second portal detection attempt for wifi1 uses 10sec timeout. - CheckRequestTimeoutAndCompleteAttempt( + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 1 /* expected_same_detection_result_count */, 1 /* expected_no_response_result_count */, - 10 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - base::RunLoop().RunUntilIdle(); + 10 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); + EXPECT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); - // Second portal detection attempt for wifi1 uses 15sec timeout. - CheckRequestTimeoutAndCompleteAttempt( + // Third portal detection attempt for wifi1 uses 15sec timeout. + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(CheckRequestTimeoutAndCompleteAttempt( 2 /* expected_same_detection_result_count */, 2 /* expected_no_response_result_count */, - 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0); - EXPECT_NE(State::STATE_IDLE, state()); - ASSERT_EQ(State::STATE_PORTAL_CHECK_PENDING, state()); + 15 /* expected_request_timeout_sec */, net::ERR_CONNECTION_CLOSED, 0)); - // Third portal detection attempt for wifi1 uses 20sec timeout. - base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( - 3 /* expected_same_detection_result_count */, - 3 /* expected_no_response_result_count */, - 20 /* expected_request_timeout_sec */, net::OK, 204); - EXPECT_NE(State::STATE_IDLE, state()); - - // Fourth portal detection attempt for wifi1 uses 5sec timeout. - base::RunLoop().RunUntilIdle(); - CheckRequestTimeoutAndCompleteAttempt( - 1 /* expected_same_detection_result_count */, - 0 /* expected_no_response_result_count */, - 5 /* expected_request_timeout_sec */, net::OK, 204); - EXPECT_NE(State::STATE_IDLE, state()); + // After 3 attempts, detection is completed. + EXPECT_EQ(State::STATE_IDLE, state()); } } // namespace ash
diff --git a/chrome/browser/ash/system_logs/bluetooth_log_source.cc b/chrome/browser/ash/system_logs/bluetooth_log_source.cc index dc73272..299351c5 100644 --- a/chrome/browser/ash/system_logs/bluetooth_log_source.cc +++ b/chrome/browser/ash/system_logs/bluetooth_log_source.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/system_logs/bluetooth_log_source.h" -#include "base/json/json_writer.h" #include "content/public/browser/browser_thread.h" #include "device/bluetooth/floss/floss_features.h" @@ -12,8 +11,7 @@ namespace { -constexpr char kBluetoothLogEntry[] = "CHROMEOS_BLUETOOTH"; -constexpr char kIsFloss[] = "Floss"; +constexpr char kBluetoothFlossLogEntry[] = "CHROMEOS_BLUETOOTH_FLOSS"; } // namespace @@ -25,16 +23,10 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK(!callback.is_null()); - auto bluetooth_log = base::Value(base::Value::Type::DICTIONARY); auto response = std::make_unique<SystemLogsResponse>(); - std::string json; - bluetooth_log.SetBoolKey(kIsFloss, floss::features::IsFlossEnabled()); - - base::JSONWriter::WriteWithOptions( - bluetooth_log, base::JSONWriter::OPTIONS_PRETTY_PRINT, &json); - - (*response)[kBluetoothLogEntry] = std::move(json); + (*response)[kBluetoothFlossLogEntry] = + floss::features::IsFlossEnabled() ? "enabled" : "disabled"; std::move(callback).Run(std::move(response)); }
diff --git a/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc b/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc index 850dd56..714e9f5 100644 --- a/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc +++ b/chrome/browser/ash/web_applications/projector_app/untrusted_projector_ui_config.cc
@@ -6,6 +6,7 @@ #include "ash/constants/ash_features.h" #include "ash/webui/projector_app/public/cpp/projector_app_constants.h" +#include "base/feature_list.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/ash/projector/projector_utils.h" @@ -13,6 +14,7 @@ #include "chrome/common/webui_url_constants.h" #include "components/version_info/channel.h" #include "content/public/browser/web_ui_data_source.h" +#include "third_party/blink/public/common/features.h" ChromeUntrustedProjectorUIDelegate::ChromeUntrustedProjectorUIDelegate() = default; @@ -35,8 +37,11 @@ source->AddBoolean( "isUseOAuthForGetVideoInfoEnabled", ash::features::IsProjectorUseOAuthForGetVideoInfoEnabled()); - source->AddBoolean("isLocalPlaybackEnabled", - ash::features::IsProjectorLocalPlaybackEnabled()); + source->AddBoolean( + "isLocalPlaybackEnabled", + ash::features::IsProjectorLocalPlaybackEnabled() && + // The local playback feature depends on the file handling API. + base::FeatureList::IsEnabled(blink::features::kFileHandlingAPI)); source->AddString("appLocale", g_browser_process->GetApplicationLocale()); }
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc index e3b943f3..0d12e7d 100644 --- a/chrome/browser/browser_features.cc +++ b/chrome/browser/browser_features.cc
@@ -160,13 +160,8 @@ // Controls whether the static key pinning list can be updated via component // updater. -#if BUILDFLAG(IS_ANDROID) -const base::Feature kKeyPinningComponentUpdater{ - "KeyPinningComponentUpdater", base::FEATURE_DISABLED_BY_DEFAULT}; -#else const base::Feature kKeyPinningComponentUpdater{ "KeyPinningComponentUpdater", base::FEATURE_ENABLED_BY_DEFAULT}; -#endif // When this feature is enabled, the network service will restart unsandboxed if // a previous attempt to launch it sandboxed failed.
diff --git a/chrome/browser/cart/cart_service_browsertest.cc b/chrome/browser/cart/cart_service_browsertest.cc index 6b984ffe..54e56b7 100644 --- a/chrome/browser/cart/cart_service_browsertest.cc +++ b/chrome/browser/cart/cart_service_browsertest.cc
@@ -175,7 +175,14 @@ run_loop[5].Run(); } -IN_PROC_BROWSER_TEST_F(CartServiceBrowserTest, TestNavigationUKMCollection) { +// TODO(crbug.com/1246293): Flaky on Linux, ChromeOS, and Mac. +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) +#define MAYBE_TestNavigationUKMCollection DISALBED_TestNavigationUKMCollection +#else +#define MAYBE_TestNavigationUKMCollection TestNavigationUKMCollection +#endif +IN_PROC_BROWSER_TEST_F(CartServiceBrowserTest, + MAYBE_TestNavigationUKMCollection) { ukm::TestAutoSetUkmRecorder ukm_recorder; GURL foo_url(kFakeMerchantURLA); GURL bar_url(kFakeMerchantURLB);
diff --git a/chrome/browser/certificate_provider/certificate_provider_service.h b/chrome/browser/certificate_provider/certificate_provider_service.h index f4c0b535..932f94c 100644 --- a/chrome/browser/certificate_provider/certificate_provider_service.h +++ b/chrome/browser/certificate_provider/certificate_provider_service.h
@@ -18,11 +18,11 @@ #include "base/memory/weak_ptr.h" #include "base/observer_list.h" #include "base/sequence_checker.h" -#include "chrome/browser/certificate_provider/certificate_info.h" #include "chrome/browser/certificate_provider/certificate_requests.h" #include "chrome/browser/certificate_provider/pin_dialog_manager.h" #include "chrome/browser/certificate_provider/sign_requests.h" #include "chrome/browser/certificate_provider/thread_safe_certificate_map.h" +#include "chromeos/components/certificate_provider/certificate_info.h" #include "components/account_id/account_id.h" #include "components/keyed_service/core/keyed_service.h" #include "net/cert/x509_certificate.h"
diff --git a/chrome/browser/certificate_provider/thread_safe_certificate_map.cc b/chrome/browser/certificate_provider/thread_safe_certificate_map.cc index a3c716f..94837ba 100644 --- a/chrome/browser/certificate_provider/thread_safe_certificate_map.cc +++ b/chrome/browser/certificate_provider/thread_safe_certificate_map.cc
@@ -10,7 +10,7 @@ #include "base/containers/flat_map.h" #include "base/strings/string_piece.h" #include "base/synchronization/lock.h" -#include "chrome/browser/certificate_provider/certificate_info.h" +#include "chromeos/components/certificate_provider/certificate_info.h" #include "net/base/hash_value.h" #include "net/cert/asn1_util.h" #include "net/cert/x509_certificate.h"
diff --git a/chrome/browser/certificate_provider/thread_safe_certificate_map.h b/chrome/browser/certificate_provider/thread_safe_certificate_map.h index 14b848fe..c0df6b4 100644 --- a/chrome/browser/certificate_provider/thread_safe_certificate_map.h +++ b/chrome/browser/certificate_provider/thread_safe_certificate_map.h
@@ -11,7 +11,7 @@ #include "base/containers/flat_map.h" #include "base/synchronization/lock.h" -#include "chrome/browser/certificate_provider/certificate_info.h" +#include "chromeos/components/certificate_provider/certificate_info.h" namespace net { class X509Certificate;
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 1572ec9..8d5a0d48 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -330,6 +330,7 @@ "//chromeos/ash/services/cros_healthd/public/cpp", "//chromeos/ash/services/cros_healthd/public/mojom", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", + "//chromeos/components/certificate_provider:certificate_provider", "//chromeos/components/disks:prefs", "//chromeos/components/mojo_bootstrap", "//chromeos/components/onc",
diff --git a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator.java b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator.java index 9fb1cf4..2723378 100644 --- a/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator.java +++ b/chrome/browser/commerce/merchant_viewer/android/java/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediator.java
@@ -91,10 +91,9 @@ } @Override - public void didStartNavigation(NavigationHandle navigation) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { mMetrics.recordNavigateLinkOnBottomSheet(); - if (navigation.isInPrimaryMainFrame() && !navigation.isSameDocument() - && (navigation.getUrl() != null)) { + if (!navigation.isSameDocument() && (navigation.getUrl() != null)) { GURL url = navigation.getUrl(); if (url.equals(mCurrentUrl)) return; mCurrentUrl = url; @@ -103,6 +102,12 @@ } @Override + public void didStartNavigationNoop(NavigationHandle navigation) { + mMetrics.recordNavigateLinkOnBottomSheet(); + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void titleWasSet(String title) { if (!MerchantViewerConfig.doesTrustSignalsSheetUsePageTitle()) return; mToolbarModel.set(BottomSheetToolbarProperties.TITLE, title);
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediatorTest.java index 1ff9974..73ae85b 100644 --- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediatorTest.java +++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustBottomSheetMediatorTest.java
@@ -259,7 +259,8 @@ assertNull(mToolbarModel.get(BottomSheetToolbarProperties.FAVICON_ICON_DRAWABLE)); - mWebContentsObserverCaptor.getValue().didStartNavigation(mMockNavigationHandle); + mWebContentsObserverCaptor.getValue().didStartNavigationInPrimaryMainFrame( + mMockNavigationHandle); verify(mMockMetrics, times(1)).recordNavigateLinkOnBottomSheet(); verify(mMockFaviconHelper, times(1)) .getLocalFaviconImageForURL(any(Profile.class), any(GURL.class), anyInt(),
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java index 0d0c36a..f5df1622 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java
@@ -181,7 +181,7 @@ UmaUtils.recordTopMenuShareCount(itemsShared); return true; } else if (item.getItemId() == R.id.search_menu_id) { - mToolbar.showSearchView(); + mToolbar.showSearchView(true); updateShadowVisibility(); return true; } else if (item.getItemId() == R.id.settings_menu_id) {
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn index 75f8139..4c6fd09 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/BUILD.gn
@@ -42,6 +42,20 @@ "//services/network/public/mojom", ] } + if (is_mac) { + sources += [ + "mac_key_rotation_command.cc", + "mac_key_rotation_command.h", + ] + deps += [ + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/network", + "//chrome/browser/enterprise/connectors/device_trust/key_management/installer:elevated_rotation", + "//chrome/common:channel_info", + "//components/version_info", + "//services/network/public/cpp", + ] + } } source_set("test_support") { @@ -68,31 +82,38 @@ source_set("unit_tests") { testonly = true + deps = [ + ":commands", + ":test_support", + "//base", + "//base/test:test_support", + "//testing/gtest", + ] if (is_win) { sources = [ "win_key_rotation_command_unittest.cc" ] - deps = [ - ":commands", - ":test_support", - "//base", - "//base/test:test_support", - "//chrome/installer/util:constants", - "//testing/gtest", - ] + deps += [ "//chrome/installer/util:constants" ] } if (is_linux) { sources = [ "linux_key_rotation_command_unittest.cc" ] - deps = [ - ":commands", - ":test_support", - "//base", - "//base/test:test_support", + deps += [ "//chrome/browser/enterprise/connectors/device_trust/key_management/core:constants", "//services/network:test_support", - "//testing/gtest", + ] + } + + if (is_mac) { + sources = [ "mac_key_rotation_command_unittest.cc" ] + + deps += [ + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac:test_support", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/network:test_support", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence:test_support", + "//chrome/browser/enterprise/connectors/device_trust/key_management/installer:elevated_rotation", ] } }
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc index 2bb505e..1ddcd36 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command_factory.cc
@@ -15,6 +15,8 @@ #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/win_key_rotation_command.h" #elif BUILDFLAG(IS_LINUX) #include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/linux_key_rotation_command.h" +#elif BUILDFLAG(IS_MAC) +#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h" #endif // BUILDFLAG(IS_WIN) namespace enterprise_connectors { @@ -44,8 +46,9 @@ #if BUILDFLAG(IS_WIN) return std::make_unique<WinKeyRotationCommand>(); #elif BUILDFLAG(IS_LINUX) - return std::make_unique<LinuxKeyRotationCommand>( - std::move(url_loader_factory)); + return std::make_unique<LinuxKeyRotationCommand>(url_loader_factory); +#elif BUILDFLAG(IS_MAC) + return std::make_unique<MacKeyRotationCommand>(url_loader_factory); #else return nullptr; #endif // BUILDFLAG(IS_WIN)
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc new file mode 100644 index 0000000..7d6ae13 --- /dev/null +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.cc
@@ -0,0 +1,93 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h" + +#include <string> +#include <utility> + +#include "base/callback.h" +#include "base/check.h" +#include "base/memory/scoped_refptr.h" +#include "base/syslog_logging.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mojo_key_network_delegate.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h" +#include "chrome/common/channel_info.h" +#include "components/version_info/channel.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "url/gurl.h" + +namespace enterprise_connectors { + +namespace { + +constexpr char kStableChannelHostName[] = "m.google.com"; + +bool ValidRotationCommand(const std::string& host_name) { + return chrome::GetChannel() != version_info::Channel::STABLE || + host_name == kStableChannelHostName; +} + +} // namespace + +MacKeyRotationCommand::MacKeyRotationCommand( + std::unique_ptr<KeyRotationManager> key_rotation_manager) + : key_rotation_manager_(std::move(key_rotation_manager)), + client_(SecureEnclaveClient::Create()) { + DCHECK(key_rotation_manager_); + DCHECK(client_); +} + +MacKeyRotationCommand::MacKeyRotationCommand( + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory) + : key_rotation_manager_( + KeyRotationManager::Create(std::make_unique<MojoKeyNetworkDelegate>( + std::move(url_loader_factory.get())))), + client_(SecureEnclaveClient::Create()) { + DCHECK(key_rotation_manager_); + DCHECK(client_); +} + +MacKeyRotationCommand::~MacKeyRotationCommand() = default; + +void MacKeyRotationCommand::Trigger(const KeyRotationCommand::Params& params, + Callback callback) { + if (!client_->VerifyKeychainUnlocked()) { + SYSLOG(ERROR) + << "Device trust key rotation failed. The keychain is not unlocked."; + std::move(callback).Run(KeyRotationCommand::Status::FAILED); + return; + } + + if (!client_->VerifySecureEnclaveSupported()) { + SYSLOG(ERROR) << "Device trust key rotation failed. The secure enclave is " + "not supported."; + std::move(callback).Run(KeyRotationCommand::Status::FAILED); + return; + } + + GURL dm_server_url(params.dm_server_url); + if (!ValidRotationCommand(dm_server_url.host())) { + SYSLOG(ERROR) + << "Device trust key rotation failed. The server URL is invalid."; + std::move(callback).Run(KeyRotationCommand::Status::FAILED); + return; + } + + key_rotation_manager_.get()->Rotate( + dm_server_url, params.dm_token, params.nonce, + base::BindOnce( + [](std::unique_ptr<KeyRotationManager> manager, Callback callback, + bool result) { + if (!result) { + SYSLOG(ERROR) << "Device trust key rotation failed."; + std::move(callback).Run(KeyRotationCommand::Status::FAILED); + return; + } + std::move(callback).Run(KeyRotationCommand::Status::SUCCEEDED); + }, + std::move(key_rotation_manager_), std::move(callback))); +} + +} // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h new file mode 100644 index 0000000..c4cd946 --- /dev/null +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h
@@ -0,0 +1,44 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_MAC_KEY_ROTATION_COMMAND_H_ +#define CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_MAC_KEY_ROTATION_COMMAND_H_ + +#include "base/callback.h" +#include "base/memory/scoped_refptr.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/key_rotation_command.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h" + +namespace network { +class SharedURLLoaderFactory; +} // namespace network + +namespace enterprise_connectors { + +class MacKeyRotationCommand : public KeyRotationCommand { + public: + explicit MacKeyRotationCommand( + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory); + + ~MacKeyRotationCommand() override; + + // KeyRotationCommand: + void Trigger(const Params& params, Callback callback) override; + + private: + friend class MacKeyRotationCommandTest; + + explicit MacKeyRotationCommand( + std::unique_ptr<KeyRotationManager> key_rotation_manager); + + std::unique_ptr<KeyRotationManager> key_rotation_manager_; + + // Used to issue Keychain APIs. + std::unique_ptr<SecureEnclaveClient> client_; +}; + +} // namespace enterprise_connectors + +#endif // CHROME_BROWSER_ENTERPRISE_CONNECTORS_DEVICE_TRUST_KEY_MANAGEMENT_BROWSER_COMMANDS_MAC_KEY_ROTATION_COMMAND_H_
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc new file mode 100644 index 0000000..eb78244 --- /dev/null +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command_unittest.cc
@@ -0,0 +1,213 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/connectors/device_trust/key_management/browser/commands/mac_key_rotation_command.h" + +#include <string> +#include <utility> + +#include "base/memory/scoped_refptr.h" +#include "base/test/task_environment.h" +#include "base/test/test_future.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_client.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/network/mock_key_network_delegate.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mock_key_persistence_delegate.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/scoped_key_persistence_delegate_factory.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/installer/key_rotation_manager.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::InSequence; +using testing::Invoke; +using testing::Return; +namespace enterprise_connectors { + +using test::MockKeyNetworkDelegate; +using test::MockKeyPersistenceDelegate; +using test::MockSecureEnclaveClient; +using test::ScopedKeyPersistenceDelegateFactory; +using HttpResponseCode = + enterprise_connectors::test::MockKeyNetworkDelegate::HttpResponseCode; + +namespace { + +constexpr char kNonce[] = "nonce"; +constexpr char kFakeDMToken[] = "fake-browser-dm-token"; +constexpr char kFakeDmServerUrl[] = + "https://m.google.com/" + "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&" + "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%" + "7C1.2.3&request=browser_public_key_upload"; +constexpr char kInvalidDmServerUrl[] = + "https://example.com/" + "management_service?retry=false&agent=Chrome+1.2.3(456)&apptype=Chrome&" + "critical=true&deviceid=fake-client-id&devicetype=2&platform=Test%7CUnit%" + "7C1.2.3&request=browser_public_key_upload"; +constexpr HttpResponseCode kSuccessCode = 200; +constexpr HttpResponseCode kFailureCode = 400; + +} // namespace + +class MacKeyRotationCommandTest : public testing::Test { + void SetUp() override { + auto mock_secure_enclave_client = + std::make_unique<MockSecureEnclaveClient>(); + mock_secure_enclave_client_ = mock_secure_enclave_client.get(); + SecureEnclaveClient::SetInstanceForTesting( + std::move(mock_secure_enclave_client)); + + params.dm_token = kFakeDMToken; + params.dm_server_url = kFakeDmServerUrl; + params.nonce = kNonce; + + auto mock_network_delegate = std::make_unique<MockKeyNetworkDelegate>(); + auto mock_persistence_delegate = scoped_factory_.CreateMockedECDelegate(); + + mock_network_delegate_ = mock_network_delegate.get(); + mock_persistence_delegate_ = mock_persistence_delegate.get(); + EXPECT_CALL(*mock_persistence_delegate_, LoadKeyPair()); + rotation_command_ = absl::WrapUnique( + new MacKeyRotationCommand(KeyRotationManager::CreateForTesting( + std::move(mock_network_delegate), + std::move(mock_persistence_delegate)))); + } + + protected: + std::unique_ptr<MacKeyRotationCommand> rotation_command_; + MockSecureEnclaveClient* mock_secure_enclave_client_ = nullptr; + MockKeyNetworkDelegate* mock_network_delegate_ = nullptr; + MockKeyPersistenceDelegate* mock_persistence_delegate_ = nullptr; + test::ScopedKeyPersistenceDelegateFactory scoped_factory_; + KeyRotationCommand::Params params; + base::test::TaskEnvironment task_environment_; +}; + +// Tests a failed key rotation due to the mac keychain being locked. +TEST_F(MacKeyRotationCommandTest, RotateFailure_KeychainLocked) { + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(false)); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests a failed key rotation due to the secure enclave not being supported. +TEST_F(MacKeyRotationCommandTest, RotateFailure_SecureEnclaveUnsupported) { + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(false)); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests a failed key rotation due to an invalid command to rotate. +TEST_F(MacKeyRotationCommandTest, RotateFailure_InvalidCommand) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(true)); + + params.dm_server_url = kInvalidDmServerUrl; + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests a failed key rotation due to failure creating a new signing key pair. +TEST_F(MacKeyRotationCommandTest, RotateFailure_CreateKeyFailure) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()) + .WillOnce(Invoke([]() { return nullptr; })); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests a failed key rotation due to a store key failure. +TEST_F(MacKeyRotationCommandTest, RotateFailure_StoreKeyFailure) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()); + EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _)) + .WillOnce(Return(false)); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests a failed key rotation due to a failure sending the key to the dm +// server. +TEST_F(MacKeyRotationCommandTest, RotateFailure_UploadKeyFailure) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()); + EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _)) + .WillOnce(Return(true)); + EXPECT_CALL( + *mock_network_delegate_, + SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _)) + .WillOnce(Invoke([](const GURL& url, const std::string& dm_token, + const std::string& body, + base::OnceCallback<void(int)> callback) { + std::move(callback).Run(kFailureCode); + })); + EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _)) + .WillOnce(Return(true)); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::FAILED, future.Get()); +} + +// Tests when the key rotation is successful. +TEST_F(MacKeyRotationCommandTest, RotateFailure_Success) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, VerifyKeychainUnlocked()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_secure_enclave_client_, VerifySecureEnclaveSupported()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CheckRotationPermissions()) + .WillOnce(Return(true)); + EXPECT_CALL(*mock_persistence_delegate_, CreateKeyPair()); + EXPECT_CALL(*mock_persistence_delegate_, StoreKeyPair(_, _)) + .WillOnce(Return(true)); + EXPECT_CALL( + *mock_network_delegate_, + SendPublicKeyToDmServer(GURL(kFakeDmServerUrl), kFakeDMToken, _, _)) + .WillOnce(Invoke([](const GURL& url, const std::string& dm_token, + const std::string& body, + base::OnceCallback<void(int)> callback) { + std::move(callback).Run(kSuccessCode); + })); + + base::test::TestFuture<KeyRotationCommand::Status> future; + rotation_command_->Trigger(params, future.GetCallback()); + EXPECT_EQ(KeyRotationCommand::Status::SUCCEEDED, future.Get()); +} + +} // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.cc index a85177a2..3502e25 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.cc
@@ -8,7 +8,9 @@ #include <utility> #include "base/no_destructor.h" +#include "base/notreached.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h" namespace enterprise_connectors { @@ -19,6 +21,15 @@ return storage.get(); } +// Returns the result of the comparison of the key `label` and the +// `wrapped_label`. +bool CheckEqual(base::span<const uint8_t> wrapped_label, + const std::string& label) { + auto label_span = base::as_bytes(base::make_span(label)); + return std::equal(wrapped_label.begin(), wrapped_label.end(), + label_span.begin(), label_span.end()); +} + } // namespace // static @@ -37,4 +48,21 @@ *GetTestInstanceStorage() = std::move(client); } +// static +absl::optional<SecureEnclaveClient::KeyType> +SecureEnclaveClient::GetTypeFromWrappedKey( + base::span<const uint8_t> wrapped_key_label) { + if (CheckEqual(wrapped_key_label, constants::kDeviceTrustSigningKeyLabel)) { + return SecureEnclaveClient::KeyType::kPermanent; + } + + if (CheckEqual(wrapped_key_label, + constants::kTemporaryDeviceTrustSigningKeyLabel)) { + return SecureEnclaveClient::KeyType::kTemporary; + } + + NOTREACHED(); + return absl::nullopt; +} + } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h index ec28ba7d..91b98087 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h
@@ -13,6 +13,7 @@ #include "base/containers/span.h" #include "base/mac/scoped_cftyperef.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace enterprise_connectors { @@ -36,6 +37,11 @@ static std::unique_ptr<SecureEnclaveClient> Create(); + // Returns the key type from the `wrapped_key_label` if the label matches + // any of the supported key labels. Otherwise a nullptr is returned. + static absl::optional<SecureEnclaveClient::KeyType> GetTypeFromWrappedKey( + base::span<const uint8_t> wrapped_key_label); + // Creates a new Secure Enclave private key with a permanent key label. virtual base::ScopedCFTypeRef<SecKeyRef> CreatePermanentKey() = 0;
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm index 9ee02da..807c7cb 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm
@@ -209,7 +209,7 @@ return false; } - output.assign(*der, *der + der_len); + output.assign(der, der + der_len); bssl::UniquePtr<uint8_t> delete_signed_cert_bytes(der); return true; }
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.cc index aca89f38..6ec18d8 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.cc
@@ -12,9 +12,7 @@ #include "base/containers/contains.h" #include "base/containers/span.h" #include "base/mac/scoped_cftyperef.h" -#include "base/notreached.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h" -#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h" #include "crypto/signature_verifier.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -22,32 +20,6 @@ namespace { -// Returns the result of the comparison of the key `label` and the -// `wrapped_key_label`. -bool CheckEqual(const std::string& label, - base::span<const uint8_t> wrapped_key_label) { - auto label_span = base::as_bytes(base::make_span(label)); - return std::equal(wrapped_key_label.begin(), wrapped_key_label.end(), - label_span.begin(), label_span.end()); -} - -// Returns the key type from the `wrapped_key_label` if the `wrapped_key_label` -// matches any of the supported key labels. Otherwise a nullptr is returned. -absl::optional<SecureEnclaveClient::KeyType> GetTypeFromWrappedKey( - base::span<const uint8_t> wrapped_key_label) { - if (CheckEqual(constants::kDeviceTrustSigningKeyLabel, wrapped_key_label)) { - return SecureEnclaveClient::KeyType::kPermanent; - } - - if (CheckEqual(constants::kTemporaryDeviceTrustSigningKeyLabel, - wrapped_key_label)) { - return SecureEnclaveClient::KeyType::kTemporary; - } - - NOTREACHED(); - return absl::nullopt; -} - // An implementation of crypto::UnexportableSigningKey. class SecureEnclaveSigningKey : public crypto::UnexportableSigningKey { public: @@ -151,7 +123,8 @@ SecureEnclaveSigningKeyProvider::FromWrappedSigningKeySlowly( base::span<const uint8_t> wrapped_key_label) { // Verifying wrapped key label matches the provider key type. - if (provider_key_type_ != GetTypeFromWrappedKey(wrapped_key_label)) + if (provider_key_type_ != + SecureEnclaveClient::GetTypeFromWrappedKey(wrapped_key_label)) return nullptr; auto client = SecureEnclaveClient::Create();
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/BUILD.gn b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/BUILD.gn index a9f706a..2094bb4 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/BUILD.gn +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/BUILD.gn
@@ -32,6 +32,12 @@ "mac_key_persistence_delegate.cc", "mac_key_persistence_delegate.h", ] + deps += [ + "//chrome/browser/enterprise/connectors/device_trust/key_management/core:constants", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac", + ] + + friend = [ ":unit_tests" ] } if (is_linux) { @@ -74,17 +80,33 @@ ] } -if (is_linux) { - source_set("unit_tests") { - testonly = true - sources = [ "linux_key_persistence_delegate_unittest.cc" ] +source_set("unit_tests") { + testonly = true - deps = [ - ":persistence", - "//base", - "//chrome/browser/enterprise/connectors/device_trust/key_management/core", - "//components/policy/proto", - "//testing/gtest", + deps = [ + ":persistence", + "//base", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core", + "//components/policy/proto", + "//testing/gtest", + ] + + if (is_linux) { + sources = [ "linux_key_persistence_delegate_unittest.cc" ] + } + + if (is_mac) { + sources = [ "mac_key_persistence_delegate_unittest.mm" ] + + deps += [ + "//chrome/browser/enterprise/connectors/device_trust/key_management/core:constants", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac", + "//chrome/browser/enterprise/connectors/device_trust/key_management/core/mac:test_support", + ] + + frameworks = [ + "Foundation.framework", + "Security.framework", ] } }
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.cc index 2923b17..e319188 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.cc
@@ -4,7 +4,11 @@ #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h" -#include "base/notreached.h" +#include <utility> + +#include "base/check.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/signing_key_pair.h" #include "components/policy/proto/device_management_backend.pb.h" @@ -12,31 +16,78 @@ using BPKUR = enterprise_management::BrowserPublicKeyUploadRequest; +MacKeyPersistenceDelegate::MacKeyPersistenceDelegate() + : client_(SecureEnclaveClient::Create()) { + DCHECK(client_); +} + MacKeyPersistenceDelegate::~MacKeyPersistenceDelegate() = default; bool MacKeyPersistenceDelegate::CheckRotationPermissions() { - NOTIMPLEMENTED(); - return false; + return true; } bool MacKeyPersistenceDelegate::StoreKeyPair(KeyTrustLevel trust_level, std::vector<uint8_t> wrapped) { - NOTIMPLEMENTED(); - return false; + // This method does not actually store a new key pair but instead performs the + // rollback of moving the previous signing key from temporary key storage back + // to permanent key storage when failure occurs during the key rotation. This + // is because key storage is handled by the SecureEnclaveSigningKey upon key + // creation. + auto key_type = SecureEnclaveClient::GetTypeFromWrappedKey( + base::make_span(wrapped.data(), wrapped.size())); + + if (!key_type || + key_type.value() == SecureEnclaveClient::KeyType::kTemporary) { + // Roll the previous signing key back to permanent key storage. + return client_->UpdateStoredKeyLabel( + SecureEnclaveClient::KeyType::kTemporary, + SecureEnclaveClient::KeyType::kPermanent); + } + + return true; } std::unique_ptr<SigningKeyPair> MacKeyPersistenceDelegate::LoadKeyPair() { - NOTIMPLEMENTED(); - return nullptr; + SecureEnclaveClient::KeyType key_type = + SecureEnclaveClient::KeyType::kPermanent; + std::vector<uint8_t> key_label; + if (!client_->GetStoredKeyLabel(key_type, key_label) || key_label.empty()) { + return nullptr; + } + + SecureEnclaveSigningKeyProvider provider(key_type); + auto signing_key = provider.FromWrappedSigningKeySlowly(key_label); + if (!signing_key) { + return nullptr; + } + + return std::make_unique<SigningKeyPair>(std::move(signing_key), + BPKUR::CHROME_BROWSER_HW_KEY); } std::unique_ptr<SigningKeyPair> MacKeyPersistenceDelegate::CreateKeyPair() { - NOTIMPLEMENTED(); - return nullptr; + // Moving a previous signing key to temporary key storage if a key exists. + client_->UpdateStoredKeyLabel(SecureEnclaveClient::KeyType::kPermanent, + SecureEnclaveClient::KeyType::kTemporary); + + // The permanent key provider creates a new signing key pair in the permanent + // key storage. + SecureEnclaveClient::KeyType key_type = + SecureEnclaveClient::KeyType::kPermanent; + SecureEnclaveSigningKeyProvider provider(key_type); + auto acceptable_algorithms = {crypto::SignatureVerifier::ECDSA_SHA256}; + auto signing_key = provider.GenerateSigningKeySlowly(acceptable_algorithms); + if (!signing_key) { + return nullptr; + } + + return std::make_unique<SigningKeyPair>(std::move(signing_key), + BPKUR::CHROME_BROWSER_HW_KEY); } void MacKeyPersistenceDelegate::CleanupTemporaryKeyData() { - NOTIMPLEMENTED(); + client_->DeleteKey(SecureEnclaveClient::KeyType::kTemporary); } } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h index c093e1fb..1e99f99 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h
@@ -8,15 +8,18 @@ #include <memory> #include <vector> +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client.h" #include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/key_persistence_delegate.h" namespace enterprise_connectors { class SigningKeyPair; -// Mac implementation of the KeyPersistenceDelegate interface. +// Mac implementation of the KeyPersistenceDelegate interface. Mac currently +// only supports hardware generated Secure Enclave signing keys. class MacKeyPersistenceDelegate : public KeyPersistenceDelegate { public: + MacKeyPersistenceDelegate(); ~MacKeyPersistenceDelegate() override; // KeyPersistenceDelegate: @@ -26,6 +29,9 @@ std::unique_ptr<SigningKeyPair> LoadKeyPair() override; std::unique_ptr<SigningKeyPair> CreateKeyPair() override; void CleanupTemporaryKeyData() override; + + private: + std::unique_ptr<SecureEnclaveClient> client_; }; } // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate_unittest.mm b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate_unittest.mm new file mode 100644 index 0000000..19592a7 --- /dev/null +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate_unittest.mm
@@ -0,0 +1,284 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/mac_key_persistence_delegate.h" + +#import <Foundation/Foundation.h> +#import <Security/Security.h> + +#include <string> +#include <utility> + +#include "base/containers/span.h" +#include "base/mac/scoped_cftyperef.h" +#include "base/strings/sys_string_conversions.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/mock_secure_enclave_client.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_signing_key.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/shared_command_constants.h" +#include "chrome/browser/enterprise/connectors/device_trust/key_management/core/signing_key_pair.h" +#include "components/policy/proto/device_management_backend.pb.h" +#include "testing/gtest/include/gtest/gtest.h" + +using BPKUR = enterprise_management::BrowserPublicKeyUploadRequest; +using ::testing::_; +using ::testing::InSequence; + +namespace enterprise_connectors { + +using test::MockSecureEnclaveClient; + +class MacKeyPersistenceDelegateTest : public testing::Test { + public: + MacKeyPersistenceDelegateTest() { + SetMockClient(); + persistence_delegate_ = std::make_unique<MacKeyPersistenceDelegate>(); + } + + protected: + void SetMockClient() { + auto mock_secure_enclave_client = + std::make_unique<MockSecureEnclaveClient>(); + mock_secure_enclave_client_ = mock_secure_enclave_client.get(); + SecureEnclaveClient::SetInstanceForTesting( + std::move(mock_secure_enclave_client)); + } + + std::vector<uint8_t> CreateWrappedKeyLabel(std::string label) { + std::vector<uint8_t> output; + output.assign(label.begin(), label.end()); + return output; + } + + // Creates a test key. + base::ScopedCFTypeRef<SecKeyRef> CreateTestKey() { + base::ScopedCFTypeRef<CFMutableDictionaryRef> test_attributes( + CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)); + CFDictionarySetValue(test_attributes, kSecAttrLabel, + base::SysUTF8ToNSString("fake-label")); + CFDictionarySetValue(test_attributes, kSecAttrKeyType, + kSecAttrKeyTypeECSECPrimeRandom); + CFDictionarySetValue(test_attributes, kSecAttrKeySizeInBits, @256); + base::ScopedCFTypeRef<CFMutableDictionaryRef> private_key_params( + CFDictionaryCreateMutable(kCFAllocatorDefault, 0, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks)); + CFDictionarySetValue(private_key_params, kSecAttrIsPermanent, @NO); + CFDictionarySetValue(test_attributes, kSecPrivateKeyAttrs, + private_key_params); + return base::ScopedCFTypeRef<SecKeyRef>( + SecKeyCreateRandomKey(test_attributes, nullptr)); + } + + std::unique_ptr<MacKeyPersistenceDelegate> persistence_delegate_; + MockSecureEnclaveClient* mock_secure_enclave_client_ = nullptr; +}; + +// Tests that storing a key with an OS key trust level invokes the clients' +// UpdateStoredKeyLabel method when the wrapped data is correct. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_OSKey_Success) { + InSequence s; + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .Times(0); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_OS_KEY, + CreateWrappedKeyLabel(constants::kDeviceTrustSigningKeyLabel))); + + // Correct wrapped data consists of the wrapped temporary key label. + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return true; + }); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_OS_KEY, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests that storing a key with an OS key trust level fails when the clients' +// UpdateStoredKeyLabel method returns false. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_OSKey_Failure) { + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return false; + }); + EXPECT_FALSE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_OS_KEY, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests that storing a key with an unspecified trust level invokes the clients' +// UpdateStoredKeyLabel method when the wrapped data is correct. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_UnspecifiedKey_Success) { + InSequence s; + + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .Times(0); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::KEY_TRUST_LEVEL_UNSPECIFIED, + CreateWrappedKeyLabel(constants::kDeviceTrustSigningKeyLabel))); + + // Correct wrapped data consists of the wrapped temporary key label. + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return true; + }); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::KEY_TRUST_LEVEL_UNSPECIFIED, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests that storing a key with an unspecified trust level fails when the +// clients' UpdateStoredKeyLabel method returns false. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_UnspecifiedKey_Failure) { + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return false; + }); + EXPECT_FALSE(persistence_delegate_->StoreKeyPair( + BPKUR::KEY_TRUST_LEVEL_UNSPECIFIED, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests that storing a hardware generated key invokes the clients' +// UpdateStoredKeyLabel method when the wrapped data is correct. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_HardwareKey_Success) { + InSequence s; + + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .Times(0); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_HW_KEY, + CreateWrappedKeyLabel(constants::kDeviceTrustSigningKeyLabel))); + + // Correct wrapped data consists of the wrapped temporary key label. + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return true; + }); + EXPECT_TRUE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_HW_KEY, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests that storing a hardware generated key fails when the clients' +// UpdateStoredKeyLabel method returns false. +TEST_F(MacKeyPersistenceDelegateTest, StoreKeyPair_HardwareKey_Failure) { + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, new_key_type); + return false; + }); + EXPECT_FALSE(persistence_delegate_->StoreKeyPair( + BPKUR::CHROME_BROWSER_HW_KEY, + CreateWrappedKeyLabel(constants::kTemporaryDeviceTrustSigningKeyLabel))); +} + +// Tests loading a key pair when no key previously existed. +TEST_F(MacKeyPersistenceDelegateTest, LoadKeyPair_NoKey) { + InSequence s; + + EXPECT_CALL(*mock_secure_enclave_client_, GetStoredKeyLabel(_, _)) + .WillOnce( + [](SecureEnclaveClient::KeyType type, std::vector<uint8_t>& output) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, type); + return false; + }); + EXPECT_FALSE(persistence_delegate_->LoadKeyPair()); + + EXPECT_CALL(*mock_secure_enclave_client_, GetStoredKeyLabel(_, _)) + .WillOnce( + [](SecureEnclaveClient::KeyType type, std::vector<uint8_t>& output) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, type); + return true; + }); + EXPECT_FALSE(persistence_delegate_->LoadKeyPair()); +} + +// Tests loading a key pair when a key previously existed. +TEST_F(MacKeyPersistenceDelegateTest, LoadKeyPair_Key) { + EXPECT_CALL(*mock_secure_enclave_client_, GetStoredKeyLabel(_, _)) + .WillOnce( + [](SecureEnclaveClient::KeyType type, std::vector<uint8_t>& output) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, type); + std::string label = constants::kDeviceTrustSigningKeyLabel; + output.assign(label.begin(), label.end()); + return true; + }); + + SetMockClient(); + EXPECT_CALL(*mock_secure_enclave_client_, CopyStoredKey(_)) + .WillOnce([this](SecureEnclaveClient::KeyType type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, type); + return CreateTestKey(); + }); + + auto key_pair = persistence_delegate_->LoadKeyPair(); + EXPECT_EQ(BPKUR::CHROME_BROWSER_HW_KEY, key_pair->trust_level()); + EXPECT_TRUE(key_pair->key()); +} + +// Tests a failure to create a new key pair. +TEST_F(MacKeyPersistenceDelegateTest, CreateKeyPair__EmptySigningKey) { + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, new_key_type); + return true; + }); + + SetMockClient(); + EXPECT_CALL(*mock_secure_enclave_client_, CreatePermanentKey()) + .WillOnce([]() { return base::ScopedCFTypeRef<SecKeyRef>(); }); + EXPECT_FALSE(persistence_delegate_->CreateKeyPair()); +} + +// Tests a successful call to create a new key pair. +TEST_F(MacKeyPersistenceDelegateTest, CreateKeyPair_Success) { + EXPECT_CALL(*mock_secure_enclave_client_, UpdateStoredKeyLabel(_, _)) + .WillOnce([](SecureEnclaveClient::KeyType current_key_type, + SecureEnclaveClient::KeyType new_key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kPermanent, current_key_type); + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, new_key_type); + return true; + }); + + SetMockClient(); + EXPECT_CALL(*mock_secure_enclave_client_, CreatePermanentKey()) + .WillOnce([this]() { return CreateTestKey(); }); + auto key_pair = persistence_delegate_->CreateKeyPair(); + EXPECT_EQ(BPKUR::CHROME_BROWSER_HW_KEY, key_pair->trust_level()); + EXPECT_TRUE(key_pair->key()); +} + +// Tests that the CleanupTemporaryKeyData correctly invokes the clients' +// DeleteKey method with the correct key type. +TEST_F(MacKeyPersistenceDelegateTest, CleanupTemporaryKeyData) { + EXPECT_CALL(*mock_secure_enclave_client_, DeleteKey(_)) + .WillOnce([](SecureEnclaveClient::KeyType key_type) { + EXPECT_EQ(SecureEnclaveClient::KeyType::kTemporary, key_type); + return true; + }); + persistence_delegate_->CleanupTemporaryKeyData(); +} + +} // namespace enterprise_connectors
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/win_key_persistence_delegate.cc b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/win_key_persistence_delegate.cc index c5e9e5e..58bd36e 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/win_key_persistence_delegate.cc +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/persistence/win_key_persistence_delegate.cc
@@ -94,7 +94,9 @@ std::unique_ptr<SigningKeyPair> WinKeyPersistenceDelegate::CreateKeyPair() { auto acceptable_algorithms = { - crypto::SignatureVerifier::ECDSA_SHA256, + // This a temporary fix to bug b/240187326 where The unexportable key when + // given the span of acceptable algorithms fails to create a TPM key using + // the ECDSA_SHA256 algorithm but works for the RSA algorithm. crypto::SignatureVerifier::RSA_PKCS1_SHA256, }; @@ -102,6 +104,10 @@ KeyPersistenceDelegate::KeyTrustLevel trust_level = BPKUR::CHROME_BROWSER_HW_KEY; if (!provider) { + acceptable_algorithms = { + crypto::SignatureVerifier::ECDSA_SHA256, + crypto::SignatureVerifier::RSA_PKCS1_SHA256, + }; provider = std::make_unique<ECSigningKeyProvider>(); trust_level = BPKUR::CHROME_BROWSER_OS_KEY; }
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 9af23fd..49d9fd50 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -851,6 +851,7 @@ "//components/password_manager/content/browser", "//components/password_manager/core/browser", "//components/password_manager/core/browser:affiliation", + "//components/password_manager/core/browser:import_results", "//components/password_manager/core/browser/leak_detection", "//components/payments/core", "//components/performance_manager",
diff --git a/chrome/browser/extensions/api/commands/command_service.cc b/chrome/browser/extensions/api/commands/command_service.cc index 87ea997b..0a64c2e 100644 --- a/chrome/browser/extensions/api/commands/command_service.cc +++ b/chrome/browser/extensions/api/commands/command_service.cc
@@ -601,20 +601,20 @@ ui::Accelerator suggested_key; absl::optional<bool> suggested_key_was_assigned; ExtensionPrefs* extension_prefs = ExtensionPrefs::Get(profile_); - const base::DictionaryValue* commands_prefs = nullptr; - if (extension_prefs->ReadPrefAsDictionary(extension->id(), kCommands, - &commands_prefs)) { - const base::Value* suggested_key_prefs = - commands_prefs->FindDictPath(command_name); + const base::Value::Dict* commands_prefs = + extension_prefs->ReadPrefAsDict(extension->id(), kCommands); + if (commands_prefs) { + const base::Value::Dict* suggested_key_prefs = + commands_prefs->FindDict(command_name); if (suggested_key_prefs) { const std::string* suggested_key_string = - suggested_key_prefs->FindStringKey(kSuggestedKey); + suggested_key_prefs->FindString(kSuggestedKey); if (suggested_key_string) { suggested_key = Command::StringToAccelerator(*suggested_key_string, command_name); } suggested_key_was_assigned = - suggested_key_prefs->FindBoolKey(kSuggestedKeyWasAssigned); + suggested_key_prefs->FindBool(kSuggestedKeyWasAssigned); } }
diff --git a/chrome/browser/extensions/api/history/history_api.cc b/chrome/browser/extensions/api/history/history_api.cc index e1b9e337..bb8d7f7 100644 --- a/chrome/browser/extensions/api/history/history_api.cc +++ b/chrome/browser/extensions/api/history/history_api.cc
@@ -143,10 +143,9 @@ } void HistoryEventRouter::OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { - auto args = OnVisited::Create(GetHistoryItem(row)); + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + auto args = OnVisited::Create(GetHistoryItem(url_row)); DispatchEvent(profile_, events::HISTORY_ON_VISITED, api::history::OnVisited::kEventName, std::move(args)); }
diff --git a/chrome/browser/extensions/api/history/history_api.h b/chrome/browser/extensions/api/history/history_api.h index 2b8f489..df1ed30 100644 --- a/chrome/browser/extensions/api/history/history_api.h +++ b/chrome/browser/extensions/api/history/history_api.h
@@ -38,9 +38,8 @@ private: // history::HistoryServiceObserver. void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsDeleted(history::HistoryService* history_service, const history::DeletionInfo& deletion_info) override;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc index 6bd15382..d266eaf 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.cc
@@ -220,14 +220,22 @@ auto parameters = api::passwords_private::ImportPasswords::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(parameters); - // TODO(crbug/1325290): Introduce callback for filling ImportResults with - // real data. - GetDelegate(browser_context())->ImportPasswords(GetSenderWebContents()); - api::passwords_private::ImportResults results; - results.status = - extensions::api::passwords_private::IMPORT_RESULTS_STATUS_SUCCESS; - return RespondNow(ArgumentList( - api::passwords_private::ImportPasswords::Results::Create(results))); + GetDelegate(browser_context()) + ->ImportPasswords( + parameters->to_store, + base::BindOnce( + &PasswordsPrivateImportPasswordsFunction::ImportRequestCompleted, + this), + GetSenderWebContents()); + + // `ImportRequestCompleted()` might respond before we reach this point. + return did_respond() ? AlreadyResponded() : RespondLater(); +} + +void PasswordsPrivateImportPasswordsFunction::ImportRequestCompleted( + const api::passwords_private::ImportResults& result) { + Respond(ArgumentList( + api::passwords_private::ImportPasswords::Results::Create(result))); } // PasswordsPrivateExportPasswordsFunction
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h index 7a4b1bb..ec17329 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_api.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_api.h
@@ -170,6 +170,10 @@ // ExtensionFunction overrides. ResponseAction Run() override; + + private: + void ImportRequestCompleted( + const api::passwords_private::ImportResults& results); }; class PasswordsPrivateExportPasswordsFunction : public ExtensionFunction {
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h index ac1301fa..ef166c7 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate.h
@@ -16,6 +16,7 @@ #include "components/keyed_service/core/keyed_service.h" #include "components/password_manager/core/browser/bulk_leak_check_service.h" #include "components/password_manager/core/browser/ui/export_progress_status.h" +#include "components/password_manager/core/browser/ui/import_results.h" #include "components/password_manager/core/browser/ui/insecure_credentials_manager.h" #include "extensions/browser/extension_function.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -31,6 +32,9 @@ // import/export) and to notify listeners when these values have changed. class PasswordsPrivateDelegate : public KeyedService { public: + using ImportResultsCallback = + base::OnceCallback<void(const api::passwords_private::ImportResults&)>; + using PlaintextPasswordCallback = base::OnceCallback<void(absl::optional<std::u16string>)>; using RequestCredentialDetailsCallback = base::OnceCallback<void( @@ -144,7 +148,13 @@ // Trigger the password import procedure, allowing the user to select a file // containing passwords to import. - virtual void ImportPasswords(content::WebContents* web_contents) = 0; + // |to_store|: destination store (Device or Account) for imported passwords. + // |results_callback|: Used to communicate the status and summary of the + // import process. + virtual void ImportPasswords( + api::passwords_private::PasswordStoreSet to_store, + ImportResultsCallback results_callback, + content::WebContents* web_contents) = 0; // Trigger the password export procedure, allowing the user to save a file // containing their passwords. |callback| will be called with an error
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc index 9dcd322..44634279d 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.cc
@@ -179,6 +179,33 @@ return entry; } +extensions::api::passwords_private::ImportEntry ConvertImportEntry( + const password_manager::ImportEntry& entry) { + extensions::api::passwords_private::ImportEntry result; + result.status = + static_cast<extensions::api::passwords_private::ImportEntryStatus>( + entry.status); + result.url = entry.url; + result.username = entry.username; + return result; +} + +// Maps password_manager::ImportResults to +// extensions::api::passwords_private::ImportResults. +extensions::api::passwords_private::ImportResults ConvertImportResults( + const password_manager::ImportResults& results) { + extensions::api::passwords_private::ImportResults private_results; + private_results.status = + static_cast<extensions::api::passwords_private::ImportResultsStatus>( + results.status); + private_results.number_imported = results.number_imported; + private_results.file_name = results.file_name; + private_results.failed_imports.reserve(results.failed_imports.size()); + for (const auto& entry : results.failed_imports) + private_results.failed_imports.emplace_back(ConvertImportEntry(entry)); + return private_results; +} + } // namespace namespace extensions { @@ -527,8 +554,15 @@ } void PasswordsPrivateDelegateImpl::ImportPasswords( + api::passwords_private::PasswordStoreSet to_store, + ImportResultsCallback results_callback, content::WebContents* web_contents) { - password_manager_porter_->Import(web_contents); + DCHECK_NE(api::passwords_private::PasswordStoreSet:: + PASSWORD_STORE_SET_DEVICE_AND_ACCOUNT, + to_store); + password_manager_porter_->Import( + web_contents, *ConvertToPasswordFormStores(to_store).begin(), + base::BindOnce(&ConvertImportResults).Then(std::move(results_callback))); } void PasswordsPrivateDelegateImpl::ExportPasswords(
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h index a826b77..2a05a80 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl.h
@@ -82,7 +82,9 @@ content::WebContents* web_contents) override; void MovePasswordsToAccount(const std::vector<int>& ids, content::WebContents* web_contents) override; - void ImportPasswords(content::WebContents* web_contents) override; + void ImportPasswords(api::passwords_private::PasswordStoreSet to_store, + ImportResultsCallback results_callback, + content::WebContents* web_contents) override; void ExportPasswords( base::OnceCallback<void(const std::string&)> accepted_callback, content::WebContents* web_contents) override;
diff --git a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc index a9dc3d4..7e45c869 100644 --- a/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc +++ b/chrome/browser/extensions/api/passwords_private/passwords_private_delegate_impl_unittest.cc
@@ -966,4 +966,115 @@ delegate.GetSavedPasswordsList(callback.Get()); } +TEST_F(PasswordsPrivateDelegateImplTest, VerifyCastingOfImportEntryStatus) { + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_NONE) == + static_cast<int>(password_manager::ImportEntry::Status::NONE), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_UNKNOWN_ERROR) == + static_cast<int>( + password_manager::ImportEntry::Status::UNKNOWN_ERROR), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_MISSING_PASSWORD) == + static_cast<int>( + password_manager::ImportEntry::Status::MISSING_PASSWORD), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_MISSING_URL) == + static_cast<int>(password_manager::ImportEntry::Status::MISSING_URL), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_INVALID_URL) == + static_cast<int>(password_manager::ImportEntry::Status::INVALID_URL), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_NON_ASCII_URL) == + static_cast<int>( + password_manager::ImportEntry::Status::NON_ASCII_URL), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_LONG_URL) == + static_cast<int>(password_manager::ImportEntry::Status::LONG_URL), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_LONG_PASSWORD) == + static_cast<int>( + password_manager::ImportEntry::Status::LONG_PASSWORD), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_LONG_USERNAME) == + static_cast<int>( + password_manager::ImportEntry::Status::LONG_USERNAME), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_CONFLICT_PROFILE) == + static_cast<int>( + password_manager::ImportEntry::Status::CONFLICT_PROFILE), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportEntryStatus:: + IMPORT_ENTRY_STATUS_CONFLICT_ACCOUNT) == + static_cast<int>( + password_manager::ImportEntry::Status::CONFLICT_ACCOUNT), + ""); +} + +TEST_F(PasswordsPrivateDelegateImplTest, VerifyCastingOfImportResultsStatus) { + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_NONE) == + static_cast<int>(password_manager::ImportResults::Status::NONE), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_UNKNOWN_ERROR) == + static_cast<int>( + password_manager::ImportResults::Status::UNKNOWN_ERROR), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_SUCCESS) == + static_cast<int>(password_manager::ImportResults::Status::SUCCESS), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_IO_ERROR) == + static_cast<int>(password_manager::ImportResults::Status::IO_ERROR), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_BAD_FORMAT) == + static_cast<int>(password_manager::ImportResults::Status::BAD_FORMAT), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_DISMISSED) == + static_cast<int>(password_manager::ImportResults::Status::DISMISSED), + ""); + static_assert(static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_MAX_FILE_SIZE) == + static_cast<int>( + password_manager::ImportResults::Status::MAX_FILE_SIZE), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_IMPORT_ALREADY_ACTIVE) == + static_cast<int>( + password_manager::ImportResults::Status::IMPORT_ALREADY_ACTIVE), + ""); + static_assert( + static_cast<int>(api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_NUM_PASSWORDS_EXCEEDED) == + static_cast<int>( + password_manager::ImportResults::Status::NUM_PASSWORDS_EXCEEDED), + ""); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc index d0dcbd7..3c2e66d7 100644 --- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc +++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.cc
@@ -172,10 +172,16 @@ } void TestPasswordsPrivateDelegate::ImportPasswords( + api::passwords_private::PasswordStoreSet to_store, + ImportResultsCallback results_callback, content::WebContents* web_contents) { - // The testing of password importing itself should be handled via - // |PasswordManagerPorter|. import_passwords_triggered_ = true; + + import_results_.status = api::passwords_private::ImportResultsStatus:: + IMPORT_RESULTS_STATUS_SUCCESS; + import_results_.file_name = "test.csv"; + import_results_.number_imported = 42; + std::move(results_callback).Run(import_results_); } void TestPasswordsPrivateDelegate::ExportPasswords(
diff --git a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h index 6ace7622..cd657c8b 100644 --- a/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h +++ b/chrome/browser/extensions/api/passwords_private/test_passwords_private_delegate.h
@@ -59,7 +59,9 @@ content::WebContents* web_contents) override; void MovePasswordsToAccount(const std::vector<int>& ids, content::WebContents* web_contents) override; - void ImportPasswords(content::WebContents* web_contents) override; + void ImportPasswords(api::passwords_private::PasswordStoreSet to_store, + ImportResultsCallback results_callback, + content::WebContents* web_contents) override; void ExportPasswords(base::OnceCallback<void(const std::string&)> callback, content::WebContents* web_contents) override; void CancelExportPasswords() override; @@ -147,6 +149,8 @@ absl::optional<std::u16string> plaintext_password_ = u"plaintext"; + api::passwords_private::ImportResults import_results_; + // List of insecure credentials. std::vector<api::passwords_private::PasswordUiEntry> insecure_credentials_; raw_ptr<Profile> profile_ = nullptr;
diff --git a/chrome/browser/extensions/extension_web_ui.cc b/chrome/browser/extensions/extension_web_ui.cc index 4c136ca..1b09d3d 100644 --- a/chrome/browser/extensions/extension_web_ui.cc +++ b/chrome/browser/extensions/extension_web_ui.cc
@@ -69,23 +69,23 @@ // We do the conversion because we previously stored these values as strings // rather than objects. // TODO(devlin): Remove the conversion once everyone's updated. -void InitializeOverridesList(base::Value* list) { - base::Value migrated(base::Value::Type::LIST); +void InitializeOverridesList(base::Value::List& list) { + base::Value::List migrated; std::set<std::string> seen_entries; - for (auto& val : list->GetListDeprecated()) { - base::Value new_dict(base::Value::Type::DICTIONARY); + for (auto& val : list) { + base::Value::Dict new_dict; std::string entry_name; if (val.is_dict()) { - const std::string* tmp = val.FindStringKey(kEntry); + const std::string* tmp = val.GetDict().FindString(kEntry); if (!tmp) // See comment about CHECK(success) in // ForEachOverrideList. continue; entry_name = *tmp; - new_dict = val.Clone(); + new_dict = val.GetDict().Clone(); } else if (val.is_string()) { entry_name = val.GetString(); - new_dict.SetStringKey(kEntry, entry_name); - new_dict.SetBoolKey(kActive, true); + new_dict.Set(kEntry, entry_name); + new_dict.Set(kActive, true); } else { NOTREACHED(); continue; @@ -98,24 +98,25 @@ } } - *list = std::move(migrated); + list = std::move(migrated); } // Adds |override| to |list|, or, if there's already an entry for the override, // marks it as active. -void AddOverridesToList(base::Value* list, const GURL& override_url) { +void AddOverridesToList(base::Value::List& list, const GURL& override_url) { const std::string& spec = override_url.spec(); - for (auto& val : list->GetListDeprecated()) { + for (auto& val : list) { std::string* entry = nullptr; - if (val.is_dict()) { - entry = val.FindStringKey(kEntry); + base::Value::Dict* dict = val.GetIfDict(); + if (dict) { + entry = dict->FindString(kEntry); } if (!entry) { NOTREACHED(); continue; } if (*entry == spec) { - val.SetBoolKey(kActive, true); + dict->Set(kActive, true); return; // All done! } GURL entry_url(*entry); @@ -124,29 +125,29 @@ continue; } if (entry_url.host() == override_url.host()) { - val.SetBoolKey(kActive, true); - val.SetStringKey(kEntry, spec); + dict->Set(kActive, true); + dict->Set(kEntry, spec); return; } } - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetStringPath(kEntry, spec); - dict.SetBoolPath(kActive, true); + base::Value::Dict dict; + dict.SetByDottedPath(kEntry, spec); + dict.SetByDottedPath(kActive, true); // Add the entry to the front of the list. - list->Insert(list->GetListDeprecated().begin(), std::move(dict)); + list.Insert(list.begin(), base::Value(std::move(dict))); } // Validates that each entry in |list| contains a valid url and points to an // extension contained in |all_extensions| (and, if not, removes it). void ValidateOverridesList(const extensions::ExtensionSet* all_extensions, - base::Value* list) { - base::Value migrated(base::Value::Type::LIST); + base::Value::List& list) { + base::Value::List migrated; std::set<std::string> seen_hosts; - for (auto& val : list->GetListDeprecated()) { + for (auto& val : list) { std::string* entry = nullptr; if (val.is_dict()) { - entry = val.FindStringKey(kEntry); + entry = val.GetDict().FindString(kEntry); } if (!entry) { NOTREACHED(); @@ -167,7 +168,7 @@ migrated.Append(val.Clone()); } - *list = std::move(migrated); + list = std::move(migrated); } // Reloads the page in |web_contents| if it uses the same profile as |profile| @@ -318,28 +319,29 @@ } // Fetches each list in the overrides dictionary and runs |callback| on it. -void ForEachOverrideList(Profile* profile, - base::RepeatingCallback<void(base::Value*)> callback) { +void ForEachOverrideList( + Profile* profile, + base::RepeatingCallback<void(base::Value::List&)> callback) { PrefService* prefs = profile->GetPrefs(); DictionaryPrefUpdate update(prefs, ExtensionWebUI::kExtensionURLOverrides); - base::Value* all_overrides = update.Get(); + base::Value::Dict& all_overrides = update->GetDict(); // We shouldn't modify the list during iteration. Generate the set of keys // instead. std::vector<std::string> keys; - for (const auto entry : all_overrides->DictItems()) { + for (const auto entry : all_overrides) { keys.push_back(entry.first); } for (const std::string& key : keys) { - base::Value* list = all_overrides->FindListKey(key); + base::Value::List* list = all_overrides.FindList(key); // In a perfect world, we could CHECK(list) here. Unfortunately, if a // user's prefs are mangled (by malware, user modification, hard drive // corruption, evil robots, etc), this will fail. Instead, delete the pref. if (!list) { - all_overrides->RemoveKey(key); + all_overrides.Remove(key); continue; } - callback.Run(list); + callback.Run(*list); } } @@ -535,15 +537,17 @@ return; PrefService* prefs = profile->GetPrefs(); DictionaryPrefUpdate update(prefs, kExtensionURLOverrides); - base::Value* all_overrides = update.Get(); + base::Value::Dict& all_overrides = update->GetDict(); for (const auto& page_override_pair : overrides) { - base::Value* page_overrides_weak = - all_overrides->FindListPath(page_override_pair.first); + base::Value::List* page_overrides_weak = + all_overrides.FindListByDottedPath(page_override_pair.first); if (page_overrides_weak == nullptr) { - page_overrides_weak = all_overrides->SetPath( - page_override_pair.first, base::Value(base::Value::Type::LIST)); + page_overrides_weak = + &all_overrides + .SetByDottedPath(page_override_pair.first, base::Value::List()) + ->GetList(); } - AddOverridesToList(page_overrides_weak, page_override_pair.second); + AddOverridesToList(*page_overrides_weak, page_override_pair.second); } }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java index 2d33151..2793748f 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItem.java
@@ -21,6 +21,7 @@ import org.chromium.base.Callback; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.feed.FeedFeatures; import org.chromium.chrome.browser.feed.FeedServiceBridge; import org.chromium.chrome.browser.feed.R; @@ -30,11 +31,14 @@ import org.chromium.chrome.browser.feed.webfeed.WebFeedBridge.WebFeedMetadata; import org.chromium.chrome.browser.feed.webfeed.WebFeedSnackbarController.FeedLauncher; import org.chromium.chrome.browser.preferences.Pref; +import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.share.crow.CrowButtonDelegate; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.ui.appmenu.AppMenuHandler; import org.chromium.chrome.browser.ui.messages.snackbar.SnackbarManager; import org.chromium.components.browser_ui.widget.chips.ChipView; +import org.chromium.components.feature_engagement.EventConstants; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.prefs.PrefService; import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.ui.UiUtils; @@ -284,6 +288,9 @@ mCrowButton.setOnClickListener((view) -> { if (mTab == null) return; RecordUserAction.record("Crow.LaunchCustomTab.AppMenu"); + Tracker tracker = TrackerFactory.getTrackerForProfile( + Profile.fromWebContents(mTab.getWebContents())); + tracker.notifyEvent(EventConstants.CROW_TAB_MENU_ITEM_CLICKED); Activity activity = mTab.getWindowAndroid().getActivity().get(); mCrowButtonDelegate.requestCanonicalUrl(mTab, (canonicalUrl) -> { mCrowButtonDelegate.launchCustomTab(activity, mUrl, canonicalUrl, isFollowing);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 01511fe..6cbb8c0 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -223,6 +223,11 @@ "expiry_milestone": 110 }, { + "name": "arc-input-overlay-beta", + "owners": [ "cuicuiruan@google.com", "arc-gaming@google.com" ], + "expiry_milestone": 120 + }, + { "name": "arc-keyboard-shortcut-helper-integration", "owners": [ "yhanada", "mduggan" ], "expiry_milestone": 108 @@ -880,7 +885,7 @@ { "name": "chrome-labs", "owners": ["elainechien", "robliao"], - "expiry_milestone": 107 + "expiry_milestone": 112 }, { "name": "chrome-share-long-screenshot", @@ -2720,11 +2725,21 @@ "expiry_milestone": 105 }, { + "name": "enable-projector-app-debug", + "owners": [ "tobyhuang", "cros-projector@google.com" ], + "expiry_milestone": 108 + }, + { "name": "enable-projector-exclude-transcript", "owners": [ "llin", "cros-projector@google.com" ], "expiry_milestone": 105 }, { + "name": "enable-projector-local-playback", + "owners": [ "tobyhuang", "cros-projector@google.com" ], + "expiry_milestone": 108 + }, + { "name": "enable-quic", "owners": [ "//net/quic/OWNERS" ], // This flag is used by network administrators to debug @@ -3508,6 +3523,11 @@ "expiry_milestone": 110 }, { + "name": "following-feed-sidepanel", + "owners": [ "//chrome/android/feed/OWNERS", "freedjm@chromium.org" ], + "expiry_milestone": 115 + }, + { "name": "font-access", "owners": [ "dslee" ], "expiry_milestone": 108 @@ -3949,6 +3969,11 @@ "expiry_milestone": 110 }, { + "name": "ios-media-permissions-control", + "owners": ["ginnyhuang","bling-flags@google.com"], + "expiry_milestone": 110 + }, + { "name": "ios-password-manager-cross-origin-iframe-support", "owners": ["theocristea@google.com", "kazinova@google.com", "vsemeniuk@google.com", "chrome-password-manager-team@google.com"], "expiry_milestone": 111 @@ -4728,6 +4753,11 @@ "expiry_milestone": 115 }, { + "name": "omnibox-header-padding-update", + "owners": [ "rongtan", "ender", "chrome-omnibox-team@google.com" ], + "expiry_milestone": 115 + }, + { "name": "omnibox-https-upgrades", "owners": ["meacer", "trusty-transport@chromium.org" ], "expiry_milestone": 110 @@ -4768,6 +4798,11 @@ "expiry_milestone": 110 }, { + "name": "omnibox-most-visited-tiles-fading-on-tablet", + "owners": [ "rongtan", "ender", "chrome-omnibox-team@google.com" ], + "expiry_milestone": 110 + }, + { "name": "omnibox-most-visited-tiles-on-srp", "owners": [ "rongtan", "ender", "chrome-omnibox-team@google.com" ], "expiry_milestone": 110 @@ -5108,11 +5143,6 @@ "expiry_milestone": -1 }, { - "name": "password-manager-redesign", - "owners": ["vsemeniuk@google.com", "vasilii", "chrome-password-manager-team@google.com"], - "expiry_milestone": 111 - }, - { "name": "password-notes", "owners": ["mamir", "derinel@google.com"], "expiry_milestone": 108 @@ -5344,7 +5374,7 @@ }, { "name": "query-tiles-local-ordering", - "owners": [ "hesen", "qinmin" ], + "owners": [ "qinmin" ], "expiry_milestone": 100 }, {
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 3c0c70c2..38ec734d 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -1915,6 +1915,10 @@ const char kOmniboxFuzzyUrlSuggestionsDescription[] = "Enables URL suggestions for inputs that may contain typos."; +const char kOmniboxHeaderPaddingUpdateName[] = "Omnibox Header Padding Update"; +const char kOmniboxHeaderPaddingUpdateDescription[] = + "Update Omnibox suggestion header's position."; + const char kOmniboxModernizeVisualUpdateName[] = "Omnibox Modernize Visual Update"; const char kOmniboxModernizeVisualUpdateDescription[] = @@ -2003,6 +2007,12 @@ "current URL. Will only work if user is signed-in and syncing, or is " "otherwise eligible to send the current page URL to the suggest server."; +const char kOmniboxMostVisitedTilesFadingOnTabletName[] = + "Omnibox Most Visited Tiles fading on tablet"; +const char kOmniboxMostVisitedTilesFadingOnTabletDescription[] = + "Set most visited website tiles carousel to fade on horizontal ends on" + "tablet mode."; + const char kOmniboxMostVisitedTilesOnSrpName[] = "Omnibox Most Visited Tiles on Search Results Page"; const char kOmniboxMostVisitedTilesOnSrpDescription[] = @@ -4166,10 +4176,6 @@ "Enables various experimental features related to keyword mode, its " "suggestions and layout."; -const char kPasswordManagerRedesignName[] = "Password Manager new UI"; -const char kPasswordManagerRedesignDescription[] = - "Enables new Password Manager UI on Desktop"; - const char kScreenAIName[] = "Screen AI"; const char kScreenAIDescription[] = "Enables Screen AI local machine intelligence library to use the screen " @@ -5140,10 +5146,6 @@ const char kQuickAnswersForMoreLocalesDescription[] = "Enable Quick Answers for more locales."; -const char kTrimOnMemoryPressureName[] = "Trim Working Set on memory pressure"; -const char kTrimOnMemoryPressureDescription[] = - "Trim Working Set periodically on memory pressure"; - const char kEapGtcWifiAuthenticationName[] = "EAP-GTC WiFi Authentication"; const char kEapGtcWifiAuthenticationDescription[] = "Allows configuration of WiFi networks using EAP-GTC authentication"; @@ -5631,12 +5633,21 @@ const char kProjectorAnnotatorName[] = "Enable Projector annotator"; const char kProjectorAnnotatorDescription[] = - "Turns on annotator tools when recording a screen capture using projector"; + "Turns on annotator tools when recording a screen capture using Projector"; const char kProjectorExcludeTranscriptName[] = "Enable Projector exclude transcript feature"; const char kProjectorExcludeTranscriptDescription[] = - "Support excluding segment of Projector recording by excluding transcript"; + "Supports excluding segment of Projector recording by excluding transcript"; + +const char kProjectorLocalPlaybackName[] = "Enable Projector local playback"; +const char kProjectorLocalPlaybackDescription[] = + "Supports streaming screencast videos from DriveFS instead of Drive before " + "they have finished transcoding"; + +const char kProjectorAppDebugName[] = "Enable Projector app debug"; +const char kProjectorAppDebugDescription[] = + "Adds more informative error messages to the Projector app for debugging"; const char kQsRevampName[] = "Quick Settings Revamp"; const char kQsRevampDescription[] = @@ -5660,6 +5671,11 @@ "Enables the input overlay feature for some Android game apps, " "so it can play with a keyboard and a mouse instead of touch screen"; +const char kArcInputOverlayNameBeta[] = "Enable ARC Input Overlay Beta"; +const char kArcInputOverlayDescriptionBeta[] = + "Enable more features based on ARC Input Overlay Alpha, " + "so it can change the touch point position."; + const char kSecondaryGoogleAccountUsageName[] = "Enable Secondary Google account usage policy."; const char kSecondaryGoogleAccountUsageDescription[] = @@ -6141,6 +6157,14 @@ #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || // BUILDFLAG(IS_FUCHSIA) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) +const char kFollowingFeedSidepanelName[] = "Following feed in the sidepanel"; +const char kFollowingFeedSidepanelDescription[] = + "Enables the following feed in the sidepanel."; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) + #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) const char kWebShareName[] = "Web Share"; const char kWebShareDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index cd0e3c0..e0ad6ad 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -1085,6 +1085,9 @@ extern const char kOmniboxFuzzyUrlSuggestionsName[]; extern const char kOmniboxFuzzyUrlSuggestionsDescription[]; +extern const char kOmniboxHeaderPaddingUpdateName[]; +extern const char kOmniboxHeaderPaddingUpdateDescription[]; + extern const char kOmniboxModernizeVisualUpdateName[]; extern const char kOmniboxModernizeVisualUpdateDescription[]; @@ -1118,6 +1121,9 @@ extern const char kOmniboxFocusTriggersContextualWebZeroSuggestName[]; extern const char kOmniboxFocusTriggersContextualWebZeroSuggestDescription[]; +extern const char kOmniboxMostVisitedTilesFadingOnTabletName[]; +extern const char kOmniboxMostVisitedTilesFadingOnTabletDescription[]; + extern const char kOmniboxMostVisitedTilesOnSrpName[]; extern const char kOmniboxMostVisitedTilesOnSrpDescription[]; @@ -2382,9 +2388,6 @@ extern const char kOmniboxExperimentalKeywordModeName[]; extern const char kOmniboxExperimentalKeywordModeDescription[]; -extern const char kPasswordManagerRedesignName[]; -extern const char kPasswordManagerRedesignDescription[]; - extern const char kScreenAIName[]; extern const char kScreenAIDescription[]; @@ -2929,9 +2932,6 @@ extern const char kQuickAnswersForMoreLocalesName[]; extern const char kQuickAnswersForMoreLocalesDescription[]; -extern const char kTrimOnMemoryPressureName[]; -extern const char kTrimOnMemoryPressureDescription[]; - extern const char kEapGtcWifiAuthenticationName[]; extern const char kEapGtcWifiAuthenticationDescription[]; @@ -3226,6 +3226,12 @@ extern const char kProjectorExcludeTranscriptName[]; extern const char kProjectorExcludeTranscriptDescription[]; +extern const char kProjectorLocalPlaybackName[]; +extern const char kProjectorLocalPlaybackDescription[]; + +extern const char kProjectorAppDebugName[]; +extern const char kProjectorAppDebugDescription[]; + extern const char kQsRevampName[]; extern const char kQsRevampDescription[]; @@ -3241,6 +3247,9 @@ extern const char kArcInputOverlayName[]; extern const char kArcInputOverlayDescription[]; +extern const char kArcInputOverlayNameBeta[]; +extern const char kArcInputOverlayDescriptionBeta[]; + extern const char kSecondaryGoogleAccountUsageName[]; extern const char kSecondaryGoogleAccountUsageDescription[]; @@ -3563,6 +3572,13 @@ extern const char kAsyncDnsDescription[]; #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ + BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) +extern const char kFollowingFeedSidepanelName[]; +extern const char kFollowingFeedSidepanelDescription[]; +#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || + // BUILDFLAG(IS_FUCHSIA) || BUILDFLAG(IS_CHROMEOS) + // Feature flags -------------------------------------------------------------- #if BUILDFLAG(CHROME_WIDE_ECHO_CANCELLATION)
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index f6b09d17..21d65c5c 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -354,8 +354,10 @@ &omnibox::kMostVisitedTilesDynamicSpacing, &omnibox::kMostVisitedTilesTitleWrapAround, &omnibox::kOmniboxAssistantVoiceSearch, + &omnibox::kOmniboxHeaderPaddingUpdate, &omnibox::kOmniboxRemoveSuggestionHeaderCapitalization, &omnibox::kOmniboxRemoveSuggestionHeaderChevron, + &omnibox::kOmniboxMostVisitedTilesFadingOnTablet, &omnibox::kOmniboxMostVisitedTilesOnSrp, &omnibox::kSuggestionAnswersColorReverse, &omnibox::kUpdatedConnectionSecurityIndicators,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index 32ca72fd..b0820390 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -432,7 +432,10 @@ public static final String OMNIBOX_ANDROID_AUXILIARY_SEARCH = "AndroidAuxiliarySearch"; public static final String OMNIBOX_ASSISTANT_VOICE_SEARCH = "OmniboxAssistantVoiceSearch"; + public static final String OMNIBOX_HEADER_PADDING_UPDATE = "OmniboxHeaderPaddingUpdate"; public static final String OMNIBOX_MODERNIZE_VISUAL_UPDATE = "OmniboxModernizeVisualUpdate"; + public static final String OMNIBOX_MOST_VISITED_TILES_FADING_ON_TABLET = + "OmniboxMostVisitedTilesFadingOnTablet"; public static final String OMNIBOX_MOST_VISITED_TILES_DYNAMIC_SPACING = "OmniboxMostVisitedTilesDynamicSpacing"; public static final String OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND =
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java index 2e0cd003..2d549e9b 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersMediator.java
@@ -455,7 +455,7 @@ mModelList.addAll(visitsAndRelatedSearches); clusterModel.set(HistoryClustersItemProperties.CLICK_HANDLER, - v -> hideCluster(clusterModel, visitsAndRelatedSearches)); + v -> hideCluster(clusterItem, visitsAndRelatedSearches)); Drawable chevron = UiUtils.getTintedDrawable(mContext, R.drawable.ic_expand_more_black_24dp, R.color.default_icon_color_tint_list); clusterModel.set(HistoryClustersItemProperties.END_BUTTON_DRAWABLE, chevron); @@ -542,10 +542,11 @@ } @VisibleForTesting - void hideCluster(PropertyModel clusterModel, List<ListItem> itemsToHide) { + void hideCluster(ListItem clusterItem, List<ListItem> itemsToHide) { int indexOfFirstVisit = mModelList.indexOf(itemsToHide.get(0)); + PropertyModel clusterModel = clusterItem.model; clusterModel.set(HistoryClustersItemProperties.CLICK_HANDLER, - (v) -> showCluster(clusterModel, itemsToHide, indexOfFirstVisit)); + (v) -> showCluster(clusterItem, itemsToHide)); Drawable chevron = UiUtils.getTintedDrawable(mContext, R.drawable.ic_expand_less_black_24dp, R.color.default_icon_color_tint_list); clusterModel.set(HistoryClustersItemProperties.END_BUTTON_DRAWABLE, chevron); @@ -563,14 +564,16 @@ } @VisibleForTesting - void showCluster(PropertyModel clusterModel, List<ListItem> itemsToShow, int insertionIndex) { + void showCluster(ListItem clusterItem, List<ListItem> itemsToShow) { + PropertyModel clusterModel = clusterItem.model; clusterModel.set(HistoryClustersItemProperties.CLICK_HANDLER, - (v) -> hideCluster(clusterModel, itemsToShow)); + (v) -> hideCluster(clusterItem, itemsToShow)); Drawable chevron = UiUtils.getTintedDrawable(mContext, R.drawable.ic_expand_more_black_24dp, R.color.default_icon_color_tint_list); clusterModel.set(HistoryClustersItemProperties.END_BUTTON_DRAWABLE, chevron); clusterModel.set(HistoryClustersItemProperties.ACCESSIBILITY_STATE, ClusterViewAccessibilityState.COLLAPSIBLE); + int insertionIndex = mModelList.indexOf(clusterItem) + 1; mModelList.addAll(itemsToShow, insertionIndex); }
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersToolbar.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersToolbar.java index c4ed5eae..28951d0a 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersToolbar.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersToolbar.java
@@ -47,7 +47,6 @@ void setSearchText(String text) { mSearchText.setText(text); mSearchText.setSelection(text.length()); - hideKeyboard(); mSearchText.clearFocus(); } }
diff --git a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java index edb4da4..865fd4c 100644 --- a/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java +++ b/chrome/browser/history_clusters/java/src/org/chromium/chrome/browser/history_clusters/HistoryClustersViewBinder.java
@@ -41,7 +41,7 @@ if (key == HistoryClustersToolbarProperties.QUERY_STATE) { QueryState queryState = model.get(HistoryClustersToolbarProperties.QUERY_STATE); if (queryState.isSearching()) { - toolbar.showSearchView(); + toolbar.showSearchView(false); toolbar.setSearchText(queryState.getQuery()); } else { toolbar.hideSearchView();
diff --git a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc index ad35cf0..2ecb944 100644 --- a/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc
@@ -92,12 +92,14 @@ tester()->NavigateToUntrackedUrl(); tester()->histogram_tester().ExpectTotalCount( internal::kHistogramFromGWSFirstImagePaint, 0); + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(0u, entries.size()); size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } TEST_F(FromGWSPageLoadMetricsObserverTest, NonSearchPreviousCommittedUrl) { @@ -115,12 +117,14 @@ tester()->NavigateToUntrackedUrl(); tester()->histogram_tester().ExpectTotalCount( internal::kHistogramFromGWSFirstImagePaint, 0); + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(0u, entries.size()); size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } TEST_F(FromGWSPageLoadMetricsObserverTest, @@ -139,12 +143,14 @@ tester()->NavigateToUntrackedUrl(); tester()->histogram_tester().ExpectTotalCount( internal::kHistogramFromGWSFirstImagePaint, 0); + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(0u, entries.size()); size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } TEST_F(FromGWSPageLoadMetricsObserverTest, @@ -165,12 +171,14 @@ tester()->NavigateToUntrackedUrl(); tester()->histogram_tester().ExpectTotalCount( internal::kHistogramFromGWSFirstImagePaint, 0); + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(0u, entries.size()); size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } TEST_F(FromGWSPageLoadMetricsObserverTest, SearchPreviousCommittedUrl1) { @@ -631,12 +639,15 @@ tester()->histogram_tester().ExpectTotalCount( internal::kHistogramFromGWSFirstImagePaint, 0); + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(0u, entries.size()); + size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } TEST_F(FromGWSPageLoadMetricsObserverTest, @@ -1007,14 +1018,14 @@ first_image_paint, 1); // Test UKM metrics recorded successfully. + auto entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_FromGoogleSearch::kEntryName); + EXPECT_EQ(1u, entries.size()); size_t document_created_entries_count = tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size(); size_t unload_entries_count = tester()->test_ukm_recorder().GetEntriesByName("Unload").size(); - size_t adjusted_ukm_entries_count = - tester()->test_ukm_recorder().entries_count() - - document_created_entries_count - unload_entries_count; - EXPECT_EQ(1ul, adjusted_ukm_entries_count); + EXPECT_EQ(document_created_entries_count, unload_entries_count); } // Ensures link initiated side panel navigations from Google SRPs log expected
diff --git a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc index 18ce3e7..50f112a 100644 --- a/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc +++ b/chrome/browser/page_load_metrics/observers/service_worker_page_load_metrics_observer_unittest.cc
@@ -9,6 +9,7 @@ #include "chrome/browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h" #include "components/page_load_metrics/browser/page_load_tracker.h" #include "components/page_load_metrics/common/test/page_load_metrics_test_util.h" +#include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/web_contents.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "testing/gmock/include/gmock/gmock-matchers.h" @@ -119,7 +120,9 @@ AssertNoServiceWorkerHistogramsLogged(); AssertNoSearchHistogramsLogged(); AssertNoSearchNoSWHistogramsLogged(); - EXPECT_EQ(0ul, tester()->test_ukm_recorder().entries_count()); + const auto& entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_ServiceWorkerControlled::kEntryName); + EXPECT_EQ(0u, entries.size()); } TEST_F(ServiceWorkerPageLoadMetricsObserverTest, NoServiceWorker) { @@ -132,9 +135,9 @@ AssertNoServiceWorkerHistogramsLogged(); AssertNoSearchHistogramsLogged(); AssertNoSearchNoSWHistogramsLogged(); - // Only a DocumentCreated entry and an Unload entry is logged for creation of - // a blink::Document when the navigation committed. - EXPECT_EQ(2ul, tester()->test_ukm_recorder().entries_count()); + const auto& entries = tester()->test_ukm_recorder().GetEntriesByName( + ukm::builders::PageLoad_ServiceWorkerControlled::kEntryName); + EXPECT_EQ(0u, entries.size()); EXPECT_EQ( 1ul, tester()->test_ukm_recorder().GetEntriesByName("DocumentCreated").size());
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/DemoPaintPreview.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/DemoPaintPreview.java index 9817285..27209ca 100644 --- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/DemoPaintPreview.java +++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/DemoPaintPreview.java
@@ -122,14 +122,16 @@ private class DemoPaintPreviewTabObserver extends EmptyTabObserver { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { if (!mTabbedPaintPreview.isAttached()) return; - - // Ignore navigations from subframes. We should only remove the paint preview - // player when the user navigates to a new page. - if (!navigationHandle.isInPrimaryMainFrame()) return; - removePaintPreviewDemo(); } + + @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!mTabbedPaintPreview.isAttached()) return; + if (!navigationHandle.isInPrimaryMainFrame()) return; + } } }
diff --git a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreview.java b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreview.java index 9251af1..71f27d1 100644 --- a/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreview.java +++ b/chrome/browser/paint_preview/android/java/src/org/chromium/chrome/browser/paint_preview/StartupPaintPreview.java
@@ -323,11 +323,8 @@ } @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - // Ignore navigations from subframes. We should only remove the paint preview - // player when the user navigates to a new page. - if (!navigationHandle.isInPrimaryMainFrame()) return; - + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { // If we haven't started to restore, this is the navigation call to start the // restoration. We shouldn't remove the paint preview player. if (!mDidStartRestore) return; @@ -336,6 +333,11 @@ } @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + + @Override public void onHidden(Tab tab, @TabHidingType int hidingType) { dismissSnackbar();
diff --git a/chrome/browser/payments/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediatorTest.java b/chrome/browser/payments/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediatorTest.java index 96737ffb..34a29d2 100644 --- a/chrome/browser/payments/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediatorTest.java +++ b/chrome/browser/payments/android/java/src/org/chromium/chrome/browser/payments/handler/toolbar/PaymentHandlerToolbarMediatorTest.java
@@ -72,10 +72,9 @@ .getSecurityIconContentDescription(Mockito.anyInt()); NavigationHandle navigation = Mockito.mock(NavigationHandle.class); - Mockito.when(navigation.isInPrimaryMainFrame()).thenReturn(true); Mockito.when(navigation.isSameDocument()).thenReturn(false); - mMediator.didStartNavigation(navigation); + mMediator.didStartNavigationInPrimaryMainFrame(navigation); Assert.assertEquals(123, mModel.get(PaymentHandlerToolbarProperties.SECURITY_ICON)); Assert.assertEquals("this is content description.",
diff --git a/chrome/browser/performance_manager/policies/policy_features.cc b/chrome/browser/performance_manager/policies/policy_features.cc index bbcafdf..028671a 100644 --- a/chrome/browser/performance_manager/policies/policy_features.cc +++ b/chrome/browser/performance_manager/policies/policy_features.cc
@@ -88,13 +88,11 @@ // Specifies the minimum amount of time a parent frame node must be invisible // before considering the process node for working set trim. -const base::FeatureParam<int> kNodeInvisibileTimeSec = { - &kTrimOnMemoryPressure, "NodeInvisibleTimeSec", 900}; +const int kNodeInvisibileTimeSec = 900; // Specifies the minimum amount of time a parent frame node must be invisible // before considering the process node for working set trim. -const base::FeatureParam<int> kNodeTrimBackoffTimeSec = { - &kTrimOnMemoryPressure, "NodeTrimBackoffTimeSec", 1800}; +const int kNodeTrimBackoffTimeSec = 1800; TrimOnMemoryPressureParams::TrimOnMemoryPressureParams() = default; TrimOnMemoryPressureParams::TrimOnMemoryPressureParams( @@ -106,8 +104,8 @@ TrimOnMemoryPressureParams params; params.graph_walk_backoff_time = base::Seconds(kGraphWalkBackoffTimeSec.Get()); - params.node_invisible_time = base::Seconds(kNodeInvisibileTimeSec.Get()); - params.node_trim_backoff_time = base::Seconds(kNodeTrimBackoffTimeSec.Get()); + params.node_invisible_time = base::Seconds(kNodeInvisibileTimeSec); + params.node_trim_backoff_time = base::Seconds(kNodeTrimBackoffTimeSec); params.arc_process_trim_backoff_time = base::Seconds(kArcProcessTrimBackoffTimeSec.Get());
diff --git a/chrome/browser/performance_manager/policies/policy_features.h b/chrome/browser/performance_manager/policies/policy_features.h index 0a0f80b3..cb32dfa 100644 --- a/chrome/browser/performance_manager/policies/policy_features.h +++ b/chrome/browser/performance_manager/policies/policy_features.h
@@ -46,14 +46,6 @@ // once every 2 minutes. extern const base::FeatureParam<int> kGraphWalkBackoffTimeSec; -// Specifies the minimum amount of time a parent frame node must be invisible -// before considering the process node for working set trim. -extern const base::FeatureParam<int> kNodeInvisibileTimeSec; - -// Specifies the minimum amount of time a parent frame node must be invisible -// before considering the process node for working set trim. -extern const base::FeatureParam<int> kNodeTrimBackoffTimeSec; - // Specifies the frequency in which we will fetch the arc process list. extern const base::FeatureParam<int> kArcProcessListFetchBackoffTimeSec;
diff --git a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.cc b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.cc index 24766b2..2d6c366 100644 --- a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.cc +++ b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.cc
@@ -76,8 +76,6 @@ } // namespace WorkingSetTrimmerPolicyChromeOS::WorkingSetTrimmerPolicyChromeOS() { - trim_on_memory_pressure_ = - base::FeatureList::IsEnabled(features::kTrimOnMemoryPressure); trim_on_freeze_ = base::FeatureList::IsEnabled(features::kTrimOnFreeze); trim_arc_on_memory_pressure_ = base::FeatureList::IsEnabled(features::kTrimArcOnMemoryPressure); @@ -124,11 +122,9 @@ // Try not to walk the graph too frequently because we can receive moderate // memory pressure notifications every 10s. - if (trim_on_memory_pressure_) { - if (!last_graph_walk_ || (base::TimeTicks::Now() - *last_graph_walk_ > - params_.graph_walk_backoff_time)) { - TrimNodesOnGraph(); - } + if (!last_graph_walk_ || (base::TimeTicks::Now() - *last_graph_walk_ > + params_.graph_walk_backoff_time)) { + TrimNodesOnGraph(); } if (trim_arc_on_memory_pressure_) { @@ -521,15 +517,14 @@ } void WorkingSetTrimmerPolicyChromeOS::OnPassedToGraph(Graph* graph) { - if (trim_on_memory_pressure_ || trim_arc_on_memory_pressure_) { - // We wait to register the memory pressure listener so we're on the - // right sequence. - params_ = features::TrimOnMemoryPressureParams::GetParams(); - memory_pressure_listener_.emplace( - FROM_HERE, - base::BindRepeating(&WorkingSetTrimmerPolicyChromeOS::OnMemoryPressure, - base::Unretained(this))); - } + // We wait to register the memory pressure listener so we're on the + // right sequence. + params_ = features::TrimOnMemoryPressureParams::GetParams(); + memory_pressure_listener_.emplace( + FROM_HERE, + base::BindRepeating(&WorkingSetTrimmerPolicyChromeOS::OnMemoryPressure, + base::Unretained(this))); + if (trim_arcvm_on_memory_pressure_) { arcvm_trim_metric_report_timer_.Start( FROM_HERE, kArcVmTrimMetricReportDelay,
diff --git a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.h b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.h index b406666ef..bdb47e6 100644 --- a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.h +++ b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos.h
@@ -83,7 +83,6 @@ void SetArcProcessLastTrimTime(base::ProcessId pid, base::TimeTicks time); bool trim_on_freeze() const { return trim_on_freeze_; } - bool trim_on_memory_pressure() const { return trim_on_memory_pressure_; } bool trim_arc_on_memory_pressure() const { return trim_arc_on_memory_pressure_; } @@ -102,9 +101,7 @@ virtual mechanism::WorkingSetTrimmerChromeOS* GetTrimmer(); void set_trim_on_freeze(bool enabled) { trim_on_freeze_ = enabled; } - void set_trim_on_memory_pressure(bool enabled) { - trim_on_memory_pressure_ = enabled; - } + void set_trim_arc_on_memory_pressure(bool enabled) { trim_arc_on_memory_pressure_ = enabled; } @@ -187,7 +184,6 @@ Graph* graph_ = nullptr; bool trim_on_freeze_ = false; - bool trim_on_memory_pressure_ = false; bool trim_arc_on_memory_pressure_ = false; bool trim_arcvm_on_memory_pressure_ = false;
diff --git a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos_unittest.cc b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos_unittest.cc index acde303..8cb52d24 100644 --- a/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos_unittest.cc +++ b/chrome/browser/performance_manager/policies/working_set_trimmer_policy_chromeos_unittest.cc
@@ -120,7 +120,6 @@ public: MockWorkingSetTrimmerPolicyChromeOS() : WorkingSetTrimmerPolicyChromeOS() { // Setup our default configuration - set_trim_on_memory_pressure(true); set_trim_on_freeze(true); set_trim_arc_on_memory_pressure(false); set_trim_arcvm_on_memory_pressure(false); @@ -254,10 +253,6 @@ return WorkingSetTrimmerPolicyChromeOS::GetTrimmer(); } - void trim_on_memory_pressure(bool enabled) { - set_trim_on_memory_pressure(enabled); - } - void trim_arc_on_memory_pressure(bool enabled) { set_trim_arc_on_memory_pressure(enabled); }
diff --git a/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc b/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc index 2988bda..ce1f2127 100644 --- a/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc +++ b/chrome/browser/preloading/prefetch/prefetch_proxy/prefetch_proxy_tab_helper.cc
@@ -859,9 +859,12 @@ request->headers.RemoveHeader("User-Agent"); request->trusted_params = trusted_params; request->site_for_cookies = trusted_params.isolation_info.site_for_cookies(); + request->devtools_request_id = prefetch_container->RequestId(); const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); if (devtools_observer && !prefetch_container->IsDecoy()) { + request->trusted_params->devtools_observer = + devtools_observer->MakeSelfOwnedNetworkServiceDevToolsObserver(); devtools_observer->OnStartSinglePrefetch(prefetch_container->RequestId(), *request); }
diff --git a/chrome/browser/profile_resetter/brandcoded_default_settings.cc b/chrome/browser/profile_resetter/brandcoded_default_settings.cc index b020a171..3e3ef37 100644 --- a/chrome/browser/profile_resetter/brandcoded_default_settings.cc +++ b/chrome/browser/profile_resetter/brandcoded_default_settings.cc
@@ -42,9 +42,14 @@ } bool BrandcodedDefaultSettings::GetHomepage(std::string* homepage) const { - return master_dictionary_ && - master_dictionary_->GetString(prefs::kHomePage, homepage) && - !homepage->empty(); + if (!master_dictionary_) + return false; + const std::string* val = + master_dictionary_->GetDict().FindString(prefs::kHomePage); + if (!val) + return false; + *homepage = *val; + return !homepage->empty(); } absl::optional<bool> BrandcodedDefaultSettings::GetHomepageIsNewTab() const {
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 09a8c1e..d5c1f07c 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -40,7 +40,6 @@ "new_tab_page:resources", "new_tab_page_instant:resources", "new_tab_page_third_party:resources", - "password_manager:resources", "privacy_sandbox:resources", "profile_internals:resources", "settings:resources",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index 13241f6b..ae5a174d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -2838,8 +2838,10 @@ rootWebArea: {enter: `$name`, speak: `$if($name, $name, @web_content)`}, region: {speak: `$state $nameOrTextContent $description $roleDescription`}, row: { - startOf: `$node(tableRowHeader) $roleDescription`, - speak: `$name $node(activeDescendant) $value $state $restriction $role + startOf: `$node(tableRowHeader) $roleDescription + $if($hierarchicalLevel, @describe_depth($hierarchicalLevel))`, + speak: ` $if($hierarchicalLevel, @describe_depth($hierarchicalLevel)) + $name $node(activeDescendant) $value $state $restriction $role $if($selected, @aria_selected_true) $description`, }, staticText: {speak: `$precedingBullet $name= $description`},
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js index aa39596..62a962c4 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output_test.js
@@ -1451,3 +1451,44 @@ CursorRange.fromNode(menu.firstChild), CursorRange.fromNode(p)); assertEquals('first', o.contextOrder_); }); + +AX_TEST_F('ChromeVoxOutputE2ETest', 'TreeGridLevel', async function() { + const site = ` + <table id="treegrid" role="treegrid" aria-label="Inbox"> + <tbody> + <tr role="row" aria-level="1" aria-posinset="1" aria-setsize="1" + aria-expanded="true"> + <td role="gridcell">Treegrids are awesome</td> + <td role="gridcell">Want to learn how to use them?</td> + </tr> + </tbody> + </table> + `; + const root = await this.runWithLoadedTree(site); + const row = root.find({role: RoleType.ROW}); + let range = CursorRange.fromNode(row); + let o = + new Output().withoutHints().withSpeechAndBraille(range, null, 'navigate'); + + checkSpeechOutput( + ' level 1 |Expanded|Row', + [ + {value: 'state', start: 10, end: 18}, + {value: 'role', start: 19, end: 22}, + ], + o); + + range = CursorRange.fromNode(row.firstChild); + o = new Output().withoutHints().withSpeechAndBraille(range, null, 'navigate'); + + checkSpeechOutput( + 'Treegrids are awesome| level 1 |row 1 column 1', + [{value: 'name', start: 0, end: 21}], o); + + range = CursorRange.fromNode(row.lastChild); + o = new Output().withoutHints().withSpeechAndBraille(range, null, 'navigate'); + + checkSpeechOutput( + 'Want to learn how to use them?|row 1 column 2', + [{value: 'name', start: 0, end: 30}], o); +});
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/BUILD.gn index f613cbf..c20a129 100644 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/BUILD.gn
@@ -25,7 +25,6 @@ mode = "copy" dest_dir = enhanced_network_tts_dir sources = [ - "background.html", "background.js", "enhanced_network_tts.js", ]
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/background.html b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/background.html deleted file mode 100644 index b731534..0000000 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts/background.html +++ /dev/null
@@ -1,5 +0,0 @@ -<!-- Global scripts. --> -<script src="/common/closure_shim.js"></script> - -<!-- Module entry point. --> -<script type="module" src="/enhanced_network_tts/background.js"></script>
diff --git a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts_manifest.json.jinja2 b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts_manifest.json.jinja2 index adc69e06..010065d 100644 --- a/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts_manifest.json.jinja2 +++ b/chrome/browser/resources/chromeos/accessibility/enhanced_network_tts_manifest.json.jinja2
@@ -10,7 +10,7 @@ "incognito": "split", {% endif %} "background": { - "page": "enhanced_network_tts/background.html" + "scripts": ["enhanced_network_tts/background.js"] }, "permissions": [ "ttsEngine"
diff --git a/chrome/browser/resources/chromeos/login/BUILD.gn b/chrome/browser/resources/chromeos/login/BUILD.gn index 25a490c..8b2afbfd 100644 --- a/chrome/browser/resources/chromeos/login/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/BUILD.gn
@@ -248,8 +248,6 @@ "screens/common/app_downloading.js", "screens/common/app_launch_splash.html", "screens/common/app_launch_splash.js", - "screens/common/arc_terms_of_service.html", - "screens/common/arc_terms_of_service.js", "screens/common/assistant_optin.html", "screens/common/assistant_optin.js", "screens/common/autolaunch.html", @@ -436,7 +434,6 @@ "components/web_view_loader.m.js", "screens/common/app_downloading.m.js", "screens/common/app_launch_splash.m.js", - "screens/common/arc_terms_of_service.m.js", "screens/common/assistant_optin.m.js", "screens/common/autolaunch.m.js", "screens/common/consolidated_consent.m.js", @@ -501,7 +498,10 @@ out_folder = "$target_gen_dir/$oobe_preprocessed_folder" out_manifest = "$target_gen_dir/$web_components_manifest" - in_files = [ "screens/common/adb_sideloading.js" ] + in_files = [ + "screens/common/adb_sideloading.js", + "screens/common/arc_terms_of_service.js", + ] } # Main group for Polymer3 elements
diff --git a/chrome/browser/resources/chromeos/login/screens.js b/chrome/browser/resources/chromeos/login/screens.js index 10fd9796..d1518548 100644 --- a/chrome/browser/resources/chromeos/login/screens.js +++ b/chrome/browser/resources/chromeos/login/screens.js
@@ -9,7 +9,7 @@ import './screens/common/adb_sideloading.js'; import './screens/common/app_downloading.m.js'; import './screens/common/app_launch_splash.m.js'; -import './screens/common/arc_terms_of_service.m.js'; +import './screens/common/arc_terms_of_service.js'; import './screens/common/assistant_optin.m.js'; import './screens/common/autolaunch.m.js'; import './screens/common/consolidated_consent.m.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn index 13891f5b..3a48e4d 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn +++ b/chrome/browser/resources/chromeos/login/screens/common/BUILD.gn
@@ -15,7 +15,6 @@ public_deps = [ ":app_downloading_module", ":app_launch_splash_module", - ":arc_terms_of_service_module", ":assistant_optin_module", ":autolaunch_module", ":consolidated_consent_module", @@ -64,7 +63,7 @@ ":adb_sideloading", ":app_downloading.m", ":app_launch_splash.m", - ":arc_terms_of_service.m", + ":arc_terms_of_service", #":assistant_optin.m", ":autolaunch.m", @@ -144,8 +143,8 @@ extra_deps = [ ":app_launch_splash_module" ] } -js_library("arc_terms_of_service.m") { - sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.m.js" ] +js_library("arc_terms_of_service") { + sources = [ "$root_gen_dir/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js" ] deps = [ "../../:display_manager.m", "../../components:oobe_select.m", @@ -164,7 +163,7 @@ "$externs_path/chrome_extensions.js", "$externs_path/webview_tag.js", ] - extra_deps = [ ":arc_terms_of_service_module" ] + extra_deps = [ ":web_components" ] } js_library("assistant_optin.m") { @@ -587,6 +586,7 @@ "../../components/dialogs:oobe_adaptive_dialog.m", "../../components/dialogs:oobe_loading_dialog.m", "//third_party/polymer/v3_0/components-chromium/polymer:polymer_bundled", + "//ui/webui/resources/cr_elements/cr_checkbox:cr_checkbox", "//ui/webui/resources/js:assert.m", ] extra_deps = [ ":sync_consent_module" ] @@ -679,15 +679,6 @@ namespace_rewrites = oobe_namespace_rewrites } -polymer_modulizer("arc_terms_of_service") { - js_file = "arc_terms_of_service.js" - html_file = "arc_terms_of_service.html" - html_type = "dom-module" - auto_imports = oobe_auto_imports - migrated_imports = oobe_migrated_imports - namespace_rewrites = oobe_namespace_rewrites -} - polymer_modulizer("assistant_optin") { js_file = "assistant_optin.js" html_file = "assistant_optin.html" @@ -906,7 +897,7 @@ js_file = "sync_consent.js" html_file = "sync_consent.html" html_type = "dom-module" - auto_imports = oobe_auto_imports + auto_imports = oobe_auto_imports + [ "ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.html|CrCheckboxElement" ] namespace_rewrites = oobe_namespace_rewrites migrated_imports = oobe_migrated_imports } @@ -944,5 +935,8 @@ } html_to_js("web_components") { - js_files = [ "adb_sideloading.js" ] + js_files = [ + "adb_sideloading.js", + "arc_terms_of_service.js", + ] }
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html index 48b6032..034e304 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html +++ b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.html
@@ -2,285 +2,251 @@ Use of this source code is governed by a BSD-style license that can be found in the LICENSE file. --> -<link rel="import" href="chrome://resources/html/polymer.html"> +<style include="oobe-dialog-host-styles"> + #arcTosContainer p { + color: rgba(0, 0, 0, 0.54); + line-height: 20px; + margin: 0; + padding: 0; + } -<link rel="import" href="chrome://resources/cr_elements/cr_checkbox/cr_checkbox.html"> -<link rel="import" href="chrome://resources/html/action_link.html"> -<link rel="import" href="chrome://resources/html/load_time_data.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/iron-icon/iron-icon.html"> -<link rel="import" href="chrome://resources/polymer/v1_0/paper-styles/color.html"> + cr-checkbox { + --cr-checkbox-label-padding-start: 16px; + } + .parameter-section { + margin: 0; + max-width: 590px; + padding: 0 20px 16px 20px; + } -<link rel="import" href="../../cr_ui.html"> -<link rel="import" href="../../components/display_manager_types.html"> -<link rel="import" href="../../components/oobe_icons.html"> -<link rel="import" href="../../components/oobe_select.html"> -<link rel="import" href="../../components/oobe_types.html"> -<link rel="import" href="../../components/web_view_helper.html"> -<link rel="import" href="../../components/web_view_loader.html"> -<link rel="import" href="../../components/behaviors/login_screen_behavior.html"> -<link rel="import" href="../../components/behaviors/multi_step_behavior.html"> -<link rel="import" href="../../components/behaviors/oobe_i18n_behavior.html"> -<link rel="import" href="../../components/buttons/oobe_back_button.html"> -<link rel="import" href="../../components/buttons/oobe_text_button.html"> -<link rel="import" href="../../components/common_styles/common_styles.html"> -<link rel="import" href="../../components/common_styles/oobe_dialog_host_styles.html"> -<link rel="import" href="../../components/dialogs/oobe_adaptive_dialog.html"> -<link rel="import" href="../../components/dialogs/oobe_loading_dialog.html"> -<link rel="import" href="../../components/dialogs/oobe_modal_dialog.html"> + #arcPolicyLink { + margin: 0; + padding: 16px 0 16px 20px; + } -<link rel="stylesheet" href="chrome://resources/css/overlay.css"> + #arcGoogleServiceConfirmation { + font-weight: 600; + } -<dom-module id="arc-tos-element"> - <template> - <style include="oobe-dialog-host-styles"> - #arcTosContainer p { - color: rgba(0, 0, 0, 0.54); - line-height: 20px; - margin: 0; - padding: 0; - } + #arcTosContainer::-webkit-scrollbar { + display: none; + } - cr-checkbox { - --cr-checkbox-label-padding-start: 16px; - } + #arcTosOverlayWebview { + border: 1px solid #d9d9d9; + display: flex; + height: 300px; + width: 100%; + } - .parameter-section { - margin: 0; - max-width: 590px; - padding: 0 20px 16px 20px; - } + #arcTosOverlayWebviewContainer { + box-sizing: border-box; + height: 332px; + margin: auto; + padding: 24px 8px 8px 8px; + width: 100%; + } +</style> - #arcPolicyLink { - margin: 0; - padding: 16px 0 16px 20px; - } +<!-- LOADING DIALOG --> +<oobe-loading-dialog id="arcTosLoadingDialog" for-step="loading" + role="dialog" + aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]" + title-key="arcTermsOfServiceLoading"> + <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> +</oobe-loading-dialog> - #arcGoogleServiceConfirmation { - font-weight: 600; - } +<!-- ERROR DIALOG --> +<oobe-adaptive-dialog id="arcTosErrorDialog" for-step="error" + role="dialog" + aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]"> + <iron-icon slot="icon" icon="oobe-32:warning"></iron-icon> + <h1 slot="title"> + [[i18nDynamic(locale, 'arcTermsOfServiceErrorTitle')]] + </h1> + <p slot="subtitle"> + [[i18nDynamic(locale, 'arcTermsOfServiceErrorMessage')]] + </p> + <div slot="content" class="flex layout vertical center center-justified"> + <img src="images/error.svg" class="oobe-illustration"> + </div> + <div slot="bottom-buttons"> + <oobe-text-button id="arcTosRetryButton" class="focus-on-show" + inverse on-click="onRetry_" + text-key="arcTermsOfServiceRetryButton"></oobe-text-button> + </div> +</oobe-adaptive-dialog> - #arcTosContainer::-webkit-scrollbar { - display: none; - } - - #arcTosOverlayWebview { - border: 1px solid #d9d9d9; - display: flex; - height: 300px; - width: 100%; - } - - #arcTosOverlayWebviewContainer { - box-sizing: border-box; - height: 332px; - margin: auto; - padding: 24px 8px 8px 8px; - width: 100%; - } - </style> - - <!-- LOADING DIALOG --> - <oobe-loading-dialog id="arcTosLoadingDialog" for-step="loading" - role="dialog" - aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]" - title-key="arcTermsOfServiceLoading"> - <iron-icon slot="icon" icon="oobe-32:googleg"></iron-icon> - </oobe-loading-dialog> - - <!-- ERROR DIALOG --> - <oobe-adaptive-dialog id="arcTosErrorDialog" for-step="error" - role="dialog" - aria-label$="[[i18nDynamic(locale, 'arcTermsOfServiceScreenHeading')]]"> - <iron-icon slot="icon" icon="oobe-32:warning"></iron-icon> - <h1 slot="title"> - [[i18nDynamic(locale, 'arcTermsOfServiceErrorTitle')]] - </h1> - <p slot="subtitle"> - [[i18nDynamic(locale, 'arcTermsOfServiceErrorMessage')]] +<!-- As this dialog have pre-loading logic that require access to elements, + dialog is marked as no-lazy. --> +<oobe-adaptive-dialog id="arcTosDialog" for-step="loaded" + role="dialog" aria-label$="[[getDialogTitle_(locale, isChild)]]" + no-lazy> + <iron-icon src="chrome://oobe/playstore.svg" slot="icon"> + </iron-icon> + <h1 slot="title"> + [[getDialogTitle_(locale, isChild)]] + </h1> + <p slot="subtitle" hidden="[[isChild]]"> + [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescription')]] + </p> + <p slot="subtitle" hidden="[[!isChild]]"> + [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescriptionForChild')]] + </p> + <div id="arcTosContainer" slot="content" class="flex layout vertical"> + <webview id="arcTosView" allowTransparency + role="document" class="flex oobe-tos-webview" + on-contentload="onTermsViewContentLoad_"> + </webview> + <div id="arcPolicyLink" class="arc-tos-content" + on-click="onPolicyLinkClick_"> + <a class="oobe-local-link" is="action-link"> + [[i18nDynamic(locale, 'arcPolicyLink')]] + </a> + </div> + <div class="parameter-section arc-tos-content" + hidden="[[isMetricsHidden]]"> + <p> + <span>[[i18nDynamic(locale, metricsTextKey)]]</span> + <a id="learnMoreLinkMetrics" class="oobe-local-link" + on-click="onMetricsLearnMoreTap_" is="action-link"> + [[i18nDynamic(locale, 'arcLearnMoreText')]] + </a> </p> - <div slot="content" class="flex layout vertical center center-justified"> - <img src="images/error.svg" class="oobe-illustration"> - </div> - <div slot="bottom-buttons"> - <oobe-text-button id="arcTosRetryButton" class="focus-on-show" - inverse on-click="onRetry_" - text-key="arcTermsOfServiceRetryButton"></oobe-text-button> - </div> - </oobe-adaptive-dialog> - - <!-- As this dialog have pre-loading logic that require access to elements, - dialog is marked as no-lazy. --> - <oobe-adaptive-dialog id="arcTosDialog" for-step="loaded" - role="dialog" aria-label$="[[getDialogTitle_(locale, isChild)]]" - no-lazy> - <iron-icon src="chrome://oobe/playstore.svg" slot="icon"> - </iron-icon> - <h1 slot="title"> - [[getDialogTitle_(locale, isChild)]] - </h1> - <p slot="subtitle" hidden="[[isChild]]"> - [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescription')]] - </p> - <p slot="subtitle" hidden="[[!isChild]]"> - [[i18nDynamic(locale, 'arcTermsOfServiceScreenDescriptionForChild')]] - </p> - <div id="arcTosContainer" slot="content" class="flex layout vertical"> - <webview id="arcTosView" allowTransparency - role="document" class="flex oobe-tos-webview" - on-contentload="onTermsViewContentLoad_"> - </webview> - <div id="arcPolicyLink" class="arc-tos-content" - on-click="onPolicyLinkClick_"> - <a class="oobe-local-link" is="action-link"> - [[i18nDynamic(locale, 'arcPolicyLink')]] + </div> + <div id="arcTosMetricsDemoApps" + class="parameter-section arc-tos-content" + hidden="[[!demoMode]]"> + <p>[[i18nDynamic(locale, 'arcTextMetricsDemoApps')]]</p> + </div> + <div id="arcBackupService" + class="parameter-section arc-tos-content" + disabled="[[backupRestoreManaged]]" + hidden="[[demoMode]]"> + <cr-checkbox id="arcEnableBackupRestore" + class="layout start" + checked="{{backupRestore}}" + disabled="[[backupRestoreManaged]]"> + <p> + <span>[[i18nDynamic(locale, 'arcTextBackupRestore')]]</span> + <a id="learnMoreLinkBackupRestore" class="oobe-local-link" + on-click="onBackupRestoreLearnMoreTap_" is="action-link"> + [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> - </div> - <div class="parameter-section arc-tos-content" - hidden="[[isMetricsHidden]]"> + </p> + </cr-checkbox> + </div> + <div id="arcExtraContent" hidden="[[!showFullDialog]]"> + <div id="arcLocationService" + class="parameter-section arc-tos-content" + disabled="[[locationServiceManaged]]" + hidden="[[demoMode]]"> + <cr-checkbox id="arcEnableLocationService" + class="layout start" + checked="{{locationService}}" + disabled="[[locationServiceManaged]]"> <p> - <span>[[i18nDynamic(locale, metricsTextKey)]]</span> - <a id="learnMoreLinkMetrics" class="oobe-local-link" - on-click="onMetricsLearnMoreTap_" is="action-link"> + <span>[[i18nDynamic(locale, 'arcTextLocationService')]]</span> + <a id="learnMoreLinkLocationService" class="oobe-local-link" + on-click="onLocationServiceLearnMoreTap_" is="action-link"> [[i18nDynamic(locale, 'arcLearnMoreText')]] </a> </p> - </div> - <div id="arcTosMetricsDemoApps" - class="parameter-section arc-tos-content" - hidden="[[!demoMode]]"> - <p>[[i18nDynamic(locale, 'arcTextMetricsDemoApps')]]</p> - </div> - <div id="arcBackupService" - class="parameter-section arc-tos-content" - disabled="[[backupRestoreManaged]]" - hidden="[[demoMode]]"> - <cr-checkbox id="arcEnableBackupRestore" - class="layout start" - checked="{{backupRestore}}" - disabled="[[backupRestoreManaged]]"> - <p> - <span>[[i18nDynamic(locale, 'arcTextBackupRestore')]]</span> - <a id="learnMoreLinkBackupRestore" class="oobe-local-link" - on-click="onBackupRestoreLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </cr-checkbox> - </div> - <div id="arcExtraContent" hidden="[[!showFullDialog]]"> - <div id="arcLocationService" - class="parameter-section arc-tos-content" - disabled="[[locationServiceManaged]]" - hidden="[[demoMode]]"> - <cr-checkbox id="arcEnableLocationService" - class="layout start" - checked="{{locationService}}" - disabled="[[locationServiceManaged]]"> - <p> - <span>[[i18nDynamic(locale, 'arcTextLocationService')]]</span> - <a id="learnMoreLinkLocationService" class="oobe-local-link" - on-click="onLocationServiceLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </cr-checkbox> - </div> - <div id="arcPaiService" class="parameter-section arc-tos-content"> - <p> - <span>[[i18nDynamic(locale, 'arcTextPaiService')]]</span> - <a id="learnMoreLinkPai" class="oobe-local-link" - on-click="onPaiLearnMoreTap_" is="action-link"> - [[i18nDynamic(locale, 'arcLearnMoreText')]] - </a> - </p> - </div> - <div id="arcGoogleServiceConfirmation" - class="parameter-section arc-tos-content"> - <p>[[i18nDynamic(locale, googleServiceConfirmationTextKey)]]</p> - </div> - <div id="arcReviewSettings" - class="parameter-section arc-tos-content" - hidden="[[demoMode]]"> - <cr-checkbox id="arcReviewSettingsCheckbox" - class="layout start" - checked="{{reviewSettings}}"> - <p>[[i18nDynamic(locale, 'arcTextReviewSettings')]]</p> - </cr-checkbox> - </div> - </div> + </cr-checkbox> </div> - <div slot="back-navigation"> - <oobe-back-button id="arcTosBackButton" hidden="[[!demoMode]]" - on-click="onBack_"></oobe-back-button> + <div id="arcPaiService" class="parameter-section arc-tos-content"> + <p> + <span>[[i18nDynamic(locale, 'arcTextPaiService')]]</span> + <a id="learnMoreLinkPai" class="oobe-local-link" + on-click="onPaiLearnMoreTap_" is="action-link"> + [[i18nDynamic(locale, 'arcLearnMoreText')]] + </a> + </p> </div> - <div slot="bottom-buttons"> - <oobe-text-button id="arcTosNextButton" class="focus-on-show" - inverse on-click="onNext_" - disabled="[[arcTosButtonsDisabled]]" - hidden="[[showFullDialog]]" - text-key="arcTermsOfServiceNextButton"></oobe-text-button> - <oobe-text-button id="arcTosAcceptButton" - inverse on-click="onAccept_" - disabled="[[arcTosButtonsDisabled]]" - hidden="[[!showFullDialog]]" - text-key="[[acceptTextKey]]"></oobe-text-button> + <div id="arcGoogleServiceConfirmation" + class="parameter-section arc-tos-content"> + <p>[[i18nDynamic(locale, googleServiceConfirmationTextKey)]]</p> </div> - </oobe-adaptive-dialog> - <oobe-modal-dialog id="arcMetricsPopup" on-close="onOverlayClosed_" - title-key="arcLearnMoreStatisticsTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP3')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP4')]]</p> + <div id="arcReviewSettings" + class="parameter-section arc-tos-content" + hidden="[[demoMode]]"> + <cr-checkbox id="arcReviewSettingsCheckbox" + class="layout start" + checked="{{reviewSettings}}"> + <p>[[i18nDynamic(locale, 'arcTextReviewSettings')]]</p> + </cr-checkbox> </div> - </oobe-modal-dialog> - <oobe-modal-dialog id="arcBackupRestorePopup" on-close="onOverlayClosed_" - title-key="arcLearnMoreBackupAndRestoreTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP3')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP4')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP5')]]</p> - </div> - </oobe-modal-dialog> - <oobe-modal-dialog id="arcBackupRestoreChildPopup" - on-close="onOverlayClosed_" - title-key="arcLearnMoreBackupAndRestoreTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP2')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP3')]]</p> - </div> - </oobe-modal-dialog> - <oobe-modal-dialog id="arcLocationServicePopup" - on-close="onOverlayClosed_" - title-key="arcLearnMoreLocationServiceTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP1')]]</p> - <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP2')]]</p> - </div> - </oobe-modal-dialog> - <oobe-modal-dialog id="arcPaiPopup" on-close="onOverlayClosed_" - title-key="arcLearnMorePaiServiceTitle"> - <div slot="content"> - <p>[[i18nDynamic(locale, 'arcLearnMorePaiService')]]</p> - </div> - </oobe-modal-dialog> - <oobe-modal-dialog id="arcTosOverlayPrivacyPolicy" - on-close="onOverlayClosed_"> - <div slot="content" id = "arcTosOverlayWebviewContainer"> - <webview id="arcTosOverlayWebview" - hidden="[[overlayLoading_]]" class="flex oobe-tos-webview" - on-contentload="onAcrTosOverlayContentLoad_"> - </webview> - <throbber-notice class="flex layout center-justified vertical" - hidden="[[!overlayLoading_]]" style="height: 100%;"> - </throbber-notice> - </div> - </oobe-modal-dialog> - </template> - <script src="arc_terms_of_service.js"></script> -</dom-module> + </div> + </div> + <div slot="back-navigation"> + <oobe-back-button id="arcTosBackButton" hidden="[[!demoMode]]" + on-click="onBack_"></oobe-back-button> + </div> + <div slot="bottom-buttons"> + <oobe-text-button id="arcTosNextButton" class="focus-on-show" + inverse on-click="onNext_" + disabled="[[arcTosButtonsDisabled]]" + hidden="[[showFullDialog]]" + text-key="arcTermsOfServiceNextButton"></oobe-text-button> + <oobe-text-button id="arcTosAcceptButton" + inverse on-click="onAccept_" + disabled="[[arcTosButtonsDisabled]]" + hidden="[[!showFullDialog]]" + text-key="[[acceptTextKey]]"></oobe-text-button> + </div> +</oobe-adaptive-dialog> +<oobe-modal-dialog id="arcMetricsPopup" on-close="onOverlayClosed_" + title-key="arcLearnMoreStatisticsTitle"> + <div slot="content"> + <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP1')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP2')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP3')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreStatisticsP4')]]</p> + </div> +</oobe-modal-dialog> +<oobe-modal-dialog id="arcBackupRestorePopup" on-close="onOverlayClosed_" + title-key="arcLearnMoreBackupAndRestoreTitle"> + <div slot="content"> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP1')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP2')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP3')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP4')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreP5')]]</p> + </div> +</oobe-modal-dialog> +<oobe-modal-dialog id="arcBackupRestoreChildPopup" + on-close="onOverlayClosed_" + title-key="arcLearnMoreBackupAndRestoreTitle"> + <div slot="content"> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP1')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP2')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreBackupAndRestoreChildP3')]]</p> + </div> +</oobe-modal-dialog> +<oobe-modal-dialog id="arcLocationServicePopup" + on-close="onOverlayClosed_" + title-key="arcLearnMoreLocationServiceTitle"> + <div slot="content"> + <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP1')]]</p> + <p>[[i18nDynamic(locale, 'arcLearnMoreLocationServiceP2')]]</p> + </div> +</oobe-modal-dialog> +<oobe-modal-dialog id="arcPaiPopup" on-close="onOverlayClosed_" + title-key="arcLearnMorePaiServiceTitle"> + <div slot="content"> + <p>[[i18nDynamic(locale, 'arcLearnMorePaiService')]]</p> + </div> +</oobe-modal-dialog> +<oobe-modal-dialog id="arcTosOverlayPrivacyPolicy" + on-close="onOverlayClosed_"> + <div slot="content" id = "arcTosOverlayWebviewContainer"> + <webview id="arcTosOverlayWebview" + hidden="[[overlayLoading_]]" class="flex oobe-tos-webview" + on-contentload="onAcrTosOverlayContentLoad_"> + </webview> + <throbber-notice class="flex layout center-justified vertical" + hidden="[[!overlayLoading_]]" style="height: 100%;"> + </throbber-notice> + </div> +</oobe-modal-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js index bd45ce0..b8122564 100644 --- a/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js +++ b/chrome/browser/resources/chromeos/login/screens/common/arc_terms_of_service.js
@@ -8,7 +8,31 @@ */ -/* #js_imports_placeholder */ +import '//resources/cr_elements/cr_checkbox/cr_checkbox.js'; +import '//resources/js/action_link.js'; +import '//resources/polymer/v3_0/iron-icon/iron-icon.js'; +import '//resources/polymer/v3_0/paper-styles/color.js'; +import '../../components/oobe_icons.m.js'; +import '../../components/common_styles/common_styles.m.js'; +import '../../components/common_styles/oobe_dialog_host_styles.m.js'; +import '../../components/dialogs/oobe_adaptive_dialog.m.js'; +import '../../components/dialogs/oobe_loading_dialog.m.js'; +import '../../components/dialogs/oobe_modal_dialog.m.js'; + +import {loadTimeData} from '//resources/js/load_time_data.m.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {LoginScreenBehavior, LoginScreenBehaviorInterface} from '../../components/behaviors/login_screen_behavior.m.js'; +import {MultiStepBehavior, MultiStepBehaviorInterface} from '../../components/behaviors/multi_step_behavior.m.js'; +import {OobeI18nBehavior, OobeI18nBehaviorInterface} from '../../components/behaviors/oobe_i18n_behavior.m.js'; +import {OobeTextButton} from '../../components/buttons/oobe_text_button.m.js'; +import {OOBE_UI_STATE} from '../../components/display_manager_types.m.js'; +import {getSelectedValue} from '../../components/oobe_select.m.js'; +import {OobeTypes} from '../../components/oobe_types.m.js'; +import {WebViewHelper} from '../../components/web_view_helper.m.js'; +import {CLEAR_ANCHORS_CONTENT_SCRIPT, WebViewLoader} from '../../components/web_view_loader.m.js'; +import {Oobe} from '../../cr_ui.m.js'; + // Enum that describes the current state of the Arc Terms Of Service screen const ArcTosState = { @@ -30,9 +54,8 @@ * @implements {MultiStepBehaviorInterface} * @implements {OobeI18nBehaviorInterface} */ - const ArcTermsOfserviceBase = Polymer.mixinBehaviors( - [OobeI18nBehavior, MultiStepBehavior, LoginScreenBehavior], - Polymer.Element); +const ArcTermsOfserviceBase = mixinBehaviors( + [OobeI18nBehavior, MultiStepBehavior, LoginScreenBehavior], PolymerElement); /** * @typedef {{ @@ -60,7 +83,9 @@ return 'arc-tos-element'; } - /* #html_template_placeholder */ + static get template() { + return html`{__html_template__}`; + } static get properties() { return {
diff --git a/chrome/browser/resources/chromeos/network_ui/third_party/LICENSE b/chrome/browser/resources/chromeos/network_ui/third_party/LICENSE new file mode 100644 index 0000000..ffa3c5e5 --- /dev/null +++ b/chrome/browser/resources/chromeos/network_ui/third_party/LICENSE
@@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Leon Sorokin + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE.
diff --git a/chrome/browser/resources/chromeos/network_ui/third_party/README.chromium b/chrome/browser/resources/chromeos/network_ui/third_party/README.chromium new file mode 100644 index 0000000..e641d02e --- /dev/null +++ b/chrome/browser/resources/chromeos/network_ui/third_party/README.chromium
@@ -0,0 +1,11 @@ +Name: uPlot: A small, fast chart for time series, lines, areas, ohlc & bars +Short Name: uPlot +URL: https://github.com/leeoniya/uPlot/blob/a8854465fe44248980a675656ca544823d4fd01c/dist/uPlot.iife.min.js, https://github.com/leeoniya/uPlot/blob/master/dist/uPlot.min.css +Version: 1.6.21 +Date: 2022-08-8 +License: MIT +Security Critical: No +Description: This snapshot of uPlot is used to generate realtime plots/charts of WiFi related performance metrics. +Local Modifications: +Disable eslint on library file given it is purposely minified to improve space efficiency and, therefore, not human readable. +Add 'export ' to uPlot.iife.min.js to expose the variable (and library by extension). \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.iife.min.js b/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.iife.min.js new file mode 100644 index 0000000..bd322d9b --- /dev/null +++ b/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.iife.min.js
@@ -0,0 +1,3 @@ +/*! https://github.com/leeoniya/uPlot (v1.6.21) */ +// eslint-disable-next-line +export var uPlot=function(){"use strict";const e="u-off",t="u-label",l="width",n="height",i="top",o="bottom",s="left",r="right",u="#000",a="mousemove",f="mousedown",c="mouseup",h="mouseenter",d="mouseleave",p="dblclick",m="change",g="dppxchange",x="undefined"!=typeof window,w=x?document:null,_=x?window:null,k=x?navigator:null;let b,v;function y(e,t){if(null!=t){let l=e.classList;!l.contains(t)&&l.add(t)}}function M(e,t){let l=e.classList;l.contains(t)&&l.remove(t)}function S(e,t,l){e.style[t]=l+"px"}function E(e,t,l,n){let i=w.createElement(e);return null!=t&&y(i,t),null!=l&&l.insertBefore(i,n),i}function D(e,t){return E("div",e,t)}const z=new WeakMap;function T(t,l,n,i,o){let s="translate("+l+"px,"+n+"px)";s!=z.get(t)&&(t.style.transform=s,z.set(t,s),0>l||0>n||l>i||n>o?y(t,e):M(t,e))}const P=new WeakMap;function A(e,t,l){let n=t+l;n!=P.get(e)&&(P.set(e,n),e.style.background=t,e.style.borderColor=l)}const W=new WeakMap;function Y(e,t,l,n){let i=t+""+l;i!=W.get(e)&&(W.set(e,i),e.style.height=l+"px",e.style.width=t+"px",e.style.marginLeft=n?-t/2+"px":0,e.style.marginTop=n?-l/2+"px":0)}const C={passive:!0},F={...C,capture:!0};function H(e,t,l,n){t.addEventListener(e,l,n?F:C)}function R(e,t,l,n){t.removeEventListener(e,l,n?F:C)}function G(e,t,l,n){let i;l=l||0;let o=2147483647>=(n=n||t.length-1);for(;n-l>1;)i=o?l+n>>1:te((l+n)/2),e>t[i]?l=i:n=i;return e-t[l]>t[n]-e?n:l}function L(e,t,l,n){for(let i=1==n?t:l;i>=t&&l>=i;i+=n)if(null!=e[i])return i;return-1}x&&function e(){let t=devicePixelRatio;b!=t&&(b=t,v&&R(m,v,e),v=matchMedia(`(min-resolution: ${b-.001}dppx) and (max-resolution: ${b+.001}dppx)`),H(m,v,e),_.dispatchEvent(new CustomEvent(g)))}();const I=[0,0];function O(e,t,l,n){return I[0]=0>l?ye(e,-l):e,I[1]=0>n?ye(t,-n):t,I}function N(e,t,l,n){let i,o,s,r=re(e),u=10==l?ue:ae;return e==t&&(-1==r?(e*=l,t/=l):(e/=l,t*=l)),n?(i=te(u(e)),o=ne(u(t)),s=O(se(l,i),se(l,o),i,o),e=s[0],t=s[1]):(i=te(u(ee(e))),o=te(u(ee(t))),s=O(se(l,i),se(l,o),i,o),e=ve(e,s[0]),t=be(t,s[1])),[e,t]}function j(e,t,l,n){let i=N(e,t,l,n);return 0==e&&(i[0]=0),0==t&&(i[1]=0),i}const B={mode:3,pad:.1},U={pad:0,soft:null,mode:0},V={min:U,max:U};function J(e,t,l,n){return We(l)?K(e,t,l):(U.pad=l,U.soft=n?0:null,U.mode=n?3:0,K(e,t,V))}function q(e,t){return null==e?t:e}function K(e,t,l){let n=l.min,i=l.max,o=q(n.pad,0),s=q(i.pad,0),r=q(n.hard,-ce),u=q(i.hard,ce),a=q(n.soft,ce),f=q(i.soft,-ce),c=q(n.mode,0),h=q(i.mode,0),d=t-e;1e-9>d&&(d=0,0!=e&&0!=t||(d=1e-9,2==c&&a!=ce&&(o=0),2==h&&f!=-ce&&(s=0)));let p=d||ee(t)||1e3,m=ue(p),g=se(10,te(m)),x=ye(ve(e-p*(0==d?0==e?.1:1:o),g/10),9),w=a>e||1!=c&&(3!=c||x>a)&&(2!=c||a>x)?ce:a,_=oe(r,w>x&&e>=w?w:ie(w,x)),k=ye(be(t+p*(0==d?0==t?.1:1:s),g/10),9),b=t>f||1!=h&&(3!=h||f>k)&&(2!=h||k>f)?-ce:f,v=ie(u,k>b&&b>=t?b:oe(b,k));return _==v&&0==_&&(v=100),[_,v]}const Z=new Intl.NumberFormat(x?k.language:"en-US"),$=e=>Z.format(e),X=Math,Q=X.PI,ee=X.abs,te=X.floor,le=X.round,ne=X.ceil,ie=X.min,oe=X.max,se=X.pow,re=X.sign,ue=X.log10,ae=X.log2,fe=(e,t=1)=>X.asinh(e/t),ce=1/0;function he(e){return 1+(0|ue((e^e>>31)-(e>>31)))}function de(e,t){return le(e/t)*t}function pe(e,t,l){return ie(oe(e,t),l)}function me(e){return"function"==typeof e?e:()=>e}const ge=e=>e,xe=(e,t)=>t,we=()=>null,_e=()=>!0,ke=(e,t)=>e==t;function be(e,t){return ne(e/t)*t}function ve(e,t){return te(e/t)*t}function ye(e,t){return le(e*(t=10**t))/t}const Me=new Map;function Se(e){return((""+e).split(".")[1]||"").length}function Ee(e,t,l,n){let i=[],o=n.map(Se);for(let s=t;l>s;s++){let t=ee(s),l=ye(se(e,s),t);for(let e=0;n.length>e;e++){let r=n[e]*l,u=(0>r||0>s?t:0)+(o[e]>s?o[e]:0),a=ye(r,u);i.push(a),Me.set(a,u)}}return i}const De={},ze=[],Te=[null,null],Pe=Array.isArray;function Ae(e){return"string"==typeof e}function We(e){let t=!1;if(null!=e){let l=e.constructor;t=null==l||l==Object}return t}function Ye(e){return null!=e&&"object"==typeof e}function Ce(e,t=We){let l;if(Pe(e)){let n=e.find((e=>null!=e));if(Pe(n)||t(n)){l=Array(e.length);for(let n=0;e.length>n;n++)l[n]=Ce(e[n],t)}else l=e.slice()}else if(t(e)){l={};for(let n in e)l[n]=Ce(e[n],t)}else l=e;return l}function Fe(e){let t=arguments;for(let l=1;t.length>l;l++){let n=t[l];for(let t in n)We(e[t])?Fe(e[t],Ce(n[t])):e[t]=Ce(n[t])}return e}function He(e,t,l){for(let n,i=0,o=-1;t.length>i;i++){let s=t[i];if(s>o){for(n=s-1;n>=0&&null==e[n];)e[n--]=null;for(n=s+1;l>n&&null==e[n];)e[o=n++]=null}}}const Re="undefined"==typeof queueMicrotask?e=>Promise.resolve().then(e):queueMicrotask,Ge=["January","February","March","April","May","June","July","August","September","October","November","December"],Le=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"];function Ie(e){return e.slice(0,3)}const Oe=Le.map(Ie),Ne=Ge.map(Ie),je={MMMM:Ge,MMM:Ne,WWWW:Le,WWW:Oe};function Be(e){return(10>e?"0":"")+e}const Ue={YYYY:e=>e.getFullYear(),YY:e=>(e.getFullYear()+"").slice(2),MMMM:(e,t)=>t.MMMM[e.getMonth()],MMM:(e,t)=>t.MMM[e.getMonth()],MM:e=>Be(e.getMonth()+1),M:e=>e.getMonth()+1,DD:e=>Be(e.getDate()),D:e=>e.getDate(),WWWW:(e,t)=>t.WWWW[e.getDay()],WWW:(e,t)=>t.WWW[e.getDay()],HH:e=>Be(e.getHours()),H:e=>e.getHours(),h:e=>{let t=e.getHours();return 0==t?12:t>12?t-12:t},AA:e=>12>e.getHours()?"AM":"PM",aa:e=>12>e.getHours()?"am":"pm",a:e=>12>e.getHours()?"a":"p",mm:e=>Be(e.getMinutes()),m:e=>e.getMinutes(),ss:e=>Be(e.getSeconds()),s:e=>e.getSeconds(),fff:e=>function(e){return(10>e?"00":100>e?"0":"")+e}(e.getMilliseconds())};function Ve(e,t){t=t||je;let l,n=[],i=/\{([a-z]+)\}|[^{]+/gi;for(;l=i.exec(e);)n.push("{"==l[0][0]?Ue[l[1]]:l[0]);return e=>{let l="";for(let i=0;n.length>i;i++)l+="string"==typeof n[i]?n[i]:n[i](e,t);return l}}const Je=(new Intl.DateTimeFormat).resolvedOptions().timeZone,qe=e=>e%1==0,Ke=[1,2,2.5,5],Ze=Ee(10,-16,0,Ke),$e=Ee(10,0,16,Ke),Xe=$e.filter(qe),Qe=Ze.concat($e),et="{YYYY}",tt="\n"+et,lt="{M}/{D}",nt="\n"+lt,it=nt+"/{YY}",ot="{aa}",st="{h}:{mm}"+ot,rt="\n"+st,ut=":{ss}",at=null;function ft(e){let t=1e3*e,l=60*t,n=60*l,i=24*n,o=30*i,s=365*i;return[(1==e?Ee(10,0,3,Ke).filter(qe):Ee(10,-3,0,Ke)).concat([t,5*t,10*t,15*t,30*t,l,5*l,10*l,15*l,30*l,n,2*n,3*n,4*n,6*n,8*n,12*n,i,2*i,3*i,4*i,5*i,6*i,7*i,8*i,9*i,10*i,15*i,o,2*o,3*o,4*o,6*o,s,2*s,5*s,10*s,25*s,50*s,100*s]),[[s,et,at,at,at,at,at,at,1],[28*i,"{MMM}",tt,at,at,at,at,at,1],[i,lt,tt,at,at,at,at,at,1],[n,"{h}"+ot,it,at,nt,at,at,at,1],[l,st,it,at,nt,at,at,at,1],[t,ut,it+" "+st,at,nt+" "+st,at,rt,at,1],[e,ut+".{fff}",it+" "+st,at,nt+" "+st,at,rt,at,1]],function(t){return(r,u,a,f,c,h)=>{let d=[],p=c>=s,m=c>=o&&s>c,g=t(a),x=ye(g*e,3),w=_t(g.getFullYear(),p?0:g.getMonth(),m||p?1:g.getDate()),_=ye(w*e,3);if(m||p){let l=m?c/o:0,n=p?c/s:0,i=x==_?x:ye(_t(w.getFullYear()+n,w.getMonth()+l,1)*e,3),r=new Date(le(i/e)),u=r.getFullYear(),a=r.getMonth();for(let o=0;f>=i;o++){let s=_t(u+n*o,a+l*o,1),r=s-t(ye(s*e,3));i=ye((+s+r)*e,3),i>f||d.push(i)}}else{let o=i>c?c:i,s=_+(te(a)-te(x))+be(x-_,o);d.push(s);let p=t(s),m=p.getHours()+p.getMinutes()/l+p.getSeconds()/n,g=c/n,w=h/r.axes[u]._space;for(;s=ye(s+c,1==e?0:3),f>=s;)if(g>1){let e=te(ye(m+g,6))%24,l=t(s).getHours()-e;l>1&&(l=-1),s-=l*n,m=(m+g)%24,.7>ye((s-d[d.length-1])/c,3)*w||d.push(s)}else d.push(s)}return d}}]}const[ct,ht,dt]=ft(1),[pt,mt,gt]=ft(.001);function xt(e,t){return e.map((e=>e.map(((l,n)=>0==n||8==n||null==l?l:t(1==n||0==e[8]?l:e[1]+l)))))}function wt(e,t){return(l,n,i,o,s)=>{let r,u,a,f,c,h,d=t.find((e=>s>=e[0]))||t[t.length-1];return n.map((t=>{let l=e(t),n=l.getFullYear(),i=l.getMonth(),o=l.getDate(),s=l.getHours(),p=l.getMinutes(),m=l.getSeconds(),g=n!=r&&d[2]||i!=u&&d[3]||o!=a&&d[4]||s!=f&&d[5]||p!=c&&d[6]||m!=h&&d[7]||d[1];return r=n,u=i,a=o,f=s,c=p,h=m,g(l)}))}}function _t(e,t,l){return new Date(e,t,l)}function kt(e,t){return t(e)}function bt(e,t){return(l,n)=>t(e(n))}Ee(2,-53,53,[1]);const vt={show:!0,live:!0,isolate:!1,markers:{show:!0,width:2,stroke:function(e,t){let l=e.series[t];return l.width?l.stroke(e,t):l.points.width?l.points.stroke(e,t):null},fill:function(e,t){return e.series[t].fill(e,t)},dash:"solid"},idx:null,idxs:null,values:[]},yt=[0,0];function Mt(e,t,l){return e=>{0==e.button&&l(e)}}function St(e,t,l){return l}const Et={show:!0,x:!0,y:!0,lock:!1,move:function(e,t,l){return yt[0]=t,yt[1]=l,yt},points:{show:function(e,t){let i=e.cursor.points,o=D(),s=i.size(e,t);S(o,l,s),S(o,n,s);let r=s/-2;S(o,"marginLeft",r),S(o,"marginTop",r);let u=i.width(e,t,s);return u&&S(o,"borderWidth",u),o},size:function(e,t){return Vt(e.series[t].points.width,1)},width:0,stroke:function(e,t){let l=e.series[t].points;return l._stroke||l._fill},fill:function(e,t){let l=e.series[t].points;return l._fill||l._stroke}},bind:{mousedown:Mt,mouseup:Mt,click:Mt,dblclick:Mt,mousemove:St,mouseleave:St,mouseenter:St},drag:{setScale:!0,x:!0,y:!1,dist:0,uni:null,_x:!1,_y:!1},focus:{prox:-1},left:-10,top:-10,idx:null,dataIdx:function(e,t,l){return l},idxs:null},Dt={show:!0,stroke:"rgba(0,0,0,0.07)",width:2},zt=Fe({},Dt,{filter:xe}),Tt=Fe({},zt,{size:10}),Pt=Fe({},Dt,{show:!1}),At='12px system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"',Wt="bold "+At,Yt={show:!0,scale:"x",stroke:u,space:50,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Wt,side:2,grid:zt,ticks:Tt,border:Pt,font:At,rotate:0},Ct={show:!0,scale:"x",auto:!1,sorted:1,min:ce,max:-ce,idxs:[]};function Ft(e,t){return t.map((e=>null==e?"":$(e)))}function Ht(e,t,l,n,i,o,s){let r=[],u=Me.get(i)||0;for(let e=l=s?l:ye(be(l,i),u);n>=e;e=ye(e+i,u))r.push(Object.is(e,-0)?0:e);return r}function Rt(e,t,l,n,i){const o=[],s=e.scales[e.axes[t].scale].log,r=te((10==s?ue:ae)(l));i=se(s,r),0>r&&(i=ye(i,-r));let u=l;do{o.push(u),u=ye(u+i,Me.get(i)),i*s>u||(i=u)}while(n>=u);return o}function Gt(e,t,l,n,i){let o=e.scales[e.axes[t].scale].asinh,s=n>o?Rt(e,t,oe(o,l),n,i):[o],r=0>n||l>0?[]:[0];return(-o>l?Rt(e,t,oe(o,-n),-l,i):[o]).reverse().map((e=>-e)).concat(r,s)}const Lt=/./,It=/[12357]/,Ot=/[125]/,Nt=/1/;function jt(e,t,l){let n=e.axes[l],i=n.scale,o=e.scales[i];if(3==o.distr&&2==o.log)return t;let s=e.valToPos,r=n._space,u=s(10,i),a=s(9,i)-u<r?s(7,i)-u<r?s(5,i)-u<r?Nt:Ot:It:Lt;return t.map((e=>4==o.distr&&0==e||a.test(e)?e:null))}function Bt(e,t){return null==t?"":$(t)}const Ut={show:!0,scale:"y",stroke:u,space:30,gap:5,size:50,labelGap:0,labelSize:30,labelFont:Wt,side:3,grid:zt,ticks:Tt,border:Pt,font:At,rotate:0};function Vt(e,t){return ye((3+2*(e||1))*t,3)}const Jt={scale:null,auto:!0,sorted:0,min:ce,max:-ce},qt={show:!0,auto:!0,sorted:0,alpha:1,facets:[Fe({},Jt,{scale:"x"}),Fe({},Jt,{scale:"y"})]},Kt={scale:"y",auto:!0,sorted:0,show:!0,spanGaps:!1,gaps:(e,t,l,n,i)=>i,alpha:1,points:{show:function(e,t){let{scale:l,idxs:n}=e.series[0],i=e._data[0],o=e.valToPos(i[n[0]],l,!0),s=e.valToPos(i[n[1]],l,!0);return ee(s-o)/(e.series[t].points.space*b)>=n[1]-n[0]},filter:null},values:null,min:ce,max:-ce,idxs:[],path:null,clip:null};function Zt(e,t,l){return l/10}const $t={time:!0,auto:!0,distr:1,log:10,asinh:1,min:null,max:null,dir:1,ori:0},Xt=Fe({},$t,{time:!1,ori:1}),Qt={};function el(e){let t=Qt[e];return t||(t={key:e,plots:[],sub(e){t.plots.push(e)},unsub(e){t.plots=t.plots.filter((t=>t!=e))},pub(e,l,n,i,o,s,r){for(let u=0;t.plots.length>u;u++)t.plots[u]!=l&&t.plots[u].pub(e,l,n,i,o,s,r)}},null!=e&&(Qt[e]=t)),t}function tl(e,t,l){const n=e.series[t],i=e.scales,o=e.bbox;let s=e._data[0],r=e._data[t],u=2==e.mode?i[n.facets[0].scale]:i[e.series[0].scale],a=2==e.mode?i[n.facets[1].scale]:i[n.scale],f=o.left,c=o.top,h=o.width,d=o.height,p=e.valToPosH,m=e.valToPosV;return 0==u.ori?l(n,s,r,u,a,p,m,f,c,h,d,al,cl,dl,ml,xl):l(n,s,r,u,a,m,p,c,f,d,h,fl,hl,pl,gl,wl)}function ll(e,t){let l=0,n=0,i=q(e.bands,ze);for(let e=0;i.length>e;e++){let o=i[e];o.series[0]==t?l=o.dir:o.series[1]==t&&(n|=1==o.dir?1:2)}return[l,1==n?-1:2==n?1:3==n?2:0]}function nl(e,t,l,n,i){let o=e.scales[e.series[t].scale];return-1==i?o.min:1==i?o.max:3==o.distr?1==o.dir?o.min:o.max:0}function il(e,t,l,n,i,o){return tl(e,t,((e,t,s,r,u,a,f,c,h,d,p)=>{let m=e.pxRound;const g=0==r.ori?cl:hl;let x,w;1==r.dir*(0==r.ori?1:-1)?(x=l,w=n):(x=n,w=l);let _=m(a(t[x],r,d,c)),k=m(f(s[x],u,p,h)),b=m(a(t[w],r,d,c)),v=m(f(1==o?u.max:u.min,u,p,h)),y=new Path2D(i);return g(y,b,v),g(y,_,v),g(y,_,k),y}))}function ol(e,t,l,n,i,o){let s=null;if(e.length>0){s=new Path2D;const r=0==t?dl:pl;let u=l;for(let t=0;e.length>t;t++){let l=e[t];if(l[1]>l[0]){let e=l[0]-u;e>0&&r(s,u,n,e,n+o),u=l[1]}}let a=l+i-u;a>0&&r(s,u,n,a,n+o)}return s}function sl(e,t,l,n,i,o,s){let r=[];for(let u=1==i?l:n;u>=l&&n>=u;u+=i)if(null===t[u]){let a=u,f=u;if(1==i)for(;++u<=n&&null===t[u];)f=u;else for(;--u>=l&&null===t[u];)f=u;let c=o(e[a]),h=f==a?c:o(e[f]);c=s>0?c:o(e[a-i]),h=0>s?h:o(e[f+i]),c>h||r.push([c,h])}return r}function rl(e){return 0==e?ge:1==e?le:t=>de(t,e)}function ul(e){let t=0==e?al:fl,l=0==e?(e,t,l,n,i,o)=>{e.arcTo(t,l,n,i,o)}:(e,t,l,n,i,o)=>{e.arcTo(l,t,i,n,o)},n=0==e?(e,t,l,n,i)=>{e.rect(t,l,n,i)}:(e,t,l,n,i)=>{e.rect(l,t,i,n)};return(e,i,o,s,r,u=0)=>{0==u?n(e,i,o,s,r):(u=ie(u,s/2,r/2),t(e,i+u,o),l(e,i+s,o,i+s,o+r,u),l(e,i+s,o+r,i,o+r,u),l(e,i,o+r,i,o,u),l(e,i,o,i+s,o,u),e.closePath())}}const al=(e,t,l)=>{e.moveTo(t,l)},fl=(e,t,l)=>{e.moveTo(l,t)},cl=(e,t,l)=>{e.lineTo(t,l)},hl=(e,t,l)=>{e.lineTo(l,t)},dl=ul(0),pl=ul(1),ml=(e,t,l,n,i,o)=>{e.arc(t,l,n,i,o)},gl=(e,t,l,n,i,o)=>{e.arc(l,t,n,i,o)},xl=(e,t,l,n,i,o,s)=>{e.bezierCurveTo(t,l,n,i,o,s)},wl=(e,t,l,n,i,o,s)=>{e.bezierCurveTo(l,t,i,n,s,o)};function _l(){return(e,t,l,n,i)=>tl(e,t,((t,o,s,r,u,a,f,c,h,d,p)=>{let m,g,{pxRound:x,points:w}=t;0==r.ori?(m=al,g=ml):(m=fl,g=gl);const _=ye(w.width*b,3);let k=(w.size-w.width)/2*b,v=ye(2*k,3),y=new Path2D,M=new Path2D,{left:S,top:E,width:D,height:z}=e.bbox;dl(M,S-v,E-v,D+2*v,z+2*v);const T=e=>{if(null!=s[e]){let t=x(a(o[e],r,d,c)),l=x(f(s[e],u,p,h));m(y,t+k,l),g(y,t,l,k,0,2*Q)}};if(i)i.forEach(T);else for(let e=l;n>=e;e++)T(e);return{stroke:_>0?y:null,fill:y,clip:M,flags:3}}))}function kl(e){return(t,l,n,i,o,s)=>{n!=i&&(o!=n&&s!=n&&e(t,l,n),o!=i&&s!=i&&e(t,l,i),e(t,l,s))}}const bl=kl(cl),vl=kl(hl);function yl(e){const t=q(e?.alignGaps,0);return(e,l,n,i)=>tl(e,l,((o,s,r,u,a,f,c,h,d,p,m)=>{let g,x,w=o.pxRound,_=e=>w(f(e,u,p,h)),k=e=>w(c(e,a,m,d));0==u.ori?(g=cl,x=bl):(g=hl,x=vl);const b=u.dir*(0==u.ori?1:-1),v={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},y=v.stroke;let M,S,E,D=ce,z=-ce,T=_(s[1==b?n:i]),P=L(r,n,i,1*b),A=L(r,n,i,-1*b),W=_(s[P]),Y=_(s[A]);for(let e=1==b?n:i;e>=n&&i>=e;e+=b){let t=_(s[e]);t==T?null!=r[e]&&(S=k(r[e]),D==ce&&(g(y,t,S),M=S),D=ie(S,D),z=oe(S,z)):(D!=ce&&(x(y,T,D,z,M,S),E=T),null!=r[e]?(S=k(r[e]),g(y,t,S),D=z=M=S):(D=ce,z=-ce),T=t)}D!=ce&&D!=z&&E!=T&&x(y,T,D,z,M,S);let[C,F]=ll(e,l);if(null!=o.fill||0!=C){let t=v.fill=new Path2D(y),n=k(o.fillTo(e,l,o.min,o.max,C));g(t,Y,n),g(t,W,n)}if(!o.spanGaps){let a=[];a.push(...sl(s,r,n,i,b,_,t)),v.gaps=a=o.gaps(e,l,n,i,a),v.clip=ol(a,u.ori,h,d,p,m)}return 0!=F&&(v.band=2==F?[il(e,l,n,i,y,-1),il(e,l,n,i,y,1)]:il(e,l,n,i,y,F)),v}))}function Ml(e,t,l,n,i){const o=e.length;if(2>o)return null;const s=new Path2D;if(l(s,e[0],t[0]),2==o)n(s,e[1],t[1]);else{let l=Array(o),n=Array(o-1),r=Array(o-1),u=Array(o-1);for(let l=0;o-1>l;l++)r[l]=t[l+1]-t[l],u[l]=e[l+1]-e[l],n[l]=r[l]/u[l];l[0]=n[0];for(let e=1;o-1>e;e++)0===n[e]||0===n[e-1]||n[e-1]>0!=n[e]>0?l[e]=0:(l[e]=3*(u[e-1]+u[e])/((2*u[e]+u[e-1])/n[e-1]+(u[e]+2*u[e-1])/n[e]),isFinite(l[e])||(l[e]=0));l[o-1]=n[o-2];for(let n=0;o-1>n;n++)i(s,e[n]+u[n]/3,t[n]+l[n]*u[n]/3,e[n+1]-u[n]/3,t[n+1]-l[n+1]*u[n]/3,e[n+1],t[n+1])}return s}const Sl=new Set;function El(){Sl.forEach((e=>{e.syncRect(!0)}))}x&&(H("resize",_,El),H("scroll",_,El,!0),H(g,_,(()=>{Ol.pxRatio=b})));const Dl=yl(),zl=_l();function Tl(e,t,l,n){return(n?[e[0],e[1]].concat(e.slice(2)):[e[0]].concat(e.slice(1))).map(((e,n)=>Pl(e,n,t,l)))}function Pl(e,t,l,n){return Fe({},0==t?l:n,e)}function Al(e,t,l){return null==t?Te:[t,l]}const Wl=Al;function Yl(e,t,l){return null==t?Te:J(t,l,.1,!0)}function Cl(e,t,l,n){return null==t?Te:N(t,l,e.scales[n].log,!1)}const Fl=Cl;function Hl(e,t,l,n){return null==t?Te:j(t,l,e.scales[n].log,!1)}const Rl=Hl;function Gl(e,t,l,n,i){let o=oe(he(e),he(t)),s=t-e,r=G(i/n*s,l);do{let e=l[r],t=n*e/s;if(t>=i&&17>=o+(5>e?Me.get(e):0))return[e,t]}while(++r<l.length);return[0,0]}function Ll(e){let t,l;return[e=e.replace(/(\d+)px/,((e,n)=>(t=le((l=+n)*b))+"px")),t,l]}function Il(e){e.show&&[e.font,e.labelFont].forEach((e=>{let t=ye(e[2]*b,1);e[0]=e[0].replace(/[0-9.]+px/,t+"px"),e[1]=t}))}function Ol(u,m,x){const k={mode:q(u.mode,1)},v=k.mode;function z(e,t){return((3==t.distr?ue(e>0?e:t.clamp(k,e,t.min,t.max,t.key)):4==t.distr?fe(e,t.asinh):e)-t._min)/(t._max-t._min)}function P(e,t,l,n){let i=z(e,t);return n+l*(-1==t.dir?1-i:i)}function W(e,t,l,n){let i=z(e,t);return n+l*(-1==t.dir?i:1-i)}function C(e,t,l,n){return 0==t.ori?P(e,t,l,n):W(e,t,l,n)}k.valToPosH=P,k.valToPosV=W;let F=!1;k.status=0;const L=k.root=D("uplot");null!=u.id&&(L.id=u.id),y(L,u.class),u.title&&(D("u-title",L).textContent=u.title);const I=E("canvas"),O=k.ctx=I.getContext("2d"),U=D("u-wrap",L),V=k.under=D("u-under",U);U.appendChild(I);const K=k.over=D("u-over",U),Z=+q((u=Ce(u)).pxAlign,1),$=rl(Z);(u.plugins||[]).forEach((e=>{e.opts&&(u=e.opts(k,u)||u)}));const te=u.ms||.001,re=k.series=1==v?Tl(u.series||[],Ct,Kt,!1):function(e,t){return e.map(((e,l)=>0==l?null:Fe({},t,e)))}(u.series||[null],qt),ae=k.axes=Tl(u.axes||[],Yt,Ut,!0),he=k.scales={},ge=k.bands=u.bands||[];ge.forEach((e=>{e.fill=me(e.fill||null),e.dir=q(e.dir,-1)}));const ve=2==v?re[1].facets[0].scale:re[0].scale,Me={axes:function(){for(let e=0;ae.length>e;e++){let t=ae[e];if(!t.show||!t._show)continue;let l,n,u=t.side,a=u%2,f=t.stroke(k,e),c=0==u||3==u?-1:1;if(t.label){let e=le((t._lpos+t.labelGap*c)*b);ql(t.labelFont[0],f,"center",2==u?i:o),O.save(),1==a?(l=n=0,O.translate(e,le(At+Lt/2)),O.rotate((3==u?-Q:Q)/2)):(l=le(Pt+Wt/2),n=e),O.fillText(t.label,l,n),O.restore()}let[h,d]=t._found;if(0==d)continue;let p=he[t.scale],m=0==a?Wt:Lt,g=0==a?Pt:At,x=le(t.gap*b),w=t._splits,_=2==p.distr?w.map((e=>jl[e])):w,v=2==p.distr?jl[w[1]]-jl[w[0]]:h,y=t.ticks,M=t.border,S=y.show?le(y.size*b):0,E=t._rotate*-Q/180,D=$(t._pos*b),z=D+(S+x)*c;n=0==a?z:0,l=1==a?z:0,ql(t.font[0],f,1==t.align?s:2==t.align?r:E>0?s:0>E?r:0==a?"center":3==u?r:s,E||1==a?"middle":2==u?i:o);let T=1.5*t.font[1],P=w.map((e=>$(C(e,p,m,g)))),A=t._values;for(let e=0;A.length>e;e++){let t=A[e];if(null!=t){0==a?l=P[e]:n=P[e],t=""+t;let i=-1==t.indexOf("\n")?[t]:t.split(/\n/gm);for(let e=0;i.length>e;e++){let t=i[e];E?(O.save(),O.translate(l,n+e*T),O.rotate(E),O.fillText(t,0,0),O.restore()):O.fillText(t,l,n+e*T)}}}y.show&&tn(P,y.filter(k,_,e,d,v),a,u,D,S,ye(y.width*b,3),y.stroke(k,e),y.dash,y.cap);let W=t.grid;W.show&&tn(P,W.filter(k,_,e,d,v),a,0==a?2:1,0==a?At:Pt,0==a?Lt:Wt,ye(W.width*b,3),W.stroke(k,e),W.dash,W.cap),M.show&&tn([D],[1],0==a?1:0,0==a?1:2,1==a?At:Pt,1==a?Lt:Wt,ye(M.width*b,3),M.stroke(k,e),M.dash,M.cap)}ti("drawAxes")},series:function(){pl>0&&(re.forEach(((e,t)=>{if(t>0&&e.show&&null==e._paths){let l=function(e){let t=pe(ml-1,0,pl-1),l=pe(gl+1,0,pl-1);for(;null==e[t]&&t>0;)t--;for(;null==e[l]&&pl-1>l;)l++;return[t,l]}(m[t]);e._paths=e.paths(k,t,l[0],l[1])}})),re.forEach(((e,t)=>{if(t>0&&e.show){Nl!=e.alpha&&(O.globalAlpha=Nl=e.alpha),Zl(t,!1),e._paths&&$l(t,!1);{Zl(t,!0);let l=e.points.show(k,t,ml,gl),n=e.points.filter(k,t,l,e._paths?e._paths.gaps:null);(l||n)&&(e.points._paths=e.points.paths(k,t,ml,gl,n),$l(t,!0))}1!=Nl&&(O.globalAlpha=Nl=1),ti("drawSeries",t)}})))}},Se=(u.drawOrder||["axes","series"]).map((e=>Me[e]));function Ee(e){let t=he[e];if(null==t){let l=(u.scales||De)[e]||De;if(null!=l.from)Ee(l.from),he[e]=Fe({},he[l.from],l,{key:e});else{t=he[e]=Fe({},e==ve?$t:Xt,l),t.key=e;let n=t.time,i=t.range,o=Pe(i);if((e!=ve||2==v&&!n)&&(!o||null!=i[0]&&null!=i[1]||(i={min:null==i[0]?B:{mode:1,hard:i[0],soft:i[0]},max:null==i[1]?B:{mode:1,hard:i[1],soft:i[1]}},o=!1),!o&&We(i))){let e=i;i=(t,l,n)=>null==l?Te:J(l,n,e)}t.range=me(i||(n?Wl:e==ve?3==t.distr?Fl:4==t.distr?Rl:Al:3==t.distr?Cl:4==t.distr?Hl:Yl)),t.auto=me(!o&&t.auto),t.clamp=me(t.clamp||Zt),t._min=t._max=null}}}Ee("x"),Ee("y"),1==v&&re.forEach((e=>{Ee(e.scale)})),ae.forEach((e=>{Ee(e.scale)}));for(let e in u.scales)Ee(e);const He=he[ve],Ge=He.distr;let Le,Ie;0==He.ori?(y(L,"u-hz"),Le=P,Ie=W):(y(L,"u-vt"),Le=W,Ie=P);const Oe={};for(let e in he){let t=he[e];null==t.min&&null==t.max||(Oe[e]={min:t.min,max:t.max},t.min=t.max=null)}const Ne=u.tzDate||(e=>new Date(le(e/te))),je=u.fmtDate||Ve,Be=1==te?dt(Ne):gt(Ne),Ue=wt(Ne,xt(1==te?ht:mt,je)),Je=bt(Ne,kt("{YYYY}-{MM}-{DD} {h}:{mm}{aa}",je)),qe=[],Ke=k.legend=Fe({},vt,u.legend),Ze=Ke.show,$e=Ke.markers;let et;Ke.idxs=qe,$e.width=me($e.width),$e.dash=me($e.dash),$e.stroke=me($e.stroke),$e.fill=me($e.fill);let tt,lt=[],nt=[],it=!1,ot={};if(Ke.live){const e=re[1]?re[1].values:null;it=null!=e,tt=it?e(k,1,0):{_:0};for(let e in tt)ot[e]="--"}if(Ze)if(et=E("table","u-legend",L),it){let e=E("tr","u-thead",et);for(var st in E("th",null,e),tt)E("th",t,e).textContent=st}else y(et,"u-inline"),Ke.live&&y(et,"u-live");const rt={show:!0},ut={show:!1},at=new Map;function ft(e,t,l){const n=at.get(t)||{},i=il.bind[e](k,t,l);i&&(H(e,t,n[e]=i),at.set(t,n))}function _t(e,t){const l=at.get(t)||{};for(let n in l)null!=e&&n!=e||(R(n,t,l[n]),delete l[n]);null==e&&at.delete(t)}let yt=0,Mt=0,St=0,Dt=0,zt=0,Tt=0,Pt=0,At=0,Wt=0,Lt=0;k.bbox={};let It=!1,Ot=!1,Nt=!1,Jt=!1,Qt=!1;function tl(e,t,l){(l||e!=k.width||t!=k.height)&&ll(e,t),on(!1),Nt=!0,Ot=!0,Jt=Qt=il.left>=0,_n()}function ll(e,t){k.width=yt=St=e,k.height=Mt=Dt=t,zt=Tt=0,function(){let e=!1,t=!1,l=!1,n=!1;ae.forEach((i=>{if(i.show&&i._show){let{side:o,_size:s}=i,r=o%2,u=s+(null!=i.label?i.labelSize:0);u>0&&(r?(St-=u,3==o?(zt+=u,n=!0):l=!0):(Dt-=u,0==o?(Tt+=u,e=!0):t=!0))}})),fl[0]=e,fl[1]=l,fl[2]=t,fl[3]=n,St-=dl[1]+dl[3],zt+=dl[3],Dt-=dl[2]+dl[0],Tt+=dl[0]}(),function(){let e=zt+St,t=Tt+Dt,l=zt,n=Tt;function i(i,o){switch(i){case 1:return e+=o,e-o;case 2:return t+=o,t-o;case 3:return l-=o,l+o;case 0:return n-=o,n+o}}ae.forEach((e=>{if(e.show&&e._show){let t=e.side;e._pos=i(t,e._size),null!=e.label&&(e._lpos=i(t,e.labelSize))}}))}();let l=k.bbox;Pt=l.left=de(zt*b,.5),At=l.top=de(Tt*b,.5),Wt=l.width=de(St*b,.5),Lt=l.height=de(Dt*b,.5)}k.setSize=function({width:e,height:t}){tl(e,t)};const il=k.cursor=Fe({},Et,{drag:{y:2==v}},u.cursor);{il.idxs=qe,il._lock=!1;let e=il.points;e.show=me(e.show),e.size=me(e.size),e.stroke=me(e.stroke),e.width=me(e.width),e.fill=me(e.fill)}const ol=k.focus=Fe({},u.focus||{alpha:.3},il.focus),sl=ol.prox>=0;let ul=[null];function al(l,n){if(1==v||n>0){let e=1==v&&he[l.scale].time,t=l.value;l.value=e?Ae(t)?bt(Ne,kt(t,je)):t||Je:t||Bt,l.label=l.label||(e?"Time":"Value")}if(n>0){l.width=null==l.width?1:l.width,l.paths=l.paths||Dl||we,l.fillTo=me(l.fillTo||nl),l.pxAlign=+q(l.pxAlign,Z),l.pxRound=rl(l.pxAlign),l.stroke=me(l.stroke||null),l.fill=me(l.fill||null),l._stroke=l._fill=l._paths=l._focus=null;let e=Vt(l.width,1),t=l.points=Fe({},{size:e,width:oe(1,.2*e),stroke:l.stroke,space:2*e,paths:zl,_stroke:null,_fill:null},l.points);t.show=me(t.show),t.filter=me(t.filter),t.fill=me(t.fill),t.stroke=me(t.stroke),t.paths=me(t.paths),t.pxAlign=l.pxAlign}if(Ze){let i=function(l,n){if(0==n&&(it||!Ke.live||2==v))return Te;let i=[],o=E("tr","u-series",et,et.childNodes[n]);y(o,l.class),l.show||y(o,e);let s=E("th",null,o);if($e.show){let e=D("u-marker",s);if(n>0){let t=$e.width(k,n);t&&(e.style.border=t+"px "+$e.dash(k,n)+" "+$e.stroke(k,n)),e.style.background=$e.fill(k,n)}}let r=D(t,s);for(var u in r.textContent=l.label,n>0&&($e.show||(r.style.color=l.width>0?$e.stroke(k,n):$e.fill(k,n)),ft("click",s,(e=>{if(il._lock)return;let t=re.indexOf(l);if((e.ctrlKey||e.metaKey)!=Ke.isolate){let e=re.some(((e,l)=>l>0&&l!=t&&e.show));re.forEach(((l,n)=>{n>0&&Pn(n,e?n==t?rt:ut:rt,!0,li.setSeries)}))}else Pn(t,{show:!l.show},!0,li.setSeries)})),sl&&ft(h,s,(()=>{il._lock||Pn(re.indexOf(l),Cn,!0,li.setSeries)}))),tt){let e=E("td","u-value",o);e.textContent="--",i.push(e)}return[o,i]}(l,n);lt.splice(n,0,i[0]),nt.splice(n,0,i[1]),Ke.values.push(null)}if(il.show){qe.splice(n,0,null);let e=function(e,t){if(t>0){let l=il.points.show(k,t);if(l)return y(l,"u-cursor-pt"),y(l,e.class),T(l,-10,-10,St,Dt),K.insertBefore(l,ul[t]),l}}(l,n);e&&ul.splice(n,0,e)}ti("addSeries",n)}k.addSeries=function(e,t){e=Pl(e,t=null==t?re.length:t,Ct,Kt),re.splice(t,0,e),al(re[t],t)},k.delSeries=function(e){if(re.splice(e,1),Ze){Ke.values.splice(e,1),nt.splice(e,1);let t=lt.splice(e,1)[0];_t(null,t.firstChild),t.remove()}il.show&&(qe.splice(e,1),ul.length>1&&ul.splice(e,1)[0].remove()),ti("delSeries",e)};const fl=[!1,!1,!1,!1];function cl(e,t,l){let[n,i,o,s]=l,r=t%2,u=0;return 0==r&&(s||i)&&(u=0==t&&!n||2==t&&!o?le(Yt.size/3):0),1==r&&(n||o)&&(u=1==t&&!i||3==t&&!s?le(Ut.size/2):0),u}const hl=k.padding=(u.padding||[cl,cl,cl,cl]).map((e=>me(q(e,cl)))),dl=k._padding=hl.map(((e,t)=>e(k,t,fl,0)));let pl,ml=null,gl=null;const xl=1==v?re[0].idxs:null;let wl,_l,kl,bl,vl,yl,Ml,El,Ol,Nl,jl=null,Bl=!1;function Ul(e,t){if(m=null==e?[]:Ce(e,Ye),2==v){pl=0;for(let e=1;re.length>e;e++)pl+=m[e][0].length;k.data=m=e}else if(null==m[0]&&(m[0]=[]),k.data=m.slice(),jl=m[0],pl=jl.length,2==Ge){m[0]=Array(pl);for(let e=0;pl>e;e++)m[0][e]=e}if(k._data=m,on(!0),ti("setData"),!1!==t){let e=He;e.auto(k,Bl)?Vl():Tn(ve,e.min,e.max),Jt=il.left>=0,Qt=!0,_n()}}function Vl(){let e,t;Bl=!0,1==v&&(pl>0?(ml=xl[0]=0,gl=xl[1]=pl-1,e=m[0][ml],t=m[0][gl],2==Ge?(e=ml,t=gl):1==pl&&(3==Ge?[e,t]=N(e,e,He.log,!1):4==Ge?[e,t]=j(e,e,He.log,!1):He.time?t=e+le(86400/te):[e,t]=J(e,t,.1,!0))):(ml=xl[0]=e=null,gl=xl[1]=t=null)),Tn(ve,e,t)}function Jl(e="#0000",t,l=ze,n="butt",i="#0000",o="round"){e!=wl&&(O.strokeStyle=wl=e),i!=_l&&(O.fillStyle=_l=i),t!=kl&&(O.lineWidth=kl=t),o!=vl&&(O.lineJoin=vl=o),n!=yl&&(O.lineCap=yl=n),l!=bl&&O.setLineDash(bl=l)}function ql(e,t,l,n){t!=_l&&(O.fillStyle=_l=t),e!=Ml&&(O.font=Ml=e),l!=El&&(O.textAlign=El=l),n!=Ol&&(O.textBaseline=Ol=n)}function Kl(e,t,l,n,i=0){if(n.length>0&&e.auto(k,Bl)&&(null==t||null==t.min)){let t=q(ml,0),o=q(gl,n.length-1),s=null==l.min?3==e.distr?function(e,t,l){let n=ce,i=-ce;for(let o=t;l>=o;o++)e[o]>0&&(n=ie(n,e[o]),i=oe(i,e[o]));return[n==ce?1:n,i==-ce?10:i]}(n,t,o):function(e,t,l,n){let i=ce,o=-ce;if(1==n)i=e[t],o=e[l];else if(-1==n)i=e[l],o=e[t];else for(let n=t;l>=n;n++)null!=e[n]&&(i=ie(i,e[n]),o=oe(o,e[n]));return[i,o]}(n,t,o,i):[l.min,l.max];e.min=ie(e.min,l.min=s[0]),e.max=oe(e.max,l.max=s[1])}}function Zl(e,t){let l=t?re[e].points:re[e];l._stroke=l.stroke(k,e),l._fill=l.fill(k,e)}function $l(e,t){let l=t?re[e].points:re[e],n=l._stroke,i=l._fill,{stroke:o,fill:s,clip:r,flags:u}=l._paths,a=null,f=ye(l.width*b,3),c=f%2/2;t&&null==i&&(i=f>0?"#fff":n);let h=1==l.pxAlign;if(h&&O.translate(c,c),!t){let e=Pt,t=At,n=Wt,i=Lt,o=f*b/2;0==l.min&&(i+=o),0==l.max&&(t-=o,i+=o),a=new Path2D,a.rect(e,t,n,i)}t?Xl(n,f,l.dash,l.cap,i,o,s,u,r):function(e,t,l,n,i,o,s,r,u,a,f){let c=!1;ge.forEach(((h,d)=>{if(h.series[0]==e){let e,p=re[h.series[1]],g=m[h.series[1]],x=(p._paths||De).band;Pe(x)&&(x=1==h.dir?x[0]:x[1]);let w=null;p.show&&x&&function(e,t,l){for(t=q(t,0),l=q(l,e.length-1);l>=t;){if(null!=e[t])return!0;t++}return!1}(g,ml,gl)?(w=h.fill(k,d)||o,e=p._paths.clip):x=null,Xl(t,l,n,i,w,s,r,u,a,f,e,x),c=!0}})),c||Xl(t,l,n,i,o,s,r,u,a,f)}(e,n,f,l.dash,l.cap,i,o,s,u,a,r),h&&O.translate(-c,-c)}function Xl(e,t,l,n,i,o,s,r,u,a,f,c){Jl(e,t,l,n,i),(u||a||c)&&(O.save(),u&&O.clip(u),a&&O.clip(a)),c?3==(3&r)?(O.clip(c),f&&O.clip(f),en(i,s),Ql(e,o,t)):2&r?(en(i,s),O.clip(c),Ql(e,o,t)):1&r&&(O.save(),O.clip(c),f&&O.clip(f),en(i,s),O.restore(),Ql(e,o,t)):(en(i,s),Ql(e,o,t)),(u||a||c)&&O.restore()}function Ql(e,t,l){l>0&&(t instanceof Map?t.forEach(((e,t)=>{O.strokeStyle=wl=t,O.stroke(e)})):null!=t&&e&&O.stroke(t))}function en(e,t){t instanceof Map?t.forEach(((e,t)=>{O.fillStyle=_l=t,O.fill(e)})):null!=t&&e&&O.fill(t)}function tn(e,t,l,n,i,o,s,r,u,a){let f=s%2/2;1==Z&&O.translate(f,f),Jl(r,s,u,a,r),O.beginPath();let c,h,d,p,m=i+(0==n||3==n?-o:o);0==l?(h=i,p=m):(c=i,d=m);for(let n=0;e.length>n;n++)null!=t[n]&&(0==l?c=d=e[n]:h=p=e[n],O.moveTo(c,h),O.lineTo(d,p));O.stroke(),1==Z&&O.translate(-f,-f)}function ln(e){let t=!0;return ae.forEach(((l,n)=>{if(!l.show)return;let i=he[l.scale];if(null==i.min)return void(l._show&&(t=!1,l._show=!1,on(!1)));l._show||(t=!1,l._show=!0,on(!1));let o=l.side,s=o%2,{min:r,max:u}=i,[a,f]=function(e,t,l,n){let i,o=ae[e];if(n>0){let s=o._space=o.space(k,e,t,l,n);i=Gl(t,l,o._incrs=o.incrs(k,e,t,l,n,s),n,s)}else i=[0,0];return o._found=i}(n,r,u,0==s?St:Dt);if(0==f)return;let c=l._splits=l.splits(k,n,r,u,a,f,2==i.distr),h=2==i.distr?c.map((e=>jl[e])):c,d=2==i.distr?jl[c[1]]-jl[c[0]]:a,p=l._values=l.values(k,l.filter(k,h,n,f,d),n,f,d);l._rotate=2==o?l.rotate(k,p,n,f):0;let m=l._size;l._size=ne(l.size(k,p,n,e)),null!=m&&l._size!=m&&(t=!1)})),t}function nn(e){let t=!0;return hl.forEach(((l,n)=>{let i=l(k,n,fl,e);i!=dl[n]&&(t=!1),dl[n]=i})),t}function on(e){re.forEach(((t,l)=>{l>0&&(t._paths=null,e&&(1==v?(t.min=null,t.max=null):t.facets.forEach((e=>{e.min=null,e.max=null}))))}))}k.setData=Ul;let sn,rn,un,an,fn,cn,hn,dn,pn,mn,gn,xn,wn=!1;function _n(){wn||(Re(kn),wn=!0)}function kn(){It&&(function(){let e=Ce(he,Ye);for(let t in e){let l=e[t],n=Oe[t];if(null!=n&&null!=n.min)Fe(l,n),t==ve&&on(!0);else if(t!=ve||2==v)if(0==pl&&null==l.from){let e=l.range(k,null,null,t);l.min=e[0],l.max=e[1]}else l.min=ce,l.max=-ce}if(pl>0){re.forEach(((t,l)=>{if(1==v){let n=t.scale,i=e[n],o=Oe[n];if(0==l){let e=i.range(k,i.min,i.max,n);i.min=e[0],i.max=e[1],ml=G(i.min,m[0]),gl=G(i.max,m[0]),i.min>m[0][ml]&&ml++,m[0][gl]>i.max&&gl--,t.min=jl[ml],t.max=jl[gl]}else t.show&&t.auto&&Kl(i,o,t,m[l],t.sorted);t.idxs[0]=ml,t.idxs[1]=gl}else if(l>0&&t.show&&t.auto){let[n,i]=t.facets,o=n.scale,s=i.scale,[r,u]=m[l];Kl(e[o],Oe[o],n,r,n.sorted),Kl(e[s],Oe[s],i,u,i.sorted),t.min=i.min,t.max=i.max}}));for(let t in e){let l=e[t],n=Oe[t];if(null==l.from&&(null==n||null==n.min)){let e=l.range(k,l.min==ce?null:l.min,l.max==-ce?null:l.max,t);l.min=e[0],l.max=e[1]}}}for(let t in e){let l=e[t];if(null!=l.from){let n=e[l.from];if(null==n.min)l.min=l.max=null;else{let e=l.range(k,n.min,n.max,t);l.min=e[0],l.max=e[1]}}}let t={},l=!1;for(let n in e){let i=e[n],o=he[n];if(o.min!=i.min||o.max!=i.max){o.min=i.min,o.max=i.max;let e=o.distr;o._min=3==e?ue(o.min):4==e?fe(o.min,o.asinh):o.min,o._max=3==e?ue(o.max):4==e?fe(o.max,o.asinh):o.max,t[n]=l=!0}}if(l){re.forEach(((e,l)=>{2==v?l>0&&t.y&&(e._paths=null):t[e.scale]&&(e._paths=null)}));for(let e in t)Nt=!0,ti("setScale",e);il.show&&(Jt=Qt=il.left>=0)}for(let e in Oe)Oe[e]=null}(),It=!1),Nt&&(function(){let e=!1,t=0;for(;!e;){t++;let l=ln(t),n=nn(t);e=3==t||l&&n,e||(ll(k.width,k.height),Ot=!0)}}(),Nt=!1),Ot&&(S(V,s,zt),S(V,i,Tt),S(V,l,St),S(V,n,Dt),S(K,s,zt),S(K,i,Tt),S(K,l,St),S(K,n,Dt),S(U,l,yt),S(U,n,Mt),I.width=le(yt*b),I.height=le(Mt*b),ae.forEach((({_el:t,_show:l,_size:n,_pos:i,side:o})=>{if(null!=t)if(l){let l=o%2==1;S(t,l?"left":"top",i-(3===o||0===o?n:0)),S(t,l?"width":"height",n),S(t,l?"top":"left",l?Tt:zt),S(t,l?"height":"width",l?Dt:St),M(t,e)}else y(t,e)})),wl=_l=kl=vl=yl=Ml=El=Ol=bl=null,Nl=1,Bn(!0),ti("setSize"),Ot=!1),yt>0&&Mt>0&&(O.clearRect(0,0,I.width,I.height),ti("drawClear"),Se.forEach((e=>e())),ti("draw")),il.show&&Jt&&(Nn(null,!0,!1),Jt=!1),F||(F=!0,k.status=1,ti("ready")),Bl=!1,wn=!1}function bn(e,t){let l=he[e];if(null==l.from){if(0==pl){let n=l.range(k,t.min,t.max,e);t.min=n[0],t.max=n[1]}if(t.min>t.max){let e=t.min;t.min=t.max,t.max=e}if(pl>1&&null!=t.min&&null!=t.max&&1e-16>t.max-t.min)return;e==ve&&2==l.distr&&pl>0&&(t.min=G(t.min,m[0]),t.max=G(t.max,m[0]),t.min==t.max&&t.max++),Oe[e]=t,It=!0,_n()}}k.redraw=(e,t)=>{Nt=t||!1,!1!==e?Tn(ve,He.min,He.max):_n()},k.setScale=bn;let vn=!1;const yn=il.drag;let Mn=yn.x,Sn=yn.y;il.show&&(il.x&&(sn=D("u-cursor-x",K)),il.y&&(rn=D("u-cursor-y",K)),0==He.ori?(un=sn,an=rn):(un=rn,an=sn),gn=il.left,xn=il.top);const En=k.select=Fe({show:!0,over:!0,left:0,width:0,top:0,height:0},u.select),Dn=En.show?D("u-select",En.over?K:V):null;function zn(e,t){if(En.show){for(let t in e)S(Dn,t,En[t]=e[t]);!1!==t&&ti("setSelect")}}function Tn(e,t,l){bn(e,{min:t,max:l})}function Pn(t,l,n,i){null!=l.focus&&function(e){if(e!=Yn){let t=null==e,l=1!=ol.alpha;re.forEach(((n,i)=>{let o=t||0==i||i==e;n._focus=t?null:o,l&&function(e,t){re[e].alpha=t,il.show&&ul[e]&&(ul[e].style.opacity=t),Ze&<[e]&&(lt[e].style.opacity=t)}(i,o?1:ol.alpha)})),Yn=e,l&&_n()}}(t),null!=l.show&&re.forEach(((n,i)=>{0>=i||t!=i&&null!=t||(n.show=l.show,function(t){let l=Ze?lt[t]:null;re[t].show?l&&M(l,e):(l&&y(l,e),ul.length>1&&T(ul[t],-10,-10,St,Dt))}(i),Tn(2==v?n.facets[1].scale:n.scale,null,null),_n())})),!1!==n&&ti("setSeries",t,l),i&&oi("setSeries",k,t,l)}let An,Wn,Yn;k.setSelect=zn,k.setSeries=Pn,k.addBand=function(e,t){e.fill=me(e.fill||null),e.dir=q(e.dir,-1),ge.splice(t=null==t?ge.length:t,0,e)},k.setBand=function(e,t){Fe(ge[e],t)},k.delBand=function(e){null==e?ge.length=0:ge.splice(e,1)};const Cn={focus:!0};function Fn(e,t,l){let n=he[t];l&&(e=e/b-(1==n.ori?Tt:zt));let i=St;1==n.ori&&(i=Dt,e=i-e),-1==n.dir&&(e=i-e);let o=n._min,s=o+e/i*(n._max-o),r=n.distr;return 3==r?se(10,s):4==r?((e,t=1)=>X.sinh(e)*t)(s,n.asinh):s}function Hn(e,t){S(Dn,s,En.left=e),S(Dn,l,En.width=t)}function Rn(e,t){S(Dn,i,En.top=e),S(Dn,n,En.height=t)}Ze&&sl&&H(d,et,(()=>{il._lock||null!=Yn&&Pn(null,Cn,!0,li.setSeries)})),k.valToIdx=e=>G(e,m[0]),k.posToIdx=function(e,t){return G(Fn(e,ve,t),m[0],ml,gl)},k.posToVal=Fn,k.valToPos=(e,t,l)=>0==he[t].ori?P(e,he[t],l?Wt:St,l?Pt:0):W(e,he[t],l?Lt:Dt,l?At:0),k.batch=function(e){e(k),_n()},k.setCursor=(e,t,l)=>{gn=e.left,xn=e.top,Nn(null,t,l)};let Gn=0==He.ori?Hn:Rn,Ln=1==He.ori?Hn:Rn;function In(e,t){if(null!=e){let t=e.idx;Ke.idx=t,re.forEach(((e,l)=>{(l>0||!it)&&On(l,t)}))}Ze&&Ke.live&&function(){if(Ze&&Ke.live)for(let e=2==v?1:0;re.length>e;e++){if(0==e&&it)continue;let t=Ke.values[e],l=0;for(let n in t)nt[e][l++].firstChild.nodeValue=t[n]}}(),Qt=!1,!1!==t&&ti("setLegend")}function On(e,t){let l;if(null==t)l=ot;else{let n=re[e],i=0==e&&2==Ge?jl:m[e];l=it?n.values(k,e,t):{_:n.value(k,i[t],e,t)}}Ke.values[e]=l}function Nn(e,t,l){let n;pn=gn,mn=xn,[gn,xn]=il.move(k,gn,xn),il.show&&(un&&T(un,le(gn),0,St,Dt),an&&T(an,0,le(xn),St,Dt)),An=ce;let i=0==He.ori?St:Dt,o=1==He.ori?St:Dt;if(0>gn||0==pl||ml>gl){n=null;for(let e=0;re.length>e;e++)e>0&&ul.length>1&&T(ul[e],-10,-10,St,Dt);if(sl&&Pn(null,Cn,!0,null==e&&li.setSeries),Ke.live){qe.fill(null),Qt=!0;for(let e=0;re.length>e;e++)Ke.values[e]=ot}}else{let e,t,l;1==v&&(e=0==He.ori?gn:xn,t=Fn(e,ve),n=G(t,m[0],ml,gl),l=be(Le(m[0][n],He,i,0),.5));for(let e=2==v?1:0;re.length>e;e++){let s=re[e],r=qe[e],u=1==v?m[e][r]:m[e][1][r],a=il.dataIdx(k,e,n,t),f=1==v?m[e][a]:m[e][1][a];Qt=Qt||f!=u||a!=r,qe[e]=a;let c=a==n?l:be(Le(1==v?m[0][a]:m[e][0][a],He,i,0),.5);if(e>0&&s.show){let t,l,n=null==f?-10:be(Ie(f,1==v?he[s.scale]:he[s.facets[1].scale],o,0),.5);if(n>0&&1==v){let t=ee(n-xn);t>An||(An=t,Wn=e)}if(0==He.ori?(t=c,l=n):(t=n,l=c),Qt&&ul.length>1){A(ul[e],il.points.fill(k,e),il.points.stroke(k,e));let n,i,o,s,r=!0,u=il.points.bbox;if(null!=u){r=!1;let t=u(k,e);o=t.left,s=t.top,n=t.width,i=t.height}else o=t,s=l,n=i=il.points.size(k,e);Y(ul[e],n,i,r),T(ul[e],o,s,St,Dt)}}if(Ke.live){if(!Qt||0==e&&it)continue;On(e,a)}}}if(il.idx=n,il.left=gn,il.top=xn,Qt&&(Ke.idx=n,In()),En.show&&vn)if(null!=e){let[t,l]=li.scales,[n,s]=li.match,[r,u]=e.cursor.sync.scales,a=e.cursor.drag;if(Mn=a._x,Sn=a._y,Mn||Sn){let a,f,c,h,d,{left:p,top:m,width:g,height:x}=e.select,w=e.scales[t].ori,_=e.posToVal,k=null!=t&&n(t,r),b=null!=l&&s(l,u);k&&Mn?(0==w?(a=p,f=g):(a=m,f=x),c=he[t],h=Le(_(a,r),c,i,0),d=Le(_(a+f,r),c,i,0),Gn(ie(h,d),ee(d-h))):Gn(0,i),b&&Sn?(1==w?(a=p,f=g):(a=m,f=x),c=he[l],h=Ie(_(a,u),c,o,0),d=Ie(_(a+f,u),c,o,0),Ln(ie(h,d),ee(d-h))):Ln(0,o)}else qn()}else{let e=ee(pn-fn),t=ee(mn-cn);if(1==He.ori){let l=e;e=t,t=l}Mn=yn.x&&e>=yn.dist,Sn=yn.y&&t>=yn.dist;let l,n,s=yn.uni;null!=s?Mn&&Sn&&(Mn=e>=s,Sn=t>=s,Mn||Sn||(t>e?Sn=!0:Mn=!0)):yn.x&&yn.y&&(Mn||Sn)&&(Mn=Sn=!0),Mn&&(0==He.ori?(l=hn,n=gn):(l=dn,n=xn),Gn(ie(l,n),ee(n-l)),Sn||Ln(0,o)),Sn&&(1==He.ori?(l=hn,n=gn):(l=dn,n=xn),Ln(ie(l,n),ee(n-l)),Mn||Gn(0,i)),Mn||Sn||(Gn(0,0),Ln(0,0))}if(yn._x=Mn,yn._y=Sn,null==e){if(l){if(null!=ni){let[e,t]=li.scales;li.values[0]=null!=e?Fn(0==He.ori?gn:xn,e):null,li.values[1]=null!=t?Fn(1==He.ori?gn:xn,t):null}oi(a,k,gn,xn,St,Dt,n)}if(sl){let e=l&&li.setSeries,t=ol.prox;null==Yn?An>t||Pn(Wn,Cn,!0,e):An>t?Pn(null,Cn,!0,e):Wn!=Yn&&Pn(Wn,Cn,!0,e)}}F&&!1!==t&&ti("setCursor")}k.setLegend=In;let jn=null;function Bn(e){!0===e?jn=null:(jn=K.getBoundingClientRect(),ti("syncRect",jn))}function Un(e,t,l,n,i,o){il._lock||(Vn(e,t,l,n,i,o,0,!1,null!=e),null!=e?Nn(null,!0,!0):Nn(t,!0,!1))}function Vn(e,t,l,n,i,o,s,r,u){if(null==jn&&Bn(!1),null!=e)l=e.clientX-jn.left,n=e.clientY-jn.top;else{if(0>l||0>n)return gn=-10,void(xn=-10);let[e,s]=li.scales,r=t.cursor.sync,[u,a]=r.values,[f,c]=r.scales,[h,d]=li.match,p=t.axes[0].side%2==1,m=0==He.ori?St:Dt,g=1==He.ori?St:Dt,x=p?o:i,w=p?i:o,_=p?n:l,k=p?l:n;if(l=null!=f?h(e,f)?C(u,he[e],m,0):-10:m*(_/x),n=null!=c?d(s,c)?C(a,he[s],g,0):-10:g*(k/w),1==He.ori){let e=l;l=n,n=e}}u&&(l>1&&St-1>l||(l=de(l,St)),n>1&&Dt-1>n||(n=de(n,Dt))),r?(fn=l,cn=n,[hn,dn]=il.move(k,l,n)):(gn=l,xn=n)}const Jn={width:0,height:0};function qn(){zn(Jn,!1)}function Kn(e,t,l,n,i,o){vn=!0,Mn=Sn=yn._x=yn._y=!1,Vn(e,t,l,n,i,o,0,!0,!1),null!=e&&(ft(c,w,Zn),oi(f,k,hn,dn,St,Dt,null))}function Zn(e,t,l,n,i,o){vn=yn._x=yn._y=!1,Vn(e,t,l,n,i,o,0,!1,!0);let{left:s,top:r,width:u,height:a}=En,f=u>0||a>0;if(f&&zn(En),yn.setScale&&f){let e=s,t=u,l=r,n=a;if(1==He.ori&&(e=r,t=a,l=s,n=u),Mn&&Tn(ve,Fn(e,ve),Fn(e+t,ve)),Sn)for(let e in he){let t=he[e];e!=ve&&null==t.from&&t.min!=ce&&Tn(e,Fn(l+n,e),Fn(l,e))}qn()}else il.lock&&(il._lock=!il._lock,il._lock||Nn(null,!0,!1));null!=e&&(_t(c,w),oi(c,k,gn,xn,St,Dt,null))}function $n(e){Vl(),qn(),null!=e&&oi(p,k,gn,xn,St,Dt,null)}function Xn(){ae.forEach(Il),tl(k.width,k.height,!0)}H(g,_,Xn);const Qn={};Qn.mousedown=Kn,Qn.mousemove=Un,Qn.mouseup=Zn,Qn.dblclick=$n,Qn.setSeries=(e,t,l,n)=>{Pn(l,n,!0,!1)},il.show&&(ft(f,K,Kn),ft(a,K,Un),ft(h,K,Bn),ft(d,K,(function(){if(!il._lock){let e=vn;if(vn){let e,t,l=!0,n=!0,i=10;0==He.ori?(e=Mn,t=Sn):(e=Sn,t=Mn),e&&t&&(l=i>=gn||gn>=St-i,n=i>=xn||xn>=Dt-i),e&&l&&(gn=hn>gn?0:St),t&&n&&(xn=dn>xn?0:Dt),Nn(null,!0,!0),vn=!1}gn=-10,xn=-10,Nn(null,!0,!0),e&&(vn=e)}})),ft(p,K,$n),Sl.add(k),k.syncRect=Bn);const ei=k.hooks=u.hooks||{};function ti(e,t,l){e in ei&&ei[e].forEach((e=>{e.call(null,k,t,l)}))}(u.plugins||[]).forEach((e=>{for(let t in e.hooks)ei[t]=(ei[t]||[]).concat(e.hooks[t])}));const li=Fe({key:null,setSeries:!1,filters:{pub:_e,sub:_e},scales:[ve,re[1]?re[1].scale:null],match:[ke,ke],values:[null,null]},il.sync);il.sync=li;const ni=li.key,ii=el(ni);function oi(e,t,l,n,i,o,s){li.filters.pub(e,t,l,n,i,o,s)&&ii.pub(e,t,l,n,i,o,s)}function si(){ti("init",u,m),Ul(m||u.data,!1),Oe[ve]?bn(ve,Oe[ve]):Vl(),tl(u.width,u.height),Nn(null,!0,!1),zn(En,!1)}return ii.sub(k),k.pub=function(e,t,l,n,i,o,s){li.filters.sub(e,t,l,n,i,o,s)&&Qn[e](null,t,l,n,i,o,s)},k.destroy=function(){ii.unsub(k),Sl.delete(k),at.clear(),R(g,_,Xn),L.remove(),ti("destroy")},re.forEach(al),ae.forEach((function(e,t){if(e._show=e.show,e.show){let l=e.side%2,n=he[e.scale];null==n&&(e.scale=l?re[1].scale:ve,n=he[e.scale]);let i=n.time;e.size=me(e.size),e.space=me(e.space),e.rotate=me(e.rotate),e.incrs=me(e.incrs||(2==n.distr?Xe:i?1==te?ct:pt:Qe)),e.splits=me(e.splits||(i&&1==n.distr?Be:3==n.distr?Rt:4==n.distr?Gt:Ht)),e.stroke=me(e.stroke),e.grid.stroke=me(e.grid.stroke),e.ticks.stroke=me(e.ticks.stroke),e.border.stroke=me(e.border.stroke);let o=e.values;e.values=Pe(o)&&!Pe(o[0])?me(o):i?Pe(o)?wt(Ne,xt(o,je)):Ae(o)?function(e,t){let l=Ve(t);return(t,n)=>n.map((t=>l(e(t))))}(Ne,o):o||Ue:o||Ft,e.filter=me(e.filter||(3>n.distr?xe:jt)),e.font=Ll(e.font),e.labelFont=Ll(e.labelFont),e._size=e.size(k,null,t,0),e._space=e._rotate=e._incrs=e._found=e._splits=e._values=null,e._size>0&&(fl[t]=!0,e._el=D("u-axis",U))}})),x?x instanceof HTMLElement?(x.appendChild(L),si()):x(k,si):si(),k}Ol.assign=Fe,Ol.fmtNum=$,Ol.rangeNum=J,Ol.rangeLog=N,Ol.rangeAsinh=j,Ol.orient=tl,Ol.pxRatio=b,Ol.join=function(e,t){let l=new Set;for(let t=0;e.length>t;t++){let n=e[t][0],i=n.length;for(let e=0;i>e;e++)l.add(n[e])}let n=[Array.from(l).sort(((e,t)=>e-t))],i=n[0].length,o=new Map;for(let e=0;i>e;e++)o.set(n[0][e],e);for(let l=0;e.length>l;l++){let s=e[l],r=s[0];for(let e=1;s.length>e;e++){let u=s[e],a=Array(i).fill(void 0),f=t?t[l][e]:1,c=[];for(let e=0;u.length>e;e++){let t=u[e],l=o.get(r[e]);null===t?0!=f&&(a[l]=t,2==f&&c.push(l)):a[l]=t}He(a,c,i),n.push(a)}}return n},Ol.fmtDate=Ve,Ol.tzDate=function(e,t){let l;return"UTC"==t||"Etc/UTC"==t?l=new Date(+e+6e4*e.getTimezoneOffset()):t==Je?l=e:(l=new Date(e.toLocaleString("en-US",{timeZone:t})),l.setMilliseconds(e.getMilliseconds())),l},Ol.sync=el;{Ol.addGap=function(e,t,l){let n=e[e.length-1];n&&n[0]==t?n[1]=l:e.push([t,l])},Ol.clipGaps=ol;let e=Ol.paths={points:_l};e.linear=yl,e.stepped=function(e){const t=q(e.align,1),l=q(e.ascDesc,!1),n=q(e.alignGaps,0);return(e,i,o,s)=>tl(e,i,((r,u,a,f,c,h,d,p,m,g,x)=>{let w=r.pxRound,_=e=>w(h(e,f,g,p)),k=e=>w(d(e,c,x,m)),v=0==f.ori?cl:hl;const y={stroke:new Path2D,fill:null,clip:null,band:null,gaps:null,flags:1},M=y.stroke,S=f.dir*(0==f.ori?1:-1);o=L(a,o,s,1),s=L(a,o,s,-1);let E=k(a[1==S?o:s]),D=_(u[1==S?o:s]),z=D;v(M,D,E);for(let e=1==S?o:s;e>=o&&s>=e;e+=S){let l=a[e];if(null==l)continue;let n=_(u[e]),i=k(l);1==t?v(M,n,E):v(M,z,i),v(M,n,i),E=i,z=n}let[T,P]=ll(e,i);if(null!=r.fill||0!=T){let t=y.fill=new Path2D(M),l=k(r.fillTo(e,i,r.min,r.max,T));v(t,z,l),v(t,D,l)}if(!r.spanGaps){let c=[];c.push(...sl(u,a,o,s,S,_,n));let h=r.width*b/2,d=l||1==t?h:-h,w=l||-1==t?-h:h;c.forEach((e=>{e[0]+=d,e[1]+=w})),y.gaps=c=r.gaps(e,i,o,s,c),y.clip=ol(c,f.ori,p,m,g,x)}return 0!=P&&(y.band=2==P?[il(e,i,o,s,M,-1),il(e,i,o,s,M,1)]:il(e,i,o,s,M,P)),y}))},e.bars=function(e){const t=q((e=e||De).size,[.6,ce,1]),l=e.align||0,n=(e.gap||0)*b,i=q(e.radius,0),o=1-t[0],s=q(t[1],ce)*b,r=q(t[2],1)*b,u=q(e.disp,De),a=q(e.each,(()=>{})),{fill:f,stroke:c}=u;return(e,t,h,d)=>tl(e,t,((p,m,g,x,w,_,k,v,y,M,S)=>{let E=p.pxRound;const D=x.dir*(0==x.ori?1:-1),z=w.dir*(1==w.ori?1:-1);let T,P,A=0==x.ori?dl:pl,W=0==x.ori?a:(e,t,l,n,i,o,s)=>{a(e,t,l,i,n,s,o)},[Y,C]=ll(e,t),F=3==w.distr?1==Y?w.max:w.min:0,H=k(F,w,S,y),R=E(p.width*b),G=!1,L=null,I=null,O=null,N=null;null==f||0!=R&&null==c||(G=!0,L=f.values(e,t,h,d),I=new Map,new Set(L).forEach((e=>{null!=e&&I.set(e,new Path2D)})),R>0&&(O=c.values(e,t,h,d),N=new Map,new Set(O).forEach((e=>{null!=e&&N.set(e,new Path2D)}))));let{x0:j,size:B}=u;if(null!=j&&null!=B){m=j.values(e,t,h,d),2==j.unit&&(m=m.map((t=>e.posToVal(v+t*M,x.key,!0))));let l=B.values(e,t,h,d);P=2==B.unit?l[0]*M:_(l[0],x,M,v)-_(0,x,M,v),P=E(P-R),T=1==D?-R/2:P+R/2}else{let e=M;if(m.length>1){let t=null;for(let l=0,n=1/0;m.length>l;l++)if(void 0!==g[l]){if(null!=t){let i=ee(m[l]-m[t]);n>i&&(n=i,e=ee(_(m[l],x,M,v)-_(m[t],x,M,v)))}t=l}}P=E(ie(s,oe(r,e-e*o))-R-n),T=(0==l?P/2:l==D?0:P)-l*D*n/2}const U={stroke:null,fill:null,clip:null,band:null,gaps:null,flags:3};let V;0!=C&&(U.band=new Path2D,V=E(k(1==C?w.max:w.min,w,S,y)));const J=G?null:new Path2D,K=U.band;let{y0:Z,y1:$}=u,X=null;null!=Z&&null!=$&&(g=$.values(e,t,h,d),X=Z.values(e,t,h,d));for(let l=1==D?h:d;l>=h&&d>=l;l+=D){let n=g[l],o=_(2!=x.distr||null!=u?m[l]:l,x,M,v),s=k(q(n,F),w,S,y);null!=X&&null!=n&&(H=k(X[l],w,S,y));let r=E(o-T),a=E(oe(s,H)),f=E(ie(s,H)),c=a-f,h=i*P;null!=n&&(G?(R>0&&null!=O[l]&&A(N.get(O[l]),r,f+te(R/2),P,oe(0,c-R),h),null!=L[l]&&A(I.get(L[l]),r,f+te(R/2),P,oe(0,c-R),h)):A(J,r,f+te(R/2),P,oe(0,c-R),h),W(e,t,l,r-R/2,f,P+R,c)),0!=C&&(z*C==1?(a=f,f=V):(f=a,a=V),c=a-f,A(K,r-R/2,f,P+R,oe(0,c),0))}return R>0&&(U.stroke=G?N:J),U.fill=G?I:J,U}))},e.spline=function(e){return function(e,t){const l=q(t?.alignGaps,0);return(t,n,i,o)=>tl(t,n,((s,r,u,a,f,c,h,d,p,m,g)=>{let x,w,_,k=s.pxRound,b=e=>k(c(e,a,m,d)),v=e=>k(h(e,f,g,p));0==a.ori?(x=al,_=cl,w=xl):(x=fl,_=hl,w=wl);const y=a.dir*(0==a.ori?1:-1);i=L(u,i,o,1),o=L(u,i,o,-1);let M=b(r[1==y?i:o]),S=M,E=[],D=[];for(let e=1==y?i:o;e>=i&&o>=e;e+=y)if(null!=u[e]){let t=b(r[e]);E.push(S=t),D.push(v(u[e]))}const z={stroke:e(E,D,x,_,w,k),fill:null,clip:null,band:null,gaps:null,flags:1},T=z.stroke;let[P,A]=ll(t,n);if(null!=s.fill||0!=P){let e=z.fill=new Path2D(T),l=v(s.fillTo(t,n,s.min,s.max,P));_(e,S,l),_(e,M,l)}if(!s.spanGaps){let e=[];e.push(...sl(r,u,i,o,y,b,l)),z.gaps=e=s.gaps(t,n,i,o,e),z.clip=ol(e,a.ori,d,p,m,g)}return 0!=A&&(z.band=2==A?[il(t,n,i,o,T,-1),il(t,n,i,o,T,1)]:il(t,n,i,o,T,A)),z}))}(Ml,e)}}return Ol}(); \ No newline at end of file
diff --git a/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.min.css b/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.min.css new file mode 100644 index 0000000..c54627de --- /dev/null +++ b/chrome/browser/resources/chromeos/network_ui/third_party/uPlot.min.css
@@ -0,0 +1 @@ +.uplot, .uplot *, .uplot *::before, .uplot *::after {box-sizing: border-box;}.uplot {font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";line-height: 1.5;width: min-content;}.u-title {text-align: center;font-size: 18px;font-weight: bold;}.u-wrap {position: relative;user-select: none;}.u-over, .u-under {position: absolute;}.u-under {overflow: hidden;}.uplot canvas {display: block;position: relative;width: 100%;height: 100%;}.u-axis {position: absolute;}.u-legend {font-size: 14px;margin: auto;text-align: center;}.u-inline {display: block;}.u-inline * {display: inline-block;}.u-inline tr {margin-right: 16px;}.u-legend th {font-weight: 600;}.u-legend th > * {vertical-align: middle;display: inline-block;}.u-legend .u-marker {width: 1em;height: 1em;margin-right: 4px;background-clip: padding-box !important;}.u-inline.u-live th::after {content: ":";vertical-align: middle;}.u-inline:not(.u-live) .u-value {display: none;}.u-series > * {padding: 4px;}.u-series th {cursor: pointer;}.u-legend .u-off > * {opacity: 0.3;}.u-select {background: rgba(0,0,0,0.07);position: absolute;pointer-events: none;}.u-cursor-x, .u-cursor-y {position: absolute;left: 0;top: 0;pointer-events: none;will-change: transform;z-index: 100;}.u-hz .u-cursor-x, .u-vt .u-cursor-y {height: 100%;border-right: 1px dashed #607D8B;}.u-hz .u-cursor-y, .u-vt .u-cursor-x {width: 100%;border-bottom: 1px dashed #607D8B;}.u-cursor-pt {position: absolute;top: 0;left: 0;border-radius: 50%;border: 0 solid;pointer-events: none;will-change: transform;z-index: 100;/*this has to be !important since we set inline "background" shorthand */background-clip: padding-box !important;}.u-axis.u-off, .u-select.u-off, .u-cursor-x.u-off, .u-cursor-y.u-off, .u-cursor-pt.u-off {display: none;} \ No newline at end of file
diff --git a/chrome/browser/resources/feed/feed.html b/chrome/browser/resources/feed/feed.html index 0702626..f489ce3 100644 --- a/chrome/browser/resources/feed/feed.html +++ b/chrome/browser/resources/feed/feed.html
@@ -4,17 +4,27 @@ <meta charset="utf-8"> <title>Feed Untrusted Frame</title> <meta name="viewport" content="width=device-width"> + <style> + html { + height: 100%; + overflow: hidden; + width: 100%; + } + body { + height: 100%; + margin: 0; + width: 100%; + } + #feed-frame { + border: 0; + height: 100%; + width: 100%; + } + </style> </head> <body> - <h1>Feed Untrusted Frame</h1> - <script type="module" src="$i18n{scriptUrl}"></script> - <div> - <button id="do-something" type="button">Do Something (via Mojo)</button> - <div> - <label>Mojo event: - <input type="text" readonly id="mojo-event"> - </label> - </div> - </div> + <iframe id="feed-frame" + src="$i18n{feedUrl}"> + </iframe> </body> </html> \ No newline at end of file
diff --git a/chrome/browser/resources/password_manager/BUILD.gn b/chrome/browser/resources/password_manager/BUILD.gn deleted file mode 100644 index 9926ada..0000000 --- a/chrome/browser/resources/password_manager/BUILD.gn +++ /dev/null
@@ -1,18 +0,0 @@ -# Copyright 2022 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//chrome/browser/resources/tools/build_webui.gni") - -build_webui("build") { - grd_prefix = "password_manager" - static_files = [ "password_manager.html" ] - web_component_files = [ "password_manager_app.ts" ] - non_web_component_files = [ "password_manager.ts" ] - - ts_deps = [ - "//third_party/polymer/v3_0:library", - "//ui/webui/resources:library", - "//ui/webui/resources/js/browser_command:build_ts", - ] -}
diff --git a/chrome/browser/resources/password_manager/password_manager.html b/chrome/browser/resources/password_manager/password_manager.html deleted file mode 100644 index 80cb9653..0000000 --- a/chrome/browser/resources/password_manager/password_manager.html +++ /dev/null
@@ -1,27 +0,0 @@ -<!doctype html> -<html dir="$i18n{textdirection}" lang="$i18n{language}"> -<head> - <meta charset="utf8"> - <title>$i18n{title}</title> - <link rel="stylesheet" href="chrome://resources/css/md_colors.css"> - <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> - - <style> - html { - background: var(--md-background-color); - height: 100%; - overflow: hidden; - } - - body { - height: 100%; - margin: 0; - } - </style> -</head> - -<body class="loading"> - <password-manager-app></password-manager-app> - <script type="module" src="password_manager.js"></script> -</body> -</html>
diff --git a/chrome/browser/resources/password_manager/password_manager.ts b/chrome/browser/resources/password_manager/password_manager.ts deleted file mode 100644 index 6eb53172..0000000 --- a/chrome/browser/resources/password_manager/password_manager.ts +++ /dev/null
@@ -1,7 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import './password_manager_app.js'; - -export {PasswordManagerAppElement} from './password_manager_app.js';
diff --git a/chrome/browser/resources/password_manager/password_manager_app.html b/chrome/browser/resources/password_manager/password_manager_app.html deleted file mode 100644 index 5fc32f02..0000000 --- a/chrome/browser/resources/password_manager/password_manager_app.html +++ /dev/null
@@ -1 +0,0 @@ -Password Manager page coming soon
diff --git a/chrome/browser/resources/password_manager/password_manager_app.ts b/chrome/browser/resources/password_manager/password_manager_app.ts deleted file mode 100644 index 4c91151..0000000 --- a/chrome/browser/resources/password_manager/password_manager_app.ts +++ /dev/null
@@ -1,18 +0,0 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './password_manager_app.html.js'; - -export class PasswordManagerAppElement extends PolymerElement { - static get is() { - return 'password-manager-app'; - } - - static get template() { - return getTemplate(); - } -} -customElements.define(PasswordManagerAppElement.is, PasswordManagerAppElement);
diff --git a/chrome/browser/resources/password_manager/tsconfig_base.json b/chrome/browser/resources/password_manager/tsconfig_base.json deleted file mode 100644 index de14880..0000000 --- a/chrome/browser/resources/password_manager/tsconfig_base.json +++ /dev/null
@@ -1,7 +0,0 @@ -{ - "extends": "../../../../tools/typescript/tsconfig_base.json", - "compilerOptions": { - "noUnusedLocals": false, - "strictPropertyInitialization": false - } -}
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.html b/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.html index d5613b31..8941117 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.html +++ b/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.html
@@ -1,4 +1,4 @@ -<style include="settings-shared"> +<style include="settings-shared md-select"> .flex { display: flex; } @@ -51,6 +51,19 @@ color: var(--cr-primary-text-color); } + .md-select { + --md-select-width: 100%; + margin-bottom: var(--cr-form-field-bottom-spacing); + margin-top: 2px; + /* Needed to avoid outline cropping */ + } + + paper-spinner-lite { + margin-bottom: auto; + margin-inline-end: 16px; + margin-top: auto; + } + @media (prefers-color-scheme: dark) { #tipBox { background: var(--google-grey-900); @@ -61,6 +74,18 @@ <cr-dialog id="dialog" close-text="$i18n{close}" show-on-attach> <div slot="title" id="title">$i18n{importPasswordsTitle}</div> <div slot="body"> + <select class="md-select" id="storePicker" + aria-description="$i18n{importPasswordsStorePickerA11yDescription}" + hidden="[[!shouldShowStorePicker_(isAccountStoreUser, dialogState)]]" + autofocus="[[shouldShowStorePicker_(isAccountStoreUser, + dialogState)]]"> + <option value="[[storeOptionEnum_.ACCOUNT]]"> + [[getStoreOptionAccountText_(accountEmail, dialogState)]] + </option> + <option value="[[storeOptionEnum_.DEVICE]]"> + $i18n{addPasswordStoreOptionDevice} + </option> + </select> <div class="flex"> <template is="dom-if" if="[[isState_(importDialogStateEnum_.SUCCESS, dialogState)]]"> @@ -68,6 +93,10 @@ </iron-icon> </template> <template is="dom-if" + if="[[isState_(importDialogStateEnum_.ALREADY_ACTIVE, dialogState)]]"> + <iron-icon id="infoIcon" icon="cr:info-outline"></iron-icon> + </template> + <template is="dom-if" if="[[isState_(importDialogStateEnum_.ERROR, dialogState)]]"> <iron-icon class="error-icon" icon="cr:warning"></iron-icon> </template> @@ -110,21 +139,25 @@ </div> </div> <div slot="button-container"> + <paper-spinner-lite active="[[inProgress_]]"> + </paper-spinner-lite> <template is="dom-if" if="[[isState_(importDialogStateEnum_.START, dialogState)]]"> - <cr-button id="cancel" class="cancel-button" on-click="onCancelClick_"> + <cr-button id="cancel" class="cancel-button" on-click="onCancelClick_" + disabled="[[inProgress_]]"> $i18n{cancel} </cr-button> </template> <template is="dom-if" if="[[isState_(importDialogStateEnum_.ERROR, dialogState)]]"> - <cr-button id="close" class="cancel-button" on-click="onCloseClick_"> + <cr-button id="close" class="cancel-button" on-click="onCloseClick_" + disabled="[[inProgress_]]"> $i18n{close} </cr-button> </template> <template is="dom-if" if="[[showChooseFileButton_(dialogState)]]"> <cr-button id="chooseFile" class="action-button" - on-click="onChooseFileClick_"> + on-click="onChooseFileClick_" disabled="[[inProgress_]]"> $i18n{importPasswordsChooseFile} </cr-button> </template> @@ -134,5 +167,11 @@ $i18n{done} </cr-button> </template> + <template is="dom-if" + if="[[isState_(importDialogStateEnum_.ALREADY_ACTIVE, dialogState)]]"> + <cr-button id="close" class="action-button" on-click="onCloseClick_"> + $i18n{close} + </cr-button> + </template> </div> </cr-dialog> \ No newline at end of file
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.ts b/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.ts index 6aa5ac2..e80c303 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.ts +++ b/chrome/browser/resources/settings/autofill_page/passwords_import_dialog.ts
@@ -9,7 +9,9 @@ import 'chrome://resources/cr_elements/cr_button/cr_button.m.js'; import 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; +import 'chrome://resources/cr_elements/md_select_css.m.js'; import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js'; +import 'chrome://resources/polymer/v3_0/paper-spinner/paper-spinner-lite.js'; import '../settings_shared.css.js'; import '../site_favicon.js'; @@ -26,6 +28,7 @@ $: { dialog: CrDialogElement, descriptionText: HTMLElement, + storePicker: HTMLSelectElement, }; } @@ -35,6 +38,12 @@ START, ERROR, SUCCESS, + ALREADY_ACTIVE, +} + +enum StoreOption { + ACCOUNT = 'account', + DEVICE = 'device', } export class PasswordsImportDialogElement extends @@ -57,21 +66,56 @@ readOnly: true, }, + storeOptionEnum_: { + type: Object, + value: StoreOption, + readOnly: true, + }, + descriptionText_: String, + inProgress_: { + type: Boolean, + value: false, + }, + results_: Object, }; } dialogState: ImportDialogState; + isUserSyncingPasswords: boolean; + isAccountStoreUser: boolean; + accountEmail: string; private results_: chrome.passwordsPrivate.ImportResults|null; + // Refers both to syncing users with sync enabled for passwords and account + // store users who choose to import passwords to their account. + private passwordsSavedToAccount_: boolean; private descriptionText_: string; + private inProgress_: boolean; private passwordManager_: PasswordManagerProxy = PasswordManagerImpl.getInstance(); override connectedCallback() { super.connectedCallback(); - this.descriptionText_ = this.i18n('importPasswordsGenericDescription'); + + if (this.isAccountStoreUser) { + this.descriptionText_ = this.i18n('importPasswordsGenericDescription'); + PasswordManagerImpl.getInstance().isAccountStoreDefault().then( + isAccountStoreDefault => { + this.passwordsSavedToAccount_ = isAccountStoreDefault; + this.$.storePicker.value = isAccountStoreDefault ? + StoreOption.ACCOUNT : + StoreOption.DEVICE; + }); + } else if (this.isUserSyncingPasswords) { + this.passwordsSavedToAccount_ = true; + this.descriptionText_ = + this.i18n('importPasswordsDescriptionAccount', this.accountEmail); + } else { + this.passwordsSavedToAccount_ = false; + this.descriptionText_ = this.i18n('importPasswordsDescriptionDevice'); + } this.dialogState = ImportDialogState.START; } @@ -95,12 +139,28 @@ !!this.results_!.failedImports.length; } + private shouldShowStorePicker_(): boolean { + return this.isState_(ImportDialogState.START) && this.isAccountStoreUser; + } + /** * Handler for clicking the 'chooseFile' button. It triggers import flow. */ private async onChooseFileClick_() { - this.results_ = await this.passwordManager_.importPasswords( - chrome.passwordsPrivate.PasswordStoreSet.DEVICE); + this.inProgress_ = true; + // For "non-account-store-users" users passwords are stored in the "profile" + // (DEVICE) store. + let destinationStore = chrome.passwordsPrivate.PasswordStoreSet.DEVICE; + if (this.isAccountStoreUser) { + this.passwordsSavedToAccount_ = + this.$.storePicker.value === StoreOption.ACCOUNT; + if (this.passwordsSavedToAccount_) { + destinationStore = chrome.passwordsPrivate.PasswordStoreSet.ACCOUNT; + } + } + this.results_ = + await this.passwordManager_.importPasswords(destinationStore); + this.inProgress_ = false; switch (this.results_.status) { case chrome.passwordsPrivate.ImportResultsStatus.SUCCESS: this.handleSuccess_(); @@ -117,6 +177,10 @@ case chrome.passwordsPrivate.ImportResultsStatus.DISMISSED: // Dialog state should not change if a system file picker was dismissed. return; + case chrome.passwordsPrivate.ImportResultsStatus.IMPORT_ALREADY_ACTIVE: + this.descriptionText_ = this.i18n('importPasswordsAlreadyActive'); + this.dialogState = ImportDialogState.ALREADY_ACTIVE; + break; default: assertNotReached(); } @@ -124,13 +188,25 @@ private async handleSuccess_() { assert(this.results_); - this.descriptionText_ = - await PluralStringProxyImpl.getInstance().getPluralString( - 'importPasswordsSuccessSummaryDevice', - this.results_.numberImported); + if (this.passwordsSavedToAccount_) { + const descriptionText = + await PluralStringProxyImpl.getInstance().getPluralString( + 'importPasswordsSuccessSummaryAccount', + this.results_.numberImported); + this.descriptionText_ = descriptionText.replace('$1', this.accountEmail); + } else { + this.descriptionText_ = + await PluralStringProxyImpl.getInstance().getPluralString( + 'importPasswordsSuccessSummaryDevice', + this.results_.numberImported); + } this.dialogState = ImportDialogState.SUCCESS; } + private getStoreOptionAccountText_(): string { + return this.i18n('addPasswordStoreOptionAccount', this.accountEmail!); + } + private getSuccessTip_(): string { return this.i18n('importPasswordsSuccessTip', this.results_!.fileName); } @@ -162,12 +238,12 @@ case chrome.passwordsPrivate.ImportEntryStatus.LONG_USERNAME: return this.i18n('importPasswordsLongUsername'); case chrome.passwordsPrivate.ImportEntryStatus.CONFLICT_PROFILE: - // TODO(crbug/1325290): for syncing users this should be "account - // conflict". + if (!this.isAccountStoreUser && this.isUserSyncingPasswords) { + return this.i18n('importPasswordsConflictAccount', this.accountEmail); + } return this.i18n('importPasswordsConflictDevice'); case chrome.passwordsPrivate.ImportEntryStatus.CONFLICT_ACCOUNT: - // TODO(crbug/1325290): fill with real data. - return this.i18n('importPasswordsConflictAccount', ''); + return this.i18n('importPasswordsConflictAccount', this.accountEmail); } assertNotReached(); }
diff --git a/chrome/browser/resources/settings/autofill_page/passwords_section.html b/chrome/browser/resources/settings/autofill_page/passwords_section.html index 079f911..5d4c571c 100644 --- a/chrome/browser/resources/settings/autofill_page/passwords_section.html +++ b/chrome/browser/resources/settings/autofill_page/passwords_section.html
@@ -298,6 +298,9 @@ </template> <template is="dom-if" if="[[showPasswordsImportDialog_]]" restamp> <passwords-import-dialog id="importPasswordsDialog" + account-email="[[profileEmail]]" + is-account-store-user="[[isAccountStoreUser]]" + is-user-syncing-passwords="[[isSyncingPasswords]]" on-close="onPasswordsImportDialogClosed_"> </passwords-import-dialog> </template>
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.html b/chrome/browser/resources/settings/chromeos/device_page/audio.html index b259044..cfbd03ea 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/audio.html +++ b/chrome/browser/resources/settings/chromeos/device_page/audio.html
@@ -95,7 +95,8 @@ disabled="[[isOutputVolumeSliderDisabled_( audioSystemProperties_.outputMuteState )]]" - value="[[audioSystemProperties_.outputVolumePercent]]"> + value="[[audioSystemProperties_.outputVolumePercent]]" + on-cr-slider-value-changed="onOutputVolumeSliderChanged_"> </cr-slider> <iron-icon id="audioOutputSliderVolumeUpIcon" icon="settings:volume-up">
diff --git a/chrome/browser/resources/settings/chromeos/device_page/audio.js b/chrome/browser/resources/settings/chromeos/device_page/audio.js index c4a6a62..93d9d580 100644 --- a/chrome/browser/resources/settings/chromeos/device_page/audio.js +++ b/chrome/browser/resources/settings/chromeos/device_page/audio.js
@@ -116,8 +116,15 @@ MuteState.kMutedByPolicy; } - // TODO(crbug.com/1092970): Create onCrSliderChanged_ method for setting - // output volume. + /** + * Handles the event where the output volume slider is being changed. + * @private + */ + onOutputVolumeSliderChanged_() { + const sliderValue = + this.shadowRoot.querySelector('#outputVolumeSlider').value; + this.crosAudioConfig_.setOutputVolumePercent(sliderValue); + } // TODO(crbug.com/1092970): Create onOutputMuteTap_ method for setting output // mute state.
diff --git a/chrome/browser/resources/support_tool/url_generator.html b/chrome/browser/resources/support_tool/url_generator.html index 907ca043..96bf4cd1 100644 --- a/chrome/browser/resources/support_tool/url_generator.html +++ b/chrome/browser/resources/support_tool/url_generator.html
@@ -38,8 +38,8 @@ </div> <div class="data-collector-list" aria-labelledby="data-sources-title"> <template is="dom-repeat" items="[[dataCollectors_]]"> - <cr-checkbox class="data-collector-checkbox" checked="{{item.isIncluded}}" - on-click="onDataCollectorItemClicked_" tabindex="0"> + <cr-checkbox class="data-collector-checkbox" checked="{{item.isIncluded}}" + on-change="onDataCollectorItemChange_" tabindex="0"> [[item.name]] </cr-checkbox> </template>
diff --git a/chrome/browser/resources/support_tool/url_generator.ts b/chrome/browser/resources/support_tool/url_generator.ts index d8bd180..8ec5fe0 100644 --- a/chrome/browser/resources/support_tool/url_generator.ts +++ b/chrome/browser/resources/support_tool/url_generator.ts
@@ -73,7 +73,7 @@ }); } - private onDataCollectorItemClicked_() { + private onDataCollectorItemChange_() { // The button should be disabled if no data collector is selected. this.buttonDisabled_ = !this.hasDataCollectorSelected(); }
diff --git a/chrome/browser/search_engines/chrome_template_url_service_client.cc b/chrome/browser/search_engines/chrome_template_url_service_client.cc index 8dbdcbb..b509f3b 100644 --- a/chrome/browser/search_engines/chrome_template_url_service_client.cc +++ b/chrome/browser/search_engines/chrome_template_url_service_client.cc
@@ -61,16 +61,15 @@ void ChromeTemplateURLServiceClient::OnURLVisited( history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { + const history::URLRow& url_row, + const history::VisitRow& new_visit) { DCHECK_EQ(history_service_, history_service); if (!owner_) return; TemplateURLService::URLVisitedDetails visited_details; - visited_details.url = row.url(); - visited_details.is_keyword_transition = - ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_KEYWORD); + visited_details.url = url_row.url(); + visited_details.is_keyword_transition = ui::PageTransitionCoreTypeIs( + new_visit.transition, ui::PAGE_TRANSITION_KEYWORD); owner_->OnHistoryURLVisited(visited_details); }
diff --git a/chrome/browser/search_engines/chrome_template_url_service_client.h b/chrome/browser/search_engines/chrome_template_url_service_client.h index 5646f65..1beda91 100644 --- a/chrome/browser/search_engines/chrome_template_url_service_client.h +++ b/chrome/browser/search_engines/chrome_template_url_service_client.h
@@ -37,9 +37,8 @@ // history::HistoryServiceObserver: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; private: raw_ptr<TemplateURLService> owner_;
diff --git a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc index 896e6a3..6fccba8 100644 --- a/chrome/browser/speech/extension_api/tts_engine_extension_api.cc +++ b/chrome/browser/speech/extension_api/tts_engine_extension_api.cc
@@ -411,23 +411,21 @@ EXTENSION_FUNCTION_VALIDATE(utterance_id_value.is_int()); int utterance_id = utterance_id_value.GetInt(); - const base::DictionaryValue* event; - EXTENSION_FUNCTION_VALIDATE(args()[1].GetAsDictionary(&event)); + EXTENSION_FUNCTION_VALIDATE(args()[1].is_dict()); + const base::Value::Dict& event = args()[1].GetDict(); - std::string event_type; - EXTENSION_FUNCTION_VALIDATE( - event->GetString(constants::kEventTypeKey, &event_type)); + const std::string* event_type = event.FindString(constants::kEventTypeKey); + EXTENSION_FUNCTION_VALIDATE(event_type); int char_index = 0; - const base::Value* char_index_value = - event->FindKey(constants::kCharIndexKey); + const base::Value* char_index_value = event.Find(constants::kCharIndexKey); if (char_index_value) { EXTENSION_FUNCTION_VALIDATE(char_index_value->is_int()); char_index = char_index_value->GetInt(); } int length = -1; - const base::Value* length_value = event->FindKey(constants::kLengthKey); + const base::Value* length_value = event.Find(constants::kLengthKey); if (length_value) { EXTENSION_FUNCTION_VALIDATE(length_value->is_int()); length = length_value->GetInt(); @@ -442,7 +440,7 @@ for (size_t i = 0; i < tts_voices->size(); i++) { const extensions::TtsVoice& voice = tts_voices->at(i); - if (voice.event_types.find(event_type) != voice.event_types.end()) { + if (voice.event_types.find(*event_type) != voice.event_types.end()) { event_type_allowed = true; break; } @@ -451,30 +449,31 @@ return RespondNow(Error(constants::kErrorUndeclaredEventType)); content::TtsController* controller = content::TtsController::GetInstance(); - if (event_type == constants::kEventTypeStart) { + if (*event_type == constants::kEventTypeStart) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_START, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeEnd) { + } else if (*event_type == constants::kEventTypeEnd) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_END, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeWord) { + } else if (*event_type == constants::kEventTypeWord) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_WORD, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeSentence) { + } else if (*event_type == constants::kEventTypeSentence) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_SENTENCE, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeMarker) { + } else if (*event_type == constants::kEventTypeMarker) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_MARKER, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeError) { - std::string error_message; - event->GetString(constants::kErrorMessageKey, &error_message); + } else if (*event_type == constants::kEventTypeError) { + const std::string* error_message = + event.FindString(constants::kErrorMessageKey); controller->OnTtsEvent(utterance_id, content::TTS_EVENT_ERROR, char_index, - length, error_message); - } else if (event_type == constants::kEventTypePause) { + length, + error_message != nullptr ? *error_message : ""); + } else if (*event_type == constants::kEventTypePause) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_PAUSE, char_index, length, std::string()); - } else if (event_type == constants::kEventTypeResume) { + } else if (*event_type == constants::kEventTypeResume) { controller->OnTtsEvent(utterance_id, content::TTS_EVENT_RESUME, char_index, length, std::string()); } else {
diff --git a/chrome/browser/speech/tts_controller_delegate_impl.cc b/chrome/browser/speech/tts_controller_delegate_impl.cc index 9810cd42..948ed02d 100644 --- a/chrome/browser/speech/tts_controller_delegate_impl.cc +++ b/chrome/browser/speech/tts_controller_delegate_impl.cc
@@ -29,12 +29,19 @@ if (!voice_id || voice_id->empty()) return absl::nullopt; - std::unique_ptr<base::DictionaryValue> json = - base::DictionaryValue::From(base::JSONReader::ReadDeprecated(*voice_id)); + absl::optional<base::Value> json = base::JSONReader::Read(*voice_id); std::string name; std::string id; - json->GetString("name", &name); - json->GetString("extension", &id); + if (json && json->is_dict()) { + const base::Value::Dict& dict = json->GetDict(); + const std::string* name_str = dict.FindString("name"); + if (name_str) + name = *name_str; + const std::string* id_str = dict.FindString("extension"); + if (id_str) + id = *id_str; + } + return absl::optional<content::TtsControllerDelegate::PreferredVoiceId>( {name, id}); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java index bdcb818..1d31dc6 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -96,7 +96,11 @@ public void onUpdateUrl(Tab tab, GURL url) {} @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) {} + public void onDidStartNavigationInPrimaryMainFrame(Tab tab, NavigationHandle navigationHandle) { + } + + @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) {} @Override public void onDidRedirectNavigation(Tab tab, NavigationHandle navigationHandle) {}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java index e64741d..102b1f2 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -208,12 +208,19 @@ // WebContentsObserver methods --------------------------------------------------------- /** - * Called when a navigation is started in the WebContents. + * Called when a navigation in the primary main frame is started in the WebContents. * @param tab The notifying {@link Tab}. * @param navigationHandle Pointer to a NavigationHandle representing the navigation. * Its lifetime end at the end of onDidFinishNavigation(). */ - void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle); + void onDidStartNavigationInPrimaryMainFrame(Tab tab, NavigationHandle navigationHandle); + + /** + * TODO(crbug.com/1337446) Remove when NotifyJavaSupriouslyToMeasurePerf experiment is finished. + * No-op, for measuring performance of calling didStartNavigation in only the primary main + * frame vs calling it in all frames. + */ + void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle); /** * Called when a navigation is redirected in the WebContents.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java index c97e2f5..d16e687 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/CouponPersistedTabData.java
@@ -399,8 +399,9 @@ registerIsTabSaveEnabledSupplier(mIsTabSaveEnabledSupplier); mUrlUpdatedObserver = new EmptyTabObserver() { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - if (!navigationHandle.isInPrimaryMainFrame() || navigationHandle.isSameDocument()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { + if (navigationHandle.isSameDocument()) { return; } // User is navigating to a different page - as detected by a change in URL @@ -408,6 +409,12 @@ resetCoupon(); } } + + @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + @Override public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) { String scheme = navigationHandle.getUrl().getScheme();
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java index 732b336..cf7bde8c 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java
@@ -354,8 +354,9 @@ // essentially can't persisted any price drops of the active Tab across restarts. mUrlUpdatedObserver = new EmptyTabObserver() { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigationHandle) { - if (!navigationHandle.isInPrimaryMainFrame() || navigationHandle.isSameDocument()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigationHandle) { + if (navigationHandle.isSameDocument()) { return; } // User is navigating to a different page - as detected by a change in URL @@ -363,6 +364,12 @@ resetPriceData(); } } + + @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + @Override public void onDidFinishNavigation(Tab tab, NavigationHandle navigationHandle) { if (!navigationHandle.isInPrimaryMainFrame() || navigationHandle.isSameDocument()
diff --git a/chrome/browser/thumbnail/generator/BUILD.gn b/chrome/browser/thumbnail/generator/BUILD.gn index bbd5506e..3fac07f 100644 --- a/chrome/browser/thumbnail/generator/BUILD.gn +++ b/chrome/browser/thumbnail/generator/BUILD.gn
@@ -34,8 +34,6 @@ if (is_android) { sources += [ - "android/local_media_data_source_factory.cc", - "android/local_media_data_source_factory.h", "android/stats.cc", "android/stats.h", "android/thumbnail_generator.cc",
diff --git a/chrome/browser/thumbnail/generator/android/thumbnail_media_parser_impl.cc b/chrome/browser/thumbnail/generator/android/thumbnail_media_parser_impl.cc index 90020780..8b2e7c0 100644 --- a/chrome/browser/thumbnail/generator/android/thumbnail_media_parser_impl.cc +++ b/chrome/browser/thumbnail/generator/android/thumbnail_media_parser_impl.cc
@@ -14,7 +14,7 @@ #include "base/task/task_traits.h" #include "base/task/thread_pool.h" #include "cc/paint/skia_paint_canvas.h" -#include "chrome/browser/thumbnail/generator/android/local_media_data_source_factory.h" +#include "chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.h" #include "content/public/browser/android/gpu_video_accelerator_factories_provider.h" #include "content/public/browser/media_service.h" #include "media/base/overlay_info.h"
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.cc b/chrome/browser/tracing/chrome_tracing_delegate.cc index 4ba6f3d..88dbb61 100644 --- a/chrome/browser/tracing/chrome_tracing_delegate.cc +++ b/chrome/browser/tracing/chrome_tracing_delegate.cc
@@ -267,8 +267,9 @@ #endif } -absl::optional<base::Value> ChromeTracingDelegate::GenerateMetadataDict() { - base::Value metadata_dict(base::Value::Type::DICTIONARY); +absl::optional<base::Value::Dict> +ChromeTracingDelegate::GenerateMetadataDict() { + base::Value::Dict metadata_dict; std::vector<std::string> variations; variations::GetFieldTrialActiveGroupIdsAsStrings(base::StringPiece(), &variations); @@ -277,7 +278,7 @@ for (const auto& it : variations) variations_list.Append(it); - metadata_dict.SetKey("field-trials", std::move(variations_list)); - metadata_dict.SetStringKey("revision", version_info::GetLastChange()); + metadata_dict.Set("field-trials", std::move(variations_list)); + metadata_dict.Set("revision", version_info::GetLastChange()); return metadata_dict; }
diff --git a/chrome/browser/tracing/chrome_tracing_delegate.h b/chrome/browser/tracing/chrome_tracing_delegate.h index 2b9730bd..28276fa 100644 --- a/chrome/browser/tracing/chrome_tracing_delegate.h +++ b/chrome/browser/tracing/chrome_tracing_delegate.h
@@ -53,7 +53,7 @@ bool IsSystemWideTracingEnabled() override; - absl::optional<base::Value> GenerateMetadataDict() override; + absl::optional<base::Value::Dict> GenerateMetadataDict() override; private: FRIEND_TEST_ALL_PREFIXES(ChromeTracingDelegateBrowserTest,
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index f4e4613..c16932d 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -522,6 +522,7 @@ "//components/password_manager/content/browser", "//components/password_manager/core/browser", "//components/password_manager/core/browser:affiliation", + "//components/password_manager/core/browser:import_results", "//components/password_manager/core/browser/import:csv", "//components/password_manager/core/browser/import:importer", "//components/password_manager/core/common", @@ -1572,8 +1573,6 @@ "webui/ntp/ntp_resource_cache_factory.h", "webui/page_not_available_for_guest/page_not_available_for_guest_ui.cc", "webui/page_not_available_for_guest/page_not_available_for_guest_ui.h", - "webui/password_manager/password_manager_ui.cc", - "webui/password_manager/password_manager_ui.h", "webui/plural_string_handler.cc", "webui/plural_string_handler.h", "webui/policy_indicator_localized_strings_provider.cc",
diff --git a/chrome/browser/ui/android/omnibox/BUILD.gn b/chrome/browser/ui/android/omnibox/BUILD.gn index 0814958..a50da745 100644 --- a/chrome/browser/ui/android/omnibox/BUILD.gn +++ b/chrome/browser/ui/android/omnibox/BUILD.gn
@@ -413,6 +413,7 @@ "java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SimpleVerticalLayoutViewTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionSpannableUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessorUnitTest.java", + "java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessorUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionSelectionManagerUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java", "java/src/org/chromium/chrome/browser/omnibox/suggestions/clipboard/ClipboardSuggestionProcessorUnitTest.java",
diff --git a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml index 33fc3fd..3bc8a814 100644 --- a/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml +++ b/chrome/browser/ui/android/omnibox/java/res/values/dimens.xml
@@ -44,7 +44,10 @@ <dimen name="omnibox_suggestion_header_margin_start"> @dimen/omnibox_suggestion_24dp_icon_margin_start </dimen> + <dimen name="omnibox_suggestion_header_margin_start_modern">20dp</dimen> + <dimen name="omnibox_suggestion_header_margin_top">12dp</dimen> <dimen name="omnibox_suggestion_header_height">48dp</dimen> + <dimen name="omnibox_suggestion_header_height_modern">36dp</dimen> <dimen name="omnibox_suggestion_semicompact_height">56dp</dimen> <dimen name="omnibox_suggestion_compact_height">48dp</dimen> <dimen name="omnibox_suggestion_semicompact_padding">8dp</dimen>
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java index d1db0db..209be6f 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
@@ -351,6 +351,13 @@ // become stale. Reset it. resetAnimationStatus(); } + + // If the icon's visibility changes while layout is pending, we can end up in a bad state + // due to a stale measurement cache. forceLayout() will invalidate the cache without + // bubbling the request to parent views. + if (isInLayout()) { + forceLayout(); + } } /**
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java index a1ecf49..2f0ac03 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListManager.java
@@ -11,7 +11,6 @@ import androidx.annotation.NonNull; -import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.components.omnibox.AutocompleteResult; @@ -179,7 +178,7 @@ * @param type The type of the suggestion. */ private boolean suggestionShouldHaveBackground(@OmniboxSuggestionUiType int type) { - return CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE) + return ChromeFeatureList.sOmniboxModernizeVisualUpdate.isEnabled() && (type == OmniboxSuggestionUiType.DEFAULT || type == OmniboxSuggestionUiType.EDIT_URL_SUGGESTION || type == OmniboxSuggestionUiType.ANSWER_SUGGESTION
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index f804949e..91e1ad9 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -30,7 +30,6 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.TimingMetric; import org.chromium.base.task.PostTask; -import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; @@ -195,8 +194,7 @@ }); final Resources resources = context.getResources(); - int paddingSide = - CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE) + int paddingSide = ChromeFeatureList.sOmniboxModernizeVisualUpdate.isEnabled() ? resources.getDimensionPixelOffset(R.dimen.omnibox_suggestion_list_padding_side) : 0; int paddingBottom =
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java index e4a31488..96c7f09e 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionViewProcessor.java
@@ -13,7 +13,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.MatchClassificationStyle; import org.chromium.chrome.browser.omnibox.R; @@ -75,8 +74,7 @@ @Override public void onNativeInitialized() { - mDropdownItemRoundingEnabled = - CachedFeatureFlags.isEnabled(ChromeFeatureList.OMNIBOX_MODERNIZE_VISUAL_UPDATE); + mDropdownItemRoundingEnabled = ChromeFeatureList.sOmniboxModernizeVisualUpdate.isEnabled(); } @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java index 55a84ad2b..5dd5de6 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessor.java
@@ -6,17 +6,26 @@ import android.content.Context; +import androidx.annotation.CallSuper; + +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionProcessor; +import org.chromium.components.omnibox.AutocompleteMatch; +import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.ui.modelutil.PropertyModel; /** The base processor implementation for the Carousel suggestions. */ public abstract class BaseCarouselSuggestionProcessor implements SuggestionProcessor { + private final Context mContext; private final int mCarouselViewDecorationHeightPx; + private boolean mEnableHorizontalFade; /** * @param context Current context. */ public BaseCarouselSuggestionProcessor(Context context) { + mContext = context; mCarouselViewDecorationHeightPx = context.getResources().getDimensionPixelSize( R.dimen.omnibox_suggestion_header_height); } @@ -37,8 +46,20 @@ @Override public void onUrlFocusChange(boolean hasFocus) {} + @CallSuper @Override - public void onNativeInitialized() {} + public void onNativeInitialized() { + mEnableHorizontalFade = ChromeFeatureList.isEnabled( + ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_FADING_ON_TABLET); + } + + @CallSuper + @Override + public void populateModel(AutocompleteMatch suggestion, PropertyModel model, int matchIndex) { + boolean isTablet = DeviceFormFactor.isNonMultiDisplayContextOnTablet(mContext); + model.set(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE, + isTablet && mEnableHorizontalFade); + } @Override public boolean allowBackgroundRounding() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessorUnitTest.java new file mode 100644 index 0000000..f4e5532 --- /dev/null +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionProcessorUnitTest.java
@@ -0,0 +1,96 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.omnibox.suggestions.carousel; + +import android.content.Context; + +import androidx.annotation.NonNull; + +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; +import org.robolectric.annotation.Config; + +import org.chromium.base.ContextUtils; +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; +import org.chromium.components.omnibox.AutocompleteMatch; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Tests for {@link BaseCarouselSuggestionProcessor}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(manifest = Config.NONE) +public class BaseCarouselSuggestionProcessorUnitTest { + public @Rule TestRule mFeatures = new Features.JUnitProcessor(); + + // Stores PropertyModel for the suggestion. + private PropertyModel mModel; + private BaseCarouselSuggestionProcessorTestClass mProcessor; + + /** + * Test class to instantiate BaseCarouselSuggestionProcessor class + */ + public class BaseCarouselSuggestionProcessorTestClass extends BaseCarouselSuggestionProcessor { + /** + * Constructs a new BaseCarouselSuggestionProcessor. + * + * @param context Current context. + */ + public BaseCarouselSuggestionProcessorTestClass(@NonNull Context context) { + super(context); + } + + @Override + public boolean doesProcessSuggestion(AutocompleteMatch suggestion, int matchIndex) { + return false; + } + + @Override + public int getViewTypeId() { + return 0; + } + + @Override + public PropertyModel createModel() { + return new PropertyModel(BaseCarouselSuggestionViewProperties.ALL_KEYS); + } + + @Override + public int getMinimumCarouselItemViewHeight() { + return 0; + } + } + + @Before + public void setUp() { + mProcessor = + new BaseCarouselSuggestionProcessorTestClass(ContextUtils.getApplicationContext()); + mModel = mProcessor.createModel(); + } + + @Test + @EnableFeatures({ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_FADING_ON_TABLET}) + public void testPopulateModelTest_notTablet() { + mProcessor.onNativeInitialized(); + mProcessor.populateModel(null, mModel, 0); + Assert.assertFalse(mModel.get(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE)); + } + + @Test + @Config(qualifiers = "w600dp-h820dp") + @EnableFeatures({ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_FADING_ON_TABLET}) + public void testPopulateModelTest_isTablet() { + mProcessor.onNativeInitialized(); + mProcessor.populateModel(null, mModel, 0); + Assert.assertTrue(mModel.get(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE)); + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionView.java index e7a466c..8b275ab 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionView.java
@@ -131,4 +131,13 @@ mItemSpacingPx = itemSpacingPx; mRecyclerView.requestLayout(); } + + /** + * Set the carousel to have horizontal fade effect. + * + * @param enableFade whether we should enable horizontal fade. + */ + public void setCarouselHorizontalFade(boolean enableFade) { + mRecyclerView.setHorizontalFadingEdgeEnabled(enableFade); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java index 8861ec5..65b0fd2 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java
@@ -52,6 +52,9 @@ } else if (key == SuggestionCommonProperties.DEVICE_FORM_FACTOR) { view.setItemSpacingPx(getItemSpacingPx( model.get(SuggestionCommonProperties.DEVICE_FORM_FACTOR), view.getResources())); + } else if (key == BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE) { + view.setCarouselHorizontalFade( + model.get(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE)); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java index 0f491d7..da28b61 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java
@@ -237,4 +237,13 @@ Assert.assertEquals(landscapePadding, BaseCarouselSuggestionViewBinder.getItemSpacingPx(FormFactor.TABLET, mResources)); } + + @Test + public void mView_setHorizontalFadingEdgeEnabled() { + mModel.set(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE, true); + verify(mView, times(1)).setCarouselHorizontalFade(true); + + mModel.set(BaseCarouselSuggestionViewProperties.HORIZONTAL_FADE, false); + verify(mView, times(1)).setCarouselHorizontalFade(false); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewProperties.java index 98e6a0d1..2618f3a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewProperties.java
@@ -26,8 +26,12 @@ /** Controls whether the Header should be shown. */ public static final WritableBooleanPropertyKey SHOW_TITLE = new WritableBooleanPropertyKey(); + /** Controls whether the carousel should have horizontal fade effect. */ + public static final WritableBooleanPropertyKey HORIZONTAL_FADE = + new WritableBooleanPropertyKey(); + public static final PropertyKey[] ALL_UNIQUE_KEYS = - new PropertyKey[] {TITLE, SHOW_TITLE, TILES}; + new PropertyKey[] {TITLE, SHOW_TITLE, TILES, HORIZONTAL_FADE}; public static final PropertyKey[] ALL_KEYS = PropertyModel.concatKeys(ALL_UNIQUE_KEYS, SuggestionCommonProperties.ALL_KEYS);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java index e0191bf..a8315b48 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderProcessor.java
@@ -23,6 +23,7 @@ private boolean mShouldRemoveSuggestionHeaderChevron; private boolean mAllowGroupCollapsedState; private boolean mShouldRemoveSuggestionHeaderCapitalization; + private boolean mUseUpdatedHeaderPadding; /** * @param context An Android context. @@ -62,6 +63,7 @@ model.set(HeaderViewProperties.SHOULD_REMOVE_CHEVRON, mShouldRemoveSuggestionHeaderChevron); model.set(HeaderViewProperties.SHOULD_REMOVE_CAPITALIZATION, mShouldRemoveSuggestionHeaderCapitalization); + model.set(HeaderViewProperties.USE_UPDATED_HEADER_PADDING, mUseUpdatedHeaderPadding); if (mAllowGroupCollapsedState) { model.set(HeaderViewProperties.DELEGATE, new HeaderViewProperties.Delegate() { @Override @@ -103,6 +105,9 @@ mShouldRemoveSuggestionHeaderCapitalization = ChromeFeatureList.isEnabled( ChromeFeatureList.OMNIBOX_REMOVE_SUGGESTION_HEADER_CAPITALIZATION); + + mUseUpdatedHeaderPadding = + ChromeFeatureList.isEnabled(ChromeFeatureList.OMNIBOX_HEADER_PADDING_UPDATE); } @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java index 523430d..ec7afb79 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderView.java
@@ -56,13 +56,8 @@ mHeaderText.setEllipsize(TruncateAt.END); TextViewCompat.setTextAppearance( mHeaderText, ChromeColors.getTextMediumThickSecondaryStyle(false)); - mHeaderText.setMinHeight(context.getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_header_height)); mHeaderText.setGravity(Gravity.CENTER_VERTICAL); mHeaderText.setTextAlignment(TextView.TEXT_ALIGNMENT_VIEW_START); - mHeaderText.setPaddingRelative(context.getResources().getDimensionPixelSize( - R.dimen.omnibox_suggestion_header_margin_start), - 0, 0, 0); addView(mHeaderText); mHeaderIcon = new AppCompatImageView(context); @@ -152,6 +147,16 @@ mHeaderText.setAllCaps(!shouldRemoveSuggestionHeaderCapitalization); } + /** + * Specifies the paddings for suggestion header. + * + * @param shouldUpdateHeaderPadding true, if suggestion header's padding should be updated. + */ + void setUpdateHeaderPadding(int minHeight, int paddingMarginStart, int paddingMarginTop) { + mHeaderText.setMinHeight(minHeight); + mHeaderText.setPaddingRelative(paddingMarginStart, paddingMarginTop, 0, 0); + } + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { boolean isRtl = getLayoutDirection() == LAYOUT_DIRECTION_RTL;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java index 4ff7976..bee5924 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinder.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.omnibox.suggestions.header; +import android.content.res.Resources; + import androidx.core.view.ViewCompat; import androidx.core.widget.TextViewCompat; @@ -51,6 +53,22 @@ } else if (propertyKey == HeaderViewProperties.SHOULD_REMOVE_CAPITALIZATION) { view.setShouldRemoveSuggestionHeaderCapitalization( model.get(HeaderViewProperties.SHOULD_REMOVE_CAPITALIZATION)); + } else if (propertyKey == HeaderViewProperties.USE_UPDATED_HEADER_PADDING) { + boolean useUpdatedHeaderPadding = + model.get(HeaderViewProperties.USE_UPDATED_HEADER_PADDING); + Resources res = view.getResources(); + + int minHeight = res.getDimensionPixelSize(useUpdatedHeaderPadding + ? R.dimen.omnibox_suggestion_header_height_modern + : R.dimen.omnibox_suggestion_header_height); + int paddingMarginStart = res.getDimensionPixelSize(useUpdatedHeaderPadding + ? R.dimen.omnibox_suggestion_header_margin_start_modern + : R.dimen.omnibox_suggestion_header_margin_start); + int paddingMarginTop = useUpdatedHeaderPadding + ? res.getDimensionPixelSize(R.dimen.omnibox_suggestion_header_margin_top) + : 0; + + view.setUpdateHeaderPadding(minHeight, paddingMarginStart, paddingMarginTop); } } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java index 45073579..aaecedfb 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewBinderUnitTest.java
@@ -13,7 +13,10 @@ import static org.mockito.Mockito.when; import android.app.Activity; +import android.content.Context; +import android.content.res.Resources; import android.os.Bundle; +import android.view.ContextThemeWrapper; import android.view.accessibility.AccessibilityNodeInfo; import android.view.accessibility.AccessibilityNodeInfo.AccessibilityAction; import android.widget.ImageView; @@ -30,6 +33,7 @@ import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import org.chromium.base.ContextUtils; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; import org.chromium.ui.base.TestActivity; @@ -47,6 +51,8 @@ Activity mActivity; PropertyModel mModel; + Context mContext; + Resources mResources; HeaderView mHeaderView; @Mock @@ -56,6 +62,10 @@ @Before public void setUp() { + mContext = new ContextThemeWrapper( + ContextUtils.getApplicationContext(), R.style.Theme_BrowserUI_DayNight); + mResources = mContext.getResources(); + MockitoAnnotations.initMocks(this); mActivityScenarioRule.getScenario().onActivity((activity) -> mActivity = activity); @@ -173,4 +183,32 @@ mModel.set(HeaderViewProperties.SHOULD_REMOVE_CAPITALIZATION, false); verify(mHeaderView, times(1)).setShouldRemoveSuggestionHeaderCapitalization(false); } + + @Test + public void headerView_updateHeaderPaddingTrue() { + // Update Header Padding. + mModel.set(HeaderViewProperties.USE_UPDATED_HEADER_PADDING, true); + + int minHeight = + mResources.getDimensionPixelSize(R.dimen.omnibox_suggestion_header_height_modern); + int paddingMarginStart = mResources.getDimensionPixelSize( + R.dimen.omnibox_suggestion_header_margin_start_modern); + int paddingMarginTop = + mResources.getDimensionPixelSize(R.dimen.omnibox_suggestion_header_margin_top); + verify(mHeaderView, times(1)) + .setUpdateHeaderPadding(minHeight, paddingMarginStart, paddingMarginTop); + } + + @Test + public void headerView_updateHeaderPaddingFalse() { + // Update Header Padding. + mModel.set(HeaderViewProperties.USE_UPDATED_HEADER_PADDING, false); + + int minHeight = mResources.getDimensionPixelSize(R.dimen.omnibox_suggestion_header_height); + int paddingMarginStart = + mResources.getDimensionPixelSize(R.dimen.omnibox_suggestion_header_margin_start); + int paddingMarginTop = 0; + verify(mHeaderView, times(1)) + .setUpdateHeaderPadding(minHeight, paddingMarginStart, paddingMarginTop); + } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java index 6021d04..f615af9c 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/header/HeaderViewProperties.java
@@ -34,9 +34,12 @@ /** The flag to state whether to remove the header chevron. */ public static final WritableBooleanPropertyKey SHOULD_REMOVE_CAPITALIZATION = new WritableBooleanPropertyKey(); + /** The flag to state whether to use the updated padding on suggestion header. */ + public static final WritableBooleanPropertyKey USE_UPDATED_HEADER_PADDING = + new WritableBooleanPropertyKey(); - public static final PropertyKey[] ALL_UNIQUE_KEYS = new PropertyKey[] { - DELEGATE, IS_COLLAPSED, TITLE, SHOULD_REMOVE_CHEVRON, SHOULD_REMOVE_CAPITALIZATION}; + public static final PropertyKey[] ALL_UNIQUE_KEYS = new PropertyKey[] {DELEGATE, IS_COLLAPSED, + TITLE, SHOULD_REMOVE_CHEVRON, SHOULD_REMOVE_CAPITALIZATION, USE_UPDATED_HEADER_PADDING}; public static final PropertyKey[] ALL_KEYS = PropertyModel.concatKeys(ALL_UNIQUE_KEYS, SuggestionCommonProperties.ALL_KEYS);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java index 0cad2ca..47c5a12 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessor.java
@@ -83,6 +83,8 @@ @Override public void onNativeInitialized() { + super.onNativeInitialized(); + mShouldWrapTitleText = ChromeFeatureList.isEnabled( ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND); mEnableOrganicRepeatableQueries = @@ -91,6 +93,8 @@ @Override public void populateModel(AutocompleteMatch suggestion, PropertyModel model, int matchIndex) { + super.populateModel(suggestion, model, matchIndex); + final List<AutocompleteMatch.SuggestTile> tiles = suggestion.getSuggestTiles(); final int tilesCount = tiles.size(); final List<ListItem> tileList = new ArrayList<>(tilesCount);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java index 4df1d1d..28f98bda 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java
@@ -69,7 +69,8 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) @EnableFeatures({ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND, - ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES}) + ChromeFeatureList.HISTORY_ORGANIC_REPEATABLE_QUERIES, + ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_FADING_ON_TABLET}) public final class MostVisitedTilesProcessorUnitTest { private static final GURL NAV_URL = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_1); private static final GURL NAV_URL_2 = JUnitTestGURLs.getGURL(JUnitTestGURLs.URL_2);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java index 8f55f1b..6e8dabd 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
@@ -42,8 +42,9 @@ mIsStartSurfaceEnabled = isStartSurfaceEnabled; mTabObserver = new CurrentTabObserver(tabSupplier, new EmptyTabObserver() { @Override - public void onDidStartNavigation(Tab tab, NavigationHandle navigation) { - if (navigation.isSameDocument() || !navigation.isInPrimaryMainFrame()) { + public void onDidStartNavigationInPrimaryMainFrame( + Tab tab, NavigationHandle navigation) { + if (navigation.isSameDocument()) { return; } @@ -58,6 +59,11 @@ } @Override + public void onDidStartNavigationNoop(Tab tab, NavigationHandle navigation) { + if (!navigation.isInPrimaryMainFrame()) return; + } + + @Override public void onLoadStopped(Tab tab, boolean toDifferentDocument) { if (!toDifferentDocument) return;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java index 7537c80..c0884fa 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediatorTest.java
@@ -87,7 +87,7 @@ NavigationHandle navigation = new NavigationHandle(0, URL_1, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals( CompletionState.UNFINISHED, mModel.get(LoadProgressProperties.COMPLETION_STATE)); assertEquals(LoadProgressMediator.MINIMUM_LOAD_PROGRESS, @@ -123,7 +123,7 @@ NavigationHandle navigation = new NavigationHandle(0, URL_1, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals( CompletionState.UNFINISHED, mModel.get(LoadProgressProperties.COMPLETION_STATE)); assertEquals(LoadProgressMediator.MINIMUM_LOAD_PROGRESS, @@ -143,14 +143,14 @@ NavigationHandle navigation = new NavigationHandle(0, URL_1, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals( CompletionState.UNFINISHED, mModel.get(LoadProgressProperties.COMPLETION_STATE)); assertEquals(0.1f, mModel.get(LoadProgressProperties.PROGRESS), MathUtils.EPSILON); navigation = new NavigationHandle(0, NATIVE_PAGE_URL, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals(CompletionState.FINISHED_DONT_ANIMATE, mModel.get(LoadProgressProperties.COMPLETION_STATE)); } @@ -162,7 +162,7 @@ NavigationHandle navigation = new NavigationHandle(0, URL_1, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals( CompletionState.UNFINISHED, mModel.get(LoadProgressProperties.COMPLETION_STATE)); assertEquals(LoadProgressMediator.MINIMUM_LOAD_PROGRESS, @@ -184,7 +184,7 @@ NavigationHandle navigation = new NavigationHandle(0, URL_1, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); assertEquals( CompletionState.UNFINISHED, mModel.get(LoadProgressProperties.COMPLETION_STATE)); assertEquals(LoadProgressMediator.MINIMUM_LOAD_PROGRESS, @@ -235,7 +235,7 @@ NavigationHandle navigation = new NavigationHandle(0, gurl, GURL.emptyGURL(), GURL.emptyGURL(), true, false, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, navigation); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, navigation); mTabObserver.onLoadProgressChanged(mTab, 1.0f); assertEquals(1.0f, mModel.get(LoadProgressProperties.PROGRESS), MathUtils.EPSILON); assertEquals(CompletionState.FINISHED_DO_ANIMATE, @@ -243,7 +243,7 @@ NavigationHandle sameDocNav = new NavigationHandle(0, gurl, GURL.emptyGURL(), GURL.emptyGURL(), true, true, false, null, 0, false, false, false, false, 0, false, false); - mTabObserver.onDidStartNavigation(mTab, sameDocNav); + mTabObserver.onDidStartNavigationInPrimaryMainFrame(mTab, sameDocNav); assertEquals(1.0f, mModel.get(LoadProgressProperties.PROGRESS), MathUtils.EPSILON); assertEquals(CompletionState.FINISHED_DO_ANIMATE,
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc index 26a215f..a988c9c 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc +++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.cc
@@ -8,7 +8,6 @@ #include "ash/public/cpp/app_list/app_list_types.h" #include "ash/public/cpp/app_menu_constants.h" #include "ash/public/cpp/new_window_delegate.h" -#include "ash/strings/grit/ash_strings.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -25,7 +24,6 @@ #include "chrome/browser/ash/plugin_vm/plugin_vm_util.h" #include "chrome/browser/extensions/context_menu_matcher.h" #include "chrome/browser/extensions/menu_manager.h" -#include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/app_list/app_context_menu_delegate.h" #include "chrome/browser/ui/app_list/app_list_controller_delegate.h" @@ -38,7 +36,6 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/webui/settings/ash/app_management/app_management_uma.h" #include "chrome/grit/generated_resources.h" -#include "chromeos/ui/base/tablet_state.h" #include "components/app_constants/constants.h" #include "components/services/app_service/public/cpp/types_util.h" #include "content/public/browser/browser_task_traits.h" @@ -58,27 +55,6 @@ model_updater->RequestAppListSort(order); } -bool MenuItemHasLauncherContext(const extensions::MenuItem* item) { - return item->contexts().Contains(extensions::MenuItem::LAUNCHER); -} - -apps::WindowMode ConvertUseLaunchTypeCommandToWindowMode(int command_id) { - DCHECK(command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && - command_id < ash::USE_LAUNCH_TYPE_COMMAND_END); - switch (command_id) { - case ash::USE_LAUNCH_TYPE_REGULAR: - return apps::WindowMode::kBrowser; - case ash::USE_LAUNCH_TYPE_WINDOW: - return apps::WindowMode::kWindow; - case ash::USE_LAUNCH_TYPE_TABBED_WINDOW: - return apps::WindowMode::kTabbedWindow; - case ash::USE_LAUNCH_TYPE_PINNED: - case ash::USE_LAUNCH_TYPE_FULLSCREEN: - default: - return apps::WindowMode::kUnknown; - } -} - void CreateNewWindow(bool incognito, bool post_task) { if (post_task) { content::GetUIThreadTaskRunner({})->PostTask( @@ -256,6 +232,9 @@ default: if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) { + launch_new_string_id_ = + apps::StringIdForUseLaunchTypeCommand(command_id); + if (app_type_ == apps::AppType::kWeb && command_id == ash::USE_LAUNCH_TYPE_TABBED_WINDOW) { proxy_->SetWindowMode(app_id(), @@ -284,6 +263,25 @@ } } +ui::ImageModel AppServiceContextMenu::GetIconForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + const gfx::VectorIcon& icon = + GetMenuItemVectorIcon(command_id, launch_new_string_id_); + return ui::ImageModel::FromVectorIcon( + icon, apps::GetColorIdForMenuItemIcon(), ash::kAppContextMenuIconSize); + } + return AppContextMenu::GetIconForCommandId(command_id); +} + +std::u16string AppServiceContextMenu::GetLabelForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + return l10n_util::GetStringUTF16(launch_new_string_id_); + } + return AppContextMenu::GetLabelForCommandId(command_id); +} + bool AppServiceContextMenu::IsCommandIdChecked(int command_id) const { // StandaloneBrowserExtension handles its own context menus. Forward to that // class. @@ -303,17 +301,15 @@ }); return user_window_mode != apps::WindowMode::kUnknown && user_window_mode == - ConvertUseLaunchTypeCommandToWindowMode(command_id); + apps::ConvertLaunchTypeCommandToWindowMode(command_id); } return AppContextMenu::IsCommandIdChecked(command_id); case apps::AppType::kChromeApp: if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) { - return static_cast<int>( - controller()->GetExtensionLaunchType(profile(), app_id())) + - ash::USE_LAUNCH_TYPE_COMMAND_START == - command_id; + return controller()->GetExtensionLaunchType(profile(), app_id()) == + apps::ConvertLaunchTypeCommandToExtensionLaunchType(command_id); } else if (extensions::ContextMenuMatcher::IsExtensionsCustomCommandId( command_id)) { return extension_menu_items_->IsCommandIdChecked(command_id); @@ -349,15 +345,21 @@ return AppContextMenu::IsCommandIdEnabled(command_id); } +bool AppServiceContextMenu::IsItemForCommandIdDynamic(int command_id) const { + return command_id == ash::LAUNCH_NEW || + AppContextMenu::IsItemForCommandIdDynamic(command_id); +} + void AppServiceContextMenu::OnGetMenuModel( GetMenuModelCallback callback, apps::mojom::MenuItemsPtr menu_items) { auto menu_model = std::make_unique<ui::SimpleMenuModel>(this); submenu_ = std::make_unique<ui::SimpleMenuModel>(this); size_t index = 0; - if (apps::PopulateNewItemFromMojoMenuItems( - menu_items->items, menu_model.get(), submenu_.get(), - base::BindOnce(&AppServiceContextMenu::GetMenuItemVectorIcon))) { + + if (apps::PopulateNewItemFromMojoMenuItems(menu_items->items, + menu_model.get(), submenu_.get(), + &launch_new_string_id_)) { index = 1; } @@ -432,7 +434,7 @@ ui::SimpleMenuModel* menu_model) { extension_menu_items_ = std::make_unique<extensions::ContextMenuMatcher>( profile(), this, menu_model, - base::BindRepeating(MenuItemHasLauncherContext)); + base::BindRepeating(apps::MenuItemHasLauncherContext)); // Assign unique IDs to commands added by the app itself. int index = ash::USE_LAUNCH_TYPE_COMMAND_END; @@ -464,7 +466,7 @@ // Web apps and standalone browser hosted apps can only toggle between // kWindow and kBrowser. apps::WindowMode user_window_mode = - ConvertUseLaunchTypeCommandToWindowMode(command_id); + apps::ConvertLaunchTypeCommandToWindowMode(command_id); if (user_window_mode != apps::WindowMode::kUnknown) { proxy_->SetWindowMode( app_id(),
diff --git a/chrome/browser/ui/app_list/app_service/app_service_context_menu.h b/chrome/browser/ui/app_list/app_service/app_service_context_menu.h index dc351f0..745daccf 100644 --- a/chrome/browser/ui/app_list/app_service/app_service_context_menu.h +++ b/chrome/browser/ui/app_list/app_service/app_service_context_menu.h
@@ -45,8 +45,11 @@ // AppContextMenu overrides: void GetMenuModel(GetMenuModelCallback callback) override; void ExecuteCommand(int command_id, int event_flags) override; + ui::ImageModel GetIconForCommandId(int command_id) const override; + std::u16string GetLabelForCommandId(int command_id) const override; bool IsCommandIdChecked(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; + bool IsItemForCommandIdDynamic(int command_id) const override; private: void OnGetMenuModel(GetMenuModelCallback callback, @@ -86,6 +89,11 @@ // Where this item is being shown (e.g. the apps grid or recent apps). const ash::AppListItemContext item_context_; + // String id for the `LAUNCH_NEW` command / menu item tracked so the menu icon + // and label can be changed dynamically after the app launch type changes + // using the launch new item submenu. + int launch_new_string_id_ = 0; + base::WeakPtrFactory<AppServiceContextMenu> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc index 8ec5dd1..79b7079 100644 --- a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc +++ b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc
@@ -313,9 +313,6 @@ views::Button* template_item = ash::GetTemplateItemButton(/*index=*/0); DCHECK(template_item); ClickButton(template_item); - - // We need to wait for the template to be fetched from the model. - ash::WaitForDesksTemplatesUI(); } const std::vector<const ash::DeskTemplate*> GetAllEntries() {
diff --git a/chrome/browser/ui/ash/login_screen_client_impl.cc b/chrome/browser/ui/ash/login_screen_client_impl.cc index 05edbaf..f204e63 100644 --- a/chrome/browser/ui/ash/login_screen_client_impl.cc +++ b/chrome/browser/ui/ash/login_screen_client_impl.cc
@@ -361,21 +361,20 @@ std::vector<ash::InputMethodItem> result; for (const auto& i : keyboard_layouts->GetList()) { - const base::DictionaryValue* dictionary; - if (!i.GetAsDictionary(&dictionary)) + if (!i.is_dict()) continue; + const base::Value::Dict& dict = i.GetDict(); ash::InputMethodItem input_method_item; - std::string ime_id; - dictionary->GetString("value", &ime_id); - input_method_item.ime_id = ime_id; + const std::string* ime_id = dict.FindString("value"); + if (ime_id) + input_method_item.ime_id = *ime_id; - std::string title; - dictionary->GetString("title", &title); - input_method_item.title = title; + const std::string* title = dict.FindString("title"); + if (title) + input_method_item.title = *title; - input_method_item.selected = - dictionary->FindBoolKey("selected").value_or(false); + input_method_item.selected = dict.FindBool("selected").value_or(false); result.push_back(std::move(input_method_item)); } ash::LoginScreen::Get()->GetModel()->SetPublicSessionKeyboardLayouts(
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.cc b/chrome/browser/ui/ash/projector/projector_client_impl.cc index 72400cd..8a18560b 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_client_impl.cc
@@ -6,6 +6,7 @@ #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" +#include "ash/projector/projector_metrics.h" #include "ash/public/cpp/projector/annotator_tool.h" #include "ash/public/cpp/projector/projector_controller.h" #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" @@ -246,10 +247,11 @@ // TODO(b/240497023): convert to dcheck once confirm that the pointer is // always available at this point. if (!swa_manager) { + RecordPolicyChangeHandlingError( + ash::ProjectorPolicyChangeHandlingError::kSwaManager); return; } const bool is_installed = - swa_manager && swa_manager->IsSystemWebApp(ash::kChromeUITrustedProjectorSwaAppId); // We can't enable or disable the app if it's not already installed. if (!is_installed) @@ -266,6 +268,8 @@ // TODO(b/240497023): convert to dcheck once confirm that the pointer is // always available at this point. if (!web_app_provider) { + RecordPolicyChangeHandlingError( + ash::ProjectorPolicyChangeHandlingError::kWebAppProvider); return; } web_app_provider->on_registry_ready().Post( @@ -280,10 +284,18 @@ // TODO(b/240497023): convert to dcheck once confirm that the pointer is // always available at this point. if (!web_app_provider) { + RecordPolicyChangeHandlingError(ash::ProjectorPolicyChangeHandlingError:: + kWebAppProviderOnRegistryReady); return; } auto* sync_bridge = &web_app_provider->sync_bridge(); - DCHECK(sync_bridge); + // TODO(b/240497023): convert to dcheck once confirm that the pointer is + // always available at this point. + if (!sync_bridge) { + RecordPolicyChangeHandlingError( + ash::ProjectorPolicyChangeHandlingError::kSyncBridge); + return; + } sync_bridge->SetAppIsDisabled(ash::kChromeUITrustedProjectorSwaAppId, disabled);
diff --git a/chrome/browser/ui/ash/projector/projector_client_impl.h b/chrome/browser/ui/ash/projector/projector_client_impl.h index 19c8b7c..63169908 100644 --- a/chrome/browser/ui/ash/projector/projector_client_impl.h +++ b/chrome/browser/ui/ash/projector/projector_client_impl.h
@@ -18,8 +18,6 @@ #include "components/prefs/pref_change_registrar.h" #include "components/session_manager/core/session_manager.h" #include "components/session_manager/core/session_manager_observer.h" -#include "components/soda/constants.h" -#include "components/soda/soda_installer.h" namespace views { class WebView;
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc index fd3982b0..2e297a7 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.cc
@@ -9,13 +9,10 @@ #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" -#include "base/strings/string_util.h" #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" -#include "chrome/browser/apps/app_service/extension_apps_utils.h" #include "chrome/browser/apps/app_service/menu_util.h" #include "chrome/browser/ash/app_restore/full_restore_service.h" -#include "chrome/browser/ash/arc/app_shortcuts/arc_app_shortcuts_menu_builder.h" #include "chrome/browser/ash/borealis/borealis_window_manager.h" #include "chrome/browser/ash/crosapi/browser_manager.h" #include "chrome/browser/ash/crostini/crostini_manager.h" @@ -30,16 +27,12 @@ #include "chrome/browser/extensions/context_menu_matcher.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/extensions/menu_manager.h" -#include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/app_list/app_context_menu_delegate.h" -#include "chrome/browser/ui/app_list/app_list_controller_delegate.h" #include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h" #include "chrome/browser/ui/app_list/extension_app_utils.h" #include "chrome/browser/ui/ash/shelf/arc_app_shelf_id.h" #include "chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.h" #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h" -#include "chrome/browser/ui/browser_commands.h" #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/views/crostini/crostini_app_restart_dialog.h" #include "chrome/browser/ui/webui/settings/ash/app_management/app_management_uma.h" @@ -47,44 +40,12 @@ #include "components/app_constants/constants.h" #include "content/public/browser/context_menu_params.h" #include "extensions/browser/extension_prefs.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/display/scoped_display_for_new_windows.h" #include "ui/gfx/vector_icon_types.h" namespace { -bool MenuItemHasLauncherContext(const extensions::MenuItem* item) { - return item->contexts().Contains(extensions::MenuItem::LAUNCHER); -} - -apps::WindowMode ConvertLaunchTypeCommandToWindowMode(int command_id) { - switch (command_id) { - case ash::USE_LAUNCH_TYPE_REGULAR: - return apps::WindowMode::kBrowser; - case ash::USE_LAUNCH_TYPE_WINDOW: - return apps::WindowMode::kWindow; - case ash::USE_LAUNCH_TYPE_TABBED_WINDOW: - return apps::WindowMode::kTabbedWindow; - default: - return apps::WindowMode::kUnknown; - } -} - -extensions::LaunchType ConvertLaunchTypeCommandToExtensionLaunchType( - int command_id) { - switch (command_id) { - case ash::USE_LAUNCH_TYPE_PINNED: - return extensions::LAUNCH_TYPE_PINNED; - case ash::USE_LAUNCH_TYPE_REGULAR: - return extensions::LAUNCH_TYPE_REGULAR; - case ash::USE_LAUNCH_TYPE_WINDOW: - return extensions::LAUNCH_TYPE_WINDOW; - case ash::USE_LAUNCH_TYPE_FULLSCREEN: - return extensions::LAUNCH_TYPE_FULLSCREEN; - default: - return extensions::LAUNCH_TYPE_INVALID; - } -} - std::string GetAppId(const ash::ShelfID& shelf_id) { // Remove the ARC shelf group prefix. const arc::ArcAppShelfId arc_shelf_id = @@ -191,6 +152,7 @@ case ash::USE_LAUNCH_TYPE_WINDOW: [[fallthrough]]; case ash::USE_LAUNCH_TYPE_FULLSCREEN: + launch_new_string_id_ = apps::StringIdForUseLaunchTypeCommand(command_id); SetLaunchType(command_id); break; @@ -232,6 +194,25 @@ } } +ui::ImageModel AppServiceShelfContextMenu::GetIconForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + const gfx::VectorIcon& icon = + GetCommandIdVectorIcon(command_id, launch_new_string_id_); + return ui::ImageModel::FromVectorIcon( + icon, apps::GetColorIdForMenuItemIcon(), ash::kAppContextMenuIconSize); + } + return ShelfContextMenu::GetIconForCommandId(command_id); +} + +std::u16string AppServiceShelfContextMenu::GetLabelForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + return l10n_util::GetStringUTF16(launch_new_string_id_); + } + return ShelfContextMenu::GetLabelForCommandId(command_id); +} + bool AppServiceShelfContextMenu::IsCommandIdChecked(int command_id) const { switch (app_type_) { case apps::AppType::kStandaloneBrowserChromeApp: @@ -248,7 +229,7 @@ }); return user_window_mode != apps::WindowMode::kUnknown && user_window_mode == - ConvertLaunchTypeCommandToWindowMode(command_id); + apps::ConvertLaunchTypeCommandToWindowMode(command_id); } return ShelfContextMenu::IsCommandIdChecked(command_id); } @@ -256,7 +237,7 @@ if (command_id >= ash::USE_LAUNCH_TYPE_COMMAND_START && command_id < ash::USE_LAUNCH_TYPE_COMMAND_END) { return GetExtensionLaunchType() == - ConvertLaunchTypeCommandToExtensionLaunchType(command_id); + apps::ConvertLaunchTypeCommandToExtensionLaunchType(command_id); } else if (command_id < ash::COMMAND_ID_COUNT) { return ShelfContextMenu::IsCommandIdChecked(command_id); } else { @@ -288,18 +269,22 @@ return true; } +bool AppServiceShelfContextMenu::IsItemForCommandIdDynamic( + int command_id) const { + return command_id == ash::LAUNCH_NEW || + ShelfContextMenu::IsItemForCommandIdDynamic(command_id); +} + void AppServiceShelfContextMenu::OnGetMenuModel( GetMenuModelCallback callback, apps::mojom::MenuItemsPtr menu_items) { auto menu_model = GetBaseMenuModel(); submenu_ = std::make_unique<ui::SimpleMenuModel>(this); size_t index = 0; - // Unretained is safe here because PopulateNewItemFromMojoMenuItems should - // call GetVectorIcon synchronously. - if (apps::PopulateNewItemFromMojoMenuItems( - menu_items->items, menu_model.get(), submenu_.get(), - base::BindOnce(&AppServiceShelfContextMenu::GetCommandIdVectorIcon, - base::Unretained(this)))) { + + if (apps::PopulateNewItemFromMojoMenuItems(menu_items->items, + menu_model.get(), submenu_.get(), + &launch_new_string_id_)) { ++index; } @@ -378,7 +363,7 @@ ui::SimpleMenuModel* menu_model) { extension_menu_items_ = std::make_unique<extensions::ContextMenuMatcher>( controller()->profile(), this, menu_model, - base::BindRepeating(MenuItemHasLauncherContext)); + base::BindRepeating(apps::MenuItemHasLauncherContext)); int index = 0; extension_menu_items_->AppendExtensionItems( @@ -490,7 +475,7 @@ case apps::AppType::kSystemWeb: { // Web apps can only toggle between kWindow, kTabbed and kBrowser. apps::WindowMode user_window_mode = - ConvertLaunchTypeCommandToWindowMode(command_id); + apps::ConvertLaunchTypeCommandToWindowMode(command_id); if (user_window_mode != apps::WindowMode::kUnknown) { apps::AppServiceProxyFactory::GetForProfile(controller()->profile()) ->SetWindowMode(
diff --git a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.h b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.h index c2e4ba3..1d96b393 100644 --- a/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.h +++ b/chrome/browser/ui/ash/shelf/app_service/app_service_shelf_context_menu.h
@@ -35,8 +35,11 @@ // ShelfContextMenu: void GetMenuModel(GetMenuModelCallback callback) override; void ExecuteCommand(int command_id, int event_flags) override; + ui::ImageModel GetIconForCommandId(int command_id) const override; + std::u16string GetLabelForCommandId(int command_id) const override; bool IsCommandIdChecked(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; + bool IsItemForCommandIdDynamic(int command_id) const override; private: void OnGetMenuModel(GetMenuModelCallback callback, @@ -89,6 +92,11 @@ std::unique_ptr<extensions::ContextMenuMatcher> extension_menu_items_; + // String id for the `LAUNCH_NEW` command / menu item tracked so the menu icon + // and label can be changed dynamically after the app launch type changes + // using the launch new item submenu. + int launch_new_string_id_ = 0; + base::WeakPtrFactory<AppServiceShelfContextMenu> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc index c7c41a6..9c032441 100644 --- a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc +++ b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.cc
@@ -9,8 +9,8 @@ #include "ash/public/cpp/app_menu_constants.h" #include "ash/public/cpp/new_window_delegate.h" #include "base/bind.h" +#include "chrome/browser/apps/app_service/menu_util.h" #include "chrome/browser/extensions/context_menu_matcher.h" -#include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/launch_util.h" #include "chrome/browser/prefs/incognito_mode_prefs.h" #include "chrome/browser/profiles/profile.h" @@ -18,27 +18,15 @@ #include "chrome/browser/ui/ash/shelf/browser_shortcut_shelf_item_controller.h" #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller.h" #include "chrome/browser/ui/ash/shelf/chrome_shelf_controller_util.h" -#include "chrome/browser/ui/browser_commands.h" -#include "chrome/common/extensions/extension_constants.h" #include "chrome/grit/chromium_strings.h" #include "chrome/grit/generated_resources.h" #include "components/app_constants/constants.h" #include "content/public/browser/context_menu_params.h" #include "extensions/browser/extension_prefs.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/base/models/image_model.h" #include "ui/color/color_id.h" #include "ui/display/scoped_display_for_new_windows.h" -#include "ui/display/screen.h" -#include "ui/gfx/paint_vector_icon.h" - -namespace { - -// A helper used to filter which menu items added by the extension are shown. -bool MenuItemHasLauncherContext(const extensions::MenuItem* item) { - return item->contexts().Contains(extensions::MenuItem::LAUNCHER); -} - -} // namespace ExtensionShelfContextMenu::ExtensionShelfContextMenu( ChromeShelfController* controller, @@ -55,7 +43,7 @@ extension_items_ = std::make_unique<extensions::ContextMenuMatcher>( profile, this, menu_model.get(), - base::BindRepeating(MenuItemHasLauncherContext)); + base::BindRepeating(apps::MenuItemHasLauncherContext)); if (item().type == ash::TYPE_PINNED_APP || item().type == ash::TYPE_APP) { CreateOpenNewSubmenu(menu_model.get()); @@ -107,46 +95,6 @@ std::move(callback).Run(std::move(menu_model)); } -bool ExtensionShelfContextMenu::IsCommandIdChecked(int command_id) const { - switch (command_id) { - case ash::USE_LAUNCH_TYPE_PINNED: - return GetLaunchType() == extensions::LAUNCH_TYPE_PINNED; - case ash::USE_LAUNCH_TYPE_REGULAR: - return GetLaunchType() == extensions::LAUNCH_TYPE_REGULAR; - case ash::USE_LAUNCH_TYPE_WINDOW: - return GetLaunchType() == extensions::LAUNCH_TYPE_WINDOW; - case ash::USE_LAUNCH_TYPE_FULLSCREEN: - return GetLaunchType() == extensions::LAUNCH_TYPE_FULLSCREEN; - default: - if (command_id < ash::COMMAND_ID_COUNT) - return ShelfContextMenu::IsCommandIdChecked(command_id); - return (extension_items_ && - extension_items_->IsCommandIdChecked(command_id)); - } -} - -bool ExtensionShelfContextMenu::IsCommandIdEnabled(int command_id) const { - switch (command_id) { - case ash::UNINSTALL: - return controller()->UninstallAllowed(item().id.app_id); - case ash::APP_CONTEXT_MENU_NEW_WINDOW: - // "Normal" windows are not allowed when incognito is enforced. - return IncognitoModePrefs::GetAvailability( - controller()->profile()->GetPrefs()) != - IncognitoModePrefs::Availability::kForced; - case ash::APP_CONTEXT_MENU_NEW_INCOGNITO_WINDOW: - // Incognito windows are not allowed when incognito is disabled. - return IncognitoModePrefs::GetAvailability( - controller()->profile()->GetPrefs()) != - IncognitoModePrefs::Availability::kDisabled; - default: - if (command_id < ash::COMMAND_ID_COUNT) - return ShelfContextMenu::IsCommandIdEnabled(command_id); - return (extension_items_ && - extension_items_->IsCommandIdEnabled(command_id)); - } -} - void ExtensionShelfContextMenu::ExecuteCommand(int command_id, int event_flags) { if (ExecuteCommonCommand(command_id, event_flags)) @@ -196,6 +144,71 @@ } } +ui::ImageModel ExtensionShelfContextMenu::GetIconForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + const gfx::VectorIcon& icon = + GetCommandIdVectorIcon(command_id, GetLaunchTypeStringId()); + return ui::ImageModel::FromVectorIcon( + icon, apps::GetColorIdForMenuItemIcon(), ash::kAppContextMenuIconSize); + } + return ShelfContextMenu::GetIconForCommandId(command_id); +} + +std::u16string ExtensionShelfContextMenu::GetLabelForCommandId( + int command_id) const { + if (command_id == ash::LAUNCH_NEW) { + return l10n_util::GetStringUTF16(GetLaunchTypeStringId()); + } + return ShelfContextMenu::GetLabelForCommandId(command_id); +} + +bool ExtensionShelfContextMenu::IsCommandIdChecked(int command_id) const { + switch (command_id) { + case ash::USE_LAUNCH_TYPE_PINNED: + return GetLaunchType() == extensions::LAUNCH_TYPE_PINNED; + case ash::USE_LAUNCH_TYPE_REGULAR: + return GetLaunchType() == extensions::LAUNCH_TYPE_REGULAR; + case ash::USE_LAUNCH_TYPE_WINDOW: + return GetLaunchType() == extensions::LAUNCH_TYPE_WINDOW; + case ash::USE_LAUNCH_TYPE_FULLSCREEN: + return GetLaunchType() == extensions::LAUNCH_TYPE_FULLSCREEN; + default: + if (command_id < ash::COMMAND_ID_COUNT) + return ShelfContextMenu::IsCommandIdChecked(command_id); + return (extension_items_ && + extension_items_->IsCommandIdChecked(command_id)); + } +} + +bool ExtensionShelfContextMenu::IsCommandIdEnabled(int command_id) const { + switch (command_id) { + case ash::UNINSTALL: + return controller()->UninstallAllowed(item().id.app_id); + case ash::APP_CONTEXT_MENU_NEW_WINDOW: + // "Normal" windows are not allowed when incognito is enforced. + return IncognitoModePrefs::GetAvailability( + controller()->profile()->GetPrefs()) != + IncognitoModePrefs::Availability::kForced; + case ash::APP_CONTEXT_MENU_NEW_INCOGNITO_WINDOW: + // Incognito windows are not allowed when incognito is disabled. + return IncognitoModePrefs::GetAvailability( + controller()->profile()->GetPrefs()) != + IncognitoModePrefs::Availability::kDisabled; + default: + if (command_id < ash::COMMAND_ID_COUNT) + return ShelfContextMenu::IsCommandIdEnabled(command_id); + return (extension_items_ && + extension_items_->IsCommandIdEnabled(command_id)); + } +} + +bool ExtensionShelfContextMenu::IsItemForCommandIdDynamic( + int command_id) const { + return command_id == ash::LAUNCH_NEW || + ShelfContextMenu::IsItemForCommandIdDynamic(command_id); +} + void ExtensionShelfContextMenu::CreateOpenNewSubmenu( ui::SimpleMenuModel* menu_model) { // Touchable extension context menus use an actionable submenu for @@ -208,11 +221,9 @@ open_new_submenu_model_->AddRadioItemWithStringId( ash::USE_LAUNCH_TYPE_WINDOW, IDS_APP_LIST_CONTEXT_MENU_NEW_WINDOW, kGroupId); - menu_model->AddActionableSubmenuWithStringIdAndIcon( - ash::LAUNCH_NEW, GetLaunchTypeStringId(), open_new_submenu_model_.get(), - ui::ImageModel::FromVectorIcon( - GetCommandIdVectorIcon(ash::LAUNCH_NEW, GetLaunchTypeStringId()), - ui::kColorAshSystemUIMenuIcon, ash::kAppContextMenuIconSize)); + menu_model->AddActionableSubMenu( + ash::LAUNCH_NEW, l10n_util::GetStringUTF16(GetLaunchTypeStringId()), + open_new_submenu_model_.get()); } extensions::LaunchType ExtensionShelfContextMenu::GetLaunchType() const {
diff --git a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.h b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.h index 7f1f266..5083292 100644 --- a/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.h +++ b/chrome/browser/ui/ash/shelf/extension_shelf_context_menu.h
@@ -31,9 +31,12 @@ void GetMenuModel(GetMenuModelCallback callback) override; // ui::SimpleMenuModel::Delegate overrides: + void ExecuteCommand(int command_id, int event_flags) override; + ui::ImageModel GetIconForCommandId(int command_id) const override; + std::u16string GetLabelForCommandId(int command_id) const override; bool IsCommandIdChecked(int command_id) const override; bool IsCommandIdEnabled(int command_id) const override; - void ExecuteCommand(int command_id, int event_flags) override; + bool IsItemForCommandIdDynamic(int command_id) const override; private: // Creates the actionable submenu for MENU_OPEN_NEW.
diff --git a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc index b68de11..86e84a5 100644 --- a/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc +++ b/chrome/browser/ui/aura/accessibility/automation_manager_aura_browsertest.cc
@@ -289,7 +289,7 @@ cache_ptr->set_focused_widget_for_testing(nullptr); - AddFailureOnWidgetAccessibilityError(widget); + RunAccessibilityChecks(widget); } // TODO(crbug.com/1202250): Crashes on Ozone. @@ -562,7 +562,7 @@ cache_ptr->set_focused_widget_for_testing(nullptr); - AddFailureOnWidgetAccessibilityError(widget); + RunAccessibilityChecks(widget); } // Verify that re-enabling AutomationManagerAura after disable will not cause @@ -637,5 +637,5 @@ cache.set_focused_widget_for_testing(nullptr); - AddFailureOnWidgetAccessibilityError(widget); + RunAccessibilityChecks(widget); }
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.h b/chrome/browser/ui/cocoa/history_menu_bridge.h index 46eb55a..45a99927 100644 --- a/chrome/browser/ui/cocoa/history_menu_bridge.h +++ b/chrome/browser/ui/cocoa/history_menu_bridge.h
@@ -236,9 +236,8 @@ // history::HistoryServiceObserver: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsModified(history::HistoryService* history_service, const history::URLRows& changed_urls) override; void OnURLsDeleted(history::HistoryService* history_service,
diff --git a/chrome/browser/ui/cocoa/history_menu_bridge.mm b/chrome/browser/ui/cocoa/history_menu_bridge.mm index f5015683..3013795 100644 --- a/chrome/browser/ui/cocoa/history_menu_bridge.mm +++ b/chrome/browser/ui/cocoa/history_menu_bridge.mm
@@ -537,9 +537,8 @@ } void HistoryMenuBridge::OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { + const history::URLRow& url_row, + const history::VisitRow& new_visit) { OnHistoryChanged(); }
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.cc b/chrome/browser/ui/passwords/settings/password_manager_porter.cc index d301025f..c7d13a6 100644 --- a/chrome/browser/ui/passwords/settings/password_manager_porter.cc +++ b/chrome/browser/ui/passwords/settings/password_manager_porter.cc
@@ -13,6 +13,7 @@ #include "base/metrics/histogram_macros.h" #include "base/path_service.h" #include "base/strings/utf_string_conversions.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/chrome_select_file_policy.h" @@ -107,12 +108,28 @@ exporter_ = std::move(exporter); } -void PasswordManagerPorter::Import(content::WebContents* web_contents) { +void PasswordManagerPorter::Import( + content::WebContents* web_contents, + password_manager::PasswordForm::Store to_store, + ImportResultsCallback results_callback) { DCHECK(web_contents); - if (!importer_) - importer_ = - std::make_unique<password_manager::PasswordImporter>(presenter_); + if (!import_results_callback_.is_null() || + (importer_ && importer_->IsRunning())) { + // Early return to prevent crashes due to already active import process in + // other window. + password_manager::ImportResults results; + results.status = + password_manager::ImportResults::Status::IMPORT_ALREADY_ACTIVE; + + // For consistency |results_callback| is always run asynchronously. + base::SequencedTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(results_callback), results)); + return; + } + + import_results_callback_ = std::move(results_callback); + to_store_ = to_store; PresentFileSelector(web_contents, PasswordManagerPorter::Type::PASSWORD_IMPORT); @@ -191,6 +208,12 @@ exporter_->Cancel(); } + if (!import_results_callback_.is_null()) { + password_manager::ImportResults results; + results.status = password_manager::ImportResults::Status::DISMISSED; + std::move(import_results_callback_).Run(results); + } + select_file_dialog_.reset(); } @@ -200,5 +223,10 @@ void PasswordManagerPorter::ImportPasswordsFromPath( const base::FilePath& path) { - importer_->Import(path); + DCHECK(!import_results_callback_.is_null()); + if (!importer_) { + importer_ = + std::make_unique<password_manager::PasswordImporter>(presenter_); + } + importer_->Import(path, to_store_, std::move(import_results_callback_)); }
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter.h b/chrome/browser/ui/passwords/settings/password_manager_porter.h index 41f3618a..9fb805b 100644 --- a/chrome/browser/ui/passwords/settings/password_manager_porter.h +++ b/chrome/browser/ui/passwords/settings/password_manager_porter.h
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "components/password_manager/core/browser/import/password_importer.h" #include "components/password_manager/core/browser/ui/export_progress_status.h" +#include "components/password_manager/core/browser/ui/import_results.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" #include "ui/shell_dialogs/select_file_dialog.h" @@ -28,6 +29,8 @@ // file to the Password Manager. class PasswordManagerPorter : public ui::SelectFileDialog::Listener { public: + using ImportResultsCallback = + base::OnceCallback<void(const password_manager::ImportResults&)>; using ProgressCallback = base::RepeatingCallback<void(password_manager::ExportProgressStatus, const std::string&)>; @@ -60,7 +63,12 @@ std::unique_ptr<password_manager::PasswordImporter> importer); // Triggers passwords import flow for the given |web_contents|. - void Import(content::WebContents* web_contents); + // Passwords will be imported into the |to_store|. + // |results_callback| is used to return import summary back to the user. It is + // run on the completion of import flow. + void Import(content::WebContents* web_contents, + password_manager::PasswordForm::Store to_store, + ImportResultsCallback results_callback); private: enum Type { @@ -95,6 +103,11 @@ const raw_ptr<password_manager::SavedPasswordsPresenter> presenter_; ProgressCallback on_export_progress_callback_; + // |import_results_callback_|, |to_store_| are stored in the porter + // while the file is being selected. + ImportResultsCallback import_results_callback_; + password_manager::PasswordForm::Store to_store_; + base::WeakPtrFactory<PasswordManagerPorter> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc index def302e41..197ddc17 100644 --- a/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc +++ b/chrome/browser/ui/passwords/settings/password_manager_porter_unittest.cc
@@ -15,6 +15,7 @@ #include "base/run_loop.h" #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/mock_callback.h" #include "build/build_config.h" #include "chrome/browser/password_manager/password_store_factory.h" #include "chrome/browser/ui/chrome_select_file_policy.h" @@ -340,7 +341,11 @@ porter.SetImporterForTesting(std::move(importer)); ui::SelectFileDialog::SetFactory( new TestSelectFileDialogFactory(temp_file_path)); - porter.Import(web_contents()); + base::MockCallback<PasswordManagerPorter::ImportResultsCallback> callback; + EXPECT_CALL(callback, Run).Times(1); + porter.Import(web_contents(), + password_manager::PasswordForm::Store::kProfileStore, + callback.Get()); base::RunLoop().RunUntilIdle(); if (tc.descriptions.empty()) { EXPECT_THAT(test_password_store->stored_passwords(), IsEmpty());
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc index 324bd71..1bd4401 100644 --- a/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/webui_tab_strip_interactive_uitest.cc
@@ -2,14 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "base/callback_forward.h" -#include "base/memory/weak_ptr.h" #include "base/strings/utf_string_conversions.h" -#include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" -#include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/ui/view_ids.h" #include "chrome/browser/ui/views/frame/browser_view.h" @@ -21,19 +17,8 @@ #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/interactive_test_utils.h" -#include "chrome/test/interaction/interaction_test_util_browser.h" -#include "chrome/test/interaction/webui_interaction_test_util.h" #include "content/public/test/browser_test.h" -#include "ui/aura/client/drag_drop_client.h" -#include "ui/base/dragdrop/drag_drop_types.h" -#include "ui/base/interaction/element_identifier.h" -#include "ui/base/interaction/element_tracker.h" -#include "ui/base/interaction/expect_call_in_scope.h" -#include "ui/base/interaction/interaction_sequence.h" -#include "ui/base/page_transition_types.h" #include "ui/base/pointer/touch_ui_controller.h" -#include "ui/base/test/ui_controls.h" -#include "ui/gfx/geometry/point.h" #include "ui/views/controls/webview/webview.h" #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -41,8 +26,6 @@ #include "chromeos/ui/frame/immersive/immersive_fullscreen_controller_test_api.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH) -DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kMouseDragCompleteCustomEvent); - class WebUITabStripInteractiveTest : public InProcessBrowserTest { public: WebUITabStripInteractiveTest() { @@ -51,63 +34,9 @@ ~WebUITabStripInteractiveTest() override = default; - // Convenience method to locate and send a custom event of type `event_type` - // on the element with identifier `id`. - void SendCustomEvent(ui::ElementIdentifier id, - ui::CustomElementEventType event_type) { - auto* const target = - ui::ElementTracker::GetElementTracker()->GetUniqueElement( - id, browser()->window()->GetElementContext()); - ASSERT_NE(nullptr, target); - ui::ElementTracker::GetFrameworkDelegate()->NotifyCustomEvent(target, - event_type); - }; - - protected: - using WeakPtr = base::WeakPtr<WebUITabStripInteractiveTest>; - - // Performs a drag by sending mouse events. - // - // Moves the cursor to `start` and begins a drag to `end` in screen - // coordinates (but does not release the mouse button). When the mouse reaches - // `end`, an event is sent. - // - // This can probably be turned into a common utility method for testing things - // that happen in the middle of a drag. - void PerformDragWithoutRelease(gfx::Point start, - gfx::Point end, - ui::ElementIdentifier target_id) { - ASSERT_TRUE(ui_controls::SendMouseMoveNotifyWhenDone( - start.x(), start.y(), - base::BindOnce( - [](WeakPtr test, gfx::Point end, ui::ElementIdentifier target_id) { - if (!test) - return; - ASSERT_TRUE(ui_controls::SendMouseEventsNotifyWhenDone( - ui_controls::LEFT, ui_controls::DOWN, - base::BindOnce( - [](WeakPtr test, gfx::Point end, - ui::ElementIdentifier target_id) { - if (!test) - return; - ASSERT_TRUE(ui_controls::SendMouseMoveNotifyWhenDone( - end.x(), end.y(), - base::BindOnce( - &WebUITabStripInteractiveTest::SendCustomEvent, - test, target_id, - kMouseDragCompleteCustomEvent))); - }, - test, end, target_id))); - }, - weak_ptr_factory_.GetWeakPtr(), end, target_id))); - }; - - WeakPtr GetWeakPtr() { return weak_ptr_factory_.GetWeakPtr(); } - private: base::test::ScopedFeatureList feature_override_; ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true}; - base::WeakPtrFactory<WebUITabStripInteractiveTest> weak_ptr_factory_{this}; }; // Regression test for crbug.com/1027375. @@ -259,226 +188,4 @@ EXPECT_TRUE(immersive_mode_controller->IsRevealed()); } -// Regression test for crbug.com/1286203. -// -// The original bug was a UAF that happened when a tab closed itself (e.g. via -// javascript) during a drag from the WebUI tabstrip; not all references to the -// tab were properly cleaned up. -// -// There is already a proposed regression test for this bug using existing -// technology; see: -// https://chromium-review.googlesource.com/c/chromium/src/+/3588859 -// -// This is a proof-of-concept for regression testing using InteractionSequence, -// which demonstrates that: -// - tests can be written without arbitrary (and often flaky) delays -// - tests can be end-to-end interacting with both native and WebUI code -// - tests can be written to reproduce very specific test cases -// -// This framework can be used to handle many similar types of bugs, for both -// WebUI and Views elements. These tests, while more verbose, can be made very -// specific and are declarative and event-driven. This particular test performs -// the following steps: -// 1. opens a second tab in the browser -// 2. clicks the tab counter button to open the WebUI tabstrip -// 3. drags the second tab out of the WebUI tabstrip -// 4. without finishing the drag, closes the tab via script -// 5. verifies the tab actually closed -// 6. completes the drag -// -// This sequence of events would crash without the associated bugfix. More -// detail is provided in the actual test sequence. -IN_PROC_BROWSER_TEST_F(WebUITabStripInteractiveTest, CloseTabDuringDrag) { - // Add a second tab and set up an object to instrument that tab. - ASSERT_TRUE(AddTabAtIndex(-1, GURL("about:blank"), ui::PAGE_TRANSITION_LINK)); - DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kFirstTabElementId); - std::unique_ptr<WebUIInteractionTestUtil> first_tab = - WebUIInteractionTestUtil::ForExistingTabInBrowser(browser(), - kFirstTabElementId, 0); - DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kSecondTabElementId); - std::unique_ptr<WebUIInteractionTestUtil> second_tab = - WebUIInteractionTestUtil::ForExistingTabInBrowser(browser(), - kSecondTabElementId, 1); - - // The WebUI for the tabstrip will be instrumented only after it is guaranteed - // to have been created. - DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebUiTabStripElementId); - std::unique_ptr<WebUIInteractionTestUtil> tab_strip; - - // This is the DeepQuery path to the second tab element in the WebUI tabstrip. - // If the structure of the WebUI page changes greatly, it may need to be - // modified to reflect a new page structure. - const WebUIInteractionTestUtil::DeepQuery kSecondTabQuery{ - "tabstrip-tab-list", "tabstrip-tab + tabstrip-tab"}; - - // Some custom events used to advance the test sequence. - DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kTabPopulatedCustomEvent); - DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kMouseUpCustomEvent); - - // These are needed to determine the sequence didn't fail. They're boilerplate - // and will probably be exchanged in the future for a smarter version of - // InteractionSequence::RunSynchronouslyForTesting(). - UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::CompletedCallback, completed); - UNCALLED_MOCK_CALLBACK(ui::InteractionSequence::AbortedCallback, aborted); - - // This object contains the sequence of expected stets in the test. - auto sequence = - ui::InteractionSequence::Builder() - .SetContext(browser()->window()->GetElementContext()) - .SetCompletedCallback(completed.Get()) - .SetAbortedCallback(aborted.Get()) - - // Wait until the second tab has fully loaded. This is advisable since - // later the destruction of the tab needs to be observed. - .AddStep(ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kShown) - .SetElementID(kSecondTabElementId) - .Build()) - - // Click the tab counter button to display the WebUI tabstrip and - // make sure the tabstrip appears. - .AddStep( - ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kShown) - .SetElementID(kTabCounterButtonElementId) - .SetStartCallback(base::BindLambdaForTesting( - [&](ui::InteractionSequence*, - ui::TrackedElement* element) { - const auto test_util = CreateInteractionTestUtil(); - test_util->PressButton(element); - - // The WebUI tabstrip can be created dynamically, so - // wait until the button is pressed and the browser is - // re-laid-out to bind the associated WebUI. - auto* const browser_view = - BrowserView::GetBrowserViewForBrowser(browser()); - browser_view->GetWidget()->LayoutRootViewIfNecessary(); - auto* const web_view = browser_view->webui_tab_strip() - ->web_view_for_testing(); - tab_strip = WebUIInteractionTestUtil::ForNonTabWebView( - web_view, kWebUiTabStripElementId); - })) - .Build()) - - // Wait for the WebUI tabstrip to become fully loaded, and then wait - // for the tab data to load and render. - .AddStep( - ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kShown) - .SetElementID(kWebUiTabStripElementId) - .SetStartCallback(base::BindLambdaForTesting( - [&](ui::InteractionSequence*, - ui::TrackedElement* element) { - // At this point the new tab has been fully loaded and - // its onLoad() called. - EXPECT_EQ(2, browser()->tab_strip_model()->count()); - - // It takes a while for tab data to be filled out in the - // tabstrip. Before it is fully loaded the tabs have - // zero visible size, so wait until they are the - // expected size. - WebUIInteractionTestUtil::StateChange change; - change.event = kTabPopulatedCustomEvent; - change.where = kSecondTabQuery; - change.type = WebUIInteractionTestUtil::StateChange:: - Type::kExistsAndConditionTrue; - change.test_function = - "el => (el.getBoundingClientRect().width > 0)"; - tab_strip->SendEventOnStateChange(std::move(change)); - })) - .Build()) - - // Now that the tab is properly rendered, drag it out of the tabstrip. - .AddStep(ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kCustomEvent, - kTabPopulatedCustomEvent) - .SetElementID(kWebUiTabStripElementId) - .SetStartCallback(base::BindLambdaForTesting( - [&](ui::InteractionSequence*, - ui::TrackedElement* element) { - // Starting point of drag is the center of the - // second tab in the WebUI tabstrip. - const gfx::Point start = - tab_strip - ->GetElementBoundsInScreen(kSecondTabQuery) - .CenterPoint(); - - // Endpoint is center of the main webcontents, so - // guaranteed to be outside the tabstrip. - const gfx::Point end = browser() - ->tab_strip_model() - ->GetActiveWebContents() - ->GetContainerBounds() - .CenterPoint(); - - // Perform but do not complete the drag. - PerformDragWithoutRelease(start, end, - kWebUiTabStripElementId); - })) - .Build()) - - // Wait for the drag to finish and close the tab without releasing the - // mouse and actually ending the drag. - .AddStep(ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kCustomEvent, - kMouseDragCompleteCustomEvent) - .SetElementID(kWebUiTabStripElementId) - .SetStartCallback(base::BindLambdaForTesting( - [&](ui::InteractionSequence*, - ui::TrackedElement* element) { - // For WebUI tab drag, the tab isn't actually - // removed from the tabstrip until the drag - // completes. - EXPECT_EQ(2, - browser()->tab_strip_model()->count()); - - // Close the new tab. - second_tab->Execute("() => window.close()"); - })) - .Build()) - - // Wait for the dragged tab to be closed, verify it is closed, and - // release the mouse to finish the drag. - // - // SetTransitionOnlyOnEvent(true) means the test will fail if the tab - // goes away before this step is queued; it will only succeed if the - // tab disappears specifically in response to the previous step. - .AddStep( - ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kHidden) - .SetElementID(kSecondTabElementId) - .SetTransitionOnlyOnEvent(true) - .SetStartCallback(base::BindLambdaForTesting( - [&](ui::InteractionSequence*, - ui::TrackedElement* element) { - // The tab should now be removed from the tabstrip - // because it was closed; the drag has not yet - // finished. - EXPECT_EQ(1, browser()->tab_strip_model()->count()); - - // Complete the drag by releasing the mouse. - // - // Note that we can't send the on-complete event through - // the tabstrip itself as it may snap shut as a result - // of aborting the drag. - EXPECT_TRUE(ui_controls::SendMouseEventsNotifyWhenDone( - ui_controls::LEFT, ui_controls::UP, - base::BindOnce( - &WebUITabStripInteractiveTest::SendCustomEvent, - GetWeakPtr(), kFirstTabElementId, - kMouseUpCustomEvent))); - })) - .Build()) - - // Wait for the mouse-up action to complete before ending the sequence - // so the browser is in a known input state for the next test. - .AddStep(ui::InteractionSequence::StepBuilder() - .SetType(ui::InteractionSequence::StepType::kCustomEvent, - kMouseUpCustomEvent) - .SetElementID(kFirstTabElementId)) - .Build(); - - EXPECT_CALL_IN_SCOPE(completed, Run, sequence->RunSynchronouslyForTesting()); -} - #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc index 8d25024ac..cea8f32c 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_button.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_button.cc
@@ -6,7 +6,6 @@ #include "base/command_line.h" #include "base/ranges/algorithm.h" -#include "base/timer/elapsed_timer.h" #include "chrome/app/vector_icons/vector_icons.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" @@ -89,8 +88,6 @@ // Asynchronously check if the user is the owner and show the Chrome Labs // bubble only after we have this information. #if BUILDFLAG(IS_CHROMEOS_ASH) - // Reset timer. - ash_owner_check_timer_ = nullptr; // Bypass possible incognito profile same as chrome://flags does. Profile* original_profile = browser_view_->browser()->profile()->GetOriginalProfile(); @@ -101,7 +98,6 @@ ash::OwnerSettingsServiceAsh* service = ash::OwnerSettingsServiceAshFactory::GetForBrowserContext( original_profile); - ash_owner_check_timer_ = std::make_unique<base::ElapsedTimer>(); is_waiting_to_show = true; service->IsOwnerAsync(base::BindOnce( [](ChromeLabsButton* button, base::WeakPtr<BrowserView> browser_view,
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_button.h b/chrome/browser/ui/views/toolbar/chrome_labs_button.h index 9bec66d..6b7cacc 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_button.h +++ b/chrome/browser/ui/views/toolbar/chrome_labs_button.h
@@ -13,10 +13,6 @@ #include "ui/base/metadata/metadata_header_macros.h" #include "ui/views/controls/dot_indicator.h" -namespace base { -class ElapsedTimer; -} - class BrowserView; class Profile; @@ -38,9 +34,6 @@ Profile* profile); #if BUILDFLAG(IS_CHROMEOS_ASH) - base::ElapsedTimer* GetAshOwnerCheckTimer() { - return ash_owner_check_timer_.get(); - } void SetShouldCircumventDeviceCheckForTesting(bool should_circumvent) { should_circumvent_device_check_for_testing_ = should_circumvent; @@ -60,13 +53,6 @@ void UpdateDotIndicator(); -#if BUILDFLAG(IS_CHROMEOS_ASH) - // Measures elapsed between when IsOwnerAsync is called and the callback - // passed into IsOwnerAsnc is called. The callback will be called after - // ownership is established. - std::unique_ptr<base::ElapsedTimer> ash_owner_check_timer_; -#endif - raw_ptr<BrowserView> browser_view_; #if BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/ui/views/toolbar/chrome_labs_coordinator.cc b/chrome/browser/ui/views/toolbar/chrome_labs_coordinator.cc index 82b01d30..3aecb48 100644 --- a/chrome/browser/ui/views/toolbar/chrome_labs_coordinator.cc +++ b/chrome/browser/ui/views/toolbar/chrome_labs_coordinator.cc
@@ -42,10 +42,6 @@ void ChromeLabsCoordinator::Show(ShowUserType user_type) { #if BUILDFLAG(IS_CHROMEOS_ASH) - if (anchor_view_->GetAshOwnerCheckTimer()) { - UmaHistogramMediumTimes("Toolbar.ChromeLabs.AshOwnerCheckTime", - anchor_view_->GetAshOwnerCheckTimer()->Elapsed()); - } // Bypass possible incognito profile same as chrome://flags does. Profile* original_profile = browser_->profile()->GetOriginalProfile();
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index ce6ebdc..7cd42b15d 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -149,7 +149,6 @@ #include "chrome/browser/ui/webui/new_tab_page_third_party/new_tab_page_third_party_ui.h" #include "chrome/browser/ui/webui/ntp/new_tab_ui.h" #include "chrome/browser/ui/webui/page_not_available_for_guest/page_not_available_for_guest_ui.h" -#include "chrome/browser/ui/webui/password_manager/password_manager_ui.h" #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h" #include "chrome/browser/ui/webui/profile_internals/profile_internals_ui.h" #include "chrome/browser/ui/webui/settings/settings_ui.h" @@ -167,7 +166,6 @@ #include "chrome/browser/ui/webui/webui_gallery/webui_gallery_ui.h" #include "chrome/browser/ui/webui/whats_new/whats_new_ui.h" #include "chrome/browser/web_applications/web_app_provider.h" -#include "components/password_manager/core/common/password_manager_features.h" #include "media/base/media_switches.h" #endif // BUILDFLAG(IS_ANDROID) @@ -841,10 +839,6 @@ // Bookmarks are part of NTP on Android. if (url.host_piece() == chrome::kChromeUIBookmarksHost) return &NewWebUI<BookmarksUI>; - if (url.host_piece() == chrome::kChromeUIPasswordManagerHost && - base::FeatureList::IsEnabled( - password_manager::features::kPasswordManagerRedesign)) - return &NewWebUI<PasswordManagerUI>; if (url.host_piece() == chrome::kChromeUICommanderHost) return &NewWebUI<CommanderUI>; // Downloads list on Android uses the built-in download manager.
diff --git a/chrome/browser/ui/webui/chromeos/network_ui.cc b/chrome/browser/ui/webui/chromeos/network_ui.cc index 2c25be38..6feccee 100644 --- a/chrome/browser/ui/webui/chromeos/network_ui.cc +++ b/chrome/browser/ui/webui/chromeos/network_ui.cc
@@ -99,9 +99,9 @@ return true; } -void SetDeviceProperties(base::Value* dictionary) { - const std::string* device = - dictionary->GetDict().FindString(shill::kDeviceProperty); +void SetDeviceProperties(base::Value::Dict* dictionary) { + DCHECK(dictionary); + const std::string* device = dictionary->FindString(shill::kDeviceProperty); if (!device) return; const DeviceState* device_state = @@ -109,19 +109,17 @@ if (!device_state) return; - base::Value device_dictionary(device_state->properties().Clone()); - if (!device_state->ip_configs().DictEmpty()) { + base::Value::Dict device_dictionary = device_state->properties().Clone(); + if (!device_state->ip_configs().empty()) { // Convert IPConfig dictionary to a ListValue. - base::Value ip_configs(base::Value::Type::LIST); - for (auto iter : device_state->ip_configs().DictItems()) { + base::Value::List ip_configs; + for (auto iter : device_state->ip_configs()) { ip_configs.Append(iter.second.Clone()); } - device_dictionary.GetDict().Set(shill::kIPConfigsProperty, - std::move(ip_configs)); + device_dictionary.Set(shill::kIPConfigsProperty, std::move(ip_configs)); } - if (!device_dictionary.DictEmpty()) - dictionary->GetDict().Set(shill::kDeviceProperty, - std::move(device_dictionary)); + if (!device_dictionary.empty()) + dictionary->Set(shill::kDeviceProperty, std::move(device_dictionary)); } bool IsGuestModeActive() { @@ -279,7 +277,7 @@ } private: - void Respond(const std::string& callback_id, const base::Value& response) { + void Respond(const std::string& callback_id, const base::ValueView response) { AllowJavascript(); ResolveJavascriptCallback(base::Value(callback_id), response); } @@ -300,7 +298,7 @@ ProvideNetworkProperties(callback_id, wifi_network->guid()); return; } - Respond(callback_id, base::ListValue()); + Respond(callback_id, base::Value::List()); } void ProvideNetworkProperties(const std::string& callback_id, @@ -329,8 +327,8 @@ // Set the 'service_path' property for debugging. result->GetDict().Set("service_path", base::Value(service_path)); // Set the device properties for debugging. - SetDeviceProperties(&result.value()); - base::ListValue return_arg_list; + SetDeviceProperties(result->GetIfDict()); + base::Value::List return_arg_list; return_arg_list.Append(std::move(*result)); Respond(callback_id, return_arg_list); } @@ -365,15 +363,15 @@ &list); if (list.empty()) { - Respond(callback_id, base::Value(base::Value::Type::LIST)); + Respond(callback_id, base::Value::List()); return; } const NetworkState* eap = list.front(); - base::Value properties(base::Value::Type::DICTIONARY); - properties.GetDict().Set("guid", eap->guid()); - properties.GetDict().Set("name", eap->name()); - properties.GetDict().Set("type", eap->type()); - base::Value response(base::Value::Type::LIST); + base::Value::Dict properties; + properties.Set("guid", eap->guid()); + properties.Set("name", eap->name()); + properties.Set("type", eap->type()); + base::Value::List response; response.Append(std::move(properties)); Respond(callback_id, response); } @@ -389,7 +387,7 @@ SystemTrayClientImpl::Get()->ShowSettingsCellularSetup( /*show_psim_flow=*/true); } - base::Value response(base::Value::Type::LIST); + base::Value::List response; response.Append(base::Value(cellular_network != nullptr)); Respond(callback_id, response); } @@ -468,7 +466,7 @@ // Set the 'device_path' property for debugging. result->GetDict().Set("device_path", base::Value(device_path)); - base::ListValue return_arg_list; + base::Value::List return_arg_list; return_arg_list.Append(std::move(*result)); Respond(callback_id, return_arg_list); } @@ -501,13 +499,13 @@ const std::string& function_name, const std::string& error_name) { NET_LOG(ERROR) << "Shill Error: " << error_name << " id=" << guid_or_type; - base::ListValue return_arg_list; - base::Value dictionary(base::Value::Type::DICTIONARY); + base::Value::List return_arg_list; + base::Value::Dict dictionary; std::string key = function_name == kGetDeviceProperties ? shill::kTypeProperty : shill::kGuidProperty; - dictionary.GetDict().Set(key, base::Value(guid_or_type)); - dictionary.GetDict().Set("ShillError", base::Value(error_name)); + dictionary.Set(key, base::Value(guid_or_type)); + dictionary.Set("ShillError", base::Value(error_name)); return_arg_list.Append(std::move(dictionary)); Respond(callback_id, return_arg_list); } @@ -557,7 +555,7 @@ } private: - void Respond(const std::string& callback_id, const base::Value& response) { + void Respond(const std::string& callback_id, const base::ValueView response) { AllowJavascript(); ResolveJavascriptCallback(base::Value(callback_id), response); } @@ -667,9 +665,11 @@ return; } - const base::Value* value = properties->FindDictKey(dict_key); - Respond(callback_id, value ? value->Clone() - : base::Value(base::Value::Type::DICTIONARY)); + const base::Value::Dict* value = properties->GetDict().FindDict(dict_key); + if (value) + Respond(callback_id, *value); + else + Respond(callback_id, base::Value::Dict()); } void SetManagerPropertiesErrorCallback(
diff --git a/chrome/browser/ui/webui/feed/feed_ui.cc b/chrome/browser/ui/webui/feed/feed_ui.cc index cea0cb0..e74a9f4 100644 --- a/chrome/browser/ui/webui/feed/feed_ui.cc +++ b/chrome/browser/ui/webui/feed/feed_ui.cc
@@ -32,47 +32,19 @@ source, base::make_span(kFeedResources, kFeedResourcesSize), IDR_FEED_FEED_HTML); - // TODO(crbug.com/1292623): CSP is weak during development and will be - // tightened once the final architecture is decided. - // - Unsafe-eval/unsafe-inline is used by wasm code and is likely that we can - // avoid this for the final production version. - if (kWebUiDisableContentSecurityPolicy.Get()) { source->DisableContentSecurityPolicy(); } else { - std::string default_script_policy = - " 'self' chrome-untrusted://resources http://localhost:8000 " - "https://*.google.com https://google.com;"; - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ScriptSrc, - base::StrCat({"script-src 'unsafe-eval' 'unsafe-inline'", - default_script_policy})); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::FrameSrc, - base::StrCat({"frame-src", default_script_policy})); + "frame-src https://www.google.com;"); source->OverrideContentSecurityPolicy( network::mojom::CSPDirectiveName::StyleSrc, - base::StrCat({"style-src", default_script_policy})); - - std::string default_content_policy = - " 'self' chrome-untrusted://resources https: http://localhost:8000;"; - - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ConnectSrc, - base::StrCat({"connect-src", default_content_policy})); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::ImgSrc, - base::StrCat({"img-src", default_content_policy})); - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::MediaSrc, - base::StrCat({"media-src", default_content_policy})); - - source->OverrideContentSecurityPolicy( - network::mojom::CSPDirectiveName::DefaultSrc, "default-src 'self';"); + "style-src 'unsafe-inline' 'self';"); } // Configurable javascript for prototyping purposes. - source->AddString("scriptUrl", kWebUiScriptFetchUrl.Get()); + source->AddString("feedUrl", kWebUiFeedUrl.Get()); // Register the URLDataSource auto* browser_context = web_ui->GetWebContents()->GetBrowserContext();
diff --git a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc index b96c8cd8..902d8df 100644 --- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc +++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
@@ -234,6 +234,10 @@ } } + if (GetConfig().user_visible_debug && cluster.from_persistence) { + cluster_mojom->debug_info = "persisted"; + } + for (const auto& visit : cluster.visits) { cluster_mojom->visits.push_back(VisitToMojom(profile, visit)); }
diff --git a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc b/chrome/browser/ui/webui/password_manager/password_manager_ui.cc deleted file mode 100644 index 8846c51..0000000 --- a/chrome/browser/ui/webui/password_manager/password_manager_ui.cc +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright (c) 2016 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/webui/password_manager/password_manager_ui.h" - -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/webui/managed_ui_handler.h" -#include "chrome/browser/ui/webui/webui_util.h" -#include "chrome/common/webui_url_constants.h" -#include "chrome/grit/generated_resources.h" -#include "chrome/grit/password_manager_resources.h" -#include "chrome/grit/password_manager_resources_map.h" -#include "content/public/browser/web_ui_data_source.h" -#include "ui/base/webui/web_ui_util.h" - -namespace { - -content::WebUIDataSource* CreatePasswordsUIHTMLSource(Profile* profile) { - content::WebUIDataSource* source = - content::WebUIDataSource::Create(chrome::kChromeUIPasswordManagerHost); - - webui::SetupWebUIDataSource( - source, - base::make_span(kPasswordManagerResources, kPasswordManagerResourcesSize), - IDR_PASSWORD_MANAGER_PASSWORD_MANAGER_HTML); - - static constexpr webui::LocalizedString kStrings[] = { - {"title", IDS_PASSWORD_MANAGER_TITLE}, - }; - source->AddLocalizedStrings(kStrings); - - return source; -} - -} // namespace - -PasswordManagerUI::PasswordManagerUI(content::WebUI* web_ui) - : WebUIController(web_ui) { - // Set up the chrome://password-manager/ source. - Profile* profile = Profile::FromWebUI(web_ui); - auto* source = CreatePasswordsUIHTMLSource(profile); - ManagedUIHandler::Initialize(web_ui, source); - content::WebUIDataSource::Add(profile, source); -}
diff --git a/chrome/browser/ui/webui/password_manager/password_manager_ui.h b/chrome/browser/ui/webui/password_manager/password_manager_ui.h deleted file mode 100644 index 8b677163..0000000 --- a/chrome/browser/ui/webui/password_manager/password_manager_ui.h +++ /dev/null
@@ -1,19 +0,0 @@ -// Copyright (c) 2022 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_PASSWORD_MANAGER_UI_H_ -#define CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_PASSWORD_MANAGER_UI_H_ - -#include "content/public/browser/web_ui_controller.h" -#include "ui/base/resource/resource_scale_factor.h" - -class PasswordManagerUI : public content::WebUIController { - public: - explicit PasswordManagerUI(content::WebUI* web_ui); - - PasswordManagerUI(const PasswordManagerUI&) = delete; - PasswordManagerUI& operator=(const PasswordManagerUI&) = delete; -}; - -#endif // CHROME_BROWSER_UI_WEBUI_PASSWORD_MANAGER_PASSWORD_MANAGER_UI_H_
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_name_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/device_name_handler_unittest.cc index 49ed673..1c72792 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_name_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_name_handler_unittest.cc
@@ -68,15 +68,15 @@ EXPECT_EQ("settings.updateDeviceNameMetadata", call_data.arg1()->GetString()); - const base::DictionaryValue* returned_data; - ASSERT_TRUE(call_data.arg2()->GetAsDictionary(&returned_data)); + ASSERT_TRUE(call_data.arg2()->is_dict()); + const base::Value::Dict& returned_data = call_data.arg2()->GetDict(); - std::string device_name; - returned_data->GetString("deviceName", &device_name); - EXPECT_EQ(expected_device_name, device_name); + const std::string* device_name = returned_data.FindString("deviceName"); + ASSERT_TRUE(device_name); + EXPECT_EQ(expected_device_name, *device_name); absl::optional<int> device_name_state = - returned_data->FindIntKey("deviceNameState"); + returned_data.FindInt("deviceNameState"); ASSERT_TRUE(device_name_state); EXPECT_EQ(static_cast<int>(expected_device_name_state), *device_name_state); }
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 9931520..f4544a2 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -1006,7 +1006,7 @@ {"addPasswordTitle", IDS_SETTINGS_PASSWORD_ADD_TITLE}, {"addPasswordFootnote", IDS_SETTINGS_PASSWORD_ADD_FOOTNOTE}, {"addPasswordStoreOptionAccount", - IDS_SETTINGS_PASSWORD_ADD_STORE_OPTION_ACCOUNT}, + IDS_SETTINGS_PASSWORD_STORE_PICKER_OPTION_ACCOUNT}, {"addPasswordStoreOptionDevice", IDS_PASSWORD_MANAGER_DESTINATION_DROPDOWN_SAVE_TO_DEVICE}, {"addPasswordStorePickerA11yDescription", @@ -1112,7 +1112,15 @@ {"importPasswordsBadFormatError", IDS_SETTINGS_PASSWORDS_IMPORT_ERROR_BAD_FORMAT}, {"importPasswordsGenericDescription", - IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_GENERIC}, + IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_ACCOUNT_STORE_USERS}, + {"importPasswordsDescriptionAccount", + IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SYNCING_USERS}, + {"importPasswordsDescriptionDevice", + IDS_SETTINGS_PASSWORDS_IMPORT_DESCRIPTION_SIGNEDOUT_USERS}, + {"importPasswordsStorePickerA11yDescription", + IDS_SETTINGS_PASSWORDS_IMPORT_STORE_PICKER_ACCESSIBLE_NAME}, + {"importPasswordsAlreadyActive", + IDS_SETTINGS_PASSWORDS_IMPORT_ALREADY_ACTIVE}, {"exportMenuItem", IDS_SETTINGS_PASSWORDS_EXPORT_MENU_ITEM}, {"exportPasswordsTitle", IDS_SETTINGS_PASSWORDS_EXPORT_TITLE}, {"exportPasswordsDescription", IDS_SETTINGS_PASSWORDS_EXPORT_DESCRIPTION},
diff --git a/chrome/browser/ui/webui/settings/settings_ui.cc b/chrome/browser/ui/webui/settings/settings_ui.cc index 0de1727..304c914 100644 --- a/chrome/browser/ui/webui/settings/settings_ui.cc +++ b/chrome/browser/ui/webui/settings/settings_ui.cc
@@ -361,6 +361,9 @@ plural_string_handler->AddLocalizedString( "importPasswordsSuccessSummaryDevice", IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_DEVICE); + plural_string_handler->AddLocalizedString( + "importPasswordsSuccessSummaryAccount", + IDS_SETTINGS_PASSWORDS_IMPORT_SUCCESS_SUMMARY_ACCOUNT); web_ui->AddMessageHandler(std::move(plural_string_handler)); // Add the metrics handler to write uma stats.
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc index 44d56ba..97b0829 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -1810,6 +1810,12 @@ ->SetWebsiteSettingDefaultScope(origin.GetURL(), GURL(), ContentSettingsType::CLIENT_HINTS, base::Value()); + // Once user clears site setting data for `origins`, all corresponding + // reduced accept language stored in the setting map should also be cleaned. + HostContentSettingsMapFactory::GetForProfile(profile_) + ->SetWebsiteSettingDefaultScope( + origin.GetURL(), GURL(), + ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, base::Value()); } // Remove Privacy Sandbox API data. content::BrowsingDataRemover* remover = profile_->GetBrowsingDataRemover();
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.h b/chrome/browser/ui/webui/settings/site_settings_handler.h index bc367897..4e97fbe 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.h +++ b/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -127,6 +127,7 @@ FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, HandleClearUnpartitionedUsage); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, ClearClientHints); + FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, ClearReducedAcceptLanguage); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, HandleClearPartitionedUsage); FRIEND_TEST_ALL_PREFIXES(SiteSettingsHandlerTest, CookieSettingDescription);
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc index ce1991c..606284b 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler_unittest.cc
@@ -2745,6 +2745,85 @@ EXPECT_EQ(0U, client_hints_settings.size()); } +TEST_F(SiteSettingsHandlerTest, ClearReducedAcceptLanguage) { + // Confirm that when the user clears unpartitioned storage, or the eTLD+1 + // group, reduce accept language are also cleared. + SetUpCookiesTreeModel(); + handler()->OnStorageFetched(); + + GURL hosts[] = {GURL("https://example.com/"), GURL("https://www.example.com"), + GURL("https://google.com/"), GURL("https://www.google.com/")}; + + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(profile()); + ContentSettingsForOneType accept_language_settings; + + std::string language = "en-us"; + base::Value accept_language_dictionary(base::Value::Type::DICTIONARY); + accept_language_dictionary.SetKey("reduce-accept-language", + base::Value(language)); + + // Add setting for the hosts. + for (const auto& host : hosts) { + host_content_settings_map->SetWebsiteSettingDefaultScope( + host, GURL(), ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, + accept_language_dictionary.Clone()); + } + + // Clear at the eTLD+1 level and ensure affected origins are cleared. + base::Value args(base::Value::Type::LIST); + args.Append("example.com"); + handler()->HandleClearEtldPlus1DataAndCookies(args.GetList()); + host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, &accept_language_settings); + EXPECT_EQ(2U, accept_language_settings.size()); + + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[2]), + accept_language_settings.at(0).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + accept_language_settings.at(0).secondary_pattern); + EXPECT_EQ(accept_language_dictionary, + accept_language_settings.at(0).setting_value); + + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[3]), + accept_language_settings.at(1).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + accept_language_settings.at(1).secondary_pattern); + EXPECT_EQ(accept_language_dictionary, + accept_language_settings.at(1).setting_value); + + // Clear unpartitioned usage data, which should only affect the specific + // origin. + args.ClearList(); + args.Append("https://google.com/"); + handler()->HandleClearUnpartitionedUsage(args.GetList()); + + // Validate the reduce accept language has been cleared. + host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, &accept_language_settings); + EXPECT_EQ(1U, accept_language_settings.size()); + + // www.google.com should be the only remainining entry. + EXPECT_EQ(ContentSettingsPattern::FromURLNoWildcard(hosts[3]), + accept_language_settings.at(0).primary_pattern); + EXPECT_EQ(ContentSettingsPattern::Wildcard(), + accept_language_settings.at(0).secondary_pattern); + EXPECT_EQ(accept_language_dictionary, + accept_language_settings.at(0).setting_value); + + // Clear unpartitioned usage data through HTTPS scheme, make sure https site + // reduced accept language have been cleared when the specific origin HTTPS + // scheme exist. + args.ClearList(); + args.Append("http://www.google.com/"); + handler()->HandleClearUnpartitionedUsage(args.GetList()); + + // Validate the reduced accept language has been cleared. + host_content_settings_map->GetSettingsForOneType( + ContentSettingsType::REDUCED_ACCEPT_LANGUAGE, &accept_language_settings); + EXPECT_EQ(0U, accept_language_settings.size()); +} + TEST_F(SiteSettingsHandlerTest, HandleClearPartitionedUsage) { // Confirm that removing unpartitioned storage correctly removes the // appropriate nodes.
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc index cdeb952..744a8b9c 100644 --- a/chrome/browser/ui/webui/support_tool/support_tool_ui.cc +++ b/chrome/browser/ui/webui/support_tool/support_tool_ui.cc
@@ -177,7 +177,7 @@ for (const auto& account : signin_ui_util::GetOrderedAccountsForDisplay( profile, /*restrict_to_accounts_eligible_for_sync=*/false)) { if (!account.IsEmpty()) - account_list.Append(base::Value(account.email)); + account_list.Append(account.email); } return account_list; } @@ -188,7 +188,7 @@ CHECK_EQ(1U, args.size()); const base::Value& callback_id = args[0]; - ResolveJavascriptCallback(callback_id, base::Value(GetAccountsList())); + ResolveJavascriptCallback(callback_id, GetAccountsList()); } void SupportToolMessageHandler::HandleGetDataCollectors( @@ -201,8 +201,8 @@ net::GetValueForKeyInQuery(web_ui()->GetWebContents()->GetURL(), support_tool_ui::kModuleQuery, &module_query); - ResolveJavascriptCallback( - callback_id, base::Value(GetDataCollectorItemsInQuery(module_query))); + ResolveJavascriptCallback(callback_id, + GetDataCollectorItemsInQuery(module_query)); } void SupportToolMessageHandler::HandleGetAllDataCollectors( @@ -210,7 +210,7 @@ AllowJavascript(); CHECK_EQ(1U, args.size()); const base::Value& callback_id = args[0]; - ResolveJavascriptCallback(callback_id, base::Value(GetAllDataCollectors())); + ResolveJavascriptCallback(callback_id, GetAllDataCollectors()); } // Starts data collection with the issue details and selected set of data @@ -254,7 +254,7 @@ std::set<SupportToolError> errors) { AllowJavascript(); FireWebUIListener("data-collection-completed", - base::Value(GetDetectedPIIDataItems(detected_pii))); + GetDetectedPIIDataItems(detected_pii)); } void SupportToolMessageHandler::HandleCancelDataCollection( @@ -345,8 +345,7 @@ data_export_result.Set("path", std::string()); data_export_result.Set("error", export_error->error_message); } - FireWebUIListener("data-export-completed", - base::Value(std::move(data_export_result))); + FireWebUIListener("data-export-completed", data_export_result); } void SupportToolMessageHandler::HandleShowExportedDataInFolder( @@ -361,8 +360,8 @@ std::string case_id = args[1].GetString(); const base::Value::List* data_collectors = args[2].GetIfList(); DCHECK(data_collectors); - ResolveJavascriptCallback(callback_id, base::Value(GenerateCustomizedURL( - case_id, data_collectors))); + ResolveJavascriptCallback(callback_id, + GenerateCustomizedURL(case_id, data_collectors)); } ////////////////////////////////////////////////////////////////////////////////
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc index 64d04d6..af488f7 100644 --- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc +++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
@@ -251,7 +251,7 @@ // TODO(b/200511640): Set `keep` field to the value we'll get from URL's // pii_masking_on query if it exists. pii_data_item.Set(support_tool_ui::kPiiItemKeepKey, true); - detected_pii_data_items.Append(base::Value(std::move(pii_data_item))); + detected_pii_data_items.Append(std::move(pii_data_item)); } return detected_pii_data_items; } @@ -349,12 +349,12 @@ return included_data_collectors; } -base::Value GetStartDataCollectionResult(bool success, - std::string error_message) { +base::Value::Dict GetStartDataCollectionResult(bool success, + std::string error_message) { base::Value::Dict result; result.Set("success", success); result.Set("errorMessage", error_message); - return base::Value(std::move(result)); + return result; } base::FilePath GetDefaultFileToExport(base::FilePath suggested_path,
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h index 526ec8f..d1fbbba 100644 --- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h +++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.h
@@ -112,8 +112,8 @@ // success: boolean, // errorMessage: string, // } -base::Value GetStartDataCollectionResult(bool success, - std::string error_message); +base::Value::Dict GetStartDataCollectionResult(bool success, + std::string error_message); base::FilePath GetDefaultFileToExport(base::FilePath suggested_path, const std::string& case_id,
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc index 351a5b4..31f10b95 100644 --- a/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc +++ b/chrome/browser/ui/webui/sync_file_system_internals/extension_statuses_handler.cc
@@ -117,8 +117,7 @@ void ExtensionStatusesHandler::DidGetExtensionStatuses(std::string callback_id, base::Value::List list) { - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(list))); + ResolveJavascriptCallback(base::Value(callback_id), list); } } // namespace syncfs_internals
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc index 1b129e6..60fe6bd3 100644 --- a/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc +++ b/chrome/browser/ui/webui/sync_file_system_internals/file_metadata_handler.cc
@@ -86,8 +86,7 @@ void FileMetadataHandler::DidGetExtensions(std::string callback_id, base::Value::List list) { - ResolveJavascriptCallback(base::Value(callback_id), - base::Value(std::move(list))); + ResolveJavascriptCallback(base::Value(callback_id), list); } void FileMetadataHandler::DidGetFileMetadata(std::string callback_id,
diff --git a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc index 905705ca..34e39f6 100644 --- a/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc +++ b/chrome/browser/ui/webui/sync_file_system_internals/sync_file_system_internals_handler.cc
@@ -105,17 +105,17 @@ void SyncFileSystemInternalsHandler::OnLogRecorded( const sync_file_system::TaskLogger::TaskLog& task_log) { - base::DictionaryValue dict; + base::Value::Dict dict; int64_t duration = (task_log.end_time - task_log.start_time).InMilliseconds(); - dict.SetIntKey("duration", duration); - dict.SetStringKey("task_description", task_log.task_description); - dict.SetStringKey("result_description", task_log.result_description); + dict.Set("duration", static_cast<int>(duration)); + dict.Set("task_description", task_log.task_description); + dict.Set("result_description", task_log.result_description); - base::ListValue details; + base::Value::List details; for (const std::string& detail : task_log.details) { details.Append(detail); } - dict.SetKey("details", std::move(details)); + dict.Set("details", std::move(details)); FireWebUIListener("task-log-recorded", dict); } @@ -159,20 +159,20 @@ last_log_id_sent = args[1].GetInt(); // Collate events which haven't been sent to WebUI yet. - base::Value list(base::Value::Type::LIST); - for (auto log_entry = log.begin(); log_entry != log.end(); ++log_entry) { - if (log_entry->id <= last_log_id_sent) + base::Value::List list; + for (const auto& entry : log) { + if (entry.id <= last_log_id_sent) continue; - base::Value dict(base::Value::Type::DICTIONARY); - dict.SetIntKey("id", log_entry->id); - dict.SetStringKey("time", google_apis::util::FormatTimeAsStringLocaltime( - log_entry->when)); - dict.SetStringKey("logEvent", log_entry->what); + base::Value::Dict dict; + dict.Set("id", entry.id); + dict.Set("time", + google_apis::util::FormatTimeAsStringLocaltime(entry.when)); + dict.Set("logEvent", entry.what); list.Append(std::move(dict)); - last_log_id_sent = log_entry->id; + last_log_id_sent = entry.id; } - if (list.GetListDeprecated().empty()) + if (list.empty()) return; ResolveJavascriptCallback(callback_id, list);
diff --git a/chrome/browser/ui/webui/webapks/webapks_handler.cc b/chrome/browser/ui/webui/webapks/webapks_handler.cc index 77712f2..fedbf88 100644 --- a/chrome/browser/ui/webui/webapks/webapks_handler.cc +++ b/chrome/browser/ui/webui/webapks/webapks_handler.cc
@@ -47,38 +47,34 @@ void WebApksHandler::OnWebApkInfoRetrieved(const WebApkInfo& webapk_info) { if (!IsJavascriptAllowed()) return; - base::DictionaryValue result; - result.SetStringKey("name", webapk_info.name); - result.SetStringKey("shortName", webapk_info.short_name); - result.SetStringKey("packageName", webapk_info.package_name); - result.SetStringKey("id", webapk_info.id); - result.SetIntKey("shellApkVersion", webapk_info.shell_apk_version); - result.SetIntKey("versionCode", webapk_info.version_code); - result.SetStringKey("uri", webapk_info.uri); - result.SetStringKey("scope", webapk_info.scope); - result.SetStringKey("manifestUrl", webapk_info.manifest_url); - result.SetStringKey("manifestStartUrl", webapk_info.manifest_start_url); - result.SetStringKey("manifestId", webapk_info.manifest_id); - result.SetStringKey("displayMode", - blink::DisplayModeToString(webapk_info.display)); - result.SetStringKey( - "orientation", - blink::WebScreenOrientationLockTypeToString(webapk_info.orientation)); - result.SetStringKey("themeColor", - ui::OptionalSkColorToString(webapk_info.theme_color)); - result.SetStringKey("backgroundColor", ui::OptionalSkColorToString( - webapk_info.background_color)); - result.SetDoubleKey("lastUpdateCheckTimeMs", - webapk_info.last_update_check_time.ToJsTime()); - result.SetDoubleKey("lastUpdateCompletionTimeMs", - webapk_info.last_update_completion_time.ToJsTime()); - result.SetBoolKey("relaxUpdates", webapk_info.relax_updates); - result.SetStringKey("backingBrowser", - webapk_info.backing_browser_package_name); - result.SetBoolKey("isBackingBrowser", webapk_info.is_backing_browser); - result.SetStringKey("updateStatus", - webapk_info.is_backing_browser - ? webapk_info.update_status - : "Current browser doesn't own this WebAPK."); + base::Value::Dict result; + result.Set("name", webapk_info.name); + result.Set("shortName", webapk_info.short_name); + result.Set("packageName", webapk_info.package_name); + result.Set("id", webapk_info.id); + result.Set("shellApkVersion", webapk_info.shell_apk_version); + result.Set("versionCode", webapk_info.version_code); + result.Set("uri", webapk_info.uri); + result.Set("scope", webapk_info.scope); + result.Set("manifestUrl", webapk_info.manifest_url); + result.Set("manifestStartUrl", webapk_info.manifest_start_url); + result.Set("manifestId", webapk_info.manifest_id); + result.Set("displayMode", blink::DisplayModeToString(webapk_info.display)); + result.Set("orientation", blink::WebScreenOrientationLockTypeToString( + webapk_info.orientation)); + result.Set("themeColor", + ui::OptionalSkColorToString(webapk_info.theme_color)); + result.Set("backgroundColor", + ui::OptionalSkColorToString(webapk_info.background_color)); + result.Set("lastUpdateCheckTimeMs", + webapk_info.last_update_check_time.ToJsTime()); + result.Set("lastUpdateCompletionTimeMs", + webapk_info.last_update_completion_time.ToJsTime()); + result.Set("relaxUpdates", webapk_info.relax_updates); + result.Set("backingBrowser", webapk_info.backing_browser_package_name); + result.Set("isBackingBrowser", webapk_info.is_backing_browser); + result.Set("updateStatus", webapk_info.is_backing_browser + ? webapk_info.update_status + : "Current browser doesn't own this WebAPK."); FireWebUIListener("web-apk-info", result); }
diff --git a/chrome/browser/ui/webui/welcome/ntp_background_handler.cc b/chrome/browser/ui/webui/welcome/ntp_background_handler.cc index cb603f9..ef6512db 100644 --- a/chrome/browser/ui/webui/welcome/ntp_background_handler.cc +++ b/chrome/browser/ui/webui/welcome/ntp_background_handler.cc
@@ -119,7 +119,7 @@ list_value.Append(std::move(element)); } - ResolveJavascriptCallback(callback_id, base::Value(std::move(list_value))); + ResolveJavascriptCallback(callback_id, list_value); } void NtpBackgroundHandler::HandleSetBackground(const base::Value::List& args) {
diff --git a/chrome/browser/web_applications/commands/web_app_install_command_unittest.cc b/chrome/browser/web_applications/commands/web_app_install_command_unittest.cc index 4ee7c5eb..425765be 100644 --- a/chrome/browser/web_applications/commands/web_app_install_command_unittest.cc +++ b/chrome/browser/web_applications/commands/web_app_install_command_unittest.cc
@@ -9,7 +9,6 @@ #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/web_applications/test/fake_data_retriever.h" -#include "chrome/browser/web_applications/test/fake_install_finalizer.h" #include "chrome/browser/web_applications/test/fake_web_app_provider.h" #include "chrome/browser/web_applications/test/fake_web_app_ui_manager.h" #include "chrome/browser/web_applications/test/test_file_utils.h" @@ -139,17 +138,14 @@ std::unique_ptr<WebAppDataRetriever> SetupFakeDataRetriever( IconsMap icons_map, IconsDownloadedResult result, - const std::vector<int>& http_status_codes) { - DCHECK_EQ(icons_map.size(), http_status_codes.size()); + int http_status_codes) { auto data_retriever = std::make_unique<FakeDataRetriever>(); data_retriever->SetIconsDownloadedResult(result); - int icon_index = 0; DownloadedIconsHttpResults http_results; for (const auto& url_and_bitmap : icons_map) { - http_results[url_and_bitmap.first] = http_status_codes[icon_index]; - ++icon_index; + http_results[url_and_bitmap.first] = http_status_codes; } data_retriever->SetDownloadedIconsHttpResults(std::move(http_results)); @@ -332,7 +328,6 @@ static_cast<int>(IconPurpose::kMinValue) + 1, "All purposes covered"); - auto data_retriever = std::make_unique<FakeDataRetriever>(); auto manifest = CreateValidManifest(); // Prepare all the data to be fetched or downloaded. @@ -351,8 +346,7 @@ icons_map[icon_url] = {CreateSquareIcon(s, purpose_info.color)}; } } - - data_retriever->SetIcons(std::move(icons_map)); + int num_of_icons = icons_map.size(); // TestingProfile creates temp directory if TestingProfile::path_ is empty // (i.e. if TestingProfile::Builder::SetPath was not called by a test fixture) @@ -362,7 +356,10 @@ EXPECT_FALSE(file_utils().DirectoryExists(manifest_resources_directory)); EXPECT_EQ( - InstallAndWait(kWebAppId, std::move(data_retriever), + InstallAndWait(kWebAppId, + SetupFakeDataRetriever(std::move(icons_map), + IconsDownloadedResult::kCompleted, + net::HttpStatusCode::HTTP_OK), webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), std::move(manifest), @@ -415,6 +412,138 @@ EXPECT_TRUE(pngs.empty()); } + const int http_code_class_ok = 2; // HTTP_OK is 200. + histogram_tester().ExpectBucketCount( + "WebApp.Icon.HttpStatusCodeClassOnCreate", http_code_class_ok, + num_of_icons); + histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnSync", + 0); + + histogram_tester().ExpectBucketCount("WebApp.Icon.DownloadedResultOnCreate", + IconsDownloadedResult::kCompleted, 1); + + histogram_tester().ExpectBucketCount( + "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", + net::HttpStatusCode::HTTP_OK, 1); +} + +TEST_F(WebAppInstallCommandTest, GetIcons_PrimaryPageChanged) { + const base::FilePath web_apps_dir = GetWebAppsRootDirectory(profile()); + const base::FilePath manifest_resources_directory = + GetManifestResourcesDirectory(web_apps_dir); + EXPECT_FALSE(file_utils().DirectoryExists(manifest_resources_directory)); + + IconsMap icons_map; + EXPECT_EQ( + InstallAndWait( + kWebAppId, + SetupFakeDataRetriever(std::move(icons_map), + IconsDownloadedResult::kPrimaryPageChanged, + net::HttpStatusCode::HTTP_OK), + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, + CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), + CreateValidManifest(), kWebAppManifestUrl, + WebAppInstallFlow::kInstallSite, /*install_params=*/absl::nullopt), + webapps::InstallResultCode::kSuccessNewInstall); + + EXPECT_TRUE(file_utils().DirectoryExists(manifest_resources_directory)); + + const base::FilePath temp_dir = web_apps_dir.AppendASCII("Temp"); + EXPECT_TRUE(file_utils().DirectoryExists(temp_dir)); + EXPECT_TRUE(file_utils().IsDirectoryEmpty(temp_dir)); + + for (const std::string icon_dir : + {"Icons", "Icons Monochrome", "Icons Maskable"}) { + const base::FilePath app_dir = + manifest_resources_directory.AppendASCII(kWebAppId); + EXPECT_TRUE(file_utils().DirectoryExists(app_dir)); + + const base::FilePath icons_dir = app_dir.AppendASCII(icon_dir); + EXPECT_TRUE(file_utils().DirectoryExists(icons_dir)); + + std::map<SquareSizePx, SkBitmap> pngs = + ReadPngsFromDirectory(&file_utils(), icons_dir); + if (icon_dir == "Icons") { + // Auto generated ANY icons. + EXPECT_EQ(GetIconSizes().size(), pngs.size()); + EXPECT_TRUE(ContainsOneIconOfEachSize(pngs)); + } else { + EXPECT_TRUE(pngs.empty()); + } + } + + histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnCreate", + 0); + histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnSync", + 0); + + histogram_tester().ExpectBucketCount( + "WebApp.Icon.DownloadedResultOnCreate", + IconsDownloadedResult::kPrimaryPageChanged, 1); + histogram_tester().ExpectTotalCount("WebApp.Icon.DownloadedResultOnSync", 0); + + histogram_tester().ExpectTotalCount( + "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", 0); + histogram_tester().ExpectTotalCount( + "WebApp.Icon.DownloadedHttpStatusCodeOnSync", 0); +} + +TEST_F(WebAppInstallCommandTest, GetIcons_IconNotFound) { + const base::FilePath web_apps_dir = GetWebAppsRootDirectory(profile()); + const base::FilePath manifest_resources_directory = + GetManifestResourcesDirectory(web_apps_dir); + EXPECT_FALSE(file_utils().DirectoryExists(manifest_resources_directory)); + + IconsMap icons_map; + AddEmptyIconToIconsMap(GURL("https://example.com/app.ico"), &icons_map); + + EXPECT_EQ( + InstallAndWait( + kWebAppId, + SetupFakeDataRetriever(std::move(icons_map), + IconsDownloadedResult::kCompleted, + net::HttpStatusCode::HTTP_NOT_FOUND), + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, + CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), + CreateValidManifest(), kWebAppManifestUrl, + WebAppInstallFlow::kInstallSite, /*install_params=*/absl::nullopt), + webapps::InstallResultCode::kSuccessNewInstall); + + EXPECT_TRUE(file_utils().DirectoryExists(manifest_resources_directory)); + + const base::FilePath temp_dir = web_apps_dir.AppendASCII("Temp"); + EXPECT_TRUE(file_utils().DirectoryExists(temp_dir)); + EXPECT_TRUE(file_utils().IsDirectoryEmpty(temp_dir)); + + for (const std::string icon_dir : + {"Icons", "Icons Monochrome", "Icons Maskable"}) { + const base::FilePath app_dir = + manifest_resources_directory.AppendASCII(kWebAppId); + EXPECT_TRUE(file_utils().DirectoryExists(app_dir)); + + const base::FilePath icons_dir = app_dir.AppendASCII(icon_dir); + EXPECT_TRUE(file_utils().DirectoryExists(icons_dir)); + + std::map<SquareSizePx, SkBitmap> pngs = + ReadPngsFromDirectory(&file_utils(), icons_dir); + if (icon_dir == "Icons") { + // Auto generated ANY icons. + EXPECT_EQ(GetIconSizes().size(), pngs.size()); + EXPECT_TRUE(ContainsOneIconOfEachSize(pngs)); + } else { + EXPECT_TRUE(pngs.empty()); + } + } + + histogram_tester().ExpectBucketCount("WebApp.Icon.DownloadedResultOnCreate", + IconsDownloadedResult::kCompleted, 1); + histogram_tester().ExpectTotalCount("WebApp.Icon.DownloadedResultOnSync", 0); + + histogram_tester().ExpectBucketCount( + "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", + net::HttpStatusCode::HTTP_NOT_FOUND, 1); + histogram_tester().ExpectTotalCount( + "WebApp.Icon.DownloadedHttpStatusCodeOnSync", 0); } TEST_F(WebAppInstallCommandTest, WriteDataToDiskFailed) { @@ -436,7 +565,7 @@ kWebAppId, SetupFakeDataRetriever(std::move(icons_map), IconsDownloadedResult::kCompleted, - {net::HttpStatusCode::HTTP_OK}), + net::HttpStatusCode::HTTP_OK), webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), CreateValidManifest(), kWebAppManifestUrl, @@ -473,151 +602,5 @@ } #endif -class WebAppInstallCommandTestWithFakeFinalizer - : public WebAppInstallCommandTest { - public: - void SetUp() override { - WebAppTest::SetUp(); - FakeWebAppProvider* provider = FakeWebAppProvider::Get(profile()); - provider->SetDefaultFakeSubsystems(); - auto finalizer = std::make_unique<FakeInstallFinalizer>(); - fake_install_finalizer_ = finalizer.get(); - provider->SetInstallFinalizer(std::move(finalizer)); - provider->SetRunSubsystemStartupTasks(true); - - test::AwaitStartWebAppProviderAndSubsystems(profile()); - } - - void TearDown() override { WebAppTest::TearDown(); } - - FakeInstallFinalizer* fake_install_finalizer() { - return fake_install_finalizer_; - } - - private: - raw_ptr<FakeInstallFinalizer> fake_install_finalizer_ = nullptr; -}; - -TEST_F(WebAppInstallCommandTestWithFakeFinalizer, GetIcons) { - const GURL icon_url = GURL("https://example.com/app.ico"); - const SkColor color = SK_ColorBLUE; - - // Generate one icon as if it was downloaded. - IconsMap icons_map; - AddIconToIconsMap(icon_url, icon_size::k128, color, &icons_map); - - EXPECT_EQ( - InstallAndWait( - kWebAppId, - SetupFakeDataRetriever(std::move(icons_map), - IconsDownloadedResult::kCompleted, - {net::HttpStatusCode::HTTP_OK}), - webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, - CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), - CreateValidManifest(), kWebAppManifestUrl, - WebAppInstallFlow::kInstallSite, /*install_params=*/absl::nullopt), - webapps::InstallResultCode::kSuccessNewInstall); - - std::unique_ptr<WebAppInstallInfo> web_app_info = - fake_install_finalizer()->web_app_info(); - - // Make sure that icons have been generated for all sub sizes. - EXPECT_TRUE(ContainsOneIconOfEachSize(web_app_info->icon_bitmaps.any)); - - // Generated icons are not considered part of the manifest icons. - EXPECT_TRUE(web_app_info->manifest_icons.empty()); - - // Generated icons are not considered part of the manifest shortcut icons. - EXPECT_TRUE(web_app_info->shortcuts_menu_item_infos.empty()); - - const int http_code_class_ok = 2; // HTTP_OK is 200. - histogram_tester().ExpectUniqueSample( - "WebApp.Icon.HttpStatusCodeClassOnCreate", http_code_class_ok, 1); - histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnSync", - 0); - - histogram_tester().ExpectBucketCount("WebApp.Icon.DownloadedResultOnCreate", - IconsDownloadedResult::kCompleted, 1); - - histogram_tester().ExpectBucketCount( - "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", - net::HttpStatusCode::HTTP_OK, 1); -} - -TEST_F(WebAppInstallCommandTestWithFakeFinalizer, GetIcons_PrimaryPageChanged) { - IconsMap icons_map; - EXPECT_EQ( - InstallAndWait( - kWebAppId, - SetupFakeDataRetriever(std::move(icons_map), - IconsDownloadedResult::kPrimaryPageChanged, - /*http_status_codes=*/{}), - webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, - CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), - CreateValidManifest(), kWebAppManifestUrl, - WebAppInstallFlow::kInstallSite, /*install_params=*/absl::nullopt), - webapps::InstallResultCode::kSuccessNewInstall); - - std::unique_ptr<WebAppInstallInfo> web_app_info = - fake_install_finalizer()->web_app_info(); - - // Make sure that icons have been generated for all sizes. - EXPECT_TRUE(ContainsOneIconOfEachSize(web_app_info->icon_bitmaps.any)); - - // Generated icons are not considered part of the manifest icons. - EXPECT_TRUE(web_app_info->manifest_icons.empty()); - - // Generated icons are not considered part of the manifest shortcut icons. - EXPECT_TRUE(web_app_info->shortcuts_menu_item_infos.empty()); - - histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnCreate", - 0); - histogram_tester().ExpectTotalCount("WebApp.Icon.HttpStatusCodeClassOnSync", - 0); - - histogram_tester().ExpectBucketCount( - "WebApp.Icon.DownloadedResultOnCreate", - IconsDownloadedResult::kPrimaryPageChanged, 1); - histogram_tester().ExpectTotalCount("WebApp.Icon.DownloadedResultOnSync", 0); - - histogram_tester().ExpectTotalCount( - "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", 0); - histogram_tester().ExpectTotalCount( - "WebApp.Icon.DownloadedHttpStatusCodeOnSync", 0); -} - -TEST_F(WebAppInstallCommandTestWithFakeFinalizer, GetIcons_IconNotFound) { - IconsMap icons_map; - AddEmptyIconToIconsMap(GURL("https://example.com/app.ico"), &icons_map); - - EXPECT_EQ( - InstallAndWait( - kWebAppId, - SetupFakeDataRetriever(std::move(icons_map), - IconsDownloadedResult::kCompleted, - {net::HttpStatusCode::HTTP_NOT_FOUND}), - webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON, - CreateDialogCallback(true), std::make_unique<WebAppInstallInfo>(), - CreateValidManifest(), kWebAppManifestUrl, - WebAppInstallFlow::kInstallSite, /*install_params=*/absl::nullopt), - webapps::InstallResultCode::kSuccessNewInstall); - - std::unique_ptr<WebAppInstallInfo> web_app_info = - fake_install_finalizer()->web_app_info(); - EXPECT_TRUE(ContainsOneIconOfEachSize(web_app_info->icon_bitmaps.any)); - EXPECT_TRUE(web_app_info->manifest_icons.empty()); - EXPECT_TRUE(web_app_info->shortcuts_menu_item_infos.empty()); - - histogram_tester().ExpectBucketCount("WebApp.Icon.DownloadedResultOnCreate", - IconsDownloadedResult::kCompleted, 1); - histogram_tester().ExpectTotalCount("WebApp.Icon.DownloadedResultOnSync", 0); - - histogram_tester().ExpectBucketCount( - "WebApp.Icon.DownloadedHttpStatusCodeOnCreate", - net::HttpStatusCode::HTTP_NOT_FOUND, 1); - histogram_tester().ExpectTotalCount( - "WebApp.Icon.DownloadedHttpStatusCodeOnSync", 0); -} - } // namespace } // namespace web_app
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index ad08e66..5c99538 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1660305329-d469f7c067ccbc040ea1532d9744d686607756e6.profdata +chrome-linux-main-1660327175-91d165ef36ddf98dfe32da5f45fdea7a77e48a2f.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 2cbf6eb..9bd9051e 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1660305329-7ab1f215c11f7e5f94f5a836978a2afdb53b28fa.profdata +chrome-mac-arm-main-1660327175-2a0722e50ee9911a8cdc9f3500d8e0bac864a4b4.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index c28acfba..45eece3b 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1660305329-75e3ab3ddf35f21b72c02ddf684ab9c682f29c5d.profdata +chrome-mac-main-1660327175-5f5785375562c84b0e2dd4ef41737e4bd7331f2e.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 99bd081..4a79934a 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1660294713-79b1373d188aaba4151f16ecb23712234c83ca60.profdata +chrome-win32-main-1660316344-9a6770416ead90e7b64c3f8bf397efac10eb93de.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index e39da60..f5c8edd 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1660305329-7d9572f8647c96cc13dcfb90b91813b5412e1269.profdata +chrome-win64-main-1660327175-fa53dc4cbf040ec80ffa3cc50a7bf0c1a78f5a48.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 2965af4b..f25c9f0 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -155,7 +155,6 @@ "$root_gen_dir/chrome/new_tab_page_instant_resources.pak", "$root_gen_dir/chrome/new_tab_page_resources.pak", "$root_gen_dir/chrome/new_tab_page_third_party_resources.pak", - "$root_gen_dir/chrome/password_manager_resources.pak", "$root_gen_dir/chrome/privacy_sandbox_resources.pak", "$root_gen_dir/chrome/profile_internals_resources.pak", "$root_gen_dir/chrome/settings_resources.pak", @@ -190,7 +189,6 @@ "//chrome/browser/resources/new_tab_page:resources", "//chrome/browser/resources/new_tab_page_instant:resources", "//chrome/browser/resources/new_tab_page_third_party:resources", - "//chrome/browser/resources/password_manager:resources", "//chrome/browser/resources/privacy_sandbox:resources", "//chrome/browser/resources/profile_internals:resources", "//chrome/browser/resources/settings:resources",
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index ecbae59..e93d13e7 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -155,7 +155,6 @@ #endif const char kChromeUIPasswordManagerInternalsHost[] = "password-manager-internals"; -const char kChromeUIPasswordManagerHost[] = "password-manager"; const char kChromeUIPolicyHost[] = "policy"; const char kChromeUIPolicyURL[] = "chrome://policy/"; const char kChromeUIPredictorsHost[] = "predictors"; @@ -660,7 +659,6 @@ kChromeUIOmniboxHost, optimization_guide_internals::kChromeUIOptimizationGuideInternalsHost, kChromeUIPasswordManagerInternalsHost, - kChromeUIPasswordManagerHost, kChromeUIPolicyHost, kChromeUIPredictorsHost, kChromeUIPrefsInternalsHost,
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index a716fea..9243c8a 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -151,7 +151,6 @@ extern const char kChromeUIOsUrlAppURL[]; #endif extern const char kChromeUIPasswordManagerInternalsHost[]; -extern const char kChromeUIPasswordManagerHost[]; extern const char kChromeUIPolicyHost[]; extern const char kChromeUIPolicyURL[]; extern const char kChromeUIPredictorsHost[];
diff --git a/chrome/services/media_gallery_util/public/cpp/BUILD.gn b/chrome/services/media_gallery_util/public/cpp/BUILD.gn index 78515b6..03b588b 100644 --- a/chrome/services/media_gallery_util/public/cpp/BUILD.gn +++ b/chrome/services/media_gallery_util/public/cpp/BUILD.gn
@@ -6,6 +6,8 @@ source_set("cpp") { sources = [ + "local_media_data_source_factory.cc", + "local_media_data_source_factory.h", "media_parser_provider.cc", "media_parser_provider.h", "safe_audio_video_checker.cc", @@ -15,6 +17,7 @@ ] deps = [ + "//base", "//chrome/app:generated_resources", "//chrome/common", "//content/public/browser",
diff --git a/chrome/browser/thumbnail/generator/android/local_media_data_source_factory.cc b/chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.cc similarity index 96% rename from chrome/browser/thumbnail/generator/android/local_media_data_source_factory.cc rename to chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.cc index 48814ae9..8d6c2989 100644 --- a/chrome/browser/thumbnail/generator/android/local_media_data_source_factory.cc +++ b/chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.cc
@@ -2,11 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/thumbnail/generator/android/local_media_data_source_factory.h" +#include "chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.h" #include <vector> -#include "base/android/content_uri_utils.h" #include "base/bind.h" #include "base/callback.h" #include "base/files/file.h" @@ -16,6 +15,10 @@ #include "build/build_config.h" #include "mojo/public/cpp/bindings/receiver.h" +#if BUILDFLAG(IS_ANDROID) +#include "base/android/content_uri_utils.h" +#endif // BUILDFLAG(IS_ANDROID) + namespace { using MediaDataCallback =
diff --git a/chrome/browser/thumbnail/generator/android/local_media_data_source_factory.h b/chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.h similarity index 86% rename from chrome/browser/thumbnail/generator/android/local_media_data_source_factory.h rename to chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.h index 26b4cb9..d85224a 100644 --- a/chrome/browser/thumbnail/generator/android/local_media_data_source_factory.h +++ b/chrome/services/media_gallery_util/public/cpp/local_media_data_source_factory.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_THUMBNAIL_GENERATOR_ANDROID_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_ -#define CHROME_BROWSER_THUMBNAIL_GENERATOR_ANDROID_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_ +#ifndef CHROME_SERVICES_MEDIA_GALLERY_UTIL_PUBLIC_CPP_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_ +#define CHROME_SERVICES_MEDIA_GALLERY_UTIL_PUBLIC_CPP_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_ #include <memory> @@ -42,4 +42,4 @@ scoped_refptr<base::SequencedTaskRunner> file_task_runner_; }; -#endif // CHROME_BROWSER_THUMBNAIL_GENERATOR_ANDROID_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_ +#endif // CHROME_SERVICES_MEDIA_GALLERY_UTIL_PUBLIC_CPP_LOCAL_MEDIA_DATA_SOURCE_FACTORY_H_
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index df6945b..17e8894 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -8095,7 +8095,6 @@ ] deps += [ - "../browser/enterprise/connectors/device_trust/key_management/core/persistence:unit_tests", "../browser/enterprise/connectors/device_trust/key_management/installer/management_service:unit_tests", "//components/dbus/thread_linux", ] @@ -8357,6 +8356,7 @@ "../browser/enterprise/connectors/device_trust/key_management/core/network:unit_tests", "../browser/enterprise/connectors/device_trust/key_management/core/persistence", "../browser/enterprise/connectors/device_trust/key_management/core/persistence:test_support", + "../browser/enterprise/connectors/device_trust/key_management/core/persistence:unit_tests", "../browser/enterprise/connectors/device_trust/key_management/installer:unit_tests", "../browser/enterprise/connectors/device_trust/signals/decorators/browser:unit_tests", "//components/device_signals/core/browser", @@ -8530,9 +8530,6 @@ } if (toolkit_views) { - # Test accessibility checks that audit any UI opened in a browser test. - sources += [ "views/accessibility_checker_unittest.cc" ] - deps += [ "//chrome:unit_tests_pak", "//chrome/browser/ui/tabs:tab_enums",
diff --git a/chrome/test/data/extensions/api_test/passwords_private/test.js b/chrome/test/data/extensions/api_test/passwords_private/test.js index 094ebdb4..b2da740b 100644 --- a/chrome/test/data/extensions/api_test/passwords_private/test.js +++ b/chrome/test/data/extensions/api_test/passwords_private/test.js
@@ -269,6 +269,11 @@ let callback = function(importResults) { chrome.test.assertNoLastError(); chrome.test.assertTrue(!!importResults); + chrome.test.assertEq( + chrome.passwordsPrivate.ImportResultsStatus.SUCCESS, + importResults.status); + chrome.test.assertEq(42, importResults.numberImported); + chrome.test.assertEq('test.csv', importResults.fileName); chrome.test.succeed(); }; chrome.passwordsPrivate.importPasswords(
diff --git a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js index acaf8823..e0210b4b 100644 --- a/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js +++ b/chrome/test/data/webui/chromeos/shimless_rma/shimless_rma_app_test.js
@@ -575,4 +575,28 @@ component.shadowRoot.querySelector('hardware-error-page'); assertTrue(!!hardwareErrorPage); }); + + test('RebootErrorCodeResultsInShowingRebootPage', async () => { + await initializeShimlessRMAApp(fakeStates, fakeChromeVersion[0]); + + // Emulate platform sending a reboot error code. + component.dispatchEvent(new CustomEvent( + 'transition-state', + { + bubbles: true, + composed: true, + detail: () => Promise.resolve({ + stateResult: { + state: State.kWPDisableComplete, + error: RmadErrorCode.kExpectReboot, + }, + }), + }, + )); + await flushTasks(); + + // Confirm transition to the reboot page. + const rebootPage = component.shadowRoot.querySelector('reboot-page'); + assertTrue(!!rebootPage); + }); }
diff --git a/chrome/test/data/webui/cr_elements/cr_checkbox_test.ts b/chrome/test/data/webui/cr_elements/cr_checkbox_test.ts index ee45be7..6f756e8 100644 --- a/chrome/test/data/webui/cr_elements/cr_checkbox_test.ts +++ b/chrome/test/data/webui/cr_elements/cr_checkbox_test.ts
@@ -26,7 +26,8 @@ `; checkbox = document.querySelector('cr-checkbox')!; - innerCheckbox = checkbox.$$('#checkbox') as HTMLElement; + innerCheckbox = + checkbox.shadowRoot!.querySelector('#checkbox')! as HTMLElement; assertNotChecked(); }); @@ -177,7 +178,8 @@ `; checkbox = document.querySelector('cr-checkbox')!; - innerCheckbox = checkbox.$$('#checkbox') as HTMLElement; + innerCheckbox = + checkbox.shadowRoot!.querySelector('#checkbox')! as HTMLElement; // Should not override tabindex if it is initialized. assertEquals(-1, checkbox.tabIndex); @@ -191,7 +193,8 @@ `; checkbox = document.querySelector('cr-checkbox')!; - innerCheckbox = checkbox.$$('#checkbox') as HTMLElement; + innerCheckbox = + checkbox.shadowRoot!.querySelector('#checkbox')! as HTMLElement; // Initializing with disabled should make tabindex="-1". assertEquals(-1, checkbox.tabIndex);
diff --git a/chrome/test/data/webui/settings/chromeos/device_page_tests.js b/chrome/test/data/webui/settings/chromeos/device_page_tests.js index 948689b..3c47f55 100644 --- a/chrome/test/data/webui/settings/chromeos/device_page_tests.js +++ b/chrome/test/data/webui/settings/chromeos/device_page_tests.js
@@ -821,14 +821,6 @@ defaultFakeAudioSystemProperties.outputVolumePercent, outputVolumeSlider.value); - // Test max volume case. - crosAudioConfig.setAudioSystemProperties( - maxVolumePercentFakeAudioSystemProperties); - await flushTasks(); - assertEquals( - maxVolumePercentFakeAudioSystemProperties.outputVolumePercent, - outputVolumeSlider.value); - // Test min volume case. crosAudioConfig.setAudioSystemProperties( minVolumePercentFakeAudioSystemProperties); @@ -836,6 +828,52 @@ assertEquals( minVolumePercentFakeAudioSystemProperties.outputVolumePercent, outputVolumeSlider.value); + + // Test max volume case. + crosAudioConfig.setAudioSystemProperties( + maxVolumePercentFakeAudioSystemProperties); + await flushTasks(); + assertEquals( + maxVolumePercentFakeAudioSystemProperties.outputVolumePercent, + outputVolumeSlider.value); + }); + + test('simulate setting output volume slider mojo test', async function() { + async function simulateSliderClicked(value) { + const outputVolumeSlider = + audioPage.shadowRoot.querySelector('#outputVolumeSlider'); + const rect = outputVolumeSlider.$.container.getBoundingClientRect(); + outputVolumeSlider.dispatchEvent(new PointerEvent('pointerdown', { + buttons: 1, + pointerId: 1, + clientX: rect.left + (value * rect.width), + })); + return await flushTasks(); + } + + // Test clicking to min volume case. + const minOutputVolumePercent = 0; + await simulateSliderClicked(minOutputVolumePercent / 100); + assertEquals( + minOutputVolumePercent, + audioPage.audioSystemProperties_.outputVolumePercent, + ); + + // Test clicking to max volume case. + const maxOutputVolumePercent = 100; + await simulateSliderClicked(maxOutputVolumePercent / 100); + assertEquals( + maxOutputVolumePercent, + audioPage.audioSystemProperties_.outputVolumePercent, + ); + + // Test clicking to non-boundary volume case. + const nonBoundaryOutputVolumePercent = 50; + await simulateSliderClicked(50 / 100); + assertEquals( + nonBoundaryOutputVolumePercent, + audioPage.audioSystemProperties_.outputVolumePercent, + ); }); test('output mute mojo test', async function() { @@ -893,7 +931,6 @@ activeSpeakerFakeAudioSystemProperties.outputDevices.length, outputDeviceDropdown.length); }); - }); suite(assert(TestNames.Pointers), function() {
diff --git a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts index 8bd8696a..474093b 100644 --- a/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts +++ b/chrome/test/data/webui/settings/passwords_and_autofill_fake_data.ts
@@ -331,8 +331,14 @@ /** * Helper method used to create a passwords import dialog. */ - createPasswordsImportDialog(): PasswordsImportDialogElement { + createPasswordsImportDialog( + isUserSyncingPasswords: boolean = false, + isAccountStoreUser: boolean = false, + accountEmail: string = ''): PasswordsImportDialogElement { const dialog = this.document.createElement('passwords-import-dialog'); + dialog.isUserSyncingPasswords = isUserSyncingPasswords; + dialog.isAccountStoreUser = isAccountStoreUser; + dialog.accountEmail = accountEmail; this.document.body.appendChild(dialog); flush(); return dialog;
diff --git a/chrome/test/data/webui/settings/passwords_import_dialog_test.ts b/chrome/test/data/webui/settings/passwords_import_dialog_test.ts index f1b8678..5a5f829c 100644 --- a/chrome/test/data/webui/settings/passwords_import_dialog_test.ts +++ b/chrome/test/data/webui/settings/passwords_import_dialog_test.ts
@@ -9,7 +9,7 @@ import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {ImportDialogState, PasswordsImportDialogElement} from 'chrome://settings/lazy_load.js'; -import {PasswordManagerImpl, SettingsPluralStringProxyImpl} from 'chrome://settings/settings.js'; +import {PasswordManagerImpl, SettingsPluralStringProxyImpl, CrButtonElement} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js'; @@ -23,14 +23,51 @@ importDialog: PasswordsImportDialogElement, passwordManager: TestPasswordManagerProxy) { const chooseFile = - importDialog.shadowRoot!.querySelector<HTMLElement>('#chooseFile'); + importDialog.shadowRoot!.querySelector<CrButtonElement>('#chooseFile'); assertTrue(!!chooseFile); assertTrue(isVisible(chooseFile)); chooseFile.click(); + flush(); + + // In progress state after the click. + const spinner = importDialog.shadowRoot!.querySelector('paper-spinner-lite'); + assertTrue(!!spinner); + assertTrue(spinner.active); + assertTrue(chooseFile.disabled); + // Import flow should have been triggered. await passwordManager.whenCalled('importPasswords'); } +function assertIntialStatePartsAndClose( + importDialog: PasswordsImportDialogElement, expectedDescription: string) { + assertEquals(ImportDialogState.START, importDialog.dialogState); + + const spinner = importDialog.shadowRoot!.querySelector('paper-spinner-lite'); + assertTrue(!!spinner); + assertFalse(spinner.active); + + const cancel = + importDialog.shadowRoot!.querySelector<CrButtonElement>('#cancel'); + assertTrue(!!cancel); + const chooseFile = + importDialog.shadowRoot!.querySelector<CrButtonElement>('#chooseFile'); + assertTrue(!!chooseFile); + + assertTrue(isVisible(cancel)); + assertTrue(isVisible(chooseFile)); + assertFalse(cancel.disabled); + assertFalse(chooseFile.disabled); + + assertEquals(importDialog.i18n('cancel'), cancel.textContent!.trim()); + assertEquals( + importDialog.i18n('importPasswordsChooseFile'), + chooseFile.textContent!.trim()); + assertEquals( + expectedDescription, importDialog.$.descriptionText.textContent!.trim()); + cancel.click(); +} + suite('PasswordsImportDialog', function() { let passwordManager: TestPasswordManagerProxy; let pluralString: TestPluralStringProxy; @@ -46,29 +83,37 @@ elementFactory = new PasswordSectionElementFactory(document); }); - test('hasCorrectInitialState', async function() { - const importDialog = elementFactory.createPasswordsImportDialog(); - assertEquals(ImportDialogState.START, importDialog.dialogState); + test('hasCorrectNonSyncingInitialState', async function() { + const importDialog = elementFactory.createPasswordsImportDialog( + /*isUserSyncingPasswords=*/ false, /*isAccountStoreUser=*/ false); - const cancel = - importDialog.shadowRoot!.querySelector<HTMLElement>('#cancel'); - assertTrue(!!cancel); - const chooseFile = - importDialog.shadowRoot!.querySelector<HTMLElement>('#chooseFile'); - assertTrue(!!chooseFile); + assertIntialStatePartsAndClose( + importDialog, importDialog.i18n('importPasswordsDescriptionDevice')); - assertTrue(isVisible(cancel)); - assertTrue(isVisible(chooseFile)); + await eventToPromise('close', importDialog); + }); - assertEquals(importDialog.i18n('cancel'), cancel.textContent!.trim()); - assertEquals( - importDialog.i18n('importPasswordsChooseFile'), - chooseFile.textContent!.trim()); - assertEquals( - importDialog.i18n('importPasswordsGenericDescription'), - importDialog.$.descriptionText.textContent!.trim()); + test('hasCorrectSyncingInitialState', async function() { + const importDialog = elementFactory.createPasswordsImportDialog( + /*isUserSyncingPasswords=*/ true, /*isAccountStoreUser=*/ false, + /*accountEmail=*/ 'test@test.com'); - cancel.click(); + assertIntialStatePartsAndClose( + importDialog, + importDialog.i18n( + 'importPasswordsDescriptionAccount', 'test@test.com')); + + await eventToPromise('close', importDialog); + }); + + test('hasCorrectButterInitialState', async function() { + const importDialog = elementFactory.createPasswordsImportDialog( + /*isUserSyncingPasswords=*/ false, /*isAccountStoreUser=*/ true, + /*accountEmail=*/ 'test@test.com'); + + assertIntialStatePartsAndClose( + importDialog, importDialog.i18n('importPasswordsGenericDescription')); + await eventToPromise('close', importDialog); }); @@ -126,10 +171,12 @@ importDialog.i18n('importPasswordsBadFormatError', 'test.csv'), importDialog.$.descriptionText.textContent!.trim()); - const close = importDialog.shadowRoot!.querySelector<HTMLElement>('#close'); + const close = + importDialog.shadowRoot!.querySelector<CrButtonElement>('#close'); assertTrue(!!close); assertEquals(importDialog.i18n('close'), close.textContent!.trim()); assertTrue(isVisible(close)); + assertFalse(close.disabled); close.click(); await eventToPromise('close', importDialog); }); @@ -153,10 +200,12 @@ importDialog.i18n('importPasswordsUnknownError'), importDialog.$.descriptionText.textContent!.trim()); - const close = importDialog.shadowRoot!.querySelector<HTMLElement>('#close'); + const close = + importDialog.shadowRoot!.querySelector<CrButtonElement>('#close'); assertTrue(!!close); assertEquals(importDialog.i18n('close'), close.textContent!.trim()); assertTrue(isVisible(close)); + assertFalse(close.disabled); close.click(); await eventToPromise('close', importDialog); }); @@ -202,4 +251,38 @@ done.click(); await eventToPromise('close', importDialog); }); + + test('hasCorrectAlreadyActiveState', async function() { + const importDialog = elementFactory.createPasswordsImportDialog(); + assertEquals(ImportDialogState.START, importDialog.dialogState); + passwordManager.setImportResults({ + status: chrome.passwordsPrivate.ImportResultsStatus.IMPORT_ALREADY_ACTIVE, + numberImported: 0, + failedImports: [], + fileName: '', + }); + + await triggerImportHelper(importDialog, passwordManager); + flush(); + // After the import, the dialog should switch to ALREADY_ACTIVE state. + assertEquals(ImportDialogState.ALREADY_ACTIVE, importDialog.dialogState); + + const infoIcon = + importDialog.shadowRoot!.querySelector<HTMLElement>('#infoIcon'); + assertTrue(!!infoIcon); + assertTrue(isVisible(infoIcon)); + + assertEquals( + importDialog.i18n('importPasswordsAlreadyActive'), + importDialog.$.descriptionText.textContent!.trim()); + + const close = + importDialog.shadowRoot!.querySelector<CrButtonElement>('#close'); + assertTrue(!!close); + assertEquals(importDialog.i18n('close'), close.textContent!.trim()); + assertTrue(isVisible(close)); + assertFalse(close.disabled); + close.click(); + await eventToPromise('close', importDialog); + }); });
diff --git a/chrome/test/views/accessibility_checker.cc b/chrome/test/views/accessibility_checker.cc index 888881e..35a38088 100644 --- a/chrome/test/views/accessibility_checker.cc +++ b/chrome/test/views/accessibility_checker.cc
@@ -4,124 +4,12 @@ #include "chrome/test/views/accessibility_checker.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/accessibility/ax_node_data.h" -#include "ui/views/accessibility/view_accessibility.h" +#include "ui/views/accessibility/accessibility_paint_checks.h" #include "ui/views/widget/native_widget_delegate.h" #include "ui/views/widget/widget.h" -namespace { - -using ax::mojom::NameFrom; -using ax::mojom::Role; -using ax::mojom::State; -using ax::mojom::StringAttribute; - -// Return helpful string for identifying a view. -// Includes the view class of every view in the ancestor chain, root first. -// Also provides the id. -// For example: -// BrowserView > OmniboxView (id 3). -std::string GetViewDebugString(const views::View* view) { - // Get classes of ancestors. - std::vector<std::string> classes; - for (const views::View* ancestor = view; ancestor; - ancestor = ancestor->parent()) - classes.insert(classes.begin(), ancestor->GetClassName()); - - return base::JoinString(classes, " > ") + - base::StringPrintf(" (id %d)", view->GetID()); -} - -bool DoesViewHaveAccessibleNameOrLabelError(ui::AXNodeData* data) { - // Focusable nodes must have an accessible name, otherwise screen reader users - // will not know what they landed on. For example, the reload button should - // have an accessible name of "Reload". - // Exceptions: - // 1) Textfields can set the placeholder string attribute. - // 2) Explicitly setting the name to "" is allowed if the view uses - // AXNodedata.SetNameExplicitlyEmpty(). - - // It has a name, we're done. - if (!data->GetStringAttribute(StringAttribute::kName).empty()) - return false; - - // Text fields are allowed to have a placeholder instead. - if (data->role == Role::kTextField && - !data->GetStringAttribute(StringAttribute::kPlaceholder).empty()) - return false; - - // Finally, a view is allowed to explicitly state that it has no name. - if (data->GetNameFrom() == NameFrom::kAttributeExplicitlyEmpty) - return false; - - // Has an error -- no name or placeholder, and not explicitly empty. - return true; -} - -bool DoesViewHaveAccessibilityErrors(views::View* view, - std::string* error_message) { - views::ViewAccessibility& view_accessibility = view->GetViewAccessibility(); - ui::AXNodeData node_data; - // Get accessible node data from view_accessibility instead of view, because - // some additional fields are processed and set there. - view_accessibility.GetAccessibleNodeData(&node_data); - - std::string violations; - - // No checks for unfocusable items yet. - if (node_data.HasState(State::kFocusable)) { - if (DoesViewHaveAccessibleNameOrLabelError(&node_data)) { - violations += - "\n- Focusable View has no accessible name or placeholder, and the " - "name attribute does not use kAttributeExplicitlyEmpty. " - "The accessible name is spoken by screen readers to end users. Thus " - "if this is production code, the accessible name should be " - "localized."; - } - if (node_data.role == Role::kNone || node_data.role == Role::kUnknown) - violations += "\n- Focusable View needs a valid role."; - if (node_data.HasState(State::kIgnored)) - violations += "\n- Focusable View should not be ignored."; - if (node_data.IsInvisible()) - violations += "\n- Focusable View should not be invisible."; - } - - if (violations.empty()) - return false; // No errors. - - *error_message = - "The following view violates DoesViewHaveAccessibilityErrors() when its " - "widget becomes " + - std::string(view->GetWidget()->IsVisible() ? "visible:\n" : "hidden:\n") + - GetViewDebugString(view) + violations + - "\n\nNote: for a more useful error message that includes a stack of how " - "this view was constructed, use git cl patch 963284. Please leave a note " - "on that CL if you find it useful."; - return true; -} - -bool DoesViewHaveAccessibilityErrorsRecursive(views::View* view, - std::string* error_message) { - const auto recurse = [error_message](auto* v) { - return DoesViewHaveAccessibilityErrorsRecursive(v, error_message); - }; - return DoesViewHaveAccessibilityErrors(view, error_message) || - std::any_of(view->children().begin(), view->children().end(), recurse); -} - -} // namespace - -void AddFailureOnWidgetAccessibilityError(views::Widget* widget) { - std::string error_message; - if (widget->widget_delegate() && !widget->IsClosed() && - widget->GetRootView() && - DoesViewHaveAccessibilityErrorsRecursive(widget->GetRootView(), - &error_message)) { - ADD_FAILURE() << error_message; - } +void RunAccessibilityChecks(views::Widget* widget) { + RunAccessibilityPaintChecks(widget); } AccessibilityChecker::AccessibilityChecker() = default; @@ -149,5 +37,5 @@ // in order to catch more errors. For example, to catch errors in the download // shelf we must check the browser window as it is hidden, because the shelf // is not visible when the browser window first appears. - AddFailureOnWidgetAccessibilityError(widget); + RunAccessibilityPaintChecks(widget); }
diff --git a/chrome/test/views/accessibility_checker.h b/chrome/test/views/accessibility_checker.h index c99a5bd..4a307cb 100644 --- a/chrome/test/views/accessibility_checker.h +++ b/chrome/test/views/accessibility_checker.h
@@ -10,9 +10,7 @@ #include "ui/views/widget/widget_observer.h" // Runs UI accessibility checks on |widget|. -// Adds a gtest failure if any check fails. -// Callers are not expected to assert/expect on failure. -void AddFailureOnWidgetAccessibilityError(views::Widget* widget); +void RunAccessibilityChecks(views::Widget* widget); // Observe the creation of all widgets and ensure their view subtrees are // checked for accessibility violations when they become visible or hidden.
diff --git a/chrome/test/views/accessibility_checker_unittest.cc b/chrome/test/views/accessibility_checker_unittest.cc deleted file mode 100644 index 5d80985..0000000 --- a/chrome/test/views/accessibility_checker_unittest.cc +++ /dev/null
@@ -1,57 +0,0 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/test/views/accessibility_checker.h" - -#include "base/strings/utf_string_conversions.h" -#include "chrome/test/views/chrome_views_test_base.h" -#include "testing/gtest/include/gtest/gtest-spi.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/views/controls/button/image_button.h" -#include "ui/views/view.h" -#include "ui/views/widget/widget.h" - -using AccessibilityCheckerTest = ChromeViewsTestBase; - -// Test that a view that is not accessible will fail the accessibility audit. -TEST_F(AccessibilityCheckerTest, VerifyAccessibilityCheckerFailAndPass) { - // Create containing widget. - views::Widget widget; - views::Widget::InitParams params = - views::Widget::InitParams(views::Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - params.bounds = gfx::Rect(0, 0, 650, 650); - params.context = GetContext(); - widget.Init(std::move(params)); - widget.Show(); - - // Add the button. - auto* button = widget.GetContentsView()->AddChildView( - std::make_unique<views::ImageButton>()); - - // Accessibility test should pass as it is focusable but has a name. - button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - button->SetAccessibleName(u"Some name"); - AddFailureOnWidgetAccessibilityError(&widget); - - // Accessibility test should pass as it has no name but is not focusable. - button->SetFocusBehavior(views::View::FocusBehavior::NEVER); - button->SetAccessibleName(u""); - AddFailureOnWidgetAccessibilityError(&widget); - - // Accessibility test should fail as it has no name and is focusable. - button->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - EXPECT_NONFATAL_FAILURE(AddFailureOnWidgetAccessibilityError(&widget), - "Accessibility"); - - // Restore the name of the button so that it is not the source of failure. - button->SetAccessibleName(u"Some name"); - - // Accessibility test should fail if the focusable view lacks a valid role. - auto* generic_view = - widget.GetContentsView()->AddChildView(std::make_unique<views::View>()); - generic_view->SetFocusBehavior(views::View::FocusBehavior::ALWAYS); - EXPECT_NONFATAL_FAILURE(AddFailureOnWidgetAccessibilityError(&widget), - "Accessibility"); -}
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc index a262984b..597ed7aa 100644 --- a/chrome/updater/test/integration_tests.cc +++ b/chrome/updater/test/integration_tests.cc
@@ -54,7 +54,7 @@ namespace test { namespace { -#if !defined(COMPONENT_BUILD) +#if BUILDFLAG(IS_WIN) || !defined(COMPONENT_BUILD) void ExpectNoUpdateSequence(ScopedServer* test_server, const std::string& app_id) { @@ -78,7 +78,7 @@ app_id.c_str())); } -#endif // !defined(COMPONENT_BUILD) +#endif // BUILDFLAG(IS_WIN) || !defined(COMPONENT_BUILD) } // namespace @@ -328,7 +328,7 @@ // the build directory. Therefore, installation of component builds is not // expected to work and these tests do not run on component builders. // See crbug.com/1112527. -#if !defined(COMPONENT_BUILD) +#if BUILDFLAG(IS_WIN) || !defined(COMPONENT_BUILD) TEST_F(IntegrationTest, InstallUninstall) { Install(); @@ -712,7 +712,14 @@ #endif // BUILDFLAG(IS_MAC) #if BUILDFLAG(CHROMIUM_BRANDING) || BUILDFLAG(GOOGLE_CHROME_BRANDING) -TEST_F(IntegrationTest, SelfUpdateFromOldReal) { +#if !defined(COMPONENT_BUILD) +// Disabled on Windows due to high flake rate; see https://crbug.com/1341471. +#if BUILDFLAG(IS_WIN) +#define MAYBE_SelfUpdateFromOldReal DISABLED_SelfUpdateFromOldReal +#else +#define MAYBE_SelfUpdateFromOldReal SelfUpdateFromOldReal +#endif +TEST_F(IntegrationTest, MAYBE_SelfUpdateFromOldReal) { ScopedServer test_server(test_commands_); SetupRealUpdaterLowerVersion(); @@ -736,8 +743,16 @@ Uninstall(); } #endif +#endif -TEST_F(IntegrationTest, UpdateServiceStress) { +// TODO(crbug.com/1336591) - enable test after investigating crbug.com/1336591 +// or open a new crbug for debugging this test if it is the culprit. +#if BUILDFLAG(IS_WIN) +#define MAYBE_UpdateServiceStress DISABLED_UpdateServiceStress +#else +#define MAYBE_UpdateServiceStress UpdateServiceStress +#endif +TEST_F(IntegrationTest, MAYBE_UpdateServiceStress) { Install(); ExpectInstalled(); StressUpdateService(); @@ -850,7 +865,7 @@ Uninstall(); } -#endif // !defined(COMPONENT_BUILD) +#endif // BUILDFLAG(IS_WIN) || !defined(COMPONENT_BUILD) } // namespace test } // namespace updater
diff --git a/chromecast/browser/BUILD.gn b/chromecast/browser/BUILD.gn index ed65a32..c8069e0 100644 --- a/chromecast/browser/BUILD.gn +++ b/chromecast/browser/BUILD.gn
@@ -357,7 +357,6 @@ ] deps += [ - "//chromecast/ui:media_control_ui", "//ui/aura", "//ui/views:views", ]
diff --git a/chromecast/browser/cast_content_window.cc b/chromecast/browser/cast_content_window.cc index 409cd63..577caba 100644 --- a/chromecast/browser/cast_content_window.cc +++ b/chromecast/browser/cast_content_window.cc
@@ -67,8 +67,4 @@ } } -mojom::MediaControlUi* CastContentWindow::media_controls() { - return nullptr; -} - } // namespace chromecast
diff --git a/chromecast/browser/cast_content_window.h b/chromecast/browser/cast_content_window.h index ac5c060..62b5a273 100644 --- a/chromecast/browser/cast_content_window.h +++ b/chromecast/browser/cast_content_window.h
@@ -17,7 +17,6 @@ #include "chromecast/common/mojom/activity_window.mojom.h" #include "chromecast/graphics/gestures/cast_gesture_handler.h" #include "chromecast/ui/back_gesture_router.h" -#include "chromecast/ui/mojom/media_control_ui.mojom.h" #include "chromecast/ui/mojom/ui_service.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -76,9 +75,6 @@ // screen. virtual void RequestMoveOut() = 0; - // Media control interface. Non-null on Aura platforms. - virtual mojom::MediaControlUi* media_controls(); - // Registers this as a delegate to BackGestureRouter. virtual void RegisterBackGestureRouter( ::chromecast::BackGestureRouter* gesture_router) {}
diff --git a/chromecast/browser/cast_content_window_aura.cc b/chromecast/browser/cast_content_window_aura.cc index db11646..61947b5 100644 --- a/chromecast/browser/cast_content_window_aura.cc +++ b/chromecast/browser/cast_content_window_aura.cc
@@ -10,7 +10,6 @@ #include "base/memory/ptr_util.h" #include "chromecast/chromecast_buildflags.h" #include "chromecast/graphics/cast_window_manager.h" -#include "chromecast/ui/media_control_ui.h" #include "content/public/browser/web_contents.h" #include "ui/aura/window.h" #include "ui/display/display.h" @@ -125,7 +124,6 @@ touch_blocker_ = std::make_unique<TouchBlocker>(window_, !params_->enable_touch_input); - media_controls_ = std::make_unique<MediaControlUi>(window_manager_); if (has_screen_access_) { window_->Show(); @@ -159,10 +157,6 @@ } } -mojom::MediaControlUi* CastContentWindowAura::media_controls() { - return media_controls_.get(); -} - void CastContentWindowAura::RequestVisibility( VisibilityPriority visibility_priority) {} @@ -195,14 +189,6 @@ SetFullWindowBounds(); } -void CastContentWindowAura::PrimaryMainFrameWasResized(bool width_changed) { - if (!web_contents()) - return; - if (media_controls_) { - media_controls_->SetBounds(web_contents()->GetContainerBounds()); - } -} - void CastContentWindowAura::SetFullWindowBounds() { #if !BUILDFLAG(IS_CAST_AUDIO_ONLY) gfx::Size display_size =
diff --git a/chromecast/browser/cast_content_window_aura.h b/chromecast/browser/cast_content_window_aura.h index f0044ab..1027471 100644 --- a/chromecast/browser/cast_content_window_aura.h +++ b/chromecast/browser/cast_content_window_aura.h
@@ -9,7 +9,6 @@ #include "chromecast/browser/cast_content_window.h" #include "chromecast/browser/cast_web_contents_observer.h" #include "chromecast/browser/mojom/cast_web_service.mojom.h" -#include "chromecast/ui/media_control_ui.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_observer.h" #include "ui/aura/window_observer.h" @@ -20,6 +19,7 @@ namespace chromecast { +class CastWindowManager; class TouchBlocker; class CastContentWindowAura : public CastContentWindow, @@ -45,12 +45,10 @@ void SetHostContext(base::Value host_context) override; void RequestMoveOut() override; void EnableTouchInput(bool enabled) override; - mojom::MediaControlUi* media_controls() override; // content::WebContentsObserver implementation: void DidStartNavigation( content::NavigationHandle* navigation_handle) override; - void PrimaryMainFrameWasResized(bool width_changed) override; // aura::WindowObserver implementation: void OnWindowVisibilityChanged(aura::Window* window, bool visible) override; @@ -65,7 +63,6 @@ // Utility class for detecting and dispatching gestures to delegates. std::unique_ptr<CastContentGestureHandler> gesture_dispatcher_; std::unique_ptr<TouchBlocker> touch_blocker_; - std::unique_ptr<MediaControlUi> media_controls_; aura::Window* window_; bool has_screen_access_;
diff --git a/chromecast/ui/BUILD.gn b/chromecast/ui/BUILD.gn index f94d845..c89557d 100644 --- a/chromecast/ui/BUILD.gn +++ b/chromecast/ui/BUILD.gn
@@ -5,13 +5,6 @@ import("//build/config/ui.gni") import("//chromecast/chromecast.gni") -import("//components/vector_icons/vector_icons.gni") - -cast_source_set("public") { - sources = [ "media_overlay.h" ] - - deps = [ "//base" ] -} cast_source_set("display_settings_public") { sources = [ @@ -48,102 +41,6 @@ } } -cast_source_set("aura_components") { - sources = [ - "aura_components.cc", - "aura_components.h", - ] - - deps = [ - ":public", - "//base", - ] - - if (use_aura) { - sources += [ - "aura_components_impl.cc", - "aura_components_impl.h", - ] - - deps += [ - ":media_overlay", - "//ui/views", - ] - } else { - sources += [ "aura_components_dummy.cc" ] - } - - if (enable_media_overlay) { - defines = [ "ENABLE_MEDIA_OVERLAY" ] - } -} - -if (use_aura) { - cast_source_set("media_control_ui") { - sources = [ - "media_control_ui.cc", - "media_control_ui.h", - ] - - deps = [ - ":vector_icons", - "//base", - "//chromecast/base", - "//chromecast/graphics", - "//chromecast/ui/mojom", - "//ui/aura", - "//ui/views", - ] - } - - cast_source_set("media_overlay") { - sources = [ - "media_overlay_impl.cc", - "media_overlay_impl.h", - ] - - deps = [ - ":public", - "//base", - "//chromecast/app:resources", - "//chromecast/base", - "//chromecast/graphics", - "//chromecast/media/cma/pipeline", - "//chromecast/ui/mojom", - "//media", - "//ui/aura", - "//ui/views", - ] - } -} - -# Rules for generating vector icon source files. -# Adapted from //components/vector_icons/BUILD.gn - -aggregate_vector_icons("media_controls_vector_icons") { - icon_directory = "vector_icons" - - sources = [ - "back30.icon", - "forward30.icon", - "next.icon", - "pause.icon", - "play.icon", - "previous.icon", - ] -} - -static_library("vector_icons") { - sources = get_target_outputs(":media_controls_vector_icons") - - deps = [ - ":media_controls_vector_icons", - "//base", - "//skia", - "//ui/gfx", - ] -} - cast_source_set("back_gesture_router") { sources = [ "back_gesture_router.h" ] }
diff --git a/chromecast/ui/aura_components.cc b/chromecast/ui/aura_components.cc deleted file mode 100644 index f07391e..0000000 --- a/chromecast/ui/aura_components.cc +++ /dev/null
@@ -1,12 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/ui/aura_components.h" - -namespace chromecast { - -AuraComponents::AuraComponents() = default; -AuraComponents::~AuraComponents() = default; - -} // namespace chromecast
diff --git a/chromecast/ui/aura_components.h b/chromecast/ui/aura_components.h deleted file mode 100644 index abce4f9..0000000 --- a/chromecast/ui/aura_components.h +++ /dev/null
@@ -1,40 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_UI_AURA_COMPONENTS_H_ -#define CHROMECAST_UI_AURA_COMPONENTS_H_ - -#include <memory> - -#include "chromecast/ui/media_overlay.h" -#include "ui/views/layout/layout_provider.h" - -namespace chromecast { - -class CastWindowManager; - -// Collection of Cast platform objects which only have valid implementations on -// Aura platforms. All getters to this class will return nullptr on non-Aura -// platforms. -// -// This class helps avoid usage of "#if defined(USE_AURA)" macros by using pure -// virtual interfaces to wrap Aura-specific code. Clients to these interfaces -// can therefore be written in a platform-agnostic way. -class AuraComponents { - public: - static std::unique_ptr<AuraComponents> Create( - CastWindowManager* cast_window_manager); - - AuraComponents(); - virtual ~AuraComponents(); - - MediaOverlay* media_overlay() const { return media_overlay_.get(); } - - protected: - std::unique_ptr<MediaOverlay> media_overlay_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_UI_AURA_COMPONENTS_H_
diff --git a/chromecast/ui/aura_components_dummy.cc b/chromecast/ui/aura_components_dummy.cc deleted file mode 100644 index 5e761ba..0000000 --- a/chromecast/ui/aura_components_dummy.cc +++ /dev/null
@@ -1,15 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/ui/aura_components.h" - -namespace chromecast { - -// static -std::unique_ptr<AuraComponents> AuraComponents::Create( - CastWindowManager* cast_window_manager) { - return std::make_unique<AuraComponents>(); -} - -} // namespace chromecast
diff --git a/chromecast/ui/aura_components_impl.cc b/chromecast/ui/aura_components_impl.cc deleted file mode 100644 index 48fd2b73..0000000 --- a/chromecast/ui/aura_components_impl.cc +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/ui/aura_components_impl.h" - -#include <utility> - -#include "chromecast/ui/media_overlay_impl.h" - -namespace chromecast { - -AuraComponentsImpl::AuraComponentsImpl(CastWindowManager* cast_window_manager) - : layout_provider_(std::make_unique<views::LayoutProvider>()) { -#if defined(ENABLE_MEDIA_OVERLAY) - media_overlay_ = std::make_unique<MediaOverlayImpl>(cast_window_manager); -#endif -} - -AuraComponentsImpl::~AuraComponentsImpl() = default; - -// static -std::unique_ptr<AuraComponents> AuraComponents::Create( - CastWindowManager* cast_window_manager) { - return std::make_unique<AuraComponentsImpl>(cast_window_manager); -} - -} // namespace chromecast
diff --git a/chromecast/ui/aura_components_impl.h b/chromecast/ui/aura_components_impl.h deleted file mode 100644 index 028e5cf..0000000 --- a/chromecast/ui/aura_components_impl.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2020 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_UI_AURA_COMPONENTS_IMPL_H_ -#define CHROMECAST_UI_AURA_COMPONENTS_IMPL_H_ - -#include <memory> - -#include "chromecast/ui/aura_components.h" -#include "ui/views/layout/layout_provider.h" - -namespace chromecast { - -class CastWindowManager; - -// Collection of Cast platform objects which only have valid implementations on -// Aura platforms. All getters to this class will return nullptr on non-Aura -// platforms. -// -// This class helps avoid usage of "#if defined(USE_AURA)" macros by using pure -// virtual interfaces to wrap Aura-specific code. Clients to these interfaces -// can therefore be written in a platform-agnostic way. -class AuraComponentsImpl : public AuraComponents { - public: - explicit AuraComponentsImpl(CastWindowManager* cast_window_manager); - ~AuraComponentsImpl() override; - - private: - std::unique_ptr<views::LayoutProvider> layout_provider_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_UI_AURA_COMPONENTS_IMPL_H_
diff --git a/chromecast/ui/media_control_ui.cc b/chromecast/ui/media_control_ui.cc deleted file mode 100644 index 61715bf..0000000 --- a/chromecast/ui/media_control_ui.cc +++ /dev/null
@@ -1,326 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/ui/media_control_ui.h" - -#include <algorithm> -#include <string> - -#include "base/bind.h" -#include "base/cxx17_backports.h" -#include "base/strings/utf_string_conversions.h" -#include "base/threading/thread_checker.h" -#include "chromecast/graphics/cast_window_manager.h" -#include "ui/aura/window.h" -#include "ui/base/metadata/metadata_header_macros.h" -#include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/gfx/font_list.h" -#include "ui/gfx/geometry/point.h" -#include "ui/gfx/paint_vector_icon.h" -#include "ui/views/background.h" - -#define LOG_VIEW(name) DVLOG(1) << #name << ": " << name->bounds().ToString(); - -namespace chromecast { - -namespace { - -constexpr base::TimeDelta kUpdateMediaTimePeriod = base::Seconds(1); -const int kButtonSmallHeight = 56; -const int kButtonBigHeight = 124; - -void SetButtonImage(views::ImageButton* button, const gfx::VectorIcon& icon) { - button->SetImage( - views::Button::STATE_NORMAL, - gfx::CreateVectorIcon(icon, button->height(), SK_ColorWHITE)); -} - -// A view that invokes an |on_tapped| closure whenever it detects a tap gesture. -class TouchView : public views::View { - public: - METADATA_HEADER(TouchView); - explicit TouchView(base::RepeatingClosure on_tapped) - : on_tapped_(std::move(on_tapped)) {} - TouchView(const TouchView&) = delete; - TouchView& operator=(const TouchView&) = delete; - - private: - // views::View implementation: - void OnGestureEvent(ui::GestureEvent* event) override { - if (event->type() == ui::ET_GESTURE_TAP) { - on_tapped_.Run(); - } - } - - base::RepeatingClosure on_tapped_; -}; - -BEGIN_METADATA(TouchView, views::View) -END_METADATA - -} // namespace - -MediaControlUi::MediaControlUi(CastWindowManager* window_manager) - : window_manager_(window_manager), - app_is_fullscreen_(false), - is_paused_(false), - media_duration_(-1.0), - last_media_time_(0.0), - weak_factory_(this) { - DCHECK(window_manager_); - - // |touch_view| will detect touch events and decide whether to show - // or hide |view_|, which contains the media controls. - auto touch_view = std::make_unique<TouchView>(base::BindRepeating( - &MediaControlUi::OnTapped, weak_factory_.GetWeakPtr())); - - // Main view. - auto view = std::make_unique<views::View>(); - view->SetVisible(false); - view->SetBackground( - views::CreateSolidBackground(SkColorSetA(SK_ColorBLACK, 0x80))); - view->SetBoundsRect( - window_manager_->GetRootWindow()->GetBoundsInRootWindow()); - view_ = touch_view->AddChildView(std::move(view)); - - // Buttons. - btn_previous_ = view_->AddChildView( - CreateImageButton(mojom::MediaCommand::PREVIOUS, - vector_icons::kPreviousIcon, kButtonSmallHeight)); - btn_play_pause_ = view_->AddChildView( - CreateImageButton(mojom::MediaCommand::TOGGLE_PLAY_PAUSE, - vector_icons::kPlayIcon, kButtonBigHeight)); - btn_next_ = view_->AddChildView(CreateImageButton( - mojom::MediaCommand::NEXT, vector_icons::kNextIcon, kButtonSmallHeight)); - btn_replay30_ = view_->AddChildView( - CreateImageButton(mojom::MediaCommand::REPLAY_30_SECONDS, - vector_icons::kBack30Icon, kButtonSmallHeight)); - btn_forward30_ = view_->AddChildView( - CreateImageButton(mojom::MediaCommand::FORWARD_30_SECONDS, - vector_icons::kForward30Icon, kButtonSmallHeight)); - - // Labels. - lbl_title_ = - view_->AddChildView(std::make_unique<views::Label>(std::u16string())); - lbl_meta_ = - view_->AddChildView(std::make_unique<views::Label>(std::u16string())); - - // Progress Bar. - progress_bar_ = view_->AddChildView(std::make_unique<views::ProgressBar>()); - - LayoutElements(); - - // Main widget. - widget_.reset(new views::Widget); - views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - params.context = window_manager_->GetRootWindow(); - params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; - params.bounds = window_manager_->GetRootWindow()->GetBoundsInRootWindow(); - widget_->Init(std::move(params)); - widget_->SetContentsView(std::move(touch_view)); - - window_manager_->SetZOrder(widget_->GetNativeView(), - mojom::ZOrder::MEDIA_INFO); -} - -MediaControlUi::~MediaControlUi() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); -} - -void MediaControlUi::SetClient( - mojo::PendingRemote<mojom::MediaControlClient> client) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - client_.Bind(std::move(client)); - MaybeShowWidget(); -} - -void MediaControlUi::SetAttributes( - mojom::MediaControlUiAttributesPtr attributes) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - last_media_timestamp_ = base::TimeTicks::Now(); - last_media_time_ = attributes->current_time; - - // Only update the media time if the player is playing. - if (attributes->is_playing) { - media_time_update_timer_.Start( - FROM_HERE, kUpdateMediaTimePeriod, - base::BindRepeating(&MediaControlUi::UpdateMediaTime, - weak_factory_.GetWeakPtr())); - } else { - media_time_update_timer_.Stop(); - } - - if (attributes->is_paused != is_paused_) { - is_paused_ = attributes->is_paused; - if (is_paused_ && !visible()) { - ShowMediaControls(true); - } - SetButtonImage(btn_play_pause_, is_paused_ ? vector_icons::kPlayIcon - : vector_icons::kPauseIcon); - } - - if (attributes->duration > 0.0) { - media_duration_ = attributes->duration; - } else if (attributes->duration == 0.0) { - media_duration_ = -1.0; - } - - if (attributes->duration > 0.0) { - progress_bar_->SetVisible(true); - } else if (attributes->duration == 0.0) { - progress_bar_->SetVisible(false); - } - - lbl_title_->SetText(base::UTF8ToUTF16(attributes->title)); - lbl_meta_->SetText(base::UTF8ToUTF16(attributes->metadata)); -} - -void MediaControlUi::SetBounds(const gfx::Rect& new_bounds) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - auto approx_equals = [](int a, int b) { - const int epsilon = 20; - return std::abs(a - b) < epsilon; - }; - - auto root_bounds = window_manager_->GetRootWindow()->bounds(); - app_is_fullscreen_ = approx_equals(root_bounds.width(), new_bounds.width()) && - approx_equals(root_bounds.height(), new_bounds.height()); - MaybeShowWidget(); -} - -void MediaControlUi::MaybeShowWidget() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (client_ && app_is_fullscreen_) { - LOG(INFO) << "Enabling platform media controls"; - widget_->Show(); - } else { - LOG(INFO) << "Disabling platform media controls"; - widget_->Hide(); - } -} - -void MediaControlUi::ShowMediaControls(bool visible) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - view_->SetVisible(visible); -} - -bool MediaControlUi::visible() const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return (view_ && view_->GetVisible()); -} - -void MediaControlUi::UpdateMediaTime() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - double progress = - last_media_time_ + - (base::TimeTicks::Now() - last_media_timestamp_).InSecondsF(); - if (media_duration_ > 0.0) { - progress = base::clamp(progress, 0.0, media_duration_); - progress_bar_->SetValue(progress / media_duration_); - } -} - -void MediaControlUi::ButtonPressed(mojom::MediaCommand command) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (client_) - client_->Execute(command); -} - -void MediaControlUi::OnTapped() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - ShowMediaControls(!visible()); -} - -std::unique_ptr<views::ImageButton> MediaControlUi::CreateImageButton( - mojom::MediaCommand command, - const gfx::VectorIcon& icon, - int height) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - auto button = std::make_unique<views::ImageButton>(base::BindRepeating( - &MediaControlUi::ButtonPressed, base::Unretained(this), command)); - button->SetImageHorizontalAlignment(views::ImageButton::ALIGN_CENTER); - button->SetImageVerticalAlignment(views::ImageButton::ALIGN_MIDDLE); - button->SetSize(gfx::Size(height, height)); - button->SetFocusBehavior(views::View::FocusBehavior::ACCESSIBLE_ONLY); - SetButtonImage(button.get(), icon); - - return button; -} - -void MediaControlUi::LayoutElements() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - const int kPrevousNextMargin = 112; - const int kSmallButtonBottomMargin = 56; - const int kLargeButtonBottomMargin = 22; - const int kReplayOffset = 236 / 3; - const int kParentWidth = view_->width(); - const int kParentHeight = view_->height(); - - btn_previous_->SetPosition(gfx::Point( - kPrevousNextMargin, - kParentHeight - btn_previous_->height() - kSmallButtonBottomMargin)); - - btn_next_->SetPosition(gfx::Point( - kParentWidth - btn_next_->width() - kPrevousNextMargin, - kParentHeight - btn_next_->height() - kSmallButtonBottomMargin)); - - btn_play_pause_->SetPosition(gfx::Point( - (kParentWidth - btn_play_pause_->width()) / 2, - kParentHeight - btn_play_pause_->height() - kLargeButtonBottomMargin)); - - btn_replay30_->SetPosition(gfx::Point( - kParentWidth / 2 - kReplayOffset - btn_replay30_->width(), - kParentHeight - btn_replay30_->height() - kSmallButtonBottomMargin)); - - btn_forward30_->SetPosition(gfx::Point( - kParentWidth / 2 + kReplayOffset, - kParentHeight - btn_forward30_->height() - kSmallButtonBottomMargin)); - - const int kProgressMargin = 56; - const int kProgressBarHeight = 5; - - progress_bar_->SetBounds( - kPrevousNextMargin, btn_previous_->y() - kProgressMargin, - kParentWidth - kPrevousNextMargin * 2, kProgressBarHeight); - - const int kTitleMargin = 56; - const int kTitleLineHeight = 80; - const int kMetadataMargin = 20; - const int kMetadataLineHeight = 24; - - lbl_title_->SetFontList(gfx::FontList("GoogleSans, 68px")); - lbl_title_->SetLineHeight(kTitleLineHeight); - lbl_title_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - lbl_title_->SetAutoColorReadabilityEnabled(false); - lbl_title_->SetEnabledColor(SkColorSetA(SK_ColorWHITE, 0xFF)); - lbl_title_->SetBounds( - kPrevousNextMargin, progress_bar_->y() - kTitleMargin - kTitleLineHeight, - kParentWidth - 2 * kPrevousNextMargin, kTitleLineHeight); - - lbl_meta_->SetFontList(gfx::FontList("GoogleSans, 24px")); - lbl_meta_->SetLineHeight(kMetadataLineHeight); - lbl_meta_->SetHorizontalAlignment(gfx::ALIGN_LEFT); - lbl_meta_->SetAutoColorReadabilityEnabled(false); - lbl_meta_->SetEnabledColor(SkColorSetA(SK_ColorWHITE, 0xFF * 0.7)); - lbl_meta_->SetBounds(kPrevousNextMargin, - lbl_title_->y() - kMetadataMargin - kMetadataLineHeight, - kParentWidth - 2 * kPrevousNextMargin, - kMetadataLineHeight); - - LOG_VIEW(view_); - LOG_VIEW(btn_previous_); - LOG_VIEW(btn_next_); - LOG_VIEW(btn_play_pause_); - LOG_VIEW(btn_replay30_); - LOG_VIEW(btn_forward30_); - LOG_VIEW(progress_bar_); - LOG_VIEW(lbl_title_); - LOG_VIEW(lbl_meta_); -} - -} // namespace chromecast
diff --git a/chromecast/ui/media_control_ui.h b/chromecast/ui/media_control_ui.h deleted file mode 100644 index 345662c..0000000 --- a/chromecast/ui/media_control_ui.h +++ /dev/null
@@ -1,107 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_UI_MEDIA_CONTROL_UI_H_ -#define CHROMECAST_UI_MEDIA_CONTROL_UI_H_ - -#include <memory> - -#include "base/memory/weak_ptr.h" -#include "base/sequence_checker.h" -#include "base/time/time.h" -#include "base/timer/timer.h" -#include "chromecast/ui/mojom/media_control_ui.mojom.h" -#include "chromecast/ui/vector_icons.h" -#include "mojo/public/cpp/bindings/remote.h" -#include "ui/views/controls/button/image_button.h" -#include "ui/views/controls/label.h" -#include "ui/views/controls/progress_bar.h" -#include "ui/views/widget/widget.h" - -namespace chromecast { - -class CastWindowManager; - -// Provides a simple touch-based media UI for Aura platforms. This is used to -// enable simple touch support for media apps which are not yet touch-enabled. -// This class uses ui::views primitives to draw the UI. -class MediaControlUi : public mojom::MediaControlUi { - public: - explicit MediaControlUi(CastWindowManager* window_manager); - - MediaControlUi(const MediaControlUi&) = delete; - MediaControlUi& operator=(const MediaControlUi&) = delete; - - ~MediaControlUi() override; - - void SetBounds(const gfx::Rect& new_bounds); - - // mojom::MediaControlUi implementation: - void SetClient( - mojo::PendingRemote<mojom::MediaControlClient> client) override; - void SetAttributes(mojom::MediaControlUiAttributesPtr attributes) override; - - private: - // Only shows the media control widget if the media app window is full screen. - void MaybeShowWidget(); - void ShowMediaControls(bool visible); - bool visible() const; - void ButtonPressed(mojom::MediaCommand command); - void OnTapped(); - std::unique_ptr<views::ImageButton> CreateImageButton( - mojom::MediaCommand command, - const gfx::VectorIcon& icon, - int height); - - // Place elements in the locations specified by the UI spec. - // In this case, using views::LayoutManager is more difficult since we care - // about the position of each specific button, not the positions of view - // children in general. - void LayoutElements(); - - // Update the media time progress bar. - void UpdateMediaTime(); - - CastWindowManager* const window_manager_; - mojo::Remote<mojom::MediaControlClient> client_; - - // This must be true to enable media overlay. - bool app_is_fullscreen_; - - // UI components - std::unique_ptr<views::Widget> widget_; - views::View* view_; - - // Controls - views::ImageButton* btn_previous_; - views::ImageButton* btn_play_pause_; - views::ImageButton* btn_next_; - views::ImageButton* btn_replay30_; - views::ImageButton* btn_forward30_; - - // Labels - views::Label* lbl_meta_; - views::Label* lbl_title_; - - // Progress - views::ProgressBar* progress_bar_; - - bool is_paused_; - - double media_duration_; - // Last media playback time reported from the app. - double last_media_time_; - // The absolute time that |last_media_time_| was reported. This is used to - // extrapolate the current media playback time as time progresses. - base::TimeTicks last_media_timestamp_; - - base::RepeatingTimer media_time_update_timer_; - - SEQUENCE_CHECKER(sequence_checker_); - base::WeakPtrFactory<MediaControlUi> weak_factory_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_UI_MEDIA_CONTROL_UI_H_
diff --git a/chromecast/ui/media_overlay.h b/chromecast/ui/media_overlay.h deleted file mode 100644 index 294a33b..0000000 --- a/chromecast/ui/media_overlay.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_UI_MEDIA_OVERLAY_H_ -#define CHROMECAST_UI_MEDIA_OVERLAY_H_ - -#include <string> - - -namespace chromecast { - -// MediaOverlay is responsible for displaying information to the user about -// media playback, such as the volume level, and notifications about volume -// control limitations. -class MediaOverlay { - public: - class Controller { - public: - // Notifies the controller that the media is rendering in surround-sound. - virtual void SetSurroundSoundInUse(bool in_use) = 0; - }; - - virtual ~MediaOverlay() = default; - - virtual void SetController(Controller* controller) = 0; - - // Displays a brief toast to the user. - virtual void ShowMessage(const std::u16string& message) = 0; - - // Shows the volume bar for a given |volume|. - virtual void ShowVolumeBar(float volume) = 0; -}; - -} // namespace chromecast - -#endif // CHROMECAST_UI_MEDIA_OVERLAY_H_
diff --git a/chromecast/ui/media_overlay_impl.cc b/chromecast/ui/media_overlay_impl.cc deleted file mode 100644 index 99e9c38..0000000 --- a/chromecast/ui/media_overlay_impl.cc +++ /dev/null
@@ -1,217 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromecast/ui/media_overlay_impl.h" - -#include <utility> - -#include "base/strings/string_number_conversions.h" -#include "base/strings/utf_string_conversions.h" -#include "base/task/single_thread_task_runner.h" -#include "base/threading/thread_task_runner_handle.h" -#include "base/time/time.h" -#include "chromecast/app/grit/shell_resources.h" -#include "chromecast/graphics/cast_window_manager.h" -#include "media/base/audio_decoder_config.h" -#include "ui/aura/window.h" -#include "ui/base/resource/resource_bundle.h" -#include "ui/gfx/color_utils.h" -#include "ui/gfx/image/image_skia.h" -#include "ui/views/background.h" -#include "ui/views/border.h" -#include "ui/views/controls/image_view.h" -#include "ui/views/controls/label.h" -#include "ui/views/controls/progress_bar.h" -#include "ui/views/layout/box_layout.h" -#include "ui/views/layout/layout_provider.h" -#include "ui/views/view.h" -#include "ui/views/widget/widget.h" - -namespace chromecast { - -namespace { - -constexpr SkColor kBackgroundColor = SkColorSetA(SK_ColorBLACK, 200); -constexpr int kElementSpacing = 16; -constexpr int kVolumeBarHeight = 16; -constexpr int kVolumePopupPadding = 16; -constexpr int kVolumePopupBottomInset = 32; -constexpr base::TimeDelta kUiHideDelay = base::Seconds(3); - -} // namespace - -MediaOverlayImpl::MediaOverlayImpl(CastWindowManager* window_manager) - : window_manager_(window_manager), - ui_task_runner_(base::ThreadTaskRunnerHandle::Get()), - controller_(nullptr), - volume_icon_image_(ui::ResourceBundle::GetSharedInstance().GetImageNamed( - IDR_CAST_SHELL_SPEAKER_ICON)), - toast_font_list_(gfx::FontList("Helvetica, 28px")), - weak_factory_(this) { - DCHECK(window_manager_); - - gfx::Rect window_bounds = window_manager_->GetRootWindow()->bounds(); - auto container_view = std::make_unique<views::View>(); - auto layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kVertical, - gfx::Insets::TLBR(0, window_bounds.width() / 4, kVolumePopupBottomInset, - window_bounds.width() / 4), - 0); - layout->set_main_axis_alignment(views::BoxLayout::MainAxisAlignment::kEnd); - layout->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kStretch); - container_view->SetLayoutManager(std::move(layout)); - - AddToast(container_view.get()); - AddVolumeBar(container_view.get()); - - overlay_widget_ = - CreateOverlayWidget(window_bounds, std::move(container_view)); - overlay_widget_->Show(); - volume_panel_->SetVisible(false); - toast_label_->SetVisible(false); - - media::MediaPipelineObserver::AddObserver(this); -} - -MediaOverlayImpl::~MediaOverlayImpl() { - media::MediaPipelineObserver::RemoveObserver(this); -} - -void MediaOverlayImpl::AddVolumeBar(views::View* container) { - std::unique_ptr<views::ImageView> volume_icon = - std::make_unique<views::ImageView>(); - volume_icon->SetImage(volume_icon_image_.ToImageSkia()); - volume_icon->SetImageSize(gfx::Size(25, 19)); - - volume_bar_ = new views::ProgressBar(kVolumeBarHeight, false); - volume_bar_->SetBackgroundColor(kBackgroundColor); - - volume_panel_ = new views::View(); - auto layout = std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, - gfx::Insets(kVolumePopupPadding), kElementSpacing); - auto* layout_ptr = volume_panel_->SetLayoutManager(std::move(layout)); - layout_ptr->set_cross_axis_alignment( - views::BoxLayout::CrossAxisAlignment::kCenter); - volume_panel_->SetBackground(views::CreateSolidBackground(kBackgroundColor)); - volume_panel_->AddChildView(volume_icon.release()); - volume_panel_->AddChildView(volume_bar_); - layout_ptr->SetFlexForView(volume_bar_, 1); - - container->AddChildView(volume_panel_); -} - -void MediaOverlayImpl::AddToast(views::View* container) { - toast_label_ = new views::Label(u""); - toast_label_->SetFontList(toast_font_list_); - toast_label_->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_CENTER); - - // Background color of the label is set to auto-compute the best - // constrasting color for the displayed text. If the background color is not - // opaque, we need to take into account the color underneath, which in worst - // case scenario will be white - toast_label_->SetBackgroundColor( - color_utils::GetResultingPaintColor(kBackgroundColor, SK_ColorWHITE)); - toast_label_->SetBackground(views::CreateSolidBackground(kBackgroundColor)); - toast_label_->SetBorder(views::CreateEmptyBorder(kVolumePopupPadding)); - toast_label_->SetMultiLine(true); - - container->AddChildView(toast_label_); -} - -void MediaOverlayImpl::SetController(Controller* controller) { - controller_ = controller; - NotifyController(); -} - -void MediaOverlayImpl::ShowMessage(const std::u16string& message) { - if (!ui_task_runner_->BelongsToCurrentThread()) { - ui_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaOverlayImpl::ShowMessage, - weak_factory_.GetWeakPtr(), message)); - return; - } - ShowToast(message); -} - -void MediaOverlayImpl::ShowVolumeBar(float volume) { - if (!ui_task_runner_->BelongsToCurrentThread()) { - ui_task_runner_->PostTask( - FROM_HERE, base::BindOnce(&MediaOverlayImpl::ShowVolumeBar, - weak_factory_.GetWeakPtr(), volume)); - return; - } - - volume_bar_->SetValue(volume); - volume_panel_->SetVisible(true); - overlay_widget_->GetContentsView()->Layout(); - - volume_widget_timer_.Start(FROM_HERE, kUiHideDelay, this, - &MediaOverlayImpl::HideVolumeWidget); -} - -void MediaOverlayImpl::HideVolumeWidget() { - volume_panel_->SetVisible(false); -} - -void MediaOverlayImpl::ShowToast(const std::u16string& text) { - toast_label_->SetText(text); - toast_label_->SizeToFit(volume_panel_->bounds().width()); - toast_label_->SetVisible(true); - overlay_widget_->GetContentsView()->Layout(); - - toast_visible_timer_.Start(FROM_HERE, kUiHideDelay, this, - &MediaOverlayImpl::HideToast); -} - -void MediaOverlayImpl::HideToast() { - toast_label_->SetVisible(false); -} - -std::unique_ptr<views::Widget> MediaOverlayImpl::CreateOverlayWidget( - const gfx::Rect& bounds, - std::unique_ptr<views::View> content_view) { - std::unique_ptr<views::Widget> widget = std::make_unique<views::Widget>(); - - views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; - params.context = window_manager_->GetRootWindow(); - params.opacity = views::Widget::InitParams::WindowOpacity::kTranslucent; - params.bounds = bounds; - params.accept_events = false; - - widget->Init(std::move(params)); - widget->SetContentsView(std::move(content_view)); - window_manager_->SetZOrder(widget->GetNativeView(), mojom::ZOrder::VOLUME); - - return widget; -} - -void MediaOverlayImpl::OnAudioPipelineInitialized( - media::MediaPipelineImpl* pipeline, - const ::media::AudioDecoderConfig& config) { - if (config.codec() == ::media::AudioCodec::kAC3 || - config.codec() == ::media::AudioCodec::kEAC3 || - config.codec() == ::media::AudioCodec::kDTS || - config.codec() == ::media::AudioCodec::kDTSXP2 || - config.codec() == ::media::AudioCodec::kMpegHAudio) { - passthrough_pipelines_.insert(pipeline); - } - - NotifyController(); -} - -void MediaOverlayImpl::OnPipelineDestroyed(media::MediaPipelineImpl* pipeline) { - passthrough_pipelines_.erase(pipeline); - NotifyController(); -} - -void MediaOverlayImpl::NotifyController() { - if (!controller_) - return; - controller_->SetSurroundSoundInUse(!passthrough_pipelines_.empty()); -} - -} // namespace chromecast
diff --git a/chromecast/ui/media_overlay_impl.h b/chromecast/ui/media_overlay_impl.h deleted file mode 100644 index a09fb11..0000000 --- a/chromecast/ui/media_overlay_impl.h +++ /dev/null
@@ -1,90 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMECAST_UI_MEDIA_OVERLAY_IMPL_H_ -#define CHROMECAST_UI_MEDIA_OVERLAY_IMPL_H_ - -#include <memory> -#include <string> - -#include "base/containers/flat_set.h" -#include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/task/single_thread_task_runner.h" -#include "base/timer/timer.h" -#include "chromecast/graphics/cast_window_manager.h" -#include "chromecast/media/cma/pipeline/media_pipeline_observer.h" -#include "chromecast/ui/media_overlay.h" -#include "ui/gfx/font_list.h" -#include "ui/gfx/geometry/rect.h" -#include "ui/gfx/image/image.h" - -namespace views { -class Label; -class ProgressBar; -class View; -class Widget; -} // namespace views - -namespace chromecast { - -class CastWindowManager; - -class MediaOverlayImpl : public MediaOverlay, - public media::MediaPipelineObserver { - public: - explicit MediaOverlayImpl(CastWindowManager* window_manager); - ~MediaOverlayImpl() override; - - MediaOverlayImpl(const MediaOverlayImpl&) = delete; - MediaOverlayImpl& operator=(const MediaOverlayImpl&) = delete; - - // MediaOverlay implementation: - void SetController(Controller* controller) override; - void ShowMessage(const std::u16string& message) override; - void ShowVolumeBar(float volume) override; - - // media::MediaPipelineObserver implementation - void OnAudioPipelineInitialized( - media::MediaPipelineImpl* pipeline, - const ::media::AudioDecoderConfig& config) override; - void OnPipelineDestroyed(media::MediaPipelineImpl* pipeline) override; - - private: - void NotifyController(); - - void AddVolumeBar(views::View* container); - void AddToast(views::View* container); - - void HideVolumeWidget(); - - void ShowToast(const std::u16string& text); - void HideToast(); - - std::unique_ptr<views::Widget> CreateOverlayWidget( - const gfx::Rect& bounds, - std::unique_ptr<views::View> content_view); - - CastWindowManager* const window_manager_; - const scoped_refptr<base::SingleThreadTaskRunner> ui_task_runner_; - base::flat_set<media::MediaPipelineImpl*> passthrough_pipelines_; - Controller* controller_; - - views::View* volume_panel_; - views::ProgressBar* volume_bar_; - base::OneShotTimer volume_widget_timer_; - const gfx::Image volume_icon_image_; - - views::Label* toast_label_; - base::OneShotTimer toast_visible_timer_; - const gfx::FontList toast_font_list_; - - std::unique_ptr<views::Widget> overlay_widget_; - - base::WeakPtrFactory<MediaOverlayImpl> weak_factory_; -}; - -} // namespace chromecast - -#endif // CHROMECAST_UI_MEDIA_OVERLAY_IMPL_H_
diff --git a/chromecast/ui/mojom/BUILD.gn b/chromecast/ui/mojom/BUILD.gn index 11cb827..bea3dab4 100644 --- a/chromecast/ui/mojom/BUILD.gn +++ b/chromecast/ui/mojom/BUILD.gn
@@ -7,11 +7,8 @@ mojom("mojom") { sources = [ "display_settings.mojom", - "media_control_ui.mojom", "ui_service.mojom", ] - public_deps = [ - "//mojo/public/mojom/base", - ] + public_deps = [ "//mojo/public/mojom/base" ] }
diff --git a/chromecast/ui/mojom/media_control_ui.mojom b/chromecast/ui/mojom/media_control_ui.mojom deleted file mode 100644 index 9dbdfda..0000000 --- a/chromecast/ui/mojom/media_control_ui.mojom +++ /dev/null
@@ -1,47 +0,0 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -module chromecast.mojom; - -// API for a touch-based media overlay UI. The client receives commands that -// are triggered from the UI. The client may also set various attributes on -// the UI, so that only relevant controls are visible to the user. -interface MediaControlUi { - // Set a client for the UI. - SetClient(pending_remote<MediaControlClient> client); - // Update the UI to match the new attributes. - SetAttributes(MediaControlUiAttributes attributes); -}; - -enum MediaCommand { - TOGGLE_PLAY_PAUSE, - NEXT, - PREVIOUS, - FORWARD_30_SECONDS, - REPLAY_30_SECONDS, -}; - -// Endpoint for plumbing media commands invoked by the UI. -interface MediaControlClient { - // Executes a media command on behalf of the UI. These commands are only - // triggered by user interaction via the touch-based UI. - Execute(MediaCommand command); -}; - -struct MediaControlUiAttributes { - // UI attributes. - bool show_seek; - bool show_next; - bool show_previous; - - // Media attributes. - string title; - string metadata; - double current_time; - double duration; - bool is_playing; - bool is_paused; -}; - -
diff --git a/chromeos/ash/components/network/device_state.cc b/chromeos/ash/components/network/device_state.cc index c9ee6204..6978976 100644 --- a/chromeos/ash/components/network/device_state.cc +++ b/chromeos/ash/components/network/device_state.cc
@@ -23,7 +23,7 @@ bool DeviceState::PropertyChanged(const std::string& key, const base::Value& value) { // All property values get stored in |properties_|. - properties_.SetKey(key, value.Clone()); + properties_.Set(key, value.Clone()); if (ManagedStatePropertyChanged(key, value)) return true; @@ -111,7 +111,7 @@ } else if (key == shill::kCellularApnListProperty) { if (!value.is_list()) return false; - apn_list_ = value.Clone(); + apn_list_ = value.GetList().Clone(); return true; } else if (key == shill::kInhibitedProperty) { return GetBooleanValue(key, value, &inhibited_); @@ -121,7 +121,7 @@ // If kIPConfigsProperty changes, clear any previous ip_configs_. // ShillPropertyhandler will request the IPConfig objects which will trigger // calls to IPConfigPropertiesChanged. - ip_configs_.DictClear(); + ip_configs_.clear(); return false; // No actual state change. } else if (key == shill::kLinkUpProperty) { return GetBooleanValue(key, value, &link_up_); @@ -138,10 +138,10 @@ } void DeviceState::IPConfigPropertiesChanged(const std::string& ip_config_path, - const base::Value& properties) { + base::Value properties) { NET_LOG(EVENT) << "IPConfig for: " << path() << " Changed: " << ip_config_path; - ip_configs_.SetKey(ip_config_path, properties.Clone()); + ip_configs_.Set(ip_config_path, std::move(properties)); } std::string DeviceState::GetName() const { @@ -175,19 +175,19 @@ } std::string DeviceState::GetIpAddressByType(const std::string& type) const { - for (const auto iter : ip_configs_.DictItems()) { + for (const auto iter : ip_configs_) { if (!iter.second.is_dict()) continue; - const base::Value& ip_config = iter.second; + const base::Value::Dict& ip_config = iter.second.GetDict(); const std::string* ip_config_method = - ip_config.FindStringKey(shill::kMethodProperty); + ip_config.FindString(shill::kMethodProperty); if (!ip_config_method) continue; if (type == *ip_config_method || (type == shill::kTypeIPv4 && *ip_config_method == shill::kTypeDHCP) || (type == shill::kTypeIPv6 && *ip_config_method == shill::kTypeDHCP6)) { const std::string* address = - ip_config.FindStringKey(shill::kAddressProperty); + ip_config.FindString(shill::kAddressProperty); if (!address) continue; return *address; @@ -208,13 +208,13 @@ } bool DeviceState::HasAPN(const std::string& access_point_name) const { - for (const auto& apn : apn_list_.GetListDeprecated()) { + for (const auto& apn : apn_list_) { // bogus empty entries in the list might have been converted to a list while // traveling over D-Bus, skip them rather than crashing below. if (!apn.is_dict()) continue; - const std::string* apn_name = apn.FindStringKey(shill::kApnProperty); + const std::string* apn_name = apn.GetDict().FindString(shill::kApnProperty); if (apn_name && *apn_name == access_point_name) { return true; }
diff --git a/chromeos/ash/components/network/device_state.h b/chromeos/ash/components/network/device_state.h index 9e8b34eb..3a7fe88 100644 --- a/chromeos/ash/components/network/device_state.h +++ b/chromeos/ash/components/network/device_state.h
@@ -33,7 +33,7 @@ bool IsActive() const override; void IPConfigPropertiesChanged(const std::string& ip_config_path, - const base::Value& properties); + base::Value properties); // Accessors const std::string& mac_address() const { return mac_address_; } @@ -59,11 +59,11 @@ bool inhibited() const { return inhibited_; } // |ip_configs_| is kept up to date by NetworkStateHandler. - const base::Value& ip_configs() const { return ip_configs_; } + const base::Value::Dict& ip_configs() const { return ip_configs_; } // Do not use this. It exists temporarily for internet_options_handler.cc // which is being deprecated. - const base::Value& properties() const { return properties_; } + const base::Value::Dict& properties() const { return properties_; } // Ethernet specific accessors bool eap_authentication_completed() const { @@ -132,13 +132,13 @@ std::string available_managed_network_path_; // Keep all Device properties in a dictionary for now. See comment above. - base::Value properties_{base::Value::Type::DICTIONARY}; + base::Value::Dict properties_; // List of APNs. - base::Value apn_list_; + base::Value::List apn_list_; // Dictionary of IPConfig properties, keyed by IpConfig path. - base::Value ip_configs_{base::Value::Type::DICTIONARY}; + base::Value::Dict ip_configs_; }; } // namespace ash
diff --git a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc index 73f60c0..0e02af3 100644 --- a/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc +++ b/chromeos/ash/components/network/managed_network_configuration_handler_impl.cc
@@ -1107,7 +1107,7 @@ // want information about all ipv4 and ipv6 IPConfig properties. base::Value ip_configs(base::Value::Type::LIST); - if (!device_state || device_state->ip_configs().DictEmpty()) { + if (!device_state || device_state->ip_configs().empty()) { // Shill may not provide IPConfigs for external Cellular devices/dongles // (https://crbug.com/739314) or VPNs, so build a dictionary of ipv4 // properties from cached NetworkState properties . @@ -1119,7 +1119,7 @@ } else { // Convert the DeviceState IPConfigs dictionary to a base::Value::Type::LIST // Value. - for (const auto iter : device_state->ip_configs().DictItems()) + for (const auto iter : device_state->ip_configs()) ip_configs.Append(iter.second.Clone()); } if (!ip_configs.GetListDeprecated().empty()) {
diff --git a/chromeos/ash/components/network/network_state_handler.cc b/chromeos/ash/components/network/network_state_handler.cc index 60c246a3..2a6db44 100644 --- a/chromeos/ash/components/network/network_state_handler.cc +++ b/chromeos/ash/components/network/network_state_handler.cc
@@ -1623,7 +1623,7 @@ ManagedState::ManagedType type, const std::string& path, const std::string& ip_config_path, - const base::Value& properties) { + base::Value properties) { if (type == ManagedState::MANAGED_TYPE_NETWORK) { NetworkState* network = GetModifiableNetworkState(path); if (!network) @@ -1638,7 +1638,7 @@ DeviceState* device = GetModifiableDeviceState(path); if (!device) return; - device->IPConfigPropertiesChanged(ip_config_path, properties); + device->IPConfigPropertiesChanged(ip_config_path, std::move(properties)); NotifyDevicePropertiesUpdated(device); if (!default_network_path_.empty()) { const NetworkState* default_network =
diff --git a/chromeos/ash/components/network/network_state_handler.h b/chromeos/ash/components/network/network_state_handler.h index ae790504..e12ca3f 100644 --- a/chromeos/ash/components/network/network_state_handler.h +++ b/chromeos/ash/components/network/network_state_handler.h
@@ -514,7 +514,7 @@ void UpdateIPConfigProperties(ManagedState::ManagedType type, const std::string& path, const std::string& ip_config_path, - const base::Value& properties) override; + base::Value properties) override; void CheckPortalListChanged(const std::string& check_portal_list) override; void HostnameChanged(const std::string& hostname) override;
diff --git a/chromeos/ash/components/network/shill_property_handler.cc b/chromeos/ash/components/network/shill_property_handler.cc index 82067615..8431331 100644 --- a/chromeos/ash/components/network/shill_property_handler.cc +++ b/chromeos/ash/components/network/shill_property_handler.cc
@@ -676,7 +676,8 @@ return; } NET_LOG(EVENT) << "IP Config properties received: " << NetworkPathId(path); - listener_->UpdateIPConfigProperties(type, path, ip_config_path, *properties); + listener_->UpdateIPConfigProperties(type, path, ip_config_path, + std::move(*properties)); } } // namespace ash::internal
diff --git a/chromeos/ash/components/network/shill_property_handler.h b/chromeos/ash/components/network/shill_property_handler.h index e680dbc..120720e 100644 --- a/chromeos/ash/components/network/shill_property_handler.h +++ b/chromeos/ash/components/network/shill_property_handler.h
@@ -70,7 +70,7 @@ virtual void UpdateIPConfigProperties(ManagedState::ManagedType type, const std::string& path, const std::string& ip_config_path, - const base::Value& properties) = 0; + base::Value properties) = 0; // Called when the list of devices with portal check enabled changes. virtual void CheckPortalListChanged(
diff --git a/chromeos/ash/components/network/shill_property_handler_unittest.cc b/chromeos/ash/components/network/shill_property_handler_unittest.cc index f7e4bf2..22779f1a 100644 --- a/chromeos/ash/components/network/shill_property_handler_unittest.cc +++ b/chromeos/ash/components/network/shill_property_handler_unittest.cc
@@ -86,7 +86,7 @@ void UpdateIPConfigProperties(ManagedState::ManagedType type, const std::string& path, const std::string& ip_config_path, - const base::Value& properties) override { + base::Value properties) override { AddPropertyUpdate(shill::kIPConfigsProperty, ip_config_path); }
diff --git a/chromeos/components/certificate_provider/BUILD.gn b/chromeos/components/certificate_provider/BUILD.gn new file mode 100644 index 0000000..7a483092 --- /dev/null +++ b/chromeos/components/certificate_provider/BUILD.gn
@@ -0,0 +1,19 @@ +# Copyright 2022 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(is_chromeos, "Non-ChromeOS builds cannot depend on //chromeos") + +component("certificate_provider") { + sources = [ + "certificate_info.cc", + "certificate_info.h", + ] + + defines = [ "IS_CERTIFICATE_PROVIDER_IMPL" ] + + public_deps = [ + "//base:base", + "//net:net", + ] +}
diff --git a/chromeos/components/certificate_provider/DIR_METADATA b/chromeos/components/certificate_provider/DIR_METADATA new file mode 100644 index 0000000..1cb62ef --- /dev/null +++ b/chromeos/components/certificate_provider/DIR_METADATA
@@ -0,0 +1,3 @@ +monorail { + component: "OS>Software>Enterprise>Smartcard" +}
diff --git a/chromeos/components/certificate_provider/OWNERS b/chromeos/components/certificate_provider/OWNERS new file mode 100644 index 0000000..e2f5733 --- /dev/null +++ b/chromeos/components/certificate_provider/OWNERS
@@ -0,0 +1 @@ +file://chrome/browser/certificate_provider/OWNERS
diff --git a/chrome/browser/certificate_provider/certificate_info.cc b/chromeos/components/certificate_provider/certificate_info.cc similarity index 91% rename from chrome/browser/certificate_provider/certificate_info.cc rename to chromeos/components/certificate_provider/certificate_info.cc index 19e1235..8e476d3 100644 --- a/chrome/browser/certificate_provider/certificate_info.cc +++ b/chromeos/components/certificate_provider/certificate_info.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/certificate_provider/certificate_info.h" +#include "chromeos/components/certificate_provider/certificate_info.h" #include "net/cert/x509_certificate.h"
diff --git a/chrome/browser/certificate_provider/certificate_info.h b/chromeos/components/certificate_provider/certificate_info.h similarity index 76% rename from chrome/browser/certificate_provider/certificate_info.h rename to chromeos/components/certificate_provider/certificate_info.h index e6ffe8d..fd53e08 100644 --- a/chrome/browser/certificate_provider/certificate_info.h +++ b/chromeos/components/certificate_provider/certificate_info.h
@@ -2,13 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_ -#define CHROME_BROWSER_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_ +#ifndef CHROMEOS_COMPONENTS_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_ +#define CHROMEOS_COMPONENTS_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_ #include <stdint.h> #include <vector> +#include "base/component_export.h" #include "base/memory/ref_counted.h" #include "net/cert/x509_certificate.h" #include "net/ssl/ssl_private_key.h" @@ -18,7 +19,7 @@ // Holds all information of a certificate that must be synchronously available // to implement net::SSLPrivateKey. -struct CertificateInfo { +struct COMPONENT_EXPORT(CERTIFICATE_PROVIDER) CertificateInfo { CertificateInfo(); CertificateInfo(const CertificateInfo& other); ~CertificateInfo(); @@ -35,4 +36,4 @@ } // namespace certificate_provider } // namespace chromeos -#endif // CHROME_BROWSER_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_ +#endif // CHROMEOS_COMPONENTS_CERTIFICATE_PROVIDER_CERTIFICATE_INFO_H_
diff --git a/chromeos/services/bluetooth_config/device_operation_handler.cc b/chromeos/services/bluetooth_config/device_operation_handler.cc index 116e937..3f952da 100644 --- a/chromeos/services/bluetooth_config/device_operation_handler.cc +++ b/chromeos/services/bluetooth_config/device_operation_handler.cc
@@ -42,7 +42,7 @@ // static const base::TimeDelta DeviceOperationHandler::kOperationTimeout = - base::Milliseconds(5000); + base::Seconds(15); DeviceOperationHandler::DeviceOperationHandler( AdapterStateController* adapter_state_controller)
diff --git a/chromeos/services/libassistant/audio/audio_input_impl.cc b/chromeos/services/libassistant/audio/audio_input_impl.cc index 3c7f6db..ca66073 100644 --- a/chromeos/services/libassistant/audio/audio_input_impl.cc +++ b/chromeos/services/libassistant/audio/audio_input_impl.cc
@@ -64,11 +64,13 @@ } void OnConversationTurnFinished() override { - input_->RecreateAudioInputStream(true /* use_dsp */); - if (stream_state_ == StreamState::HOTWORD) { - // If |stream_state_| remains unchanged, that indicates the first stage - // DSP hotword detection was rejected by Libassistant. - RecordDspHotwordDetection(DspHotwordDetectionStatus::SOFTWARE_REJECTED); + if (input_->IsHotwordEnabled()) { + input_->RecreateAudioInputStream(true /* use_dsp */); + if (stream_state_ == StreamState::HOTWORD) { + // If |stream_state_| remains unchanged, that indicates the first stage + // DSP hotword detection was rejected by Libassistant. + RecordDspHotwordDetection(DspHotwordDetectionStatus::SOFTWARE_REJECTED); + } } stream_state_ = StreamState::HOTWORD; }
diff --git a/chromeos/services/libassistant/audio/audio_input_impl.h b/chromeos/services/libassistant/audio/audio_input_impl.h index 921818ab..920dd14 100644 --- a/chromeos/services/libassistant/audio/audio_input_impl.h +++ b/chromeos/services/libassistant/audio/audio_input_impl.h
@@ -75,6 +75,7 @@ void RecreateAudioInputStream(bool use_dsp); bool IsHotwordAvailable() const; + bool IsHotwordEnabled() const { return hotword_enabled_; } // Returns the recording state used in unittests. bool IsRecordingForTesting() const;
diff --git a/components/README.md b/components/README.md index 5388dec..3131452a 100644 --- a/components/README.md +++ b/components/README.md
@@ -3,7 +3,7 @@ This directory is meant to house features or subsystems that are used in more than one part of the Chromium codebase. -## Example use cases: +## Use cases: * Features that are shared by Chrome on iOS (`//ios/chrome`) and Chrome on other platforms (`//chrome`). @@ -22,6 +22,10 @@ conceptually Blink code that is shared by iOS, raise the question on chromium-dev@, where the right folks will see it). +Note that the above list is meant to be exhaustive. A component should not be +added just to separate it from other code in the same layer that is the only +consumer; that can be done with strict DEPS or GN visibility rules. + ## Guidelines for adding a new component * You will be added to an OWNERS file under `//components/{your component}`
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java index b71213f..578534d6 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java
@@ -220,7 +220,7 @@ mPreviousSelection = new HashSet<ContactDetails>(mSelectionDelegate.getSelectedItems()); mSearchButton.setVisibility(GONE); mPickerAdapter.setSearchMode(true); - mToolbar.showSearchView(); + mToolbar.showSearchView(true); } // SelectableListToolbar.SearchDelegate:
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java index 234a956b..688eb18 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableListToolbar.java
@@ -351,7 +351,7 @@ /** * Shows the search edit text box and related views. */ - public void showSearchView() { + public void showSearchView(boolean showKeyboard) { assert mHasSearchView; mIsSearching = true; @@ -360,7 +360,10 @@ showSearchViewInternal(); mSearchEditText.requestFocus(); - KeyboardVisibilityDelegate.getInstance().showKeyboard(mSearchEditText); + if (showKeyboard) { + KeyboardVisibilityDelegate.getInstance().showKeyboard(mSearchEditText); + } + setTitle(null); }
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java index 2750c22..39f88d03 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/EventConstants.java
@@ -243,6 +243,9 @@ /** Sharing Hub link toggle events. */ public static final String SHARING_HUB_LINK_TOGGLE_CLICKED = "sharing_hub_link_toggle_clicked"; + /** Crow events. */ + public static final String CROW_TAB_MENU_ITEM_CLICKED = "crow_tab_menu_item_clicked"; + /** Mic toolbar IPH event */ public static final String SUCCESSFUL_VOICE_SEARCH = "successful_voice_search";
diff --git a/components/feed/core/v2/user_actions_collector_unittest.cc b/components/feed/core/v2/user_actions_collector_unittest.cc index 2fe7e10..4f3af10 100644 --- a/components/feed/core/v2/user_actions_collector_unittest.cc +++ b/components/feed/core/v2/user_actions_collector_unittest.cc
@@ -11,6 +11,7 @@ #include "base/callback_helpers.h" #include "base/memory/raw_ptr.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/feed/core/common/pref_names.h" #include "components/feed/core/proto/v2/user_actions_store.pb.h" @@ -18,6 +19,7 @@ #include "components/feed/core/v2/prefs.h" #include "components/feed/core/v2/public/common_enums.h" #include "components/feed/core/v2/public/feed_api.h" +#include "components/feed/feed_feature_list.h" #include "components/prefs/testing_pref_service.h" #include "components/variations/scoped_variations_ids_provider.h" #include "testing/gmock/include/gmock/gmock.h" @@ -30,6 +32,7 @@ class UserActionsCollectorTest : public testing::Test { public: UserActionsCollectorTest() { + feature_list_.InitAndEnableFeature(kPersonalizeFeedUnsignedUsers); feed::RegisterProfilePrefs(profile_prefs_.registry()); user_actions_collector_ = std::make_unique<UserActionsCollector>(&profile_prefs_); @@ -55,6 +58,7 @@ } protected: + base::test::ScopedFeatureList feature_list_; variations::ScopedVariationsIdsProvider scoped_variations_ids_provider_{ variations::VariationsIdsProvider::Mode::kUseSignedInState}; TestingPrefServiceSimple profile_prefs_;
diff --git a/components/feed/feed_feature_list.cc b/components/feed/feed_feature_list.cc index 07cffd4..943e70dc 100644 --- a/components/feed/feed_feature_list.cc +++ b/components/feed/feed_feature_list.cc
@@ -90,8 +90,8 @@ base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kWebUiFeed{"FeedWebUi", base::FEATURE_DISABLED_BY_DEFAULT}; -const base::FeatureParam<std::string> kWebUiScriptFetchUrl{ - &kWebUiFeed, "scripturl", "chrome-untrusted://feed/feed.js"}; +const base::FeatureParam<std::string> kWebUiFeedUrl{ + &kWebUiFeed, "feedurl", "https://www.google.com/feed-api/following"}; const base::FeatureParam<bool> kWebUiDisableContentSecurityPolicy{ &kWebUiFeed, "disableCsp", false}; @@ -105,7 +105,7 @@ } const base::Feature kPersonalizeFeedUnsignedUsers{ - "PersonalizeFeedUnsignedUsers", base::FEATURE_ENABLED_BY_DEFAULT}; + "PersonalizeFeedUnsignedUsers", base::FEATURE_DISABLED_BY_DEFAULT}; const base::Feature kInfoCardAcknowledgementTracking{ "InfoCardAcknowledgementTracking", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/components/feed/feed_feature_list.h b/components/feed/feed_feature_list.h index 3441f205..eb04e51 100644 --- a/components/feed/feed_feature_list.h +++ b/components/feed/feed_feature_list.h
@@ -97,7 +97,7 @@ // Feature that causes the WebUI version of the Feed to be enabled. extern const base::Feature kWebUiFeed; -extern const base::FeatureParam<std::string> kWebUiScriptFetchUrl; +extern const base::FeatureParam<std::string> kWebUiFeedUrl; extern const base::FeatureParam<bool> kWebUiDisableContentSecurityPolicy; std::string GetFeedReferrerUrl();
diff --git a/components/history/core/browser/history_backend.cc b/components/history/core/browser/history_backend.cc index 86bdbf7..7f174df 100644 --- a/components/history/core/browser/history_backend.cc +++ b/components/history/core/browser/history_backend.cc
@@ -2752,8 +2752,7 @@ for (HistoryBackendObserver& observer : observers_) observer.OnURLVisited(this, url_row, visit_row); - delegate_->NotifyURLVisited(visit_row.transition, url_row, - visit_row.visit_time); + delegate_->NotifyURLVisited(url_row, visit_row); } void HistoryBackend::NotifyURLsModified(const URLRows& changed_urls,
diff --git a/components/history/core/browser/history_backend.h b/components/history/core/browser/history_backend.h index 68e61b6..e4fcbd3 100644 --- a/components/history/core/browser/history_backend.h +++ b/components/history/core/browser/history_backend.h
@@ -153,9 +153,8 @@ // Notify HistoryService that the user is visiting a URL. The event will // be forwarded to the HistoryServiceObservers in the correct thread. - virtual void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) = 0; + virtual void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) = 0; // Notify HistoryService that some URLs have been modified. The event will // be forwarded to the HistoryServiceObservers in the correct thread.
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 7923bc0b..d60f696 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -97,16 +97,15 @@ const URLRow* row1, const URLRow* row2, const URLRow* row3) { - URLRows rows; + std::vector<URLRow> rows; rows.push_back(*row1); if (row2) rows.push_back(*row2); if (row3) rows.push_back(*row3); - base::Time visit_time; for (const URLRow& row : rows) { - observer->OnURLVisited(nullptr, ui::PAGE_TRANSITION_LINK, row, visit_time); + observer->OnURLVisited(nullptr, row, VisitRow()); } } @@ -144,9 +143,8 @@ std::unique_ptr<InMemoryHistoryBackend> backend) override; void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) override; - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) override; + void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) override; void NotifyURLsModified(const URLRows& changed_urls) override; void NotifyURLsDeleted(DeletionInfo deletion_info) override; void NotifyKeywordSearchTermUpdated(const URLRow& row, @@ -185,7 +183,7 @@ class HistoryBackendTestBase : public testing::Test { public: - typedef std::vector<std::pair<ui::PageTransition, URLRow>> URLVisitedList; + typedef std::vector<std::pair<URLRow, VisitRow>> URLVisitedList; typedef std::vector<URLRows> URLsModifiedList; typedef std::vector<std::pair<bool, bool>> URLsDeletedList; @@ -248,12 +246,10 @@ favicon_changed_notifications_icon_urls_.push_back(icon_url); } - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) { + void NotifyURLVisited(const URLRow& url_row, const VisitRow& new_visit) { // Send the notifications directly to the in-memory database. - mem_backend_->OnURLVisited(nullptr, transition, row, visit_time); - url_visited_notifications_.push_back(std::make_pair(transition, row)); + mem_backend_->OnURLVisited(nullptr, url_row, new_visit); + url_visited_notifications_.push_back(std::make_pair(url_row, new_visit)); } void NotifyURLsModified(const URLRows& changed_urls) { @@ -341,10 +337,9 @@ test_->NotifyFaviconsChanged(page_urls, icon_url); } -void HistoryBackendTestDelegate::NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) { - test_->NotifyURLVisited(transition, row, visit_time); +void HistoryBackendTestDelegate::NotifyURLVisited(const URLRow& url_row, + const VisitRow& new_visit) { + test_->NotifyURLVisited(url_row, new_visit); } void HistoryBackendTestDelegate::NotifyURLsModified( @@ -1148,7 +1143,7 @@ ASSERT_EQ(1, num_url_visited_notifications()); const URLVisitedList& visited_url_list = url_visited_notifications(); ASSERT_EQ(1u, visited_url_list.size()); - const URLRow& visited_url = visited_url_list[0].second; + const URLRow& visited_url = visited_url_list[0].first; EXPECT_EQ(page1_title, visited_url.title()); ClearBroadcastedNotifications(); @@ -1165,7 +1160,7 @@ ASSERT_EQ(1, num_url_visited_notifications()); const URLVisitedList& visited_url_list2 = url_visited_notifications(); ASSERT_EQ(1u, visited_url_list2.size()); - const URLRow& visited_url2 = visited_url_list2[0].second; + const URLRow& visited_url2 = visited_url_list2[0].first; EXPECT_EQ(page2_title, visited_url2.title()); } @@ -1610,20 +1605,23 @@ // Expect that HistoryServiceObserver::OnURLVisited has been called 3 times, // and that each time the URLRows have the correct URLs and IDs set. ASSERT_EQ(3, num_url_visited_notifications()); - EXPECT_TRUE(ui::PageTransitionCoreTypeIs(url_visited_notifications()[0].first, - ui::PAGE_TRANSITION_LINK)); - EXPECT_EQ(stored_row1.id(), url_visited_notifications()[0].second.id()); - EXPECT_EQ(stored_row1.url(), url_visited_notifications()[0].second.url()); + EXPECT_TRUE(ui::PageTransitionCoreTypeIs( + url_visited_notifications()[0].second.transition, + ui::PAGE_TRANSITION_LINK)); + EXPECT_EQ(stored_row1.id(), url_visited_notifications()[0].first.id()); + EXPECT_EQ(stored_row1.url(), url_visited_notifications()[0].first.url()); - EXPECT_TRUE(ui::PageTransitionCoreTypeIs(url_visited_notifications()[1].first, - ui::PAGE_TRANSITION_TYPED)); - EXPECT_EQ(stored_row2.id(), url_visited_notifications()[1].second.id()); - EXPECT_EQ(stored_row2.url(), url_visited_notifications()[1].second.url()); + EXPECT_TRUE(ui::PageTransitionCoreTypeIs( + url_visited_notifications()[1].second.transition, + ui::PAGE_TRANSITION_TYPED)); + EXPECT_EQ(stored_row2.id(), url_visited_notifications()[1].first.id()); + EXPECT_EQ(stored_row2.url(), url_visited_notifications()[1].first.url()); - EXPECT_TRUE(ui::PageTransitionCoreTypeIs(url_visited_notifications()[2].first, - ui::PAGE_TRANSITION_TYPED)); - EXPECT_EQ(stored_row2.id(), url_visited_notifications()[2].second.id()); - EXPECT_EQ(stored_row2.url(), url_visited_notifications()[2].second.url()); + EXPECT_TRUE(ui::PageTransitionCoreTypeIs( + url_visited_notifications()[2].second.transition, + ui::PAGE_TRANSITION_TYPED)); + EXPECT_EQ(stored_row2.id(), url_visited_notifications()[2].first.id()); + EXPECT_EQ(stored_row2.url(), url_visited_notifications()[2].first.url()); } TEST_F(HistoryBackendTest, AddPageArgsSource) {
diff --git a/components/history/core/browser/history_service.cc b/components/history/core/browser/history_service.cc index 9680c91..8515f10d 100644 --- a/components/history/core/browser/history_service.cc +++ b/components/history/core/browser/history_service.cc
@@ -99,13 +99,11 @@ history_service_, page_urls, icon_url)); } - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) override { + void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) override { service_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&HistoryService::NotifyURLVisited, history_service_, - transition, row, visit_time)); + FROM_HERE, base::BindOnce(&HistoryService::NotifyURLVisited, + history_service_, url_row, visit_row)); } void NotifyURLsModified(const URLRows& changed_urls) override { @@ -1368,12 +1366,11 @@ NotifyHistoryServiceLoaded(); } -void HistoryService::NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) { +void HistoryService::NotifyURLVisited(const URLRow& url_row, + const VisitRow& new_visit) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); for (HistoryServiceObserver& observer : observers_) - observer.OnURLVisited(this, transition, row, visit_time); + observer.OnURLVisited(this, url_row, new_visit); } void HistoryService::NotifyURLsModified(const URLRows& changed_urls) {
diff --git a/components/history/core/browser/history_service.h b/components/history/core/browser/history_service.h index a1eec0fa..80cd2cb 100644 --- a/components/history/core/browser/history_service.h +++ b/components/history/core/browser/history_service.h
@@ -713,12 +713,10 @@ // Observers ---------------------------------------------------------------- - // Notify all HistoryServiceObservers registered that user is visiting a URL. - // The `row` ID will be set to the value that is currently in effect in the - // main history database. - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time); + // Notify all HistoryServiceObservers registered that there's a `new_visit` + // for `url_row`. This happens when the user visited the URL on this machine, + // or if Sync has brought over a remote visit onto this device. + void NotifyURLVisited(const URLRow& url_row, const VisitRow& new_visit); // Notify all HistoryServiceObservers registered that URLs have been added or // modified. `changed_urls` contains the list of affects URLs.
diff --git a/components/history/core/browser/history_service_observer.h b/components/history/core/browser/history_service_observer.h index b8838cf4..80228539 100644 --- a/components/history/core/browser/history_service_observer.h +++ b/components/history/core/browser/history_service_observer.h
@@ -26,20 +26,17 @@ virtual ~HistoryServiceObserver() = default; - // Called when a new visit is added to History. This happens in two scenarios: + // Called when a `new_visit` is added to History. This happens in two + // scenarios: // 1. User makes a new visit on the local device. // 2. Sync brings a visit from a different device onto the local device. // Notably, this is called for each visit brought over. // - // The values in `row` are set to what is cuurrently in the history database. - // - // TODO(crbug.com/1345274): We should either add a parameter to this method, - // or wholly merge this with `OnURLsModified` before enabling Full History - // Sync, as this will start to get called way more often. + // The values in `url_row` and `new_visit` are set to what is currently in the + // history database. virtual void OnURLVisited(HistoryService* history_service, - ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) {} + const URLRow& url_row, + const VisitRow& new_visit) {} // Called when a URL has a metadata-only update. In situations where a URL has // a metadata-only update AND new visits, both `OnURLsModified` and @@ -56,11 +53,6 @@ // `changed_urls` lists the information for each of the URLs affected. The // rows will have the IDs that are currently in effect in the main history // database. - // - // TODO(crbug.com/1345274): The differences between this and `OnURLVisited` - // are pretty deep into the implementation of History, and we may be forcing - // observers to think too hard. Many observers simply map both calls to the - // same on-changed code. Consider merging this with `OnURLVisited`. virtual void OnURLsModified(HistoryService* history_service, const URLRows& changed_urls) {}
diff --git a/components/history/core/browser/history_types.h b/components/history/core/browser/history_types.h index 658e50d..afd7812 100644 --- a/components/history/core/browser/history_types.h +++ b/components/history/core/browser/history_types.h
@@ -1020,6 +1020,10 @@ // and should not be persisted. It's a UI-state-specific score that's // convenient to buffer here. float search_match_score = 0.0; + + // Set to true if this cluster was loaded from SQL rather than dynamically + // generated. Used for UI display only and should not be persisted. + bool from_persistence = false; }; } // namespace history
diff --git a/components/history/core/browser/in_memory_history_backend.cc b/components/history/core/browser/in_memory_history_backend.cc index a4d68b8..be4d7d1 100644 --- a/components/history/core/browser/in_memory_history_backend.cc +++ b/components/history/core/browser/in_memory_history_backend.cc
@@ -37,11 +37,11 @@ db_->DeleteAllSearchTermsForKeyword(keyword_id); } -void InMemoryHistoryBackend::OnURLVisited(HistoryService* history_service, - ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) { - OnURLVisitedOrModified(row); +void InMemoryHistoryBackend::OnURLVisited( + history::HistoryService* history_service, + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + OnURLVisitedOrModified(url_row); } void InMemoryHistoryBackend::OnURLsModified(HistoryService* history_service,
diff --git a/components/history/core/browser/in_memory_history_backend.h b/components/history/core/browser/in_memory_history_backend.h index 1a0f9011..6b0f50f 100644 --- a/components/history/core/browser/in_memory_history_backend.h +++ b/components/history/core/browser/in_memory_history_backend.h
@@ -73,10 +73,9 @@ friend class InMemoryHistoryBackendTest; // HistoryServiceObserver: - void OnURLVisited(HistoryService* history_service, - ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) override; + void OnURLVisited(history::HistoryService* history_service, + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsModified(HistoryService* history_service, const URLRows& changed_urls) override; void OnURLsDeleted(HistoryService* history_service,
diff --git a/components/history/core/browser/sync/delete_directive_handler_unittest.cc b/components/history/core/browser/sync/delete_directive_handler_unittest.cc index b4330b2..fd33bd7 100644 --- a/components/history/core/browser/sync/delete_directive_handler_unittest.cc +++ b/components/history/core/browser/sync/delete_directive_handler_unittest.cc
@@ -50,9 +50,8 @@ std::unique_ptr<InMemoryHistoryBackend> backend) override {} void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) override {} - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) override {} + void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) override {} void NotifyURLsModified(const URLRows& changed_urls) override {} void NotifyURLsDeleted(DeletionInfo deletion_info) override {} void NotifyKeywordSearchTermUpdated(const URLRow& row,
diff --git a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc index 518d888..db1cf30 100644 --- a/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc +++ b/components/history/core/browser/sync/typed_url_sync_bridge_unittest.cc
@@ -262,9 +262,8 @@ std::unique_ptr<InMemoryHistoryBackend> backend) override {} void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) override {} - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - Time visit_time) override {} + void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) override {} void NotifyURLsModified(const std::vector<URLRow>& changed_urls) override {} void NotifyURLsDeleted(DeletionInfo deletion_info) override {} void NotifyKeywordSearchTermUpdated(const URLRow& row,
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc index ff77a11..5ae7f906 100644 --- a/components/history/core/browser/visit_annotations_database.cc +++ b/components/history/core/browser/visit_annotations_database.cc
@@ -475,6 +475,7 @@ // `VisitContextAnnotations`. Cluster cluster; cluster.cluster_id = received_cluster_id; + cluster.from_persistence = true; cluster.should_show_on_prominent_ui_surfaces = statement.ColumnBool(1); // The DB can't represent `nullopt` labels, so they're persisted as u"" but // retrieved as `nullopt` for consistency with their original values and the
diff --git a/components/history/core/test/history_backend_db_base_test.cc b/components/history/core/test/history_backend_db_base_test.cc index 3a89662..63974dee 100644 --- a/components/history/core/test/history_backend_db_base_test.cc +++ b/components/history/core/test/history_backend_db_base_test.cc
@@ -43,9 +43,8 @@ } void NotifyFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url) override {} - void NotifyURLVisited(ui::PageTransition transition, - const URLRow& row, - base::Time visit_time) override {} + void NotifyURLVisited(const URLRow& url_row, + const VisitRow& visit_row) override {} void NotifyURLsModified(const URLRows& changed_urls) override {} void NotifyURLsDeleted(DeletionInfo deletion_info) override {} void NotifyKeywordSearchTermUpdated(const URLRow& row,
diff --git a/components/omnibox/browser/favicon_cache.cc b/components/omnibox/browser/favicon_cache.cc index 38a7bf8e..c1c41e5 100644 --- a/components/omnibox/browser/favicon_cache.cc +++ b/components/omnibox/browser/favicon_cache.cc
@@ -160,11 +160,10 @@ } void FaviconCache::OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { - auto it = - responses_without_favicons_.Peek({RequestType::BY_PAGE_URL, row.url()}); + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + auto it = responses_without_favicons_.Peek( + {RequestType::BY_PAGE_URL, url_row.url()}); if (it != responses_without_favicons_.end()) responses_without_favicons_.Erase(it); }
diff --git a/components/omnibox/browser/favicon_cache.h b/components/omnibox/browser/favicon_cache.h index ce35855f..3f1f34ac 100644 --- a/components/omnibox/browser/favicon_cache.h +++ b/components/omnibox/browser/favicon_cache.h
@@ -122,9 +122,8 @@ // history::HistoryServiceObserver: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsDeleted(history::HistoryService* history_service, const history::DeletionInfo& deletion_info) override; void OnFaviconsChanged(const std::set<GURL>& page_urls, const GURL& icon_url);
diff --git a/components/omnibox/browser/favicon_cache_unittest.cc b/components/omnibox/browser/favicon_cache_unittest.cc index bbb9554..a514561 100644 --- a/components/omnibox/browser/favicon_cache_unittest.cc +++ b/components/omnibox/browser/favicon_cache_unittest.cc
@@ -326,8 +326,8 @@ std::move(favicon_service_a_site_response_) .Run(favicon_base::FaviconImageResult()); - cache_.OnURLVisited(nullptr /* history_service */, ui::PAGE_TRANSITION_LINK, - history::URLRow(kUrlA), base::Time::Now()); + cache_.OnURLVisited(nullptr /* history_service */, history::URLRow(kUrlA), + history::VisitRow()); // Now the empty favicon should have been expired and we expect our second // call to the mock underlying FaviconService.
diff --git a/components/omnibox/browser/history_fuzzy_provider.cc b/components/omnibox/browser/history_fuzzy_provider.cc index ae007557..74ecab3 100644 --- a/components/omnibox/browser/history_fuzzy_provider.cc +++ b/components/omnibox/browser/history_fuzzy_provider.cc
@@ -703,14 +703,13 @@ void HistoryFuzzyProvider::OnURLVisited( history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { - DVLOG(1) << "URL Visit: " << row.url(); + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + DVLOG(1) << "URL Visit: " << url_row.url(); if (root_.TerminalCount() < std::min(OmniboxFieldTrial::MaxNumHQPUrlsIndexedAtStartup(), kMaxTerminalCount)) { - root_.Insert(UrlDomainReduction(row.url()), 0); + root_.Insert(UrlDomainReduction(url_row.url()), 0); } }
diff --git a/components/omnibox/browser/history_fuzzy_provider.h b/components/omnibox/browser/history_fuzzy_provider.h index 9fb6f7ac..628822ef 100644 --- a/components/omnibox/browser/history_fuzzy_provider.h +++ b/components/omnibox/browser/history_fuzzy_provider.h
@@ -213,9 +213,8 @@ // history::HistoryServiceObserver: // Adds visited URL host to trie. void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; // Removes deleted (or all) URLs from trie. void OnURLsDeleted(history::HistoryService* history_service,
diff --git a/components/omnibox/browser/in_memory_url_index.cc b/components/omnibox/browser/in_memory_url_index.cc index 7b6532c..f7706821 100644 --- a/components/omnibox/browser/in_memory_url_index.cc +++ b/components/omnibox/browser/in_memory_url_index.cc
@@ -155,12 +155,11 @@ } void InMemoryURLIndex::OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { + const history::URLRow& url_row, + const history::VisitRow& new_visit) { DCHECK_EQ(history_service_, history_service); needs_to_be_cached_ |= private_data_->UpdateURL( - history_service_, row, scheme_allowlist_, &private_data_tracker_); + history_service_, url_row, scheme_allowlist_, &private_data_tracker_); } void InMemoryURLIndex::OnURLsModified(history::HistoryService* history_service,
diff --git a/components/omnibox/browser/in_memory_url_index.h b/components/omnibox/browser/in_memory_url_index.h index 340700a1..dbc53bb 100644 --- a/components/omnibox/browser/in_memory_url_index.h +++ b/components/omnibox/browser/in_memory_url_index.h
@@ -35,7 +35,6 @@ namespace base { class SequencedTaskRunner; -class Time; } namespace bookmarks { @@ -244,9 +243,8 @@ // HistoryServiceObserver: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsModified(history::HistoryService* history_service, const history::URLRows& changed_urls) override; void OnURLsDeleted(history::HistoryService* history_service,
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 7f1cd03..1357312 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -300,6 +300,11 @@ const base::Feature kOmniboxFuzzyUrlSuggestions{ "OmniboxFuzzyUrlSuggestions", base::FEATURE_DISABLED_BY_DEFAULT}; +// Feature used to update the left and bottom padding of the omnibox suggestion +// header. +const base::Feature kOmniboxHeaderPaddingUpdate{ + "OmniboxHeaderPaddingUpdate", base::FEATURE_DISABLED_BY_DEFAULT}; + // Feature used to remove the capitalization of the suggestion header text. const base::Feature kOmniboxRemoveSuggestionHeaderCapitalization{ "OmniboxRemoveSuggestionHeaderCapitalization", @@ -310,6 +315,10 @@ const base::Feature kOmniboxRemoveSuggestionHeaderChevron{ "OmniboxRemoveSuggestionHeaderChevron", base::FEATURE_DISABLED_BY_DEFAULT}; +// Feature used to add fading effect to most visited tiles on tablet. +const base::Feature kOmniboxMostVisitedTilesFadingOnTablet{ + "OmniboxMostVisitedTilesFadingOnTablet", base::FEATURE_DISABLED_BY_DEFAULT}; + // Feature used to add most visited tiles to the suggestions when the user is on // a search result page that does not do search term replacement. const base::Feature kOmniboxMostVisitedTilesOnSrp{
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 4b9b220..3bf70e5 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -83,8 +83,10 @@ extern const base::Feature kNtpRealboxSuggestionAnswers; extern const base::Feature kNtpRealboxTailSuggest; extern const base::Feature kOmniboxFuzzyUrlSuggestions; +extern const base::Feature kOmniboxHeaderPaddingUpdate; extern const base::Feature kOmniboxRemoveSuggestionHeaderCapitalization; extern const base::Feature kOmniboxRemoveSuggestionHeaderChevron; +extern const base::Feature kOmniboxMostVisitedTilesFadingOnTablet; extern const base::Feature kOmniboxMostVisitedTilesOnSrp; extern const base::Feature kStrippedGurlOptimization;
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index 609a5616..8f47a782 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -412,6 +412,13 @@ } } +source_set("import_results") { + sources = [ + "ui/import_results.cc", + "ui/import_results.h", + ] +} + # PasswordForm is an extremely common struct used by many sub-components and # sub-directories. Having its own target makes it possible to break up several # cyclic dependencies.
diff --git a/components/password_manager/core/browser/import/BUILD.gn b/components/password_manager/core/browser/import/BUILD.gn index 6b3fa4ac..8a3c14c 100644 --- a/components/password_manager/core/browser/import/BUILD.gn +++ b/components/password_manager/core/browser/import/BUILD.gn
@@ -22,6 +22,7 @@ deps = [ "//components/password_manager/core/browser", + "//components/password_manager/core/browser:import_results", "//components/password_manager/services/csv_password:service", "//components/sync/base:base", ] @@ -33,6 +34,7 @@ deps = [ ":importer", "//base/test:test_support", + "//components/password_manager/core/browser:import_results", "//components/password_manager/core/browser:test_support", "//mojo/public/cpp/bindings:bindings", "//testing/gmock",
diff --git a/components/password_manager/core/browser/import/password_importer.cc b/components/password_manager/core/browser/import/password_importer.cc index 3a8cd22..1102c3f 100644 --- a/components/password_manager/core/browser/import/password_importer.cc +++ b/components/password_manager/core/browser/import/password_importer.cc
@@ -92,7 +92,13 @@ } } -void PasswordImporter::Import(const base::FilePath& path) { +void PasswordImporter::Import(const base::FilePath& path, + password_manager::PasswordForm::Store to_store, + ImportResultsCallback results_callback) { + results_callback_ = std::move(results_callback); + to_store_ = to_store; + selected_file_name_ = path.BaseName().AsUTF8Unsafe(); + // Posting with USER_VISIBLE priority, because the result of the import is // visible to the user in the password settings page. base::ThreadPool::PostTaskAndReplyWithResult( @@ -106,8 +112,15 @@ void PasswordImporter::ConsumePasswords( password_manager::mojom::CSVPasswordSequencePtr seq) { - if (!seq) + password_manager::ImportResults results; + results.file_name = std::move(selected_file_name_); + + if (!seq) { + // TODO(crbug/1325290): Compute correct status. + results.status = password_manager::ImportResults::Status::IO_ERROR; + std::move(results_callback_).Run(results); return; + } base::Time start_time = base::Time::Now(); @@ -116,13 +129,21 @@ base::ranges::transform( seq->csv_passwords, std::back_inserter(credentials), - [](const password_manager::CSVPassword& csv_password) { - return password_manager::CredentialUIEntry(csv_password); + [this](const password_manager::CSVPassword& csv_password) { + return password_manager::CredentialUIEntry(csv_password, to_store_); }); presenter_->AddCredentials( credentials, password_manager::PasswordForm::Type::kImported, - base::BindOnce(&AddCredentialsCallback, std::move(start_time))); + base::BindOnce(&AddCredentialsCallback, start_time)); + + // TODO(crbug/1325290): + // - Check for conflicts. + // - Compute and fill statuses for failed imports. + // - Count actual number of successful imports. + results.number_imported = seq->csv_passwords.size(); + results.status = password_manager::ImportResults::Status::SUCCESS; + std::move(results_callback_).Run(results); } void PasswordImporter::SetServiceForTesting(
diff --git a/components/password_manager/core/browser/import/password_importer.h b/components/password_manager/core/browser/import/password_importer.h index ee47f87..68c46d3 100644 --- a/components/password_manager/core/browser/import/password_importer.h +++ b/components/password_manager/core/browser/import/password_importer.h
@@ -10,6 +10,8 @@ #include "base/callback.h" #include "base/files/file_path.h" #include "base/types/expected.h" +#include "components/password_manager/core/browser/password_form.h" +#include "components/password_manager/core/browser/ui/import_results.h" #include "components/password_manager/services/csv_password/csv_password_parser_service.h" #include "components/password_manager/services/csv_password/public/mojom/csv_password_parser.mojom.h" @@ -36,14 +38,20 @@ using CompletionCallback = password_manager::mojom::CSVPasswordParser::ParseCSVCallback; + using ImportResultsCallback = + base::OnceCallback<void(const password_manager::ImportResults&)>; + explicit PasswordImporter(SavedPasswordsPresenter* presenter); PasswordImporter(const PasswordImporter&) = delete; PasswordImporter& operator=(const PasswordImporter&) = delete; ~PasswordImporter(); - // Imports passwords from the file at |path|. + // Imports passwords from the file at |path| into the |to_store|. + // |results_callback| is used to return import summary back to the user. // The only supported file format is CSV. - void Import(const base::FilePath& path); + void Import(const base::FilePath& path, + password_manager::PasswordForm::Store to_store, + ImportResultsCallback results_callback); // Returns the file extensions corresponding to supported formats. static std::vector<std::vector<base::FilePath::StringType>> @@ -56,6 +64,8 @@ // Returns the import status. Status GetStatus() const; + bool IsRunning() const { return !results_callback_.is_null(); } + private: // Parses passwords from |input| using a mojo sandbox process and // asynchronously calls |completion| with the results. @@ -71,6 +81,10 @@ Status status_{Status::NONE}; + ImportResultsCallback results_callback_; + password_manager::PasswordForm::Store to_store_; + std::string selected_file_name_; + const raw_ptr<SavedPasswordsPresenter> presenter_; base::WeakPtrFactory<PasswordImporter> weak_ptr_factory_{this};
diff --git a/components/password_manager/core/browser/import/password_importer_unittest.cc b/components/password_manager/core/browser/import/password_importer_unittest.cc index eab4292..24efcb18 100644 --- a/components/password_manager/core/browser/import/password_importer_unittest.cc +++ b/components/password_manager/core/browser/import/password_importer_unittest.cc
@@ -15,6 +15,7 @@ #include "components/password_manager/core/browser/import/csv_password_sequence.h" #include "components/password_manager/core/browser/test_password_store.h" #include "components/password_manager/core/browser/ui/credential_ui_entry.h" +#include "components/password_manager/core/browser/ui/import_results.h" #include "components/password_manager/core/browser/ui/saved_passwords_presenter.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -70,8 +71,12 @@ protected: void StartImportAndWaitForCompletion(const base::FilePath& input_file) { - importer_.Import(input_file); + importer_.Import(input_file, + password_manager::PasswordForm::Store::kProfileStore, + base::BindOnce(&PasswordImporterTest::OnPasswordsConsumed, + base::Unretained(this))); task_environment_.RunUntilIdle(); + ASSERT_TRUE(results_callback_called_); } std::vector<CredentialUIEntry> imported_passwords() { @@ -86,8 +91,14 @@ base::ScopedTempDir temp_directory_; private: + void OnPasswordsConsumed(const password_manager::ImportResults& results) { + results_callback_called_ = true; + import_results_ = std::move(results); + } + base::test::TaskEnvironment task_environment_; - std::vector<CredentialUIEntry> imported_passwords_; + password_manager::ImportResults import_results_; + bool results_callback_called_ = false; FakePasswordParserService service_; mojo::Receiver<mojom::CSVPasswordParser> receiver_; scoped_refptr<TestPasswordStore> store_ =
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.cc b/components/password_manager/core/browser/ui/credential_ui_entry.cc index 477fc96..ff10eade 100644 --- a/components/password_manager/core/browser/ui/credential_ui_entry.cc +++ b/components/password_manager/core/browser/ui/credential_ui_entry.cc
@@ -44,7 +44,8 @@ stored_in.insert(PasswordForm::Store::kProfileStore); } -CredentialUIEntry::CredentialUIEntry(const CSVPassword& csv_password) +CredentialUIEntry::CredentialUIEntry(const CSVPassword& csv_password, + PasswordForm::Store to_store) : signon_realm(IsValidAndroidFacetURI(csv_password.GetURL().spec()) ? csv_password.GetURL().spec() : GetSignonRealm(csv_password.GetURL())), @@ -53,8 +54,7 @@ password(base::UTF8ToUTF16(csv_password.GetPassword())) { DCHECK_EQ(csv_password.GetParseStatus(), CSVPassword::Status::kOK); - // TODO(crbug/1325290): handle stores according to user preference. - stored_in.insert(PasswordForm::Store::kProfileStore); + stored_in.insert(to_store); } CredentialUIEntry::CredentialUIEntry(const CredentialUIEntry& other) = default;
diff --git a/components/password_manager/core/browser/ui/credential_ui_entry.h b/components/password_manager/core/browser/ui/credential_ui_entry.h index 68015f9..2a179611 100644 --- a/components/password_manager/core/browser/ui/credential_ui_entry.h +++ b/components/password_manager/core/browser/ui/credential_ui_entry.h
@@ -26,7 +26,9 @@ CredentialUIEntry(); explicit CredentialUIEntry(const PasswordForm& form); - explicit CredentialUIEntry(const CSVPassword& csv_password); + explicit CredentialUIEntry( + const CSVPassword& csv_password, + PasswordForm::Store to_store = PasswordForm::Store::kProfileStore); CredentialUIEntry(const CredentialUIEntry& other); CredentialUIEntry(CredentialUIEntry&& other); ~CredentialUIEntry();
diff --git a/components/password_manager/core/browser/ui/import_results.cc b/components/password_manager/core/browser/ui/import_results.cc new file mode 100644 index 0000000..11f6656 --- /dev/null +++ b/components/password_manager/core/browser/ui/import_results.cc
@@ -0,0 +1,23 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/password_manager/core/browser/ui/import_results.h" + +namespace password_manager { + +ImportEntry::ImportEntry() = default; +ImportEntry::ImportEntry(const ImportEntry& other) = default; +ImportEntry::ImportEntry(ImportEntry&& other) = default; +ImportEntry::~ImportEntry() = default; +ImportEntry& ImportEntry::operator=(const ImportEntry& entry) = default; +ImportEntry& ImportEntry::operator=(ImportEntry&& entry) = default; + +ImportResults::ImportResults() = default; +ImportResults::ImportResults(const ImportResults& other) = default; +ImportResults::ImportResults(ImportResults&& other) = default; +ImportResults::~ImportResults() = default; +ImportResults& ImportResults::operator=(const ImportResults& entry) = default; +ImportResults& ImportResults::operator=(ImportResults&& entry) = default; + +} // namespace password_manager \ No newline at end of file
diff --git a/components/password_manager/core/browser/ui/import_results.h b/components/password_manager/core/browser/ui/import_results.h new file mode 100644 index 0000000..1ae3ace --- /dev/null +++ b/components/password_manager/core/browser/ui/import_results.h
@@ -0,0 +1,105 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_IMPORT_RESULTS_H_ +#define COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_IMPORT_RESULTS_H_ + +#include <string> +#include <vector> + +namespace password_manager { + +struct ImportEntry { + // Matches api::passwords_private::ImportEntryStatus. + enum Status { + // Should not be used. + NONE, + // Any other error state. + UNKNOWN_ERROR, + // Missing password field. + MISSING_PASSWORD, + // Missing url field. + MISSING_URL, + // Bad url formatting. + INVALID_URL, + // URL contains non-ASCII chars. + NON_ASCII_URL, + // URL is too long. + LONG_URL, + // Password is too long. + LONG_PASSWORD, + // Username is too long. + LONG_USERNAME, + // Credential is already stored in profile store. + CONFLICT_PROFILE, + // Credential is already stored in account store. + CONFLICT_ACCOUNT + }; + + // The status of parsing for individual row that represents a credential + // during import process. + Status status; + + // The url of the credential. + std::string url; + + // The username of the credential. + std::string username; + + ImportEntry(); + ImportEntry(const ImportEntry& other); + ImportEntry(ImportEntry&& other); + ~ImportEntry(); + + ImportEntry& operator=(const ImportEntry& entry); + ImportEntry& operator=(ImportEntry&& entry); +}; + +struct ImportResults { + // Matches api::passwords_private::ImportResultsStatus. + enum Status { + // Should not be used. + NONE, + // Any other error state. + UNKNOWN_ERROR, + // Data was fully or partially imported. + SUCCESS, + // Failed to read provided file. + IO_ERROR, + // Header is missing, invalid or could not be read. + BAD_FORMAT, + // File selection dismissed. + DISMISSED, + // Size of the chosen file exceeds the limit. + MAX_FILE_SIZE, + // User has already started the import flow in a different window. + IMPORT_ALREADY_ACTIVE, + // User tried to import too many passwords from one file. + NUM_PASSWORDS_EXCEEDED + }; + + // General status of the triggered password import process. + Status status; + + // Number of successfully imported passwords. + size_t number_imported = 0; + + // Possibly empty, list of credentials that couldn't be imported. + std::vector<ImportEntry> failed_imports; + + // Possibly not set, name of file that user has chosen for the import. + std::string file_name; + + ImportResults(); + ImportResults(const ImportResults& other); + ImportResults(ImportResults&& other); + ~ImportResults(); + + ImportResults& operator=(const ImportResults& entry); + ImportResults& operator=(ImportResults&& entry); +}; + +} // namespace password_manager + +#endif // COMPONENTS_PASSWORD_MANAGER_CORE_BROWSER_UI_IMPORT_RESULTS_H_ \ No newline at end of file
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc index 5d9df1c6..e70bd20 100644 --- a/components/password_manager/core/browser/ui/saved_passwords_presenter.cc +++ b/components/password_manager/core/browser/ui/saved_passwords_presenter.cc
@@ -207,7 +207,7 @@ const CredentialUIEntry& credential, password_manager::PasswordForm::Type type, base::OnceClosure completion) { - DCHECK(GetExpectedAddResult(credential) == AddResult::kSuccess); + DCHECK_EQ(GetExpectedAddResult(credential), AddResult::kSuccess); UnblocklistBothStores(credential); PasswordForm form = GenerateFormFromCredential(credential, type);
diff --git a/components/password_manager/core/browser/ui/saved_passwords_presenter.h b/components/password_manager/core/browser/ui/saved_passwords_presenter.h index 733bd90d..fa413d7 100644 --- a/components/password_manager/core/browser/ui/saved_passwords_presenter.h +++ b/components/password_manager/core/browser/ui/saved_passwords_presenter.h
@@ -142,9 +142,9 @@ private: // Adds the |credential| to the specified store. - // Expects a credential that is valid to be added - can be verefied by - // calling `CanBeAdded()` before. `completion` callback wil be run after the - // DB call is completed. + // Expects a credential that is valid to be added - can be verified by + // calling `GetExpectedAddResult()` before. `completion` callback wil be run + // after the DB call is completed. void AddCredentialAsync(const CredentialUIEntry& credential, password_manager::PasswordForm::Type type, base::OnceClosure completion);
diff --git a/components/password_manager/core/common/password_manager_features.cc b/components/password_manager/core/common/password_manager_features.cc index 7c4976d..a88239d 100644 --- a/components/password_manager/core/common/password_manager_features.cc +++ b/components/password_manager/core/common/password_manager_features.cc
@@ -167,11 +167,6 @@ const base::Feature kPasswordImport = {"PasswordImport", base::FEATURE_DISABLED_BY_DEFAULT}; -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) -const base::Feature kPasswordManagerRedesign{"PasswordManagerRedesign", - base::FEATURE_DISABLED_BY_DEFAULT}; -#endif - // Enables password reuse detection. const base::Feature kPasswordReuseDetectionEnabled = { "PasswordReuseDetectionEnabled", base::FEATURE_ENABLED_BY_DEFAULT}; @@ -204,6 +199,12 @@ #endif #if BUILDFLAG(IS_ANDROID) +const base::Feature kPasswordEditDialogWithDetails{ + "PasswordEditDialogWithDetails", base::FEATURE_DISABLED_BY_DEFAULT}; + +const base::Feature kShowUPMErrorNotification{ + "ShowUpmErrorNotification", base::FEATURE_DISABLED_BY_DEFAULT}; + // Enables the experiment to automatically submit a form after filling by // TouchToFill const base::Feature kTouchToFillPasswordSubmission = { @@ -219,6 +220,10 @@ const base::Feature kUnifiedPasswordManagerAndroid{ "UnifiedPasswordManagerAndroid", base::FEATURE_DISABLED_BY_DEFAULT}; +// Enables showing contextual error messages when UPM encounters an auth error. +const base::Feature kUnifiedPasswordManagerErrorMessages{ + "UnifiedPasswordManagerErrorMessages", base::FEATURE_DISABLED_BY_DEFAULT}; + // If enabled, the built-in sync functionality in PasswordSyncBridge becomes // unused, meaning that SyncService/SyncEngine will no longer download or // upload changes to/from the Sync server. Instead, an external Android-specific @@ -226,12 +231,6 @@ const base::Feature kUnifiedPasswordManagerSyncUsingAndroidBackendOnly{ "UnifiedPasswordManagerSyncUsingAndroidBackendOnly", base::FEATURE_DISABLED_BY_DEFAULT}; - -const base::Feature kPasswordEditDialogWithDetails{ - "PasswordEditDialogWithDetails", base::FEATURE_DISABLED_BY_DEFAULT}; - -const base::Feature kShowUPMErrorNotification{ - "ShowUpmErrorNotification", base::FEATURE_DISABLED_BY_DEFAULT}; #endif const base::Feature kUnifiedPasswordManagerDesktop = {
diff --git a/components/password_manager/core/common/password_manager_features.h b/components/password_manager/core/common/password_manager_features.h index 79075ca..43d6bea 100644 --- a/components/password_manager/core/common/password_manager_features.h +++ b/components/password_manager/core/common/password_manager_features.h
@@ -56,9 +56,6 @@ extern const base::Feature kPasswordChangeWellKnown; extern const base::Feature kPasswordDomainCapabilitiesFetching; extern const base::Feature kPasswordImport; -#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_IOS) // Desktop -extern const base::Feature kPasswordManagerRedesign; -#endif extern const base::Feature kPasswordReuseDetectionEnabled; extern const base::Feature kPasswordScriptsFetching; extern const base::Feature kPasswordStrengthIndicator; @@ -70,12 +67,13 @@ extern const base::Feature kSyncUndecryptablePasswordsLinux; #endif #if BUILDFLAG(IS_ANDROID) +extern const base::Feature kPasswordEditDialogWithDetails; +extern const base::Feature kShowUPMErrorNotification; extern const base::Feature kTouchToFillPasswordSubmission; extern const base::Feature kUnifiedCredentialManagerDryRun; extern const base::Feature kUnifiedPasswordManagerAndroid; +extern const base::Feature kUnifiedPasswordManagerErrorMessages; extern const base::Feature kUnifiedPasswordManagerSyncUsingAndroidBackendOnly; -extern const base::Feature kPasswordEditDialogWithDetails; -extern const base::Feature kShowUPMErrorNotification; #endif extern const base::Feature kUnifiedPasswordManagerDesktop; extern const base::Feature kUsernameFirstFlowFallbackCrowdsourcing;
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index 065f346..5789fe2 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -5387,7 +5387,7 @@ 'dynamic_refresh': True, 'per_profile': False, }, - 'example_value': 'foobar.example.com', + 'example_value': '*.example.com,foobar.example.com,', 'id': 746, 'caption': '''Kerberos delegation server allowlist''', 'tags': [],
diff --git a/components/safe_browsing/core/browser/db/v4_store.cc b/components/safe_browsing/core/browser/db/v4_store.cc index 7c6f00f..36e4bdbf 100644 --- a/components/safe_browsing/core/browser/db/v4_store.cc +++ b/components/safe_browsing/core/browser/db/v4_store.cc
@@ -54,6 +54,8 @@ // in order, from parts [1, 2, and 3], or [1, 2, 3, and 4]. For example: // SafeBrowsing.V4ProcessPartialUpdate.ApplyUpdate.Result, or // SafeBrowsing.V4ProcessPartialUpdate.ApplyUpdate.Result.UrlSoceng +const char kChromeExtMalwareUmaSuffix[] = ".ChromeExtMalware"; +const char kUrlMalBinUmaSuffix[] = ".UrlMalBin"; const char kUrlSocengUmaSuffix[] = ".UrlSoceng"; const uint32_t kFileMagic = 0x600D71FE; @@ -871,12 +873,19 @@ // Add a linear histogram for UrlSoceng since its size is too large to be // accurately represented by the histogram above. - const int64_t file_size_megabytes = file_size_kilobytes / 1024; if (suffix == kUrlSocengUmaSuffix) { + const int64_t file_size_megabytes = file_size_kilobytes / 1024; base::UmaHistogramExactLinear(base_metric + "Linear" + suffix, file_size_megabytes, 50); } + // Linear histogram for ChromeExtMalware, sizes in 100kB, up to ~5MB + if (suffix == kChromeExtMalwareUmaSuffix || suffix == kUrlMalBinUmaSuffix) { + const int64_t file_size_100_kb = file_size_kilobytes / 100; + base::UmaHistogramExactLinear(base_metric + "Linear" + suffix, + file_size_100_kb, 50); + } + return file_size_; }
diff --git a/components/segmentation_platform/internal/signals/history_service_observer.cc b/components/segmentation_platform/internal/signals/history_service_observer.cc index 4a61939..65f9adc 100644 --- a/components/segmentation_platform/internal/signals/history_service_observer.cc +++ b/components/segmentation_platform/internal/signals/history_service_observer.cc
@@ -36,11 +36,10 @@ void HistoryServiceObserver::OnURLVisited( history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { - url_signal_handler_->OnHistoryVisit(row.url()); - history_delegate_->OnUrlAdded(row.url()); + const history::URLRow& url_row, + const history::VisitRow& new_visit) { + url_signal_handler_->OnHistoryVisit(url_row.url()); + history_delegate_->OnUrlAdded(url_row.url()); } void HistoryServiceObserver::OnURLsDeleted(
diff --git a/components/segmentation_platform/internal/signals/history_service_observer.h b/components/segmentation_platform/internal/signals/history_service_observer.h index 75adbcc..c12dfd2 100644 --- a/components/segmentation_platform/internal/signals/history_service_observer.h +++ b/components/segmentation_platform/internal/signals/history_service_observer.h
@@ -36,9 +36,8 @@ // history::HistoryServiceObserver impl: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; void OnURLsDeleted(history::HistoryService* history_service, const history::DeletionInfo& deletion_info) override;
diff --git a/components/sync/protocol/entity_specifics.proto b/components/sync/protocol/entity_specifics.proto index 847862c..2ff9c55 100644 --- a/components/sync/protocol/entity_specifics.proto +++ b/components/sync/protocol/entity_specifics.proto
@@ -19,6 +19,7 @@ import "components/sync/protocol/arc_package_specifics.proto"; import "components/sync/protocol/autofill_specifics.proto"; import "components/sync/protocol/autofill_offer_specifics.proto"; +import "components/sync/protocol/autofill_wallet_usage_specifics.proto"; import "components/sync/protocol/bookmark_specifics.proto"; import "components/sync/protocol/device_info_specifics.proto"; import "components/sync/protocol/dictionary_specifics.proto"; @@ -159,6 +160,7 @@ HistorySpecifics history = 963985; PrintersAuthorizationServerSpecifics printers_authorization_server = 974304; SavedTabGroupSpecifics saved_tab_group = 1004874; + AutofillWalletUsageSpecifics autofill_wallet_usage = 1033580; } reserved 218175; reserved "wifi_credential";
diff --git a/components/viz/service/gl/gpu_service_impl.cc b/components/viz/service/gl/gpu_service_impl.cc index 0278b27..6301d3df 100644 --- a/components/viz/service/gl/gpu_service_impl.cc +++ b/components/viz/service/gl/gpu_service_impl.cc
@@ -12,12 +12,14 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/feature_list.h" +#include "base/metrics/histogram_macros.h" #include "base/no_destructor.h" #include "base/observer_list.h" #include "base/synchronization/waitable_event.h" #include "base/task/task_runner_util.h" #include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" +#include "base/trace_event/trace_event.h" #include "base/unguessable_token.h" #include "build/build_config.h" #include "build/chromeos_buildflags.h" @@ -126,6 +128,12 @@ namespace { +// The names emitted for GPU initialization trace events. +// This code may be removed after the following investigation: +// crbug.com/1350257 +constexpr char kGpuInitializationEventCategory[] = "latency"; +constexpr char kGpuInitializationEvent[] = "GpuInitialization"; + using LogCallback = base::RepeatingCallback< void(int severity, const std::string& header, const std::string& message)>; @@ -505,6 +513,18 @@ // Record initialization only after collecting the GPU info because that can // take a significant amount of time. gpu_info_.initialization_time = base::TimeTicks::Now() - start_time_; + + // This metric code may be removed after the following investigation: + // crbug.com/1350257 + UMA_HISTOGRAM_CUSTOM_TIMES("GPU.GPUInitializationTime.V4", + gpu_info_.initialization_time, + base::Milliseconds(5), base::Seconds(90), 100); + TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( + kGpuInitializationEventCategory, kGpuInitializationEvent, + TRACE_ID_LOCAL(this), start_time_); + TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( + kGpuInitializationEventCategory, kGpuInitializationEvent, + TRACE_ID_LOCAL(this), base::TimeTicks::Now()); } void GpuServiceImpl::UpdateGPUInfoGL() {
diff --git a/content/browser/accessibility/accessibility_auralinux_browsertest.cc b/content/browser/accessibility/accessibility_auralinux_browsertest.cc index e6beaab..b529935 100644 --- a/content/browser/accessibility/accessibility_auralinux_browsertest.cc +++ b/content/browser/accessibility/accessibility_auralinux_browsertest.cc
@@ -1493,7 +1493,7 @@ LoadInitialAccessibilityTreeFromHtml( R"HTML(<!DOCTYPE html> <html> - <body> + <body contenteditable> <style>h1.generated::before{content:" [ ";}</style> <style>h1.generated::after{content:" ] ";}</style> <h1 class="generated">Foo</h1> @@ -1501,7 +1501,14 @@ </html>)HTML"); AtkObject* document = GetRendererAccessible(); - AtkObject* heading = atk_object_ref_accessible_child(document, 0); + + AtkObject* contenteditable = atk_object_ref_accessible_child(document, 0); + ASSERT_NE(nullptr, contenteditable); + ASSERT_EQ(ATK_ROLE_SECTION, atk_object_get_role(contenteditable)); + ASSERT_TRUE(ATK_IS_TEXT(contenteditable)); + + AtkObject* heading = atk_object_ref_accessible_child(contenteditable, 0); + ASSERT_NE(nullptr, heading); ASSERT_EQ(atk_object_get_role(heading), ATK_ROLE_HEADING); // The accessible text for the heading should match the rendered text and @@ -1526,6 +1533,7 @@ } g_object_unref(heading); + g_object_unref(contenteditable); } // TODO(crbug.com/981913): This flakes on linux.
diff --git a/content/browser/accessibility/accessibility_tree_formatter_blink.cc b/content/browser/accessibility/accessibility_tree_formatter_blink.cc index 930bd19..1b7f1f4 100644 --- a/content/browser/accessibility/accessibility_tree_formatter_blink.cc +++ b/content/browser/accessibility/accessibility_tree_formatter_blink.cc
@@ -19,7 +19,6 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/accessibility/platform/ax_platform_node_delegate.h" #include "ui/accessibility/platform/compute_attributes.h" #include "ui/gfx/geometry/rect_conversions.h" @@ -72,9 +71,8 @@ if (ui::IsNodeIdIntAttribute(attr)) { // Relation ui::AXTreeID tree_id = node.tree()->GetAXTreeID(); - ui::AXNode* target = ui::AXTreeManagerMap::GetInstance() - .GetManager(tree_id) - ->GetNodeFromTree(tree_id, value); + ui::AXNode* target = + ui::AXTreeManager::FromID(tree_id)->GetNodeFromTree(tree_id, value); if (!target) return "null"; @@ -272,8 +270,7 @@ std::string AccessibilityTreeFormatterBlink::DumpInternalAccessibilityTree( ui::AXTreeID tree_id, const std::vector<AXPropertyFilter>& property_filters) { - ui::AXTreeManager* ax_mgr = - ui::AXTreeManagerMap::GetInstance().GetManager(tree_id); + ui::AXTreeManager* ax_mgr = ui::AXTreeManager::FromID(tree_id); DCHECK(ax_mgr); SetPropertyFilters(property_filters, kFiltersDefaultSet); base::Value dict = BuildTreeForNode(ax_mgr->GetRootAsAXNode()); @@ -560,9 +557,8 @@ for (auto value : values) { if (ui::IsNodeIdIntListAttribute(attr)) { ui::AXTreeID tree_id = node.tree()->GetAXTreeID(); - ui::AXNode* target = ui::AXTreeManagerMap::GetInstance() - .GetManager(tree_id) - ->GetNodeFromTree(tree_id, node.id()); + ui::AXNode* target = + ui::AXTreeManager::FromID(tree_id)->GetNodeFromTree(node.id()); if (target) value_list.Append(ui::ToString(target->GetRole()));
diff --git a/content/browser/accessibility/browser_accessibility.cc b/content/browser/accessibility/browser_accessibility.cc index 272056e0..9071554 100644 --- a/content/browser/accessibility/browser_accessibility.cc +++ b/content/browser/accessibility/browser_accessibility.cc
@@ -873,38 +873,13 @@ } bool BrowserAccessibility::HasVisibleCaretOrSelection() const { - // TODO(nektar): Move this method to `AXNode` in the immediate future. - ui::AXTree::Selection unignored_selection = - manager()->ax_tree()->GetUnignoredSelection(); - ui::AXNodeID focus_id = unignored_selection.focus_object_id; - const BrowserAccessibility* focus_object = manager()->GetFromID(focus_id); - // Since "AXTree::GetUnignoredSelection" always ensures that the focus of the - // selection is an unignored object, i.e. it is visible to platform APIs, we - // need to ensure that we check against the lowest unignored ancestor of this - // object if this object is ignored. - if (!focus_object || - !focus_object->IsDescendantOf(PlatformGetLowestPlatformAncestor())) { - return false; - } - - // A selection or the caret will be visible in a focused text field (including - // content editables). - const BrowserAccessibility* text_field = - focus_object->PlatformGetTextFieldAncestor(); - if (text_field) - return true; - // The caret should be visible if Caret Browsing is enabled. // // TODO(crbug.com/1052091): Caret Browsing should be looking at leaf text // nodes so it might not return expected results in this method. if (BrowserAccessibilityStateImpl::GetInstance()->IsCaretBrowsingEnabled()) return true; - - // The selection will be visible in non-editable content only if it is not - // collapsed. - return focus_id != unignored_selection.anchor_object_id || - unignored_selection.focus_offset != unignored_selection.anchor_offset; + return node()->HasVisibleCaretOrSelection(); } std::set<ui::AXPlatformNode*> BrowserAccessibility::GetNodesForNodeIdSet( @@ -1223,47 +1198,7 @@ const ui::AXTree::Selection BrowserAccessibility::GetUnignoredSelection() const { - // TODO(nektar): Move this method to `AXNode` in the immediate future. - - ui::AXTree::Selection selection = - manager()->ax_tree()->GetUnignoredSelection(); - - // "selection.anchor_offset" and "selection.focus_ofset" might need to be - // adjusted if the anchor or the focus nodes include ignored children. - const BrowserAccessibility* anchor_object = - manager()->GetFromID(selection.anchor_object_id); - if (anchor_object && !anchor_object->IsLeaf()) { - DCHECK_GE(selection.anchor_offset, 0); - if (static_cast<size_t>(selection.anchor_offset) < - anchor_object->node()->children().size()) { - const ui::AXNode* anchor_child = - anchor_object->node()->children()[selection.anchor_offset]; - DCHECK(anchor_child); - selection.anchor_offset = - static_cast<int>(anchor_child->GetUnignoredIndexInParent()); - } else { - selection.anchor_offset = - static_cast<int>(anchor_object->GetChildCount()); - } - } - - const BrowserAccessibility* focus_object = - manager()->GetFromID(selection.focus_object_id); - if (focus_object && !focus_object->IsLeaf()) { - DCHECK_GE(selection.focus_offset, 0); - if (static_cast<size_t>(selection.focus_offset) < - focus_object->node()->children().size()) { - const ui::AXNode* focus_child = - focus_object->node()->children()[selection.focus_offset]; - DCHECK(focus_child); - selection.focus_offset = - static_cast<int>(focus_child->GetUnignoredIndexInParent()); - } else { - selection.focus_offset = static_cast<int>(focus_object->GetChildCount()); - } - } - - return selection; + return node()->GetUnignoredSelection(); } BrowserAccessibility::AXPosition BrowserAccessibility::CreateTextPositionAt(
diff --git a/content/browser/accessibility/browser_accessibility_manager.cc b/content/browser/accessibility/browser_accessibility_manager.cc index 4b86011..43c74b4 100644 --- a/content/browser/accessibility/browser_accessibility_manager.cc +++ b/content/browser/accessibility/browser_accessibility_manager.cc
@@ -25,7 +25,6 @@ #include "ui/accessibility/ax_common.h" #include "ui/accessibility/ax_language_detection.h" #include "ui/accessibility/ax_tree_data.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/accessibility/ax_tree_serializer.h" #include "ui/base/buildflags.h" @@ -169,7 +168,7 @@ ui::AXTreeID ax_tree_id) { DCHECK(ax_tree_id != ui::AXTreeIDUnknown()); return static_cast<BrowserAccessibilityManager*>( - ui::AXTreeManagerMap::GetInstance().GetManager(ax_tree_id)); + ui::AXTreeManager::FromID(ax_tree_id)); } BrowserAccessibilityManager::BrowserAccessibilityManager( @@ -185,9 +184,7 @@ connected_to_parent_tree_node_(false), device_scale_factor_(1.0f), use_custom_device_scale_factor_for_testing_(false), - event_generator_(ax_tree()) { - tree_observation_.Observe(ax_tree()); -} + event_generator_(ax_tree()) {} BrowserAccessibilityManager::BrowserAccessibilityManager( const ui::AXTreeUpdate& initial_tree, @@ -203,7 +200,6 @@ device_scale_factor_(1.0f), use_custom_device_scale_factor_for_testing_(false), event_generator_(ax_tree()) { - tree_observation_.Observe(ax_tree()); Initialize(initial_tree); } @@ -223,7 +219,7 @@ SetLastFocusedNode(nullptr); } - ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_); + RemoveFromMap(); ParentConnectionChanged(parent); } @@ -462,10 +458,6 @@ return ax_tree()->data(); } -std::string BrowserAccessibilityManager::ToString() const { - return GetTreeData().ToString(); -} - void BrowserAccessibilityManager::OnWindowFocused() { if (IsRootTree()) FireFocusEventsIfNeeded(); @@ -1586,9 +1578,7 @@ SetLastFocusedNode(nullptr); } - ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_); - ax_tree_id_ = new_data.tree_id; - ui::AXTreeManagerMap::GetInstance().AddTreeManager(ax_tree_id_, this); + ui::AXTreeManager::OnTreeDataChanged(tree, old_data, new_data); } void BrowserAccessibilityManager::OnNodeWillBeDeleted(ui::AXTree* tree, @@ -1700,14 +1690,6 @@ return GetPlatformNodeFromTree(node.id()); } -void BrowserAccessibilityManager::AddObserver(ui::AXTreeObserver* observer) { - ax_tree()->AddObserver(observer); -} - -void BrowserAccessibilityManager::RemoveObserver(ui::AXTreeObserver* observer) { - ax_tree()->RemoveObserver(observer); -} - ui::AXTreeID BrowserAccessibilityManager::GetTreeID() const { return ax_tree_id_; }
diff --git a/content/browser/accessibility/browser_accessibility_manager.h b/content/browser/accessibility/browser_accessibility_manager.h index 29a8cdbd..f0d3a011 100644 --- a/content/browser/accessibility/browser_accessibility_manager.h +++ b/content/browser/accessibility/browser_accessibility_manager.h
@@ -16,7 +16,6 @@ #include "base/callback_forward.h" #include "base/gtest_prod_util.h" #include "base/memory/raw_ptr.h" -#include "base/scoped_observation.h" #include "build/build_config.h" #include "cc/base/rtree.h" #include "content/browser/accessibility/browser_accessibility.h" @@ -219,8 +218,6 @@ // Get the AXTreeData for this frame. const ui::AXTreeData& GetTreeData() const; - std::string ToString() const override; - // Called to notify the accessibility manager that its associated native // view got focused. virtual void OnWindowFocused(); @@ -493,8 +490,6 @@ ui::AXPlatformNode* GetPlatformNodeFromTree( const ui::AXNodeID node_id) const override; ui::AXPlatformNode* GetPlatformNodeFromTree(const ui::AXNode&) const override; - void AddObserver(ui::AXTreeObserver* observer) override; - void RemoveObserver(ui::AXTreeObserver* observer) override; ui::AXTreeID GetTreeID() const override; ui::AXTreeID GetParentTreeID() const override; ui::AXNode* GetRootAsAXNode() const override; @@ -711,15 +706,6 @@ // Only used on the root node for AXTree hit testing as an alternative to // ApproximateHitTest when used without a renderer. std::unique_ptr<cc::RTree<ui::AXNodeID>> cached_node_rtree_; - - // Automatically stops observing notifications from the AXTree when this class - // is destructed. - // - // This member needs to be destructed before any observed AXTrees. Since - // destructors for non-static member fields are called in the reverse order of - // declaration, do not move this member above other members. - base::ScopedObservation<ui::AXTree, ui::AXTreeObserver> tree_observation_{ - this}; }; } // namespace content
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc index 08ec07c..191d635d 100644 --- a/content/browser/accessibility/browser_accessibility_win_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -1930,6 +1930,8 @@ ASSERT_NE(nullptr, combo_box_accessible); ui::AXTreeData data = manager->GetTreeData(); data.focus_id = combo_box_accessible->GetId(); + data.sel_anchor_object_id = combo_box_accessible->GetId(); + data.sel_focus_object_id = combo_box_accessible->GetId(); manager->ax_tree()->UpdateDataForTesting(data); ASSERT_EQ(combo_box_accessible, ToBrowserAccessibilityWin(manager->GetFocus())); @@ -1947,19 +1949,21 @@ HRESULT hr = combo_box_accessible->GetCOM()->get_caretOffset(&caret_offset); EXPECT_EQ(S_OK, hr); EXPECT_EQ(1, caret_offset); - // The caret should be at the end of the selection. + // The caret should not be visible because the text field is not focused. hr = text_field_accessible->GetCOM()->get_caretOffset(&caret_offset); - EXPECT_EQ(S_OK, hr); - EXPECT_EQ(2, caret_offset); + EXPECT_EQ(S_FALSE, hr); + EXPECT_EQ(0, caret_offset); // Move the focus to the text field. data = manager->GetTreeData(); data.focus_id = text_field_accessible->GetId(); + data.sel_anchor_object_id = text_field_accessible->GetId(); + data.sel_focus_object_id = text_field_accessible->GetId(); manager->ax_tree()->UpdateDataForTesting(data); ASSERT_EQ(text_field_accessible, ToBrowserAccessibilityWin(manager->GetFocus())); - // The caret should not have moved. + // The caret should now appear at the end of the text field. hr = text_field_accessible->GetCOM()->get_caretOffset(&caret_offset); EXPECT_EQ(S_OK, hr); EXPECT_EQ(2, caret_offset); @@ -1995,18 +1999,23 @@ div_editable.id = 2; div_editable.role = ax::mojom::Role::kGenericContainer; div_editable.AddState(ax::mojom::State::kEditable); + div_editable.AddState(ax::mojom::State::kRichlyEditable); div_editable.AddState(ax::mojom::State::kFocusable); + div_editable.AddBoolAttribute( + ax::mojom::BoolAttribute::kNonAtomicTextFieldRoot, true); ui::AXNodeData text; text.id = 3; text.role = ax::mojom::Role::kStaticText; text.AddState(ax::mojom::State::kEditable); + text.AddState(ax::mojom::State::kRichlyEditable); text.SetName("Click "); ui::AXNodeData link; link.id = 4; link.role = ax::mojom::Role::kLink; link.AddState(ax::mojom::State::kEditable); + link.AddState(ax::mojom::State::kRichlyEditable); link.AddState(ax::mojom::State::kFocusable); link.AddState(ax::mojom::State::kLinked); link.SetName("here"); @@ -2015,6 +2024,7 @@ link_text.id = 5; link_text.role = ax::mojom::Role::kStaticText; link_text.AddState(ax::mojom::State::kEditable); + link_text.AddState(ax::mojom::State::kRichlyEditable); link_text.AddState(ax::mojom::State::kFocusable); link_text.AddState(ax::mojom::State::kLinked); link_text.SetName("here");
diff --git a/content/browser/android/web_contents_observer_proxy.cc b/content/browser/android/web_contents_observer_proxy.cc index 3eca29a..1d8562a 100644 --- a/content/browser/android/web_contents_observer_proxy.cc +++ b/content/browser/android/web_contents_observer_proxy.cc
@@ -9,6 +9,7 @@ #include "base/android/jni_android.h" #include "base/android/jni_string.h" #include "base/android/scoped_java_ref.h" +#include "base/feature_list.h" #include "base/strings/utf_string_conversions.h" #include "base/trace_event/trace_event.h" #include "content/browser/android/navigation_handle_proxy.h" @@ -29,6 +30,13 @@ using base::android::ConvertUTF8ToJavaString; using base::android::ConvertUTF16ToJavaString; +namespace features { + +const base::Feature kNotifyJavaSupriouslyToMeasurePerf{ + "NotifyJavaSupriouslyToMeasurePerf", base::FEATURE_DISABLED_BY_DEFAULT}; + +} // namespace features + namespace content { // TODO(dcheng): File a bug. This class incorrectly passes just a frame ID, @@ -140,9 +148,16 @@ void WebContentsObserverProxy::DidStartNavigation( NavigationHandle* navigation_handle) { - Java_WebContentsObserverProxy_didStartNavigation( - AttachCurrentThread(), java_observer_, - navigation_handle->GetJavaNavigationHandle()); + if (navigation_handle->IsInPrimaryMainFrame()) { + Java_WebContentsObserverProxy_didStartNavigationInPrimaryMainFrame( + AttachCurrentThread(), java_observer_, + navigation_handle->GetJavaNavigationHandle()); + } else if (base::FeatureList::IsEnabled( + features::kNotifyJavaSupriouslyToMeasurePerf)) { + Java_WebContentsObserverProxy_didStartNavigationNoop( + AttachCurrentThread(), java_observer_, + navigation_handle->GetJavaNavigationHandle()); + } } void WebContentsObserverProxy::DidRedirectNavigation(
diff --git a/content/browser/browser_interface_binders.cc b/content/browser/browser_interface_binders.cc index 75dfee1..15debe2 100644 --- a/content/browser/browser_interface_binders.cc +++ b/content/browser/browser_interface_binders.cc
@@ -68,6 +68,7 @@ #include "content/public/browser/shared_worker_instance.h" #include "content/public/browser/site_isolation_policy.h" #include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_ui_controller_interface_binder.h" #include "content/public/common/content_client.h" #include "content/public/common/content_features.h" #include "content/public/common/url_constants.h" @@ -274,113 +275,6 @@ web_contents->OnColorChooserFactoryReceiver(std::move(receiver)); } -void BindAttributionInternalsHandler( - RenderFrameHost* host, - mojo::PendingReceiver<attribution_internals::mojom::Handler> receiver) { - WebUI* web_ui = host->GetWebUI(); - - // Performs a safe downcast to the concrete AttributionInternalsUI subclass. - AttributionInternalsUI* attribution_internals_ui = - web_ui ? web_ui->GetController()->GetAs<AttributionInternalsUI>() - : nullptr; - - // This is expected to be called only for outermost main frames and for the - // right WebUI pages matching the same WebUI associated to the - // RenderFrameHost. - if (host->GetParentOrOuterDocument() || !attribution_internals_ui) { - ReceivedBadMessage( - host->GetProcess(), - bad_message::BadMessageReason::RFH_INVALID_WEB_UI_CONTROLLER); - return; - } - - DCHECK_EQ(host->GetLastCommittedURL().host_piece(), - kChromeUIAttributionInternalsHost); - DCHECK(host->GetLastCommittedURL().SchemeIs(kChromeUIScheme)); - - attribution_internals_ui->BindInterface(std::move(receiver)); -} - -void BindQuotaInternalsHandler( - RenderFrameHost* host, - mojo::PendingReceiver<storage::mojom::QuotaInternalsHandler> receiver) { - WebUI* web_ui = host->GetWebUI(); - - // Performs a safe downcast to the concrete QuotaInternalsUI - // subclass. - QuotaInternalsUI* quota_internals_ui = - web_ui ? web_ui->GetController()->GetAs<QuotaInternalsUI>() : nullptr; - - // This is expected to be called only for main frames and for the right WebUI - // pages matching the same WebUI associated to the RenderFrameHost. - if (host->GetParent() || !quota_internals_ui) { - ReceivedBadMessage( - host->GetProcess(), - bad_message::BadMessageReason::RFH_INVALID_WEB_UI_CONTROLLER); - return; - } - - DCHECK_EQ(host->GetLastCommittedURL().host_piece(), - kChromeUIQuotaInternalsHost); - DCHECK(host->GetLastCommittedURL().SchemeIs(kChromeUIScheme)); - - static_cast<StoragePartitionImpl*>(host->GetStoragePartition()) - ->GetQuotaManager() - ->proxy() - ->BindInternalsHandler(std::move(receiver)); -} - -void BindPrerenderInternalsHandler( - RenderFrameHost* host, - mojo::PendingReceiver<mojom::PrerenderInternalsHandler> receiver) { - WebUI* web_ui = host->GetWebUI(); - - PrerenderInternalsUI* prerender_internals_ui = - web_ui ? web_ui->GetController()->GetAs<PrerenderInternalsUI>() : nullptr; - - // This is expected to be called only for outermost main frames and for the - // right WebUI pages matching the same WebUI associated to the - // RenderFrameHost. - if (host->GetParentOrOuterDocument() || !prerender_internals_ui) { - ReceivedBadMessage( - host->GetProcess(), - bad_message::BadMessageReason::RFH_INVALID_WEB_UI_CONTROLLER); - return; - } - - DCHECK_EQ(host->GetLastCommittedURL().host_piece(), - kChromeUIPrerenderInternalsHost); - DCHECK(host->GetLastCommittedURL().SchemeIs(kChromeUIScheme)); - - prerender_internals_ui->BindPrerenderInternalsHandler(std::move(receiver)); -} - -void BindProcessInternalsHandler( - RenderFrameHost* host, - mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver) { - WebUI* web_ui = host->GetWebUI(); - - // Performs a safe downcast to the concrete ProcessInternalsUI subclass. - ProcessInternalsUI* process_internals_ui = - web_ui ? web_ui->GetController()->GetAs<ProcessInternalsUI>() : nullptr; - - // This is expected to be called only for outermost main frames and for the - // right WebUI pages matching the same WebUI associated to the - // RenderFrameHost. - if (host->GetParentOrOuterDocument() || !process_internals_ui) { - ReceivedBadMessage( - host->GetProcess(), - bad_message::BadMessageReason::RFH_INVALID_WEB_UI_CONTROLLER); - return; - } - - DCHECK_EQ(host->GetLastCommittedURL().host_piece(), - kChromeUIProcessInternalsHost); - DCHECK(host->GetLastCommittedURL().SchemeIs(kChromeUIScheme)); - - process_internals_ui->BindProcessInternalsHandler(std::move(receiver), host); -} - void BindQuotaManagerHost( RenderFrameHostImpl* host, mojo::PendingReceiver<blink::mojom::QuotaManagerHost> receiver) { @@ -1150,14 +1044,14 @@ map->Add<device::mojom::VRService>( base::BindRepeating(&EmptyBinderForFrame<device::mojom::VRService>)); #endif - map->Add<attribution_internals::mojom::Handler>( - base::BindRepeating(&BindAttributionInternalsHandler)); - map->Add<mojom::PrerenderInternalsHandler>( - base::BindRepeating(&BindPrerenderInternalsHandler)); - map->Add<::mojom::ProcessInternalsHandler>( - base::BindRepeating(&BindProcessInternalsHandler)); - map->Add<storage::mojom::QuotaInternalsHandler>( - base::BindRepeating(&BindQuotaInternalsHandler)); + RegisterWebUIControllerInterfaceBinder<attribution_internals::mojom::Handler, + AttributionInternalsUI>(map); + RegisterWebUIControllerInterfaceBinder<mojom::PrerenderInternalsHandler, + PrerenderInternalsUI>(map); + RegisterWebUIControllerInterfaceBinder<::mojom::ProcessInternalsHandler, + ProcessInternalsUI>(map); + RegisterWebUIControllerInterfaceBinder<storage::mojom::QuotaInternalsHandler, + QuotaInternalsUI>(map); #if BUILDFLAG(IS_ANDROID) map->Add<blink::mojom::DateTimeChooser>( base::BindRepeating(&BindDateTimeChooserForFrame));
diff --git a/content/browser/devtools/devtools_instrumentation.cc b/content/browser/devtools/devtools_instrumentation.cc index d0d6020..fcdfb04 100644 --- a/content/browser/devtools/devtools_instrumentation.cc +++ b/content/browser/devtools/devtools_instrumentation.cc
@@ -646,8 +646,10 @@ bool* report_raw_headers, absl::optional<std::vector<net::SourceStream::SourceType>>* devtools_accepted_stream_types, - bool* devtools_user_agent_overridden) { + bool* devtools_user_agent_overridden, + bool* devtools_accept_language_overridden) { *devtools_user_agent_overridden = false; + *devtools_accept_language_overridden = false; bool disable_cache = false; DevToolsAgentHostImpl* agent_host = RenderFrameDevToolsAgentHost::GetFor(frame_tree_node); @@ -678,8 +680,11 @@ for (auto* emulation : protocol::EmulationHandler::ForAgentHost(agent_host)) { bool ua_overridden = false; - emulation->ApplyOverrides(&headers, &ua_overridden); + bool accept_language_overridden = false; + emulation->ApplyOverrides(&headers, &ua_overridden, + &accept_language_overridden); *devtools_user_agent_overridden |= ua_overridden; + *devtools_accept_language_overridden |= accept_language_overridden; } if (disable_cache) {
diff --git a/content/browser/devtools/devtools_instrumentation.h b/content/browser/devtools/devtools_instrumentation.h index 539036c..ae9c0a5fe 100644 --- a/content/browser/devtools/devtools_instrumentation.h +++ b/content/browser/devtools/devtools_instrumentation.h
@@ -80,14 +80,17 @@ // If this function caused the User-Agent header to be overridden, // `devtools_user_agent_overridden` will be set to true; otherwise, it will be -// set to false. +// set to false. If this function caused the Accept-Language header to be +// overridden, `devtools_accept_language_overridden` will be set to true; +// otherwise, it will be set to false. void ApplyNetworkRequestOverrides( FrameTreeNode* frame_tree_node, blink::mojom::BeginNavigationParams* begin_params, bool* report_raw_headers, absl::optional<std::vector<net::SourceStream::SourceType>>* devtools_accepted_stream_types, - bool* devtools_user_agent_overridden); + bool* devtools_user_agent_overridden, + bool* devtools_accept_language_overridden); // Returns true if devtools want |*override_out| to be used. // (A true return and |*override_out| being nullopt means no user agent client
diff --git a/content/browser/devtools/protocol/emulation_handler.cc b/content/browser/devtools/protocol/emulation_handler.cc index 03ad02e..90c7fbeb 100644 --- a/content/browser/devtools/protocol/emulation_handler.cc +++ b/content/browser/devtools/protocol/emulation_handler.cc
@@ -643,7 +643,8 @@ } void EmulationHandler::ApplyOverrides(net::HttpRequestHeaders* headers, - bool* user_agent_overridden) { + bool* user_agent_overridden, + bool* accept_language_overridden) { if (!user_agent_.empty()) { headers->SetHeader(net::HttpRequestHeaders::kUserAgent, user_agent_); } @@ -653,6 +654,7 @@ net::HttpRequestHeaders::kAcceptLanguage, net::HttpUtil::GenerateAcceptLanguageHeader(accept_language_)); } + *accept_language_overridden = !accept_language_.empty(); if (!prefers_color_scheme_.empty()) { const auto& prefersColorSchemeClientHintHeader = network::GetClientHintToNameMap().at(
diff --git a/content/browser/devtools/protocol/emulation_handler.h b/content/browser/devtools/protocol/emulation_handler.h index 0a72a01..0d2a7556 100644 --- a/content/browser/devtools/protocol/emulation_handler.h +++ b/content/browser/devtools/protocol/emulation_handler.h
@@ -94,9 +94,11 @@ // Applies the network request header overrides on `headers`. If the // User-Agent header was overridden, `user_agent_overridden` is set to true; - // otherwise, it's set to false. + // otherwise, it's set to false. If the Accept-Language header was overridden, + // `accept_language_overridden` is set to true; otherwise, it's set to false. void ApplyOverrides(net::HttpRequestHeaders* headers, - bool* user_agent_overridden); + bool* user_agent_overridden, + bool* accept_language_overridden); bool ApplyUserAgentMetadataOverrides( absl::optional<blink::UserAgentMetadata>* override_out);
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index a8392390..68b0674 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -2072,13 +2072,6 @@ std::move(redirect_response), std::string(Network::ResourceTypeEnum::Prefetch), std::move(frame_token), request.has_user_gesture); - - // TODO: cookies, security status and full list of headers should be - // implemented. https://crbug.com/1315706. - frontend_->RequestWillBeSentExtraInfo( - request_id, BuildProtocolAssociatedCookies({}), - BuildRequestHeaders(request.headers, request.referrer), - GetConnectTiming(timestamp), MaybeBuildClientSecurityState({})); } void NetworkHandler::NavigationRequestWillBeSent(
diff --git a/content/browser/preloading/prefetch/prefetch_service.cc b/content/browser/preloading/prefetch/prefetch_service.cc index db29ebba..f8a0de3 100644 --- a/content/browser/preloading/prefetch/prefetch_service.cc +++ b/content/browser/preloading/prefetch/prefetch_service.cc
@@ -594,9 +594,12 @@ request->headers.RemoveHeader("User-Agent"); request->trusted_params = trusted_params; request->site_for_cookies = trusted_params.isolation_info.site_for_cookies(); + request->devtools_request_id = prefetch_container->RequestId(); const auto& devtools_observer = prefetch_container->GetDevToolsObserver(); if (devtools_observer && !prefetch_container->IsDecoy()) { + request->trusted_params->devtools_observer = + devtools_observer->MakeSelfOwnedNetworkServiceDevToolsObserver(); devtools_observer->OnStartSinglePrefetch(prefetch_container->RequestId(), *request); }
diff --git a/content/browser/preloading/prerender/prerender_internals_ui.cc b/content/browser/preloading/prerender/prerender_internals_ui.cc index 04096be8..46d0c77 100644 --- a/content/browser/preloading/prerender/prerender_internals_ui.cc +++ b/content/browser/preloading/prerender/prerender_internals_ui.cc
@@ -37,7 +37,7 @@ rfh->EnableMojoJsBindings(nullptr); } -void PrerenderInternalsUI::BindPrerenderInternalsHandler( +void PrerenderInternalsUI::BindInterface( mojo::PendingReceiver<mojom::PrerenderInternalsHandler> receiver) { ui_handler_ = std::make_unique<PrerenderInternalsHandlerImpl>(std::move(receiver));
diff --git a/content/browser/preloading/prerender/prerender_internals_ui.h b/content/browser/preloading/prerender/prerender_internals_ui.h index 92696ea..698ba59 100644 --- a/content/browser/preloading/prerender/prerender_internals_ui.h +++ b/content/browser/preloading/prerender/prerender_internals_ui.h
@@ -31,7 +31,7 @@ void WebUIRenderFrameCreated(RenderFrameHost* render_frame_host) override; - void BindPrerenderInternalsHandler( + void BindInterface( mojo::PendingReceiver<mojom::PrerenderInternalsHandler> receiver); private:
diff --git a/content/browser/preloading/speculation_rules/speculation_host_impl.cc b/content/browser/preloading/speculation_rules/speculation_host_impl.cc index 802022d..691f7a8 100644 --- a/content/browser/preloading/speculation_rules/speculation_host_impl.cc +++ b/content/browser/preloading/speculation_rules/speculation_host_impl.cc
@@ -8,6 +8,7 @@ #include "base/containers/span.h" #include "base/ranges/algorithm.h" #include "content/browser/devtools/devtools_instrumentation.h" +#include "content/browser/devtools/network_service_devtools_observer.h" #include "content/browser/preloading//preloading.h" #include "content/browser/preloading/prefetch/prefetch_document_manager.h" #include "content/browser/preloading/prefetch/prefetch_features.h" @@ -340,4 +341,11 @@ is_base64_encoded); } +mojo::PendingRemote<network::mojom::DevToolsObserver> +SpeculationHostImpl::MakeSelfOwnedNetworkServiceDevToolsObserver() { + auto* ftn = static_cast<RenderFrameHostImpl*>(&render_frame_host()) + ->frame_tree_node(); + return NetworkServiceDevToolsObserver::MakeSelfOwned(ftn); +} + } // namespace content
diff --git a/content/browser/preloading/speculation_rules/speculation_host_impl.h b/content/browser/preloading/speculation_rules/speculation_host_impl.h index 395166d..2f2eaa0 100644 --- a/content/browser/preloading/speculation_rules/speculation_host_impl.h +++ b/content/browser/preloading/speculation_rules/speculation_host_impl.h
@@ -51,6 +51,8 @@ void OnPrefetchBodyDataReceived(const std::string& request_id, const std::string& body, bool is_base64_encoded) override; + mojo::PendingRemote<network::mojom::DevToolsObserver> + MakeSelfOwnedNetworkServiceDevToolsObserver() override; private: SpeculationHostImpl(
diff --git a/content/browser/process_internals/process_internals_ui.cc b/content/browser/process_internals/process_internals_ui.cc index f005dc08..168e35be 100644 --- a/content/browser/process_internals/process_internals_ui.cc +++ b/content/browser/process_internals/process_internals_ui.cc
@@ -54,9 +54,9 @@ rfh->EnableMojoJsBindings(nullptr); } -void ProcessInternalsUI::BindProcessInternalsHandler( - mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver, - RenderFrameHost* render_frame_host) { +void ProcessInternalsUI::BindInterface( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver) { ui_handler_ = std::make_unique<ProcessInternalsHandlerImpl>( render_frame_host->GetSiteInstance()->GetBrowserContext(), std::move(receiver));
diff --git a/content/browser/process_internals/process_internals_ui.h b/content/browser/process_internals/process_internals_ui.h index 35d2d67..726b6e0 100644 --- a/content/browser/process_internals/process_internals_ui.h +++ b/content/browser/process_internals/process_internals_ui.h
@@ -40,9 +40,9 @@ // WebUIController overrides: void WebUIRenderFrameCreated(RenderFrameHost* render_frame_host) override; - void BindProcessInternalsHandler( - mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver, - RenderFrameHost* render_frame_host); + void BindInterface( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<::mojom::ProcessInternalsHandler> receiver); private: std::unique_ptr<::mojom::ProcessInternalsHandler> ui_handler_;
diff --git a/content/browser/quota/quota_internals_ui.cc b/content/browser/quota/quota_internals_ui.cc index b55dd4b..9384b0e 100644 --- a/content/browser/quota/quota_internals_ui.cc +++ b/content/browser/quota/quota_internals_ui.cc
@@ -4,6 +4,8 @@ #include "content/browser/quota/quota_internals_ui.h" +#include "content/browser/renderer_host/render_frame_host_impl.h" +#include "content/browser/webui/web_ui_impl.h" #include "content/grit/quota_internals_resources.h" #include "content/grit/quota_internals_resources_map.h" #include "content/public/browser/render_frame_host.h" @@ -13,6 +15,7 @@ #include "content/public/common/bindings_policy.h" #include "content/public/common/url_constants.h" #include "storage/browser/quota/quota_internals.mojom.h" +#include "storage/browser/quota/quota_manager.h" namespace content { @@ -46,4 +49,13 @@ render_frame_host->EnableMojoJsBindings(nullptr); } +void QuotaInternalsUI::BindInterface( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<storage::mojom::QuotaInternalsHandler> receiver) { + static_cast<StoragePartitionImpl*>(render_frame_host->GetStoragePartition()) + ->GetQuotaManager() + ->proxy() + ->BindInternalsHandler(std::move(receiver)); +} + } // namespace content
diff --git a/content/browser/quota/quota_internals_ui.h b/content/browser/quota/quota_internals_ui.h index ffbff15..b7ff43ff 100644 --- a/content/browser/quota/quota_internals_ui.h +++ b/content/browser/quota/quota_internals_ui.h
@@ -35,6 +35,10 @@ // WebUIController overrides: void WebUIRenderFrameCreated(RenderFrameHost* render_frame_host) override; + void BindInterface( + RenderFrameHost* render_frame_host, + mojo::PendingReceiver<storage::mojom::QuotaInternalsHandler> receiver); + private: WEB_UI_CONTROLLER_TYPE_DECL(); };
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 15fd4e9..6bbb880f 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -1718,7 +1718,8 @@ // Add reduced accept language header. if (auto reduce_accept_lang_utils = - ReduceAcceptLanguageUtils::Create(browser_context)) { + ReduceAcceptLanguageUtils::Create(browser_context); + reduce_accept_lang_utils && !devtools_accept_language_override_) { // Add the Accept-Language header with the reduce accept language value. // Chromium network stack won't overwrite the value if Accept-Language // header was already added in the request header. @@ -2401,8 +2402,8 @@ modified_request_headers_.Clear(); removed_request_headers_.clear(); - throttle_runner_ = - base::WrapUnique(new NavigationThrottleRunner(this, navigation_id_)); + throttle_runner_ = base::WrapUnique(new NavigationThrottleRunner( + this, navigation_id_, IsInPrimaryMainFrame())); // For prerendered page activation, CommitDeferringConditions have already run // at the beginning of the navigation, so we won't run them again. @@ -4242,7 +4243,8 @@ devtools_accepted_stream_types; devtools_instrumentation::ApplyNetworkRequestOverrides( frame_tree_node_, begin_params_.get(), &report_raw_headers, - &devtools_accepted_stream_types, &devtools_user_agent_override_); + &devtools_accepted_stream_types, &devtools_user_agent_override_, + &devtools_accept_language_override_); devtools_instrumentation::OnNavigationRequestWillBeSent(*this); // Merge headers with embedder's headers. @@ -4502,8 +4504,11 @@ } // Add reduced accept language header to the current request. + // If devtools has overridden the Accept-Language header, skip reduce + // Accept-Language header. if (auto reduce_accept_lang_utils = - ReduceAcceptLanguageUtils::Create(browser_context)) { + ReduceAcceptLanguageUtils::Create(browser_context); + reduce_accept_lang_utils && !devtools_accept_language_override_) { net::HttpRequestHeaders accept_language_headers; absl::optional<std::string> reduced_accept_language = reduce_accept_lang_utils.value()
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index 5c1f2d10..90cd941 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -1658,6 +1658,10 @@ // Whether devtools overrides were applied on the User-Agent request header. bool devtools_user_agent_override_ = false; + // Whether devtools overrides were applied on the Accept-Language request + // header. + bool devtools_accept_language_override_ = false; + // The type of RenderFrameHost associated with this navigation. AssociatedRenderFrameHostType associated_rfh_type_ = AssociatedRenderFrameHostType::NONE;
diff --git a/content/browser/renderer_host/navigation_throttle_runner.cc b/content/browser/renderer_host/navigation_throttle_runner.cc index f87f00a..b154d53e 100644 --- a/content/browser/renderer_host/navigation_throttle_runner.cc +++ b/content/browser/renderer_host/navigation_throttle_runner.cc
@@ -5,6 +5,7 @@ #include "content/browser/renderer_host/navigation_throttle_runner.h" #include "base/metrics/histogram_functions.h" +#include "base/metrics/metrics_hashes.h" #include "base/strings/strcat.h" #include "content/browser/devtools/devtools_instrumentation.h" #include "content/browser/portal/portal_navigation_throttle.h" @@ -19,6 +20,8 @@ #include "content/browser/renderer_host/navigator_delegate.h" #include "content/browser/renderer_host/renderer_cancellation_throttle.h" #include "content/public/browser/navigation_handle.h" +#include "services/metrics/public/cpp/ukm_builders.h" +#include "services/metrics/public/cpp/ukm_source_id.h" namespace content { @@ -97,8 +100,11 @@ } // namespace NavigationThrottleRunner::NavigationThrottleRunner(Delegate* delegate, - int64_t navigation_id) - : delegate_(delegate), navigation_id_(navigation_id) {} + int64_t navigation_id, + bool is_primary_main_frame) + : delegate_(delegate), + navigation_id_(navigation_id), + is_primary_main_frame_(is_primary_main_frame) {} NavigationThrottleRunner::~NavigationThrottleRunner() = default; @@ -113,10 +119,12 @@ NavigationThrottle* deferring_throttle) { DCHECK_EQ(GetDeferringThrottle(), deferring_throttle); RecordDeferTimeHistogram(current_event_, defer_start_time_); + RecordDeferTimeUKM(); ProcessInternal(); } void NavigationThrottleRunner::CallResumeForTesting() { + RecordDeferTimeUKM(); ProcessInternal(); } @@ -270,4 +278,22 @@ // deleted by the previous call. } +void NavigationThrottleRunner::RecordDeferTimeUKM() { + if (!is_primary_main_frame_) + return; + DCHECK(GetDeferringThrottle()); + ukm::builders::NavigationThrottleDeferredTime builder( + ukm::ConvertToSourceId(navigation_id_, ukm::SourceIdType::NAVIGATION_ID)); + builder.SetDurationOfNavigationDeferralMs( + (base::Time::Now() - defer_start_time_).InMilliseconds()); + builder.SetNavigationThrottleEventType(static_cast<int64_t>(current_event_)); + // The logging name is converted to an MD5 int64_t hash which is recorded in + // UKM. The possible values are sparse, and analyses should hash the values + // returned by NavigationThrottle::GetNameForLogging to determine which + // throttle deferred the navigation. + builder.SetNavigationThrottleNameHash( + base::HashMetricName(GetDeferringThrottle()->GetNameForLogging())); + builder.Record(ukm::UkmRecorder::Get()); +} + } // namespace content
diff --git a/content/browser/renderer_host/navigation_throttle_runner.h b/content/browser/renderer_host/navigation_throttle_runner.h index d40c54c7..ac4a944 100644 --- a/content/browser/renderer_host/navigation_throttle_runner.h +++ b/content/browser/renderer_host/navigation_throttle_runner.h
@@ -21,12 +21,13 @@ class CONTENT_EXPORT NavigationThrottleRunner { public: // The different event types that can be processed by NavigationThrottles. + // These values are recorded in metrics and should not be renumbered. enum class Event { - WillStartRequest, - WillRedirectRequest, - WillFailRequest, - WillProcessResponse, - NoEvent, + NoEvent = 0, + WillStartRequest = 1, + WillRedirectRequest = 2, + WillFailRequest = 3, + WillProcessResponse = 4, }; class Delegate { @@ -39,7 +40,9 @@ NavigationThrottle::ThrottleCheckResult result) = 0; }; - NavigationThrottleRunner(Delegate* delegate, int64_t navigation_id); + NavigationThrottleRunner(Delegate* delegate, + int64_t navigation_id, + bool is_primary_main_frame); NavigationThrottleRunner(const NavigationThrottleRunner&) = delete; NavigationThrottleRunner& operator=(const NavigationThrottleRunner&) = delete; @@ -81,6 +84,9 @@ void ProcessInternal(); void InformDelegate(const NavigationThrottle::ThrottleCheckResult& result); + // Records UKM about the deferring throttle when the navigation is resumed. + void RecordDeferTimeUKM(); + const raw_ptr<Delegate> delegate_; // A list of Throttles registered for this navigation. @@ -102,6 +108,10 @@ // The event currently being processed. Event current_event_ = Event::NoEvent; + + // Whether the navigation is in the primary main frame. + bool is_primary_main_frame_ = false; + base::WeakPtrFactory<NavigationThrottleRunner> weak_factory_{this}; };
diff --git a/content/browser/renderer_host/navigation_throttle_runner_unittest.cc b/content/browser/renderer_host/navigation_throttle_runner_unittest.cc index d89bb4d..d366db93 100644 --- a/content/browser/renderer_host/navigation_throttle_runner_unittest.cc +++ b/content/browser/renderer_host/navigation_throttle_runner_unittest.cc
@@ -5,11 +5,14 @@ #include "content/browser/renderer_host/navigation_throttle_runner.h" #include "base/bind.h" +#include "base/metrics/metrics_hashes.h" +#include "components/ukm/test_ukm_recorder.h" #include "content/public/browser/navigation_throttle.h" #include "content/public/common/url_constants.h" #include "content/public/test/mock_navigation_handle.h" #include "content/public/test/test_navigation_throttle.h" #include "content/public/test/test_renderer_host.h" +#include "services/metrics/public/cpp/ukm_builders.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace content { @@ -59,7 +62,7 @@ void SetUp() override { RenderViewHostTestHarness::SetUp(); - runner_ = std::make_unique<NavigationThrottleRunner>(this, 1); + runner_ = std::make_unique<NavigationThrottleRunner>(this, 1, true); } void Resume() { runner_->CallResumeForTesting(); } @@ -166,6 +169,8 @@ base::Unretained(this)))); } + ukm::TestUkmRecorder& test_ukm_recorder() { return test_ukm_recorder_; } + private: // NavigationThrottleRunner::Delegate: void OnNavigationEventProcessed( @@ -185,6 +190,7 @@ NavigationThrottleRunner::Event::NoEvent; bool was_delegate_notified_ = false; NavigationThrottle::ThrottleCheckResult delegate_result_; + ukm::TestAutoSetUkmRecorder test_ukm_recorder_; }; class NavigationThrottleRunnerTestWithEvent @@ -367,6 +373,40 @@ EXPECT_EQ(event(), observer_last_event()); } +// Checks that a NavigationThrottle being deferred and resumed records UKM about +// the deferral. +TEST_P(NavigationThrottleRunnerTestWithEventAndAction, DeferRecordsUKM) { + TestNavigationThrottle* defer_throttle = + CreateTestNavigationThrottle(NavigationThrottle::DEFER); + CheckNotNotified(defer_throttle); + + // Simulate the event. The request should be deferred. + SimulateEvent(event()); + CheckNotified(defer_throttle); + EXPECT_TRUE(is_deferring()); + + // Resume the request. This should record UKM. + Resume(); + + // There should be one entry with name hash matching the logging name and + // event that is being run. Ignore the time for testing as it is variable, and + // even possibly 0. + const auto& entries = test_ukm_recorder().GetEntriesByName( + ukm::builders::NavigationThrottleDeferredTime::kEntryName); + EXPECT_EQ(1u, entries.size()); + for (auto* entry : entries) { + EXPECT_EQ(*ukm::TestUkmRecorder::GetEntryMetric( + entry, ukm::builders::NavigationThrottleDeferredTime:: + kNavigationThrottleEventTypeName), + static_cast<int64_t>(event())); + EXPECT_EQ(*ukm::TestUkmRecorder::GetEntryMetric( + entry, ukm::builders::NavigationThrottleDeferredTime:: + kNavigationThrottleNameHashName), + static_cast<int64_t>( + base::HashMetricName(defer_throttle->GetNameForLogging()))); + } +} + INSTANTIATE_TEST_SUITE_P( AllEvents, NavigationThrottleRunnerTestWithEventAndAction,
diff --git a/content/browser/tracing/background_tracing_active_scenario.cc b/content/browser/tracing/background_tracing_active_scenario.cc index 6b125594..26dcd3f 100644 --- a/content/browser/tracing/background_tracing_active_scenario.cc +++ b/content/browser/tracing/background_tracing_active_scenario.cc
@@ -559,7 +559,7 @@ return nullptr; } -base::Value BackgroundTracingActiveScenario::GenerateMetadataDict() { +base::Value::Dict BackgroundTracingActiveScenario::GenerateMetadataDict() { base::Value::Dict metadata_dict; metadata_dict.Set("config", config_->ToDict()); metadata_dict.Set("scenario_name", config_->scenario_name()); @@ -568,7 +568,7 @@ metadata_dict.Set("last_triggered_rule", last_triggered_rule_->ToDict()); } - return base::Value(std::move(metadata_dict)); + return metadata_dict; } void BackgroundTracingActiveScenario::GenerateMetadataProto(
diff --git a/content/browser/tracing/background_tracing_active_scenario.h b/content/browser/tracing/background_tracing_active_scenario.h index ff8ebe4..4639a84f 100644 --- a/content/browser/tracing/background_tracing_active_scenario.h +++ b/content/browser/tracing/background_tracing_active_scenario.h
@@ -41,7 +41,7 @@ void AbortScenario(); CONTENT_EXPORT const BackgroundTracingConfigImpl* GetConfig() const; - base::Value GenerateMetadataDict(); + base::Value::Dict GenerateMetadataDict(); void GenerateMetadataProto( perfetto::protos::pbzero::ChromeMetadataPacket* metadata); State state() const { return scenario_state_; }
diff --git a/content/browser/tracing/background_tracing_manager_impl.cc b/content/browser/tracing/background_tracing_manager_impl.cc index d653402..efa00bf 100644 --- a/content/browser/tracing/background_tracing_manager_impl.cc +++ b/content/browser/tracing/background_tracing_manager_impl.cc
@@ -450,7 +450,7 @@ is_crash_scenario)); } -absl::optional<base::Value> +absl::optional<base::Value::Dict> BackgroundTracingManagerImpl::GenerateMetadataDict() { DCHECK_CURRENTLY_ON(BrowserThread::UI); if (!active_scenario_)
diff --git a/content/browser/tracing/background_tracing_manager_impl.h b/content/browser/tracing/background_tracing_manager_impl.h index 805c976..1fd336d 100644 --- a/content/browser/tracing/background_tracing_manager_impl.h +++ b/content/browser/tracing/background_tracing_manager_impl.h
@@ -166,7 +166,7 @@ ~BackgroundTracingManagerImpl() override; bool IsSupportedConfig(BackgroundTracingConfigImpl* config); - absl::optional<base::Value> GenerateMetadataDict(); + absl::optional<base::Value::Dict> GenerateMetadataDict(); void GenerateMetadataProto( perfetto::protos::pbzero::ChromeMetadataPacket* metadata, bool privacy_filtering_enabled);
diff --git a/content/browser/tracing/tracing_controller_browsertest.cc b/content/browser/tracing/tracing_controller_browsertest.cc index cda3e2b..1bbee268 100644 --- a/content/browser/tracing/tracing_controller_browsertest.cc +++ b/content/browser/tracing/tracing_controller_browsertest.cc
@@ -126,7 +126,7 @@ EXPECT_TRUE(NavigateToURL(shell, GetTestUrl("", "title1.html"))); } - absl::optional<base::Value> GenerateMetadataDict() { + absl::optional<base::Value::Dict> GenerateMetadataDict() { return std::move(metadata_); } @@ -244,8 +244,8 @@ scoped_refptr<TracingController::TraceDataEndpoint> trace_data_endpoint = TracingController::CreateStringEndpoint(std::move(callback)); - metadata_ = base::Value(base::Value::Type::DICTIONARY); - metadata_->SetStringKey("not-whitelisted", "this_not_found"); + metadata_ = base::Value::Dict(); + metadata_->Set("not-whitelisted", "this_not_found"); tracing::TraceEventAgent::GetInstance()->AddMetadataGeneratorFunction( base::BindRepeating(&TracingControllerTest::GenerateMetadataDict, base::Unretained(this))); @@ -336,7 +336,7 @@ int enable_recording_done_callback_count_; int disable_recording_done_callback_count_; base::FilePath last_actual_recording_file_path_; - absl::optional<base::Value> metadata_; + absl::optional<base::Value::Dict> metadata_; std::unique_ptr<std::string> last_data_; };
diff --git a/content/browser/tracing/tracing_controller_impl.cc b/content/browser/tracing/tracing_controller_impl.cc index 6b9633a..2044c41c0 100644 --- a/content/browser/tracing/tracing_controller_impl.cc +++ b/content/browser/tracing/tracing_controller_impl.cc
@@ -248,16 +248,17 @@ } // Can be called on any thread. -absl::optional<base::Value> TracingControllerImpl::GenerateMetadataDict() { +absl::optional<base::Value::Dict> +TracingControllerImpl::GenerateMetadataDict() { DCHECK_CURRENTLY_ON(BrowserThread::UI); - base::Value metadata_dict(base::Value::Type::DICTIONARY); + base::Value::Dict metadata_dict; - metadata_dict.SetStringKey("network-type", GetNetworkTypeString()); - metadata_dict.SetStringKey("product-version", - GetContentClient()->browser()->GetProduct()); - metadata_dict.SetStringKey("v8-version", V8_VERSION_STRING); - metadata_dict.SetStringKey("user-agent", - GetContentClient()->browser()->GetUserAgent()); + metadata_dict.Set("network-type", GetNetworkTypeString()); + metadata_dict.Set("product-version", + GetContentClient()->browser()->GetProduct()); + metadata_dict.Set("v8-version", V8_VERSION_STRING); + metadata_dict.Set("user-agent", + GetContentClient()->browser()->GetUserAgent()); #if BUILDFLAG(IS_ANDROID) // The library name is used for symbolizing heap profiles. This cannot be @@ -267,53 +268,50 @@ absl::optional<base::StringPiece> soname = base::debug::ReadElfLibraryName(&__ehdr_start); if (soname) - metadata_dict.SetStringKey("chrome-library-name", *soname); - metadata_dict.SetStringKey("clock-offset-since-epoch", - GetClockOffsetSinceEpoch()); + metadata_dict.Set("chrome-library-name", *soname); + metadata_dict.Set("clock-offset-since-epoch", GetClockOffsetSinceEpoch()); #endif // BUILDFLAG(IS_ANDROID) - metadata_dict.SetIntKey("chrome-bitness", 8 * sizeof(uintptr_t)); + metadata_dict.Set("chrome-bitness", static_cast<int>(8 * sizeof(uintptr_t))); #if DCHECK_IS_ON() - metadata_dict.SetIntKey("chrome-dcheck-on", 1); + metadata_dict.Set("chrome-dcheck-on", 1); #endif // OS #if BUILDFLAG(IS_CHROMEOS_ASH) - metadata_dict.SetStringKey("os-name", "CrOS"); + metadata_dict.Set("os-name", "CrOS"); if (are_statistics_loaded_) - metadata_dict.SetStringKey("hardware-class", hardware_class_); + metadata_dict.Set("hardware-class", hardware_class_); #else - metadata_dict.SetStringKey("os-name", base::SysInfo::OperatingSystemName()); + metadata_dict.Set("os-name", base::SysInfo::OperatingSystemName()); #endif // BUILDFLAG(IS_CHROMEOS_ASH) - metadata_dict.SetStringKey("os-version", - base::SysInfo::OperatingSystemVersion()); + metadata_dict.Set("os-version", base::SysInfo::OperatingSystemVersion()); #if BUILDFLAG(IS_WIN) if (base::win::OSInfo::GetArchitecture() == base::win::OSInfo::X64_ARCHITECTURE) { if (base::win::OSInfo::GetInstance()->IsWowX86OnAMD64()) { - metadata_dict.SetStringKey("os-wow64", "enabled"); + metadata_dict.Set("os-wow64", "enabled"); } else { - metadata_dict.SetStringKey("os-wow64", "disabled"); + metadata_dict.Set("os-wow64", "disabled"); } } - metadata_dict.SetStringKey( - "os-session", base::win::IsCurrentSessionRemote() ? "remote" : "local"); + metadata_dict.Set("os-session", + base::win::IsCurrentSessionRemote() ? "remote" : "local"); #endif - metadata_dict.SetStringKey("os-arch", - base::SysInfo::OperatingSystemArchitecture()); + metadata_dict.Set("os-arch", base::SysInfo::OperatingSystemArchitecture()); // CPU base::CPU cpu; - metadata_dict.SetIntKey("cpu-family", cpu.family()); - metadata_dict.SetIntKey("cpu-model", cpu.model()); - metadata_dict.SetIntKey("cpu-stepping", cpu.stepping()); - metadata_dict.SetIntKey("num-cpus", base::SysInfo::NumberOfProcessors()); - metadata_dict.SetIntKey("physical-memory", - base::SysInfo::AmountOfPhysicalMemoryMB()); + metadata_dict.Set("cpu-family", cpu.family()); + metadata_dict.Set("cpu-model", cpu.model()); + metadata_dict.Set("cpu-stepping", cpu.stepping()); + metadata_dict.Set("num-cpus", base::SysInfo::NumberOfProcessors()); + metadata_dict.Set("physical-memory", + base::SysInfo::AmountOfPhysicalMemoryMB()); - metadata_dict.SetStringKey("cpu-brand", cpu.cpu_brand()); + metadata_dict.Set("cpu-brand", cpu.cpu_brand()); // GPU const gpu::GPUInfo gpu_info = @@ -321,32 +319,31 @@ const gpu::GPUInfo::GPUDevice& active_gpu = gpu_info.active_gpu(); #if !BUILDFLAG(IS_ANDROID) - metadata_dict.SetIntKey("gpu-venid", active_gpu.vendor_id); - metadata_dict.SetIntKey("gpu-devid", active_gpu.device_id); + metadata_dict.Set("gpu-venid", static_cast<int>(active_gpu.vendor_id)); + metadata_dict.Set("gpu-devid", static_cast<int>(active_gpu.device_id)); #endif - metadata_dict.SetStringKey("gpu-driver", active_gpu.driver_version); - metadata_dict.SetStringKey("gpu-psver", gpu_info.pixel_shader_version); - metadata_dict.SetStringKey("gpu-vsver", gpu_info.vertex_shader_version); + metadata_dict.Set("gpu-driver", active_gpu.driver_version); + metadata_dict.Set("gpu-psver", gpu_info.pixel_shader_version); + metadata_dict.Set("gpu-vsver", gpu_info.vertex_shader_version); #if BUILDFLAG(IS_MAC) - metadata_dict.SetStringKey("gpu-glver", gpu_info.gl_version); + metadata_dict.Set("gpu-glver", gpu_info.gl_version); #elif BUILDFLAG(IS_POSIX) - metadata_dict.SetStringKey("gpu-gl-vendor", gpu_info.gl_vendor); - metadata_dict.SetStringKey("gpu-gl-renderer", gpu_info.gl_renderer); + metadata_dict.Set("gpu-gl-vendor", gpu_info.gl_vendor); + metadata_dict.Set("gpu-gl-renderer", gpu_info.gl_renderer); #endif - metadata_dict.SetKey("gpu-features", GetFeatureStatus()); + metadata_dict.Set("gpu-features", GetFeatureStatus()); - metadata_dict.SetStringKey("clock-domain", GetClockString()); - metadata_dict.SetBoolKey("highres-ticks", - base::TimeTicks::IsHighResolution()); + metadata_dict.Set("clock-domain", GetClockString()); + metadata_dict.Set("highres-ticks", base::TimeTicks::IsHighResolution()); base::CommandLine::StringType command_line = base::CommandLine::ForCurrentProcess()->GetCommandLineString(); #if BUILDFLAG(IS_WIN) - metadata_dict.SetStringKey("command_line", base::WideToUTF16(command_line)); + metadata_dict.Set("command_line", base::WideToUTF16(command_line)); #else - metadata_dict.SetStringKey("command_line", command_line); + metadata_dict.Set("command_line", command_line); #endif base::Time::Exploded ctime; @@ -354,7 +351,7 @@ std::string time_string = base::StringPrintf( "%u-%u-%u %d:%d:%d", ctime.year, ctime.month, ctime.day_of_month, ctime.hour, ctime.minute, ctime.second); - metadata_dict.SetStringKey("trace-capture-datetime", time_string); + metadata_dict.Set("trace-capture-datetime", time_string); // TODO(crbug.com/737049): The central controller doesn't know about // metadata filters, so we temporarily filter here as the controller is @@ -366,7 +363,7 @@ } if (!metadata_filter.is_null()) { - for (auto it : metadata_dict.DictItems()) { + for (auto it : metadata_dict) { if (!metadata_filter.Run(it.first)) { it.second = base::Value("__stripped__"); }
diff --git a/content/browser/tracing/tracing_controller_impl.h b/content/browser/tracing/tracing_controller_impl.h index 229498f..9dba804 100644 --- a/content/browser/tracing/tracing_controller_impl.h +++ b/content/browser/tracing/tracing_controller_impl.h
@@ -14,6 +14,7 @@ #include "base/memory/ref_counted.h" #include "base/task/task_traits.h" #include "base/timer/timer.h" +#include "base/values.h" #include "build/chromeos_buildflags.h" #include "content/common/content_export.h" #include "content/public/browser/tracing_controller.h" @@ -37,7 +38,6 @@ class TraceConfig; } // namespace trace_event -class Value; } // namespace base namespace tracing { @@ -95,7 +95,7 @@ ~TracingControllerImpl() override; void AddAgents(); void ConnectToServiceIfNeeded(); - absl::optional<base::Value> GenerateMetadataDict(); + absl::optional<base::Value::Dict> GenerateMetadataDict(); void GenerateMetadataPacket(perfetto::protos::pbzero::TracePacket* packet, bool privacy_filtering_enabled);
diff --git a/content/browser/webui/web_ui_mojo_browsertest.cc b/content/browser/webui/web_ui_mojo_browsertest.cc index 173423b..501ce4d 100644 --- a/content/browser/webui/web_ui_mojo_browsertest.cc +++ b/content/browser/webui/web_ui_mojo_browsertest.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller.h" +#include "content/public/browser/web_ui_controller_interface_binder.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/common/bindings_policy.h" #include "content/public/common/content_client.h" @@ -125,12 +126,16 @@ : TestWebUIController(web_ui) {} ~CacheTestWebUIController() override = default; - void CreateHandler( + void BindInterface( mojo::PendingReceiver<mojom::WebUIMojoTestCache> receiver) { cache_ = std::make_unique<WebUIMojoTestCacheImpl>(std::move(receiver)); } + + WEB_UI_CONTROLLER_TYPE_DECL(); }; +WEB_UI_CONTROLLER_TYPE_IMPL(CacheTestWebUIController) + // WebUIControllerFactory that creates TestWebUIController. class TestWebUIControllerFactory : public WebUIControllerFactory { public: @@ -213,16 +218,8 @@ void RegisterBrowserInterfaceBindersForFrame( RenderFrameHost* render_frame_host, mojo::BinderMapWithContext<content::RenderFrameHost*>* map) override { - map->Add<mojom::WebUIMojoTestCache>(base::BindRepeating( - &TestWebUIContentBrowserClient::BindTestCache, base::Unretained(this))); - } - void BindTestCache( - content::RenderFrameHost* render_frame_host, - mojo::PendingReceiver<mojom::WebUIMojoTestCache> receiver) { - auto* contents = WebContents::FromRenderFrameHost(render_frame_host); - static_cast<CacheTestWebUIController*>( - contents->GetWebUI()->GetController()) - ->CreateHandler(std::move(receiver)); + RegisterWebUIControllerInterfaceBinder<mojom::WebUIMojoTestCache, + CacheTestWebUIController>(map); } };
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java index 765dfc0..9dfcecef 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsObserverProxy.java
@@ -122,10 +122,20 @@ @Override @CalledByNative - public void didStartNavigation(NavigationHandle navigation) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigation) { handleObserverCall(); for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { - mObserversIterator.next().didStartNavigation(navigation); + mObserversIterator.next().didStartNavigationInPrimaryMainFrame(navigation); + } + finishObserverCall(); + } + + @Override + @CalledByNative + public void didStartNavigationNoop(NavigationHandle navigation) { + handleObserverCall(); + for (mObserversIterator.rewind(); mObserversIterator.hasNext();) { + mObserversIterator.next().didStartNavigationNoop(navigation); } finishObserverCall(); }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java index b3115dd6..8a4e41fe 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContentsObserver.java
@@ -47,13 +47,20 @@ public void renderProcessGone() {} /** - * Called when the browser process starts a navigation. + * Called when the browser process starts a navigation in the primary main frame. * @param navigationHandle * NavigationHandle are provided to several WebContentsObserver methods to allow * observers to track specific navigations. Observers should clear any references to a * NavigationHandle at didFinishNavigation(); */ - public void didStartNavigation(NavigationHandle navigationHandle) {} + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigationHandle) {} + + /** + * TODO(crbug.com/1337446) Remove when NotifyJavaSupriouslyToMeasurePerf experiment is finished. + * No-op, for measuring performance of calling didStartNavigation in only the primary main + * frame vs calling it in all frames. + */ + public void didStartNavigationNoop(NavigationHandle navigationHandle) {} /** * Called when the browser process redirect a navigation.
diff --git a/content/public/browser/speculation_host_delegate.h b/content/public/browser/speculation_host_delegate.h index 52af15f..b83a4477 100644 --- a/content/public/browser/speculation_host_delegate.h +++ b/content/public/browser/speculation_host_delegate.h
@@ -11,6 +11,10 @@ #include "services/network/public/mojom/url_response_head.mojom-forward.h" #include "third_party/blink/public/mojom/speculation_rules/speculation_rules.mojom.h" +namespace Network::mojom { +class DevToolsObserver; +} // namespace Network::mojom + namespace content { class CONTENT_EXPORT SpeculationHostDevToolsObserver { public: @@ -27,6 +31,8 @@ virtual void OnPrefetchBodyDataReceived(const std::string& request_id, const std::string& body, bool is_base64_encoded) = 0; + virtual mojo::PendingRemote<network::mojom::DevToolsObserver> + MakeSelfOwnedNetworkServiceDevToolsObserver() = 0; }; // Allow embedders to handle speculation candidates with their own strategies.
diff --git a/content/public/browser/tracing_delegate.cc b/content/public/browser/tracing_delegate.cc index 765bda0c..06cd3d7 100644 --- a/content/public/browser/tracing_delegate.cc +++ b/content/public/browser/tracing_delegate.cc
@@ -26,7 +26,7 @@ return false; } -absl::optional<base::Value> TracingDelegate::GenerateMetadataDict() { +absl::optional<base::Value::Dict> TracingDelegate::GenerateMetadataDict() { return absl::nullopt; }
diff --git a/content/public/browser/tracing_delegate.h b/content/public/browser/tracing_delegate.h index 86365093..774930a3 100644 --- a/content/public/browser/tracing_delegate.h +++ b/content/public/browser/tracing_delegate.h
@@ -5,16 +5,11 @@ #ifndef CONTENT_PUBLIC_BROWSER_TRACING_DELEGATE_H_ #define CONTENT_PUBLIC_BROWSER_TRACING_DELEGATE_H_ -#include <memory> - #include "base/callback.h" +#include "base/values.h" #include "content/common/content_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" -namespace base { -class Value; -} // namespace base - namespace content { class BackgroundTracingConfig; @@ -39,7 +34,7 @@ virtual bool IsSystemWideTracingEnabled(); // Used to add any additional metadata to traces. - virtual absl::optional<base::Value> GenerateMetadataDict(); + virtual absl::optional<base::Value::Dict> GenerateMetadataDict(); }; } // namespace content
diff --git a/content/public/browser/web_ui_controller_interface_binder.h b/content/public/browser/web_ui_controller_interface_binder.h index e517f9f..30d8fe1 100644 --- a/content/public/browser/web_ui_controller_interface_binder.h +++ b/content/public/browser/web_ui_controller_interface_binder.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_PUBLIC_BROWSER_WEB_UI_CONTROLLER_INTERFACE_BINDER_H_ #define CONTENT_PUBLIC_BROWSER_WEB_UI_CONTROLLER_INTERFACE_BINDER_H_ +#include <type_traits> + #include "content/common/content_export.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_ui.h" @@ -17,10 +19,22 @@ template <typename Interface, int N, typename... Subclasses> struct BinderHelper; +template <typename Interface, typename WebUIControllerSubclass, typename = void> +struct BinderTakesRenderFrameHost : std::false_type {}; + template <typename Interface, typename WebUIControllerSubclass> -bool SafeDownCastAndBindInterface(WebUI* web_ui, +struct BinderTakesRenderFrameHost< + Interface, + WebUIControllerSubclass, + decltype(std::declval<WebUIControllerSubclass>().BindInterface( + std::declval<RenderFrameHost*>(), + std::declval<mojo::PendingReceiver<Interface>>()))> : std::true_type {}; + +template <typename Interface, typename WebUIControllerSubclass> +bool SafeDownCastAndBindInterface(RenderFrameHost* host, mojo::PendingReceiver<Interface>& receiver) { // Performs a safe downcast to the concrete WebUIController subclass. + WebUI* web_ui = host->GetWebUI(); WebUIControllerSubclass* concrete_controller = web_ui ? web_ui->GetController()->GetAs<WebUIControllerSubclass>() : nullptr; @@ -30,20 +44,25 @@ // Fails to compile if |Subclass| does not implement the appropriate overload // for |Interface|. - concrete_controller->BindInterface(std::move(receiver)); + if constexpr (BinderTakesRenderFrameHost<Interface, + WebUIControllerSubclass>::value) { + concrete_controller->BindInterface(host, std::move(receiver)); + } else { + concrete_controller->BindInterface(std::move(receiver)); + } return true; } template <typename Interface, int N, typename Subclass, typename... Subclasses> struct BinderHelper<Interface, N, std::tuple<Subclass, Subclasses...>> { - static bool BindInterface(WebUI* web_ui, + static bool BindInterface(RenderFrameHost* host, mojo::PendingReceiver<Interface> receiver) { // Try a different subclass if the current one is not the right // WebUIController for the current WebUI page, and only fail if none of the // passed subclasses match. - if (!SafeDownCastAndBindInterface<Interface, Subclass>(web_ui, receiver)) { + if (!SafeDownCastAndBindInterface<Interface, Subclass>(host, receiver)) { return BinderHelper<Interface, N - 1, std::tuple<Subclasses...>>:: - BindInterface(web_ui, std::move(receiver)); + BindInterface(host, std::move(receiver)); } return true; } @@ -51,9 +70,9 @@ template <typename Interface, typename Subclass, typename... Subclasses> struct BinderHelper<Interface, 0, std::tuple<Subclass, Subclasses...>> { - static bool BindInterface(WebUI* web_ui, + static bool BindInterface(RenderFrameHost* host, mojo::PendingReceiver<Interface> receiver) { - return SafeDownCastAndBindInterface<Interface, Subclass>(web_ui, receiver); + return SafeDownCastAndBindInterface<Interface, Subclass>(host, receiver); } }; @@ -80,7 +99,7 @@ bool is_bound = internal::BinderHelper<Interface, size - 1, std::tuple<WebUIControllerSubclasses...>>:: - BindInterface(host->GetWebUI(), std::move(receiver)); + BindInterface(host, std::move(receiver)); // This is expected to be called only for the right WebUI pages matching // the same WebUI associated to the RenderFrameHost.
diff --git a/content/test/data/accessibility/aria/aria-searchbox-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-searchbox-expected-auralinux.txt index b146e06..6dadc320 100644 --- a/content/test/data/accessibility/aria/aria-searchbox-expected-auralinux.txt +++ b/content/test/data/accessibility/aria/aria-searchbox-expected-auralinux.txt
@@ -1,3 +1,3 @@ -[document web] caret_offset=0 +[document web] ++[entry] selectable-text xml-roles:searchbox caret_offset=0 -++++[static] name='<newline> ARIA role searchbox.<newline> ' caret_offset=0 +++++[static] name='<newline> ARIA role searchbox.<newline> ' caret_offset=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-searchbox-expected-win.txt b/content/test/data/accessibility/aria/aria-searchbox-expected-win.txt index d3d7ce00..5cbc792 100644 --- a/content/test/data/accessibility/aria/aria-searchbox-expected-win.txt +++ b/content/test/data/accessibility/aria/aria-searchbox-expected-win.txt
@@ -1,3 +1,3 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++ROLE_SYSTEM_TEXT value='<newline> ARIA role searchbox.<newline> ' FOCUSABLE IA2_STATE_MULTI_LINE xml-roles:searchbox ia2_hypertext='<newline> ARIA role searchbox.<newline> ' caret_offset=0 n_selections=0 -++++ROLE_SYSTEM_STATICTEXT name='<newline> ARIA role searchbox.<newline> ' ia2_hypertext='<newline> ARIA role searchbox.<newline> ' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_STATICTEXT name='<newline> ARIA role searchbox.<newline> ' ia2_hypertext='<newline> ARIA role searchbox.<newline> ' caret_offset=0 n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-auralinux.txt b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-auralinux.txt index 0af7c538..80979a9 100644 --- a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-auralinux.txt +++ b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-auralinux.txt
@@ -1,4 +1,4 @@ -[document web] caret_offset=0 +[document web] ++[entry] editable multi-line selectable-text xml-roles:textbox caret_offset=0 ++++[heading] name='TextBox1' editable ++++++[static] name='TextBox1' editable
diff --git a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt index 7d8ff23d..9156e74 100644 --- a/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt +++ b/content/test/data/accessibility/aria/aria-textbox-with-rich-text-expected-win.txt
@@ -1,4 +1,4 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0><obj1>' n_characters=2 caret_offset=0 n_selections=0 +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0><obj1>' n_characters=2 n_selections=0 ++ROLE_SYSTEM_TEXT value='TextBox1' FOCUSABLE IA2_STATE_MULTI_LINE xml-roles:textbox ia2_hypertext='<obj0>' n_characters=1 caret_offset=0 n_selections=0 ++++IA2_ROLE_HEADING name='TextBox1' ia2_hypertext='TextBox1' n_characters=8 n_selections=0 ++++++ROLE_SYSTEM_STATICTEXT name='TextBox1' ia2_hypertext='TextBox1' n_characters=8 n_selections=0
diff --git a/content/test/data/accessibility/html/ignored-selection-between-text-expected-auralinux.txt b/content/test/data/accessibility/html/ignored-selection-between-text-expected-auralinux.txt index bd0349d..3c2ff61 100644 --- a/content/test/data/accessibility/html/ignored-selection-between-text-expected-auralinux.txt +++ b/content/test/data/accessibility/html/ignored-selection-between-text-expected-auralinux.txt
@@ -3,6 +3,6 @@ ++++[static] name='before selection' ++[section] selection_start=0 selection_end=24 ++++[static] name='this text is not ignored' selection_start=0 selection_end=24 -++[section] caret_offset=0 -++++[static] name='after selection' caret_offset=0 -++[static] name='Done' +++[section] +++++[static] name='after selection' +++[static] name='Done' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/ignored-selection-expected-auralinux.txt b/content/test/data/accessibility/html/ignored-selection-expected-auralinux.txt index e27e9f5..160affd 100644 --- a/content/test/data/accessibility/html/ignored-selection-expected-auralinux.txt +++ b/content/test/data/accessibility/html/ignored-selection-expected-auralinux.txt
@@ -1,5 +1,5 @@ [document web] caret_offset=24 selection_start=0 selection_end=24 ++[static] name='this text is not ignored' selection_start=0 selection_end=24 -++[section] caret_offset=0 -++++[static] name='after selection' caret_offset=0 -++[static] name='Done' +++[section] +++++[static] name='after selection' +++[static] name='Done' \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-email-expected-win.txt b/content/test/data/accessibility/html/input-email-expected-win.txt index 942be6a..e0b42022 100644 --- a/content/test/data/accessibility/html/input-email-expected-win.txt +++ b/content/test/data/accessibility/html/input-email-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='someone@example.com' FOCUSABLE text-input-type:email ia2_hypertext='someone@example.com' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='someone@example.com' FOCUSABLE text-input-type:email ia2_hypertext='someone@example.com' n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-password-expected-auralinux.txt b/content/test/data/accessibility/html/input-password-expected-auralinux.txt index bcdc7d3..b84c6b37 100644 --- a/content/test/data/accessibility/html/input-password-expected-auralinux.txt +++ b/content/test/data/accessibility/html/input-password-expected-auralinux.txt
@@ -1,3 +1,3 @@ -[document web] focusable caret_offset=0 -++[section] caret_offset=0 -++++[password text] editable focusable focused selectable-text text-input-type:password caret_offset=6 +[document web] focusable +++[section] +++++[password text] editable focusable focused selectable-text text-input-type:password caret_offset=6 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-password-expected-win.txt b/content/test/data/accessibility/html/input-password-expected-win.txt index 2bf3f97..d215b67 100644 --- a/content/test/data/accessibility/html/input-password-expected-win.txt +++ b/content/test/data/accessibility/html/input-password-expected-win.txt
@@ -1,3 +1,3 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 -++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 +++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 ++++ROLE_SYSTEM_TEXT value='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2' FOCUSABLE PROTECTED IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:password ia2_hypertext='%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2%E2%80%A2' caret_offset=6 n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-search-expected-win.txt b/content/test/data/accessibility/html/input-search-expected-win.txt index a2da0fc..e45a8c56 100644 --- a/content/test/data/accessibility/html/input-search-expected-win.txt +++ b/content/test/data/accessibility/html/input-search-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='Search terms' FOCUSABLE text-input-type:search ia2_hypertext='Search terms' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='Search terms' FOCUSABLE text-input-type:search ia2_hypertext='Search terms' n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-tel-expected-win.txt b/content/test/data/accessibility/html/input-tel-expected-win.txt index e512259..b13137b 100644 --- a/content/test/data/accessibility/html/input-tel-expected-win.txt +++ b/content/test/data/accessibility/html/input-tel-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='123-456-7890' FOCUSABLE text-input-type:tel ia2_hypertext='123-456-7890' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='123-456-7890' FOCUSABLE text-input-type:tel ia2_hypertext='123-456-7890' n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-text-expected-auralinux.txt b/content/test/data/accessibility/html/input-text-expected-auralinux.txt index 8bf5585..c1f45ff 100644 --- a/content/test/data/accessibility/html/input-text-expected-auralinux.txt +++ b/content/test/data/accessibility/html/input-text-expected-auralinux.txt
@@ -1,3 +1,3 @@ -[document web] focusable caret_offset=0 -++[section] caret_offset=0 -++++[entry] name='Name' editable focusable focused single-line selectable-text text-input-type:text caret_offset=0 +[document web] focusable +++[section] +++++[entry] name='Name' editable focusable focused single-line selectable-text text-input-type:text caret_offset=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-text-expected-win.txt b/content/test/data/accessibility/html/input-text-expected-win.txt index 291a11f..f8892dda 100644 --- a/content/test/data/accessibility/html/input-text-expected-win.txt +++ b/content/test/data/accessibility/html/input-text-expected-win.txt
@@ -1,3 +1,3 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 -++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 -++++ROLE_SYSTEM_TEXT name='Name' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0 +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 +++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 +++++ROLE_SYSTEM_TEXT name='Name' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-text-read-only-expected-auralinux.txt b/content/test/data/accessibility/html/input-text-read-only-expected-auralinux.txt index e76a15a..075adb2 100644 --- a/content/test/data/accessibility/html/input-text-read-only-expected-auralinux.txt +++ b/content/test/data/accessibility/html/input-text-read-only-expected-auralinux.txt
@@ -1,3 +1,3 @@ -[document web] focusable caret_offset=0 -++[section] caret_offset=0 -++++[entry] name='Name' focusable focused single-line text-input-type:text caret_offset=0 +[document web] focusable +++[section] +++++[entry] name='Name' focusable focused single-line text-input-type:text caret_offset=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-text-read-only-expected-win.txt b/content/test/data/accessibility/html/input-text-read-only-expected-win.txt index f9e32b6f..7900c67 100644 --- a/content/test/data/accessibility/html/input-text-read-only-expected-win.txt +++ b/content/test/data/accessibility/html/input-text-read-only-expected-win.txt
@@ -1,3 +1,3 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 -++IA2_ROLE_SECTION ia2_hypertext='<obj0>' caret_offset=0 n_selections=0 -++++ROLE_SYSTEM_TEXT name='Name' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0 +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 +++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 +++++ROLE_SYSTEM_TEXT name='Name' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_SELECTABLE_TEXT IA2_STATE_SINGLE_LINE text-input-type:text caret_offset=0 n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/input-url-expected-win.txt b/content/test/data/accessibility/html/input-url-expected-win.txt index 03dc259..22f113c 100644 --- a/content/test/data/accessibility/html/input-url-expected-win.txt +++ b/content/test/data/accessibility/html/input-url-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='example.com' FOCUSABLE IA2_STATE_INVALID_ENTRY text-input-type:url ia2_hypertext='example.com' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='example.com' FOCUSABLE IA2_STATE_INVALID_ENTRY text-input-type:url ia2_hypertext='example.com' n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/textarea-expected-win.txt b/content/test/data/accessibility/html/textarea-expected-win.txt index 4a86c0d..e9ff486 100644 --- a/content/test/data/accessibility/html/textarea-expected-win.txt +++ b/content/test/data/accessibility/html/textarea-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='The <newline>textarea tag defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The <newline>textarea tag defines a multi-line text input control.<newline><newline>' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='The <newline>textarea tag defines a multi-line text input control.<newline>' FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The <newline>textarea tag defines a multi-line text input control.<newline><newline>' n_selections=0 \ No newline at end of file
diff --git a/content/test/data/accessibility/html/textarea-read-only-expected-win.txt b/content/test/data/accessibility/html/textarea-read-only-expected-win.txt index 338138e..31ec9dc 100644 --- a/content/test/data/accessibility/html/textarea-read-only-expected-win.txt +++ b/content/test/data/accessibility/html/textarea-read-only-expected-win.txt
@@ -1,3 +1,3 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ia2_hypertext='<obj0>' n_selections=0 ++IA2_ROLE_SECTION ia2_hypertext='<obj0>' n_selections=0 -++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline><newline>' caret_offset=0 n_selections=0 +++++ROLE_SYSTEM_TEXT value='The textarea tag defines a multi-line text input control.<newline>' READONLY FOCUSABLE IA2_STATE_EDITABLE IA2_STATE_MULTI_LINE IA2_STATE_SELECTABLE_TEXT ia2_hypertext='The textarea tag defines a multi-line text input control.<newline><newline>' n_selections=0 \ No newline at end of file
diff --git a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc index 61ac4a1..3181c15b 100644 --- a/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc +++ b/extensions/browser/api/bluetooth_low_energy/bluetooth_low_energy_api.cc
@@ -452,7 +452,7 @@ Respond(Error(StatusToString(status))); return; } - Respond(NoArguments()); + Respond(WithArguments()); } BluetoothLowEnergyDisconnectFunction::BluetoothLowEnergyDisconnectFunction() {} @@ -484,7 +484,7 @@ } void BluetoothLowEnergyDisconnectFunction::SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyDisconnectFunction::ErrorCallback( @@ -588,8 +588,7 @@ // Manually construct the result instead of using // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of // enums correctly. - Respond(OneArgument( - base::Value(apibtle::CharacteristicToValue(&characteristic)))); + Respond(WithArguments(apibtle::CharacteristicToValue(&characteristic))); } BluetoothLowEnergyGetCharacteristicsFunction:: @@ -630,7 +629,7 @@ for (apibtle::Characteristic& characteristic : characteristic_list) result.Append(apibtle::CharacteristicToValue(&characteristic)); - Respond(OneArgument(base::Value(std::move(result)))); + Respond(WithArguments(std::move(result))); } BluetoothLowEnergyGetIncludedServicesFunction:: @@ -700,7 +699,7 @@ // Manually construct the result instead of using // apibtle::GetDescriptor::Result::Create as it doesn't convert lists of enums // correctly. - Respond(OneArgument(base::Value::FromUniquePtrValue( + Respond(WithArguments(base::Value::FromUniquePtrValue( apibtle::DescriptorToValue(&descriptor)))); } @@ -742,7 +741,7 @@ result.Append(base::Value::FromUniquePtrValue( apibtle::DescriptorToValue(&descriptor))); - Respond(OneArgument(base::Value(std::move(result)))); + Respond(WithArguments(std::move(result))); } BluetoothLowEnergyReadCharacteristicValueFunction:: @@ -793,8 +792,7 @@ // Manually construct the result instead of using // apibtle::GetCharacteristic::Result::Create as it doesn't convert lists of // enums correctly. - Respond(OneArgument( - base::Value(apibtle::CharacteristicToValue(&characteristic)))); + Respond(WithArguments(apibtle::CharacteristicToValue(&characteristic))); } void BluetoothLowEnergyReadCharacteristicValueFunction::ErrorCallback( @@ -885,7 +883,7 @@ void BluetoothLowEnergyStartCharacteristicNotificationsFunction:: SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyStartCharacteristicNotificationsFunction::ErrorCallback( @@ -929,7 +927,7 @@ void BluetoothLowEnergyStopCharacteristicNotificationsFunction:: SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyStopCharacteristicNotificationsFunction::ErrorCallback( @@ -984,7 +982,7 @@ // Manually construct the result instead of using // apibtle::GetDescriptor::Results::Create as it doesn't convert lists of // enums correctly. - Respond(OneArgument(base::Value::FromUniquePtrValue( + Respond(WithArguments(base::Value::FromUniquePtrValue( apibtle::DescriptorToValue(&descriptor)))); } @@ -1176,7 +1174,7 @@ // If we don't have an initialized adapter, unregistering is a no-op. if (!event_router->HasAdapter()) { - Respond(NoArguments()); + Respond(WithArguments()); return; } @@ -1199,7 +1197,7 @@ void BluetoothLowEnergyUnregisterAdvertisementFunction::SuccessCallback( int advertisement_id) { RemoveAdvertisement(advertisement_id); - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyUnregisterAdvertisementFunction::ErrorCallback( @@ -1235,13 +1233,13 @@ // If the adapter is not initialized, there is nothing to reset. if (!event_router->HasAdapter()) { - Respond(NoArguments()); + Respond(WithArguments()); return; } const std::unordered_set<int>* advertisement_ids = GetAdvertisementIds(); if (!advertisement_ids || advertisement_ids->empty()) { - Respond(NoArguments()); + Respond(WithArguments()); return; } @@ -1261,7 +1259,7 @@ } void BluetoothLowEnergyResetAdvertisingFunction::SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyResetAdvertisingFunction::ErrorCallback( @@ -1299,7 +1297,7 @@ } void BluetoothLowEnergySetAdvertisingIntervalFunction::SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergySetAdvertisingIntervalFunction::ErrorCallback( @@ -1444,7 +1442,7 @@ } void BluetoothLowEnergyRegisterServiceFunction::SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyRegisterServiceFunction::ErrorCallback( @@ -1475,7 +1473,7 @@ } void BluetoothLowEnergyUnregisterServiceFunction::SuccessCallback() { - Respond(NoArguments()); + Respond(WithArguments()); } void BluetoothLowEnergyUnregisterServiceFunction::ErrorCallback( @@ -1515,7 +1513,7 @@ switch (status) { case device::BluetoothLocalGattCharacteristic::NOTIFICATION_SUCCESS: - Respond(NoArguments()); + Respond(WithArguments()); break; case device::BluetoothLocalGattCharacteristic::NOTIFY_PROPERTY_NOT_SET: Respond(Error(kErrorNotifyPropertyNotSet)); @@ -1554,7 +1552,7 @@ } event_router_->RemoveServiceFromApp(extension_id(), service->GetIdentifier()); service->Delete(); - Respond(NoArguments()); + Respond(WithArguments()); } // sendRequestResponse: @@ -1579,7 +1577,7 @@ event_router_->HandleRequestResponse( extension(), params_->response.request_id, params_->response.is_error, uint8_vector); - Respond(NoArguments()); + Respond(WithArguments()); } } // namespace api
diff --git a/extensions/browser/api/feedback_private/feedback_private_api.cc b/extensions/browser/api/feedback_private/feedback_private_api.cc index 88cfc5c..3c33f30 100644 --- a/extensions/browser/api/feedback_private/feedback_private_api.cc +++ b/extensions/browser/api/feedback_private/feedback_private_api.cc
@@ -265,8 +265,8 @@ ExtensionFunction::ResponseAction FeedbackPrivateGetUserEmailFunction::Run() { FeedbackPrivateDelegate* feedback_private_delegate = ExtensionsAPIClient::Get()->GetFeedbackPrivateDelegate(); - return RespondNow(OneArgument(base::Value( - feedback_private_delegate->GetSignedInUserEmail(browser_context())))); + return RespondNow(WithArguments( + feedback_private_delegate->GetSignedInUserEmail(browser_context()))); } ExtensionFunction::ResponseAction @@ -367,8 +367,8 @@ void FeedbackPrivateSendFeedbackFunction::OnCompleted( api::feedback_private::LandingPageType type, bool success) { - Respond(TwoArguments(base::Value(ToFeedbackStatus(success)), - base::Value(feedback_private::ToString(type)))); + Respond(WithArguments(ToFeedbackStatus(success), + feedback_private::ToString(type))); if (!success) { ExtensionsAPIClient::Get() ->GetFeedbackPrivateDelegate()
diff --git a/extensions/browser/extension_function.h b/extensions/browser/extension_function.h index a26454e..23b93ae 100644 --- a/extensions/browser/extension_function.h +++ b/extensions/browser/extension_function.h
@@ -191,6 +191,9 @@ // * RespondNow(NoArguments()) // * RespondNow(OneArgument(42)) // * RespondNow(ArgumentList(my_result.ToValue())) + // * RespondNow(WithArguments()) + // * RespondNow(WithArguments(42)) + // * RespondNow(WithArguments(42, "value", false)) // * RespondNow(Error("Warp core breach")) // * RespondNow(Error("Warp core breach on *", GetURL())) // * RespondLater(), then later, @@ -379,6 +382,19 @@ ResponseValue TwoArguments(base::Value arg1, base::Value arg2); // Success, a list of arguments |results| to pass to caller. ResponseValue ArgumentList(base::Value::List results); + + // Success, a variadic list of arguments to pass to the caller. + template <typename... Args> + ResponseValue WithArguments(Args&&... args) { + if constexpr (sizeof...(Args) == 0u) + return ArgumentList(base::Value::List()); + + base::Value::List params; + params.reserve(sizeof...(Args)); + (params.Append(std::forward<Args&&>(args)), ...); + return ArgumentList(std::move(params)); + } + // Error. chrome.runtime.lastError.message will be set to |error|. ResponseValue Error(std::string error); // Error with formatting. Args are processed using
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc index 564b7b3..8571571f 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.cc
@@ -13,7 +13,6 @@ #include "extensions/renderer/api/automation/automation_internal_custom_bindings.h" #include "ui/accessibility/ax_language_detection.h" #include "ui/accessibility/ax_node_position.h" -#include "ui/accessibility/ax_tree_manager_map.h" namespace extensions { @@ -45,16 +44,11 @@ AutomationInternalCustomBindings* owner) : ui::AXTreeManager(tree_id, std::make_unique<ui::AXTree>()), owner_(owner), - event_generator_(ax_tree()) { - ax_tree_->AddObserver(this); - ui::AXTreeManagerMap::GetInstance().AddTreeManager(tree_id, this); -} + event_generator_(ax_tree()) {} AutomationAXTreeWrapper::~AutomationAXTreeWrapper() { // Stop observing so we don't get a callback for every node being deleted. event_generator_.SetTree(nullptr); - ax_tree_->RemoveObserver(this); - ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_); } // static @@ -592,8 +586,4 @@ /* requires_unignored = */ false); } -std::string AutomationAXTreeWrapper::ToString() const { - return "<AutomationAXTreeWrapper>"; -} - } // namespace extensions
diff --git a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h index 27337e4..4b64bc42 100644 --- a/extensions/renderer/api/automation/automation_ax_tree_wrapper.h +++ b/extensions/renderer/api/automation/automation_ax_tree_wrapper.h
@@ -115,7 +115,6 @@ ui::AXTreeID GetParentTreeID() const override; ui::AXNode* GetRootAsAXNode() const override; ui::AXNode* GetParentNodeFromParentTreeAsAXNode() const override; - std::string ToString() const override; private: // AXTreeObserver overrides.
diff --git a/extensions/renderer/api/automation/automation_internal_custom_bindings_unittests.cc b/extensions/renderer/api/automation/automation_internal_custom_bindings_unittests.cc index 1d6c99b..cf8f7ce 100644 --- a/extensions/renderer/api/automation/automation_internal_custom_bindings_unittests.cc +++ b/extensions/renderer/api/automation/automation_internal_custom_bindings_unittests.cc
@@ -131,6 +131,7 @@ auto& node_data2 = tree_update.nodes.back(); node_data2.id = 2; node_data2.role = ax::mojom::Role::kButton; + bundle.tree_id = tree_data.tree_id; SendOnAccessibilityEvents(bundle, true /* active profile */); ASSERT_EQ(1U, GetTreeIDToTreeMap().size());
diff --git a/infra/config/generated/builders/ci/linux-rel-no-external-ip/properties.json b/infra/config/generated/builders/ci/linux-rel-no-external-ip/properties.json new file mode 100644 index 0000000..6c3914f --- /dev/null +++ b/infra/config/generated/builders/ci/linux-rel-no-external-ip/properties.json
@@ -0,0 +1,58 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "linux-rel-no-external-ip", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-linux-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64 + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage", + "enable_reclient" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "linux-rel-no-external-ip", + "project": "chromium" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/win10-rel-no-external-ip/properties.json b/infra/config/generated/builders/ci/win10-rel-no-external-ip/properties.json new file mode 100644 index 0000000..1c663b7 --- /dev/null +++ b/infra/config/generated/builders/ci/win10-rel-no-external-ip/properties.json
@@ -0,0 +1,58 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "win10-rel-no-external-ip", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-win-archive", + "builder_group": "chromium.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "chromium", + "target_bits": 64, + "target_platform": "win" + }, + "legacy_gclient_config": { + "apply_configs": [ + "use_clang_coverage" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "win10-rel-no-external-ip", + "project": "chromium" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics" + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 95dd159..a267e5e 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -37773,6 +37773,84 @@ } } builders { + name: "linux-rel-no-external-ip" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builder:linux-rel-no-external-ip" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Ubuntu-18.04" + dimensions: "pool:luci.chromium.ci" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/linux-rel-no-external-ip/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 86400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "linux-rust-x64-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:linux-rust-x64-dbg" @@ -43445,6 +43523,84 @@ } } builders { + name: "win10-rel-no-external-ip" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builder:win10-rel-no-external-ip" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "os:Windows" + dimensions: "pool:luci.chromium.ci" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/win10-rel-no-external-ip/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 86400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://[^/]*blink_web_tests/.+" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + } + builders { name: "win10-updater-tester-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 6d1c1f8..2961a7bf 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -7945,6 +7945,10 @@ category: "linux" } builders { + name: "buildbucket/luci.chromium.ci/linux-rel-no-external-ip" + category: "linux" + } + builders { name: "buildbucket/luci.chromium.ci/linux-wpt-fyi-rel" category: "linux" } @@ -8205,6 +8209,10 @@ category: "win" } builders { + name: "buildbucket/luci.chromium.ci/win10-rel-no-external-ip" + category: "win" + } + builders { name: "buildbucket/luci.chromium.ci/Win x64 Builder (py2 less)" category: "win" short_name: "py3"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 529ce1b..ac7735c1 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -6184,6 +6184,16 @@ } } job { + id: "linux-rel-no-external-ip" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "linux-rel-no-external-ip" + } +} +job { id: "linux-rust-x64-dbg" realm: "ci" acl_sets: "ci" @@ -7044,6 +7054,16 @@ } } job { + id: "win10-rel-no-external-ip" + realm: "ci" + acl_sets: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "win10-rel-no-external-ip" + } +} +job { id: "win10-updater-tester-dbg" realm: "ci" acls { @@ -7496,6 +7516,7 @@ triggers: "linux-lacros-version-skew-fyi" triggers: "linux-official" triggers: "linux-perfetto-rel" + triggers: "linux-rel-no-external-ip" triggers: "linux-rust-x64-dbg" triggers: "linux-rust-x64-rel" triggers: "linux-swangle-chromium-x64" @@ -7545,6 +7566,7 @@ triggers: "win-updater-builder-dbg" triggers: "win-updater-builder-rel" triggers: "win10-code-coverage" + triggers: "win10-rel-no-external-ip" triggers: "win32-archive-dbg" triggers: "win32-archive-rel" triggers: "win32-arm64-rel"
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index 4226eca..93cade76 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -772,6 +772,24 @@ reclient_instance = reclient.instance.DEFAULT_TRUSTED, ) +# TODO(crbug.com/1320004): Remove this builder after experimentation. +ci.builder( + name = "linux-rel-no-external-ip", + builderless = False, + console_view_entry = consoles.console_view_entry( + category = "linux", + ), + os = os.LINUX_DEFAULT, + builder_spec = builder_config.copy_from( + "ci/Linux Builder", + ), + # Limited test pool is likely to cause long build times. + execution_timeout = 24 * time.hour, + goma_backend = None, + reclient_jobs = reclient.jobs.DEFAULT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, +) + ci.builder( name = "mac-backuprefptr-x64-fyi-rel", builderless = True, @@ -812,6 +830,24 @@ reclient_instance = reclient.instance.DEFAULT_TRUSTED, ) +# TODO(crbug.com/1320004): Remove this builder after experimentation. +ci.builder( + name = "win10-rel-no-external-ip", + builderless = False, + console_view_entry = consoles.console_view_entry( + category = "win", + ), + os = os.WINDOWS_ANY, + builder_spec = builder_config.copy_from( + "ci/Win x64 Builder", + ), + # Limited test pool is likely to cause long build times. + execution_timeout = 24 * time.hour, + goma_backend = None, + reclient_jobs = reclient.jobs.DEFAULT, + reclient_instance = reclient.instance.DEFAULT_TRUSTED, +) + ci.builder( name = "linux-upload-perfetto", console_view_entry = consoles.console_view_entry(
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index b2896d9..04dfcc42 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -886,6 +886,10 @@ {"default-mode-ua", flag_descriptions::kAddSettingForDefaultPageModeName, flag_descriptions::kAddSettingForDefaultPageModeDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kAddSettingForDefaultPageMode)}, + {"ios-media-permissions-control", + flag_descriptions::kMediaPermissionsControlName, + flag_descriptions::kMediaPermissionsControlDescription, flags_ui::kOsIos, + FEATURE_VALUE_TYPE(web::features::kMediaPermissionsControl)}, {"enable-save-session-tabs-in-separate-files", flag_descriptions::kSaveSessionTabsToSeparateFilesName, flag_descriptions::kSaveSessionTabsToSeparateFilesDescription,
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index 92b0519..c4dbe6fd 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -434,6 +434,12 @@ const char kLogBreadcrumbsDescription[] = "When enabled, breadcrumb events will be logged."; +const char kMediaPermissionsControlName[] = + "Camera and Microphone Access Permissions Control"; +const char kMediaPermissionsControlDescription[] = + "Enables user control for camera and/or microphone access for a specific " + "site through site settings during its lifespan."; + const char kMetrickitCrashReportName[] = "Metrickit crash reports"; const char kMetrickitCrashReportDescription[] = "Enables sending Metrickit crash reports";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index a3d6061..a1a916b 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -394,6 +394,11 @@ extern const char kLogBreadcrumbsName[]; extern const char kLogBreadcrumbsDescription[]; +// Title and description for the flag to control camera and/or microphone access +// for a specific site through site settings during its lifespan. +extern const char kMediaPermissionsControlName[]; +extern const char kMediaPermissionsControlDescription[]; + // Title and description for the flag that controls sending metrickit crash // reports. extern const char kMetrickitCrashReportName[];
diff --git a/ios/chrome/browser/infobars/overlays/BUILD.gn b/ios/chrome/browser/infobars/overlays/BUILD.gn index 6fe6230..f31c360b 100644 --- a/ios/chrome/browser/infobars/overlays/BUILD.gn +++ b/ios/chrome/browser/infobars/overlays/BUILD.gn
@@ -43,6 +43,7 @@ "//ios/chrome/browser/overlays/public/infobar_modal", "//ios/chrome/browser/overlays/public/infobar_modal/permissions", "//ios/chrome/browser/passwords:infobar_delegates", + "//ios/web/common", "//ios/web/public", ] } @@ -140,6 +141,7 @@ "//ios/chrome/browser/ui/infobars/test", "//ios/chrome/browser/web_state_list", "//ios/chrome/test:test_support", + "//ios/web/common", "//ios/web/public/permissions", "//ios/web/public/test", "//ios/web/public/test/fakes",
diff --git a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm index 994dca0..0111a341 100644 --- a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm +++ b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.mm
@@ -13,6 +13,7 @@ #import "ios/chrome/browser/overlays/public/infobar_banner/infobar_banner_placeholder_request_config.h" #import "ios/chrome/browser/overlays/public/overlay_request_queue.h" #include "ios/chrome/browser/overlays/public/overlay_request_queue_util.h" +#import "ios/web/common/features.h" #import "ios/web/public/permissions/permissions.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -27,13 +28,15 @@ web::WebState* web_state) : web_state_(web_state) { if (@available(iOS 15.0, *)) { - DCHECK(web_state); - permissions_to_state_ = - [web_state->GetStatesForAllPermissions() mutableCopy]; - banner_queue_ = OverlayRequestQueue::FromWebState( - web_state, OverlayModality::kInfobarBanner); - inserter_ = InfobarOverlayRequestInserter::FromWebState(web_state); - web_state_->AddObserver(this); + if (web::features::IsMediaPermissionsControlEnabled()) { + DCHECK(web_state); + permissions_to_state_ = + [web_state->GetStatesForAllPermissions() mutableCopy]; + banner_queue_ = OverlayRequestQueue::FromWebState( + web_state, OverlayModality::kInfobarBanner); + inserter_ = InfobarOverlayRequestInserter::FromWebState(web_state); + web_state_->AddObserver(this); + } } } @@ -89,7 +92,9 @@ void PermissionsOverlayTabHelper::WebStateDestroyed(web::WebState* web_state) { DCHECK_EQ(web_state_, web_state); DCHECK(banner_queue_); - web_state_->RemoveObserver(this); + if (web::features::IsMediaPermissionsControlEnabled()) { + web_state_->RemoveObserver(this); + } web_state_ = nullptr; banner_queue_ = nullptr; inserter_ = nullptr;
diff --git a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm index 9ddfd64..eae50eb 100644 --- a/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm +++ b/ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper_unittest.mm
@@ -4,19 +4,21 @@ #import "ios/chrome/browser/infobars/overlays/permissions_overlay_tab_helper.h" -#include "base/test/task_environment.h" -#include "base/threading/platform_thread.h" -#include "base/time/time.h" -#include "components/infobars/core/infobar_manager.h" -#include "ios/chrome/browser/infobars/infobar_ios.h" -#include "ios/chrome/browser/infobars/infobar_manager_impl.h" +#import "base/test/scoped_feature_list.h" +#import "base/test/task_environment.h" +#import "base/threading/platform_thread.h" +#import "base/time/time.h" +#import "components/infobars/core/infobar_manager.h" +#import "ios/chrome/browser/infobars/infobar_ios.h" +#import "ios/chrome/browser/infobars/infobar_manager_impl.h" #import "ios/chrome/browser/infobars/overlays/infobar_overlay_request_inserter.h" #import "ios/chrome/browser/infobars/overlays/permissions_overlay_infobar_delegate.h" +#import "ios/web/common/features.h" #import "ios/web/public/permissions/permissions.h" #import "ios/web/public/test/fakes/fake_navigation_manager.h" #import "ios/web/public/test/fakes/fake_web_state.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -31,6 +33,9 @@ public: PermissionsOverlayTabHelperTest() : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) { + scoped_feature_list_.InitWithFeatures( + {web::features::kMediaPermissionsControl}, {}); + web_state_.SetNavigationManager( std::make_unique<web::FakeNavigationManager>()); InfoBarManagerImpl::CreateForWebState(&web_state_); @@ -40,6 +45,7 @@ ~PermissionsOverlayTabHelperTest() override { InfoBarManagerImpl::FromWebState(&web_state_)->ShutDown(); + // Observer should be removed before |scoped_feature_list_| is reset. web_state_.RemoveObserver( PermissionsOverlayTabHelper::FromWebState(&web_state_)); } @@ -68,6 +74,7 @@ } base::test::TaskEnvironment task_environment_; + base::test::ScopedFeatureList scoped_feature_list_; web::FakeWebState web_state_; };
diff --git a/ios/chrome/browser/pref_names.cc b/ios/chrome/browser/pref_names.cc index f4bcbcf..d4ee5fd 100644 --- a/ios/chrome/browser/pref_names.cc +++ b/ios/chrome/browser/pref_names.cc
@@ -95,9 +95,8 @@ // List preference maintaining the list of active promo campaigns. const char kIosPromosManagerActivePromos[] = "ios.promos_manager.active_promos"; -// Dictionary preference containing the promo impression history. -const char kIosPromosManagerImpressionHistory[] = - "ios.promos_manager.impression_history"; +// List preference containing the promo impression history. +const char kIosPromosManagerImpressions[] = "ios.promos_manager.impressions"; // Preference that hold a boolean indicating if the user has already dismissed // the sign-in promo in settings view.
diff --git a/ios/chrome/browser/pref_names.h b/ios/chrome/browser/pref_names.h index fc3bad5..ab88bf5 100644 --- a/ios/chrome/browser/pref_names.h +++ b/ios/chrome/browser/pref_names.h
@@ -32,7 +32,7 @@ extern const char kIosShareChromeLastShare[]; extern const char kIosDiscoverFeedLastRefreshTime[]; extern const char kIosPromosManagerActivePromos[]; -extern const char kIosPromosManagerImpressionHistory[]; +extern const char kIosPromosManagerImpressions[]; extern const char kIosSettingsPromoAlreadySeen[]; extern const char kIosSettingsSigninPromoDisplayedCount[]; extern const char kIosNtpFeedTopPromoAlreadySeen[];
diff --git a/ios/chrome/browser/prefs/browser_prefs.mm b/ios/chrome/browser/prefs/browser_prefs.mm index 6dc2c861..4d86ea0 100644 --- a/ios/chrome/browser/prefs/browser_prefs.mm +++ b/ios/chrome/browser/prefs/browser_prefs.mm
@@ -154,7 +154,7 @@ false); registry->RegisterListPref(prefs::kIosPromosManagerActivePromos); - registry->RegisterDictionaryPref(prefs::kIosPromosManagerImpressionHistory); + registry->RegisterListPref(prefs::kIosPromosManagerImpressions); registry->RegisterBooleanPref(enterprise_reporting::kCloudReportingEnabled, false);
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h index 9c75eeb..26cc0e2 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.h +++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -27,8 +27,8 @@ // base::Value::List of active promos. base::Value::List active_promos_; - // base::Value::Dict of the promo impression history. - base::Value::Dict impression_history_; + // base::Value::List of the promo impression history. + base::Value::List impression_history_; }; #endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm index 1cbd34b..1c7e6e5 100644 --- a/ios/chrome/browser/promos_manager/promos_manager.mm +++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -33,8 +33,8 @@ const base::Value::List& stored_active_promos = local_state_->GetValueList(prefs::kIosPromosManagerActivePromos); - const base::Value::Dict& stored_impression_history = - local_state_->GetValueDict(prefs::kIosPromosManagerImpressionHistory); + const base::Value::List& stored_impression_history = + local_state_->GetValueList(prefs::kIosPromosManagerImpressions); active_promos_ = stored_active_promos.Clone(); impression_history_ = stored_impression_history.Clone();
diff --git a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm index 0525385..5074d83c 100644 --- a/ios/chrome/browser/promos_manager/promos_manager_unittest.mm +++ b/ios/chrome/browser/promos_manager/promos_manager_unittest.mm
@@ -27,8 +27,8 @@ // Create pref registry for tests. void CreatePrefs() { local_state_ = std::make_unique<TestingPrefServiceSimple>(); - local_state_->registry()->RegisterDictionaryPref( - prefs::kIosPromosManagerImpressionHistory); + local_state_->registry()->RegisterListPref( + prefs::kIosPromosManagerImpressions); local_state_->registry()->RegisterListPref( prefs::kIosPromosManagerActivePromos); } @@ -42,12 +42,10 @@ TEST_F(PromosManagerTest, InitWithPrefService) { CreatePromosManager(); - EXPECT_NE( - local_state_->FindPreference(prefs::kIosPromosManagerImpressionHistory), - nullptr); + EXPECT_NE(local_state_->FindPreference(prefs::kIosPromosManagerImpressions), + nullptr); EXPECT_NE(local_state_->FindPreference(prefs::kIosPromosManagerActivePromos), nullptr); - EXPECT_FALSE( - local_state_->HasPrefPath(prefs::kIosPromosManagerImpressionHistory)); + EXPECT_FALSE(local_state_->HasPrefPath(prefs::kIosPromosManagerImpressions)); EXPECT_FALSE(local_state_->HasPrefPath(prefs::kIosPromosManagerActivePromos)); }
diff --git a/ios/chrome/browser/search_engines/template_url_service_client_impl.cc b/ios/chrome/browser/search_engines/template_url_service_client_impl.cc index 3c72bfe..82820f3 100644 --- a/ios/chrome/browser/search_engines/template_url_service_client_impl.cc +++ b/ios/chrome/browser/search_engines/template_url_service_client_impl.cc
@@ -72,16 +72,16 @@ void TemplateURLServiceClientImpl::OnURLVisited( history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) { + const history::URLRow& url_row, + const history::VisitRow& new_visit) { DCHECK_EQ(history_service, history_service_); if (!owner_) return; TemplateURLService::URLVisitedDetails details = { - row.url(), - ui::PageTransitionCoreTypeIs(transition, ui::PAGE_TRANSITION_KEYWORD), + url_row.url(), + ui::PageTransitionCoreTypeIs(new_visit.transition, + ui::PAGE_TRANSITION_KEYWORD), }; owner_->OnHistoryURLVisited(details); }
diff --git a/ios/chrome/browser/search_engines/template_url_service_client_impl.h b/ios/chrome/browser/search_engines/template_url_service_client_impl.h index 97b6f71..a225493 100644 --- a/ios/chrome/browser/search_engines/template_url_service_client_impl.h +++ b/ios/chrome/browser/search_engines/template_url_service_client_impl.h
@@ -40,9 +40,8 @@ // history::HistoryServiceObserver: void OnURLVisited(history::HistoryService* history_service, - ui::PageTransition transition, - const history::URLRow& row, - base::Time visit_time) override; + const history::URLRow& url_row, + const history::VisitRow& new_visit) override; TemplateURLService* owner_; history::HistoryService* history_service_;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm index 9dab297a..de2a47a 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_coordinator.mm
@@ -279,22 +279,15 @@ [agent.nonModalScheduler logUserPastedInOmnibox]; } -- (void)omniboxViewControllerSearchCopiedImage: - (OmniboxViewController*)omniboxViewController { - ClipboardRecentContent::GetInstance()->GetRecentImageFromClipboard( - base::BindOnce(^(absl::optional<gfx::Image> optionalImage) { - if (!optionalImage) { - return; - } - UIImage* image = optionalImage.value().ToUIImage(); - web::NavigationManager::WebLoadParams webParams = - ImageSearchParamGenerator::LoadParamsForImage( - image, ios::TemplateURLServiceFactory::GetForBrowserState( - self.browser->GetBrowserState())); - UrlLoadParams params = UrlLoadParams::InCurrentTab(webParams); +- (void)omniboxViewControllerSearchImage:(UIImage*)image { + DCHECK(image); + web::NavigationManager::WebLoadParams webParams = + ImageSearchParamGenerator::LoadParamsForImage( + image, ios::TemplateURLServiceFactory::GetForBrowserState( + self.browser->GetBrowserState())); + UrlLoadParams params = UrlLoadParams::InCurrentTab(webParams); - UrlLoadingBrowserAgent::FromBrowser(self.browser)->Load(params); - })); + UrlLoadingBrowserAgent::FromBrowser(self.browser)->Load(params); } #pragma mark - private
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_delegate.h b/ios/chrome/browser/ui/omnibox/omnibox_text_field_delegate.h index 4d61e694..ba4c47d 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_delegate.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_delegate.h
@@ -18,6 +18,13 @@ // Called when the backspace button is tapped in the OmniboxTextFieldIOS. - (void)onDeleteBackward; + +// Called when the UIPasteControl in the omnibox's keyboard accessory is shown. +// Returns whether or not the paste control should be enabled. +- (BOOL)canPasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders; + +// Called when the UIPasteControl in the omnibox's keyboard accessory is tapped. +- (void)pasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders; @end #endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_TEXT_FIELD_DELEGATE_H_
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm index 802e8b3f..9c7ef8fc 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_experimental.mm
@@ -597,14 +597,18 @@ // Used by UIPasteControl to check if can paste. - (BOOL)canPasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { - // TODO(crbug.com/1349095) Add support for image. - return [super canPasteItemProviders:itemProviders]; + if ([self.delegate respondsToSelector:@selector(canPasteItemProviders:)]) { + return [self.delegate canPasteItemProviders:itemProviders]; + } else { + return NO; + } } // Used by UIPasteControl to paste. - (void)pasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { - // TODO(crbug.com/1349095) Add support for image and paste to search. - [super pasteItemProviders:itemProviders]; + if ([self.delegate respondsToSelector:@selector(pasteItemProviders:)]) { + [self.delegate pasteItemProviders:itemProviders]; + } } #pragma mark UIKeyInput
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_text_field_legacy.mm b/ios/chrome/browser/ui/omnibox/omnibox_text_field_legacy.mm index eee9493..8508b783 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_text_field_legacy.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_text_field_legacy.mm
@@ -677,14 +677,18 @@ // Used by UIPasteControl to check if can paste. - (BOOL)canPasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { - // TODO(crbug.com/1349095) Add support for image. - return [super canPasteItemProviders:itemProviders]; + if ([self.delegate respondsToSelector:@selector(canPasteItemProviders:)]) { + return [self.delegate canPasteItemProviders:itemProviders]; + } else { + return NO; + } } // Used by UIPasteControl to paste. - (void)pasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { - // TODO(crbug.com/1349095) Add support for image and paste to search. - [super pasteItemProviders:itemProviders]; + if ([self.delegate respondsToSelector:@selector(pasteItemProviders:)]) { + [self.delegate pasteItemProviders:itemProviders]; + } } #pragma mark UIKeyInput
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.h b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.h index 8e483c0f..f3d9808 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.h
@@ -30,9 +30,9 @@ - (void)omniboxViewControllerUserDidVisitCopiedLink: (OmniboxViewController*)omniboxViewController; -// Starts a reverse image search for the image currently in the pasteboard. -- (void)omniboxViewControllerSearchCopiedImage: - (OmniboxViewController*)omniboxViewController; +// Starts a reverse image search with `image`. Caller must check that the search +// engine supports image search. +- (void)omniboxViewControllerSearchImage:(UIImage*)image; @end
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm index 1c9ca730..de400c9 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/omnibox_view_controller.mm
@@ -369,6 +369,69 @@ _textChangeDelegate->OnDeleteBackward(); } +- (BOOL)canPasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { + for (NSItemProvider* itemProvider in itemProviders) { + if ((self.searchByImageEnabled && + [itemProvider canLoadObjectOfClass:[UIImage class]]) || + [itemProvider canLoadObjectOfClass:[NSURL class]] || + [itemProvider canLoadObjectOfClass:[NSString class]]) { + return YES; + } + } + return NO; +} + +- (void)pasteItemProviders:(NSArray<NSItemProvider*>*)itemProviders { + // Interacted while focused. + self.omniboxInteractedWhileFocused = YES; + + __weak __typeof(self) weakSelf = self; + auto textCompletion = + ^(__kindof id<NSItemProviderReading> providedItem, NSError* error) { + LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeGeneral); + dispatch_async(dispatch_get_main_queue(), ^{ + NSString* text = static_cast<NSString*>(providedItem); + if (text) { + [weakSelf.dispatcher loadQuery:text immediately:YES]; + [weakSelf.dispatcher cancelOmniboxEdit]; + } + }); + }; + auto imageCompletion = + ^(__kindof id<NSItemProviderReading> providedItem, NSError* error) { + dispatch_async(dispatch_get_main_queue(), ^{ + UIImage* image = static_cast<UIImage*>(providedItem); + if (image) { + [weakSelf.delegate omniboxViewControllerSearchImage:image]; + [weakSelf.dispatcher cancelOmniboxEdit]; + } + }); + }; + for (NSItemProvider* itemProvider in itemProviders) { + if (self.searchByImageEnabled && + [itemProvider canLoadObjectOfClass:[UIImage class]]) { + RecordAction( + UserMetricsAction("Mobile.OmniboxPasteButton.SearchCopiedImage")); + [itemProvider loadObjectOfClass:[UIImage class] + completionHandler:imageCompletion]; + break; + } else if ([itemProvider canLoadObjectOfClass:[NSURL class]]) { + RecordAction( + UserMetricsAction("Mobile.OmniboxPasteButton.SearchCopiedLink")); + // Load URL as a NSString to avoid further conversion. + [itemProvider loadObjectOfClass:[NSString class] + completionHandler:textCompletion]; + break; + } else if ([itemProvider canLoadObjectOfClass:[NSString class]]) { + RecordAction( + UserMetricsAction("Mobile.OmniboxPasteButton.SearchCopiedText")); + [itemProvider loadObjectOfClass:[NSString class] + completionHandler:textCompletion]; + break; + } + } +} + #pragma mark - OmniboxConsumer - (void)updateAutocompleteIcon:(UIImage*)icon { @@ -596,7 +659,15 @@ RecordAction( UserMetricsAction("Mobile.OmniboxContextMenu.SearchCopiedImage")); self.omniboxInteractedWhileFocused = YES; - [self.delegate omniboxViewControllerSearchCopiedImage:self]; + __weak __typeof(self) weakSelf = self; + ClipboardRecentContent::GetInstance()->GetRecentImageFromClipboard( + base::BindOnce(^(absl::optional<gfx::Image> optionalImage) { + if (!optionalImage) { + return; + } + UIImage* image = optionalImage.value().ToUIImage(); + [weakSelf.delegate omniboxViewControllerSearchImage:image]; + })); } - (void)visitCopiedLink:(id)sender { @@ -606,6 +677,7 @@ [self.delegate omniboxViewControllerUserDidVisitCopiedLink:self]; RecordAction(UserMetricsAction("Mobile.OmniboxContextMenu.VisitCopiedLink")); self.omniboxInteractedWhileFocused = YES; + __weak __typeof(self) weakSelf = self; ClipboardRecentContent::GetInstance()->GetRecentURLFromClipboard( base::BindOnce(^(absl::optional<GURL> optionalURL) { if (!optionalURL) { @@ -613,8 +685,8 @@ } NSString* url = base::SysUTF8ToNSString(optionalURL.value().spec()); dispatch_async(dispatch_get_main_queue(), ^{ - [self.dispatcher loadQuery:url immediately:YES]; - [self.dispatcher cancelOmniboxEdit]; + [weakSelf.dispatcher loadQuery:url immediately:YES]; + [weakSelf.dispatcher cancelOmniboxEdit]; }); })); } @@ -625,6 +697,7 @@ LogLikelyInterestedDefaultBrowserUserActivity(DefaultPromoTypeGeneral); RecordAction(UserMetricsAction("Mobile.OmniboxContextMenu.SearchCopiedText")); self.omniboxInteractedWhileFocused = YES; + __weak __typeof(self) weakSelf = self; ClipboardRecentContent::GetInstance()->GetRecentTextFromClipboard( base::BindOnce(^(absl::optional<std::u16string> optionalText) { if (!optionalText) { @@ -632,8 +705,8 @@ } NSString* query = base::SysUTF16ToNSString(optionalText.value()); dispatch_async(dispatch_get_main_queue(), ^{ - [self.dispatcher loadQuery:query immediately:YES]; - [self.dispatcher cancelOmniboxEdit]; + [weakSelf.dispatcher loadQuery:query immediately:YES]; + [weakSelf.dispatcher cancelOmniboxEdit]; }); })); }
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm index bb8d684..a1d03116 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_presenter.mm
@@ -132,7 +132,7 @@ [self initialLayout]; if (ui::GetDeviceFormFactor() != ui::DEVICE_FORM_FACTOR_TABLET || - IsOmniboxActionsEnabled()) { + IsSwiftUIPopupEnabled()) { self.bottomConstraint.active = YES; self.bottomSeparator.hidden = NO; }
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm index 33a50e9..44d38f9 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.mm
@@ -342,12 +342,23 @@ // These constraints need to be removed when freezing the position of these // views. See -freezeLayoutGuidePositions for the reason why. + + CGFloat iconXOffset = 0; + if (IsOmniboxActionsVisualTreatment2() && !IsRegularXRegularSizeClass(self)) { + // Inset the icons in variation 2, except in reg x reg size class where the + // alignment works well already. Flip the inset on RTL as it's not flipped + // automatically. + BOOL isRTL = + [UIView userInterfaceLayoutDirectionForSemanticContentAttribute: + self.omniboxSemanticContentAttribute] == + UIUserInterfaceLayoutDirectionRightToLeft; + iconXOffset = isRTL ? -kImageOffsetVariation2 : kImageOffsetVariation2; + } + self.nonDeletingLayoutGuideConstraints = @[ [self.leadingIconView.centerXAnchor constraintEqualToAnchor:imageLayoutGuide.centerXAnchor - constant:IsOmniboxActionsVisualTreatment2() - ? kImageOffsetVariation2 - : 0], + constant:iconXOffset], stackViewToLayoutGuideLeading, stackViewToLayoutGuideTrailing, ];
diff --git a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm index d65be1a..8d8a23f 100644 --- a/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm +++ b/ios/chrome/browser/ui/omnibox/popup/omnibox_popup_view_controller.mm
@@ -19,6 +19,8 @@ #import "ios/chrome/browser/ui/omnibox/popup/omnibox_popup_row_cell.h" #include "ios/chrome/browser/ui/toolbar/buttons/toolbar_configuration.h" #import "ios/chrome/browser/ui/util/keyboard_observer_helper.h" +#import "ios/chrome/browser/ui/util/layout_guide_names.h" +#import "ios/chrome/browser/ui/util/named_guide.h" #include "ios/chrome/browser/ui/util/uikit_ui_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" #include "ios/chrome/common/ui/util/constraints_ui_util.h" @@ -33,6 +35,7 @@ const CGFloat kTopAndBottomPadding = 8.0; const CGFloat kTopPaddingVariation1 = 8.0; const CGFloat kTopPaddingVariation2 = 10.0; +const CGFloat kTopBottomPaddingVariation2Ipad = 16.0; const CGFloat kFooterHeightVariation1 = 12.0; const CGFloat kFooterHeightVariation2 = 16.0; // Percentage of the suggestion height that needs to be visible in order to @@ -163,15 +166,8 @@ IsOmniboxActionsVisualTreatment2() ? UIScrollViewContentInsetAdjustmentNever : UIScrollViewContentInsetAdjustmentAutomatic; - CGFloat topPadding = kTopAndBottomPadding; - if (IsOmniboxActionsVisualTreatment1()) { - topPadding = kTopPaddingVariation1; - } - if (IsOmniboxActionsVisualTreatment2()) { - topPadding = kTopPaddingVariation2; - } - [self.tableView - setContentInset:UIEdgeInsetsMake(topPadding, 0, kTopAndBottomPadding, 0)]; + [self.tableView setContentInset:UIEdgeInsetsMake(self.topPadding, 0, + self.bottomPadding, 0)]; self.tableView.sectionHeaderHeight = 0.1; self.tableView.estimatedRowHeight = 0; @@ -190,6 +186,10 @@ - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; + if (IsOmniboxActionsVisualTreatment2()) { + [self adjustMarginsToMatchOmniboxWidth]; + } + self.viewAppearanceTime = base::TimeTicks::Now(); } @@ -205,6 +205,37 @@ [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; [self.tableView setEditing:NO animated:NO]; self.shouldUpdateVisibleSuggestionCount = YES; + + if (IsOmniboxActionsVisualTreatment2()) { + [coordinator + animateAlongsideTransition:^( + id<UIViewControllerTransitionCoordinatorContext> context) { + [self adjustMarginsToMatchOmniboxWidth]; + } + completion:nil]; + } +} + +- (void)adjustMarginsToMatchOmniboxWidth { + NamedGuide* layoutGuide = [NamedGuide guideWithName:kOmniboxGuide + view:self.view]; + if (!layoutGuide) { + return; + } + + CGRect omniboxFrame = [layoutGuide.constrainedView + convertRect:layoutGuide.constrainedView.bounds + toView:self.view]; + CGFloat leftMargin = + IsRegularXRegularSizeClass(self) ? omniboxFrame.origin.x : 0; + CGFloat rightMargin = IsRegularXRegularSizeClass(self) + ? self.view.bounds.size.width - + omniboxFrame.origin.x - + omniboxFrame.size.width + : 0; + self.tableView.layoutMargins = + UIEdgeInsetsMake(self.tableView.layoutMargins.top, leftMargin, + self.tableView.layoutMargins.bottom, rightMargin); } #pragma mark - AutocompleteResultConsumer @@ -414,8 +445,11 @@ UIView* hairline = [[UIView alloc] initWithFrame:CGRectMake(0, 8, tableView.bounds.size.width, 2 / tableView.window.screen.scale)]; - hairline.backgroundColor = [UIColor lightGrayColor]; + hairline.backgroundColor = + self.incognito ? [UIColor.whiteColor colorWithAlphaComponent:0.12] + : [UIColor.blackColor colorWithAlphaComponent:0.12]; [footer addSubview:hairline]; + hairline.autoresizingMask = UIViewAutoresizingFlexibleWidth; return footer; } @@ -473,10 +507,10 @@ CGFloat screenHeight = currentScreen.bounds.size.height; CGFloat bottomInset = screenHeight - self.tableView.contentSize.height - _keyboardHeight - absoluteRect.origin.y - - kTopAndBottomPadding * 2; - bottomInset = MAX(kTopAndBottomPadding, -bottomInset); + self.bottomPadding - self.topPadding; + bottomInset = MAX(self.bottomPadding, -bottomInset); self.tableView.contentInset = - UIEdgeInsetsMake(kTopAndBottomPadding, 0, bottomInset, 0); + UIEdgeInsetsMake(self.topPadding, 0, bottomInset, 0); self.tableView.scrollIndicatorInsets = self.tableView.contentInset; } @@ -486,13 +520,16 @@ ToolbarConfiguration* configuration = [[ToolbarConfiguration alloc] initWithStyle:self.incognito ? INCOGNITO : NORMAL]; + if (IsOmniboxActionsVisualTreatment2()) { + self.view.backgroundColor = + [UIColor colorNamed:kGroupedPrimaryBackgroundColor]; + return; + } + if (IsRegularXRegularSizeClass(self)) { self.view.backgroundColor = configuration.backgroundColor; } else { - self.view.backgroundColor = - IsOmniboxActionsVisualTreatment2() - ? [UIColor colorNamed:kGroupedPrimaryBackgroundColor] - : [UIColor clearColor]; + self.view.backgroundColor = [UIColor clearColor]; } } @@ -642,4 +679,28 @@ self.shouldUpdateVisibleSuggestionCount = NO; } +- (CGFloat)topPadding { + CGFloat topPadding = kTopAndBottomPadding; + if (IsOmniboxActionsVisualTreatment1()) { + topPadding = kTopPaddingVariation1; + } + if (IsOmniboxActionsVisualTreatment2()) { + // On iPad, even in compact width, the popup is displayed differently than + // on the iPhone (it's "under" the always visible toolbar). So the check + // here is intentionally for device type, not size class. + BOOL isIpad = ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET; + topPadding = + isIpad ? kTopBottomPaddingVariation2Ipad : kTopPaddingVariation2; + } + return topPadding; +} + +- (CGFloat)bottomPadding { + if (IsOmniboxActionsVisualTreatment2() && + (ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET)) { + return kTopBottomPaddingVariation2Ipad; + } + return kTopAndBottomPadding; +} + @end
diff --git a/ios/chrome/browser/ui/page_info/BUILD.gn b/ios/chrome/browser/ui/page_info/BUILD.gn index b3735a0..7f622a4 100644 --- a/ios/chrome/browser/ui/page_info/BUILD.gn +++ b/ios/chrome/browser/ui/page_info/BUILD.gn
@@ -101,6 +101,7 @@ "//ios/chrome/browser/web_state_list", "//ios/components/webui:url_constants", "//ios/web", + "//ios/web/common:features", "//ios/web/public", "//ios/web/public/permissions", "//ios/web/public/security", @@ -120,6 +121,7 @@ "//ios/chrome/browser/ui/permissions", "//ios/chrome/browser/ui/permissions:permission_info", "//ios/chrome/test:test_support", + "//ios/web/common", "//ios/web/public/permissions", "//ios/web/public/test/fakes", "//testing/gtest:gtest", @@ -143,6 +145,7 @@ "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/third_party/earl_grey2:test_lib", + "//ios/web/common", "//ios/web/public/permissions", "//net:test_support", "//ui/base",
diff --git a/ios/chrome/browser/ui/page_info/page_info_coordinator.mm b/ios/chrome/browser/ui/page_info/page_info_coordinator.mm index 53eafb7..e747d4d0 100644 --- a/ios/chrome/browser/ui/page_info/page_info_coordinator.mm +++ b/ios/chrome/browser/ui/page_info/page_info_coordinator.mm
@@ -4,10 +4,10 @@ #import "ios/chrome/browser/ui/page_info/page_info_coordinator.h" -#include "base/feature_list.h" -#include "ios/chrome/browser/browser_state/chrome_browser_state.h" -#include "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" -#include "ios/chrome/browser/main/browser.h" +#import "base/feature_list.h" +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/content_settings/host_content_settings_map_factory.h" +#import "ios/chrome/browser/main/browser.h" #import "ios/chrome/browser/ui/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/commands/page_info_commands.h" #import "ios/chrome/browser/ui/page_info/page_info_permissions_mediator.h" @@ -16,6 +16,7 @@ #import "ios/chrome/browser/ui/page_info/page_info_view_controller.h" #import "ios/chrome/browser/ui/table_view/table_view_navigation_controller.h" #import "ios/chrome/browser/web_state_list/web_state_list.h" +#import "ios/web/common/features.h" #import "ios/web/public/web_state.h" #if !defined(__has_feature) || !__has_feature(objc_arc) @@ -61,10 +62,12 @@ self.browser->GetCommandDispatcher(), PageInfoCommands); if (@available(iOS 15.0, *)) { - self.permissionsMediator = - [[PageInfoPermissionsMediator alloc] initWithWebState:webState]; - self.viewController.permissionsDelegate = self.permissionsMediator; - self.permissionsMediator.consumer = self.viewController; + if (web::features::IsMediaPermissionsControlEnabled()) { + self.permissionsMediator = + [[PageInfoPermissionsMediator alloc] initWithWebState:webState]; + self.viewController.permissionsDelegate = self.permissionsMediator; + self.permissionsMediator.consumer = self.viewController; + } } [self.baseViewController presentViewController:self.navigationController
diff --git a/ios/chrome/browser/ui/page_info/page_info_egtest.mm b/ios/chrome/browser/ui/page_info/page_info_egtest.mm index b7e6846..af6eabab3 100644 --- a/ios/chrome/browser/ui/page_info/page_info_egtest.mm +++ b/ios/chrome/browser/ui/page_info/page_info_egtest.mm
@@ -5,21 +5,22 @@ #import <UIKit/UIKit.h> #import <XCTest/XCTest.h> -#include "components/strings/grit/components_chromium_strings.h" +#import "components/strings/grit/components_chromium_strings.h" #import "ios/chrome/browser/ui/page_info/page_info_constants.h" #import "ios/chrome/browser/ui/permissions/permissions_app_interface.h" #import "ios/chrome/browser/ui/permissions/permissions_constants.h" -#include "ios/chrome/grit/ios_chromium_strings.h" -#include "ios/chrome/grit/ios_strings.h" +#import "ios/chrome/grit/ios_chromium_strings.h" +#import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/earl_grey/chrome_actions.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey.h" #import "ios/chrome/test/earl_grey/chrome_earl_grey_ui.h" #import "ios/chrome/test/earl_grey/chrome_matchers.h" #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/earl_grey_test.h" +#import "ios/web/common/features.h" #import "ios/web/public/permissions/permissions.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "ui/base/l10n/l10n_util.h" +#import "net/test/embedded_test_server/embedded_test_server.h" +#import "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -44,6 +45,14 @@ @implementation PageInfoTestCase +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + if (@available(iOS 15.0, *)) { + config.features_enabled.push_back(web::features::kMediaPermissionsControl); + } + return config; +} + // Checks that if the alert for site permissions pops up, and allow it. - (void)checkAndAllowPermissionAlerts { XCUIApplication* app = [[XCUIApplication alloc] init];
diff --git a/ios/chrome/browser/ui/page_info/page_info_permissions_mediator_unittest.mm b/ios/chrome/browser/ui/page_info/page_info_permissions_mediator_unittest.mm index a7fd81240..1654eefb 100644 --- a/ios/chrome/browser/ui/page_info/page_info_permissions_mediator_unittest.mm +++ b/ios/chrome/browser/ui/page_info/page_info_permissions_mediator_unittest.mm
@@ -4,11 +4,13 @@ #import "ios/chrome/browser/ui/page_info/page_info_permissions_mediator.h" +#import "base/test/scoped_feature_list.h" #import "ios/chrome/browser/ui/permissions/permission_info.h" +#import "ios/web/common/features.h" #import "ios/web/public/permissions/permissions.h" #import "ios/web/public/test/fakes/fake_web_state.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/platform_test.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -17,6 +19,10 @@ // Tests for Permissions mediator for the page info. class PageInfoPermissionsTest : public PlatformTest { protected: + PageInfoPermissionsTest() { + feature_list_.InitAndEnableFeature(web::features::kMediaPermissionsControl); + } + ~PageInfoPermissionsTest() override { if (@available(iOS 15.0, *)) { [mediator_ disconnect]; @@ -49,6 +55,7 @@ web::WebState* web_state() { return fake_web_state_.get(); } private: + base::test::ScopedFeatureList feature_list_; std::unique_ptr<web::FakeWebState> fake_web_state_; PageInfoPermissionsMediator* mediator_ API_AVAILABLE(ios(15.0)); };
diff --git a/ios/chrome/browser/ui/permissions/BUILD.gn b/ios/chrome/browser/ui/permissions/BUILD.gn index 4969cac..0838b7d 100644 --- a/ios/chrome/browser/ui/permissions/BUILD.gn +++ b/ios/chrome/browser/ui/permissions/BUILD.gn
@@ -91,6 +91,7 @@ "//ios/chrome/test/earl_grey:eg_test_support+eg2", "//ios/testing/earl_grey:eg_test_support+eg2", "//ios/third_party/earl_grey2:test_lib", + "//ios/web/common", "//ios/web/public/permissions", "//net:test_support", "//ui/base",
diff --git a/ios/chrome/browser/ui/permissions/permissions_egtest.mm b/ios/chrome/browser/ui/permissions/permissions_egtest.mm index 12e62cb..2882190 100644 --- a/ios/chrome/browser/ui/permissions/permissions_egtest.mm +++ b/ios/chrome/browser/ui/permissions/permissions_egtest.mm
@@ -4,7 +4,7 @@ #import <XCTest/XCTest.h> -#include "base/logging.h" +#import "base/logging.h" #import "base/test/ios/wait_util.h" #import "ios/chrome/browser/ui/badges/badge_constants.h" #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h" @@ -18,9 +18,10 @@ #import "ios/chrome/test/earl_grey/chrome_test_case.h" #import "ios/testing/earl_grey/disabled_test_macros.h" #import "ios/testing/earl_grey/earl_grey_test.h" -#include "ios/web/public/permissions/permissions.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "ui/base/l10n/l10n_util.h" +#import "ios/web/common/features.h" +#import "ios/web/public/permissions/permissions.h" +#import "net/test/embedded_test_server/embedded_test_server.h" +#import "ui/base/l10n/l10n_util.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -109,6 +110,14 @@ @implementation PermissionsTestCase +- (AppLaunchConfiguration)appConfigurationForTestCase { + AppLaunchConfiguration config; + if (@available(iOS 15.0, *)) { + config.features_enabled.push_back(web::features::kMediaPermissionsControl); + } + return config; +} + #pragma mark - Helper functions // Checks that if the alert for site permissions pops up, and allow it.
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 20aaceb5..be24b91 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 @@ -8b02bcc56401152fcd75b1fdeb34e013cf8de563 \ No newline at end of file +1e381f41f980e177e95d135a5138a6e6d0f2f9e9 \ 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 8ef5cc00..5cf5197 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 @@ -9b7a4f94836740082ad0f7421ef4363ae9062aa9 \ No newline at end of file +0fa3f7c2dd4aec36ffb67d96bd4afde776ef1fe4 \ 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 73e7fde..d8cd930a 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 @@ -2538519dfe0686bd3e0b6057aa16fabc872afa06 \ No newline at end of file +0c71fafd709deaadff0dcb3f4e2301fa09e74f81 \ 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 b4f3045..824503f 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 @@ -3143c9b105a5658bf0bc23fae63dfa7c757019f6 \ No newline at end of file +d1463485552dfdae37591f320a9e34826c9426f6 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 index 8bc5b0d..facb083 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.ios.zip.sha1
@@ -1 +1 @@ -158d9c8b2b3e1104c52049156bc51a95d1045c5d \ No newline at end of file +526f9ef3210b607ba101d2e73a2f1b591f932786 \ No newline at end of file
diff --git a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 index 261f4d5..7a7c47e3 100644 --- a/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1 +++ b/ios/google_internal/frameworks/remoting_dogfood_internal_dynamic_framework.iossimulator.zip.sha1
@@ -1 +1 @@ -63b8105abaa6a7c3d2d1eb8b07f431a4a2ad393a \ No newline at end of file +ba6d77f3385f75b38167d2ba1336e87e3de906a4 \ 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 5b4b60bd..01d127d 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 @@ -7e6bddd56c4570b7681b84e71085d1a02a554372 \ No newline at end of file +b285a91fa26e17c88c50ae3cdf7873c21edaa797 \ 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 aa8b712..c48efa33 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 @@ -b76508965342233f99aac9a895f8b513afd11af2 \ No newline at end of file +e77b601ba5c00310b374461c5a5c653233b3b810 \ 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 5df28d8..4104a25c 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 @@ -0f1770187795d1abf5cfb183d987098b7127edcf \ No newline at end of file +6856f00c4df8d29966e394c019cbc5c828a6136e \ 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 3d5d161..ed5832df 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 @@ -7a67d96b2d4fbd043b3a575f0292e4aca5c96ee2 \ No newline at end of file +687008d14c87888b1b21d32619d6fcf1ce549113 \ No newline at end of file
diff --git a/ios/web/common/features.h b/ios/web/common/features.h index e775861..7843a22 100644 --- a/ios/web/common/features.h +++ b/ios/web/common/features.h
@@ -53,6 +53,12 @@ // interaction state. extern const base::Feature kSynthesizedRestoreSession; +// Enables user control for camera and/or microphone access for a specific site +// through site settings during its lifespan. When enabled, each web state will +// keep track of whether camera and/or microphone access is granted by the user +// for its current site. +extern const base::Feature kMediaPermissionsControl; + // Enables the Fullscreen API in WebKit (supported on iOS 16.0+). This API // allows web sites to enter fullscreen mode, with all browser UI hidden. extern const base::Feature kEnableFullscreenAPI; @@ -69,6 +75,10 @@ // When true, screenshots of non-HTML (e.g. PDF) pages should be taken. bool ShouldTakeScreenshotOnNonHTMLContent(); +// When true, user control for camera and/or microphone access should be +// enabled. +bool IsMediaPermissionsControlEnabled(); + // When true, the new loadSimulatedRequest API should be used when displaying // error pages. bool IsLoadSimulatedRequestAPIEnabled();
diff --git a/ios/web/common/features.mm b/ios/web/common/features.mm index ff21d9d7..abbbff9 100644 --- a/ios/web/common/features.mm +++ b/ios/web/common/features.mm
@@ -49,6 +49,9 @@ const base::Feature kEnableFullscreenAPI{"EnableFullscreenAPI", base::FEATURE_DISABLED_BY_DEFAULT}; +const base::Feature kMediaPermissionsControl{"MediaPermissionsControl", + base::FEATURE_DISABLED_BY_DEFAULT}; + const base::Feature kUseLoadSimulatedRequestForOfflinePage{ "UseLoadSimulatedRequestForErrorPageNavigation", base::FEATURE_DISABLED_BY_DEFAULT}; @@ -63,6 +66,13 @@ return true; } +bool IsMediaPermissionsControlEnabled() { + if (@available(iOS 15, *)) { + return base::FeatureList::IsEnabled(kMediaPermissionsControl); + } + return false; +} + bool IsLoadSimulatedRequestAPIEnabled() { if (@available(iOS 15, *)) { return base::FeatureList::IsEnabled(kUseLoadSimulatedRequestForOfflinePage);
diff --git a/ios/web/web_state/permissions_inttest.mm b/ios/web/web_state/permissions_inttest.mm index 1118dbc..a6ad0d2 100644 --- a/ios/web/web_state/permissions_inttest.mm +++ b/ios/web/web_state/permissions_inttest.mm
@@ -3,21 +3,23 @@ // found in the LICENSE file. #import "base/test/ios/wait_util.h" -#include "ios/testing/scoped_block_swizzler.h" +#import "base/test/scoped_feature_list.h" +#import "ios/testing/scoped_block_swizzler.h" +#import "ios/web/common/features.h" #import "ios/web/public/navigation/navigation_manager.h" -#include "ios/web/public/navigation/reload_type.h" +#import "ios/web/public/navigation/reload_type.h" #import "ios/web/public/permissions/permissions.h" #import "ios/web/public/test/navigation_test_util.h" #import "ios/web/public/web_state.h" -#include "ios/web/public/web_state_observer.h" +#import "ios/web/public/web_state_observer.h" #import "ios/web/test/web_test_with_web_controller.h" #import "ios/web/web_state/ui/crw_web_controller.h" #import "ios/web/web_state/ui/crw_wk_ui_handler.h" #import "ios/web/web_state/ui/crw_wk_ui_handler_delegate.h" -#include "net/test/embedded_test_server/embedded_test_server.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "testing/gtest_mac.h" +#import "net/test/embedded_test_server/embedded_test_server.h" +#import "testing/gmock/include/gmock/gmock.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." @@ -92,6 +94,10 @@ void SetUp() override { WebTestWithWebState::SetUp(); if (@available(iOS 15.0, *)) { + // Turn on media permissions feature. + scoped_feature_list_.InitWithFeatures( + {features::kMediaPermissionsControl}, {}); + // Switch actual objects to fakes/mocks for testing purposes. handler_ = [[FakeCRWWKUIHandler alloc] init]; handler_.delegate = (id<CRWWKUIHandlerDelegate>)web_controller(); @@ -116,6 +122,7 @@ } protected: + base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<ScopedBlockSwizzler> swizzler_; std::unique_ptr<net::EmbeddedTestServer> test_server_; testing::NiceMock<WebStateObserverMock> observer_;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index e5da1b88..3cf92c2 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -473,9 +473,13 @@ @"serverTrust" : @"webViewSecurityFeaturesDidChange", @"hasOnlySecureContent" : @"webViewSecurityFeaturesDidChange", @"title" : @"webViewTitleDidChange", - @"cameraCaptureState" : @"webViewCameraCaptureStateDidChange", - @"microphoneCaptureState" : @"webViewMicrophoneCaptureStateDidChange", }]; + if (web::features::IsMediaPermissionsControlEnabled()) { + [observers addEntriesFromDictionary:@{ + @"cameraCaptureState" : @"webViewCameraCaptureStateDidChange", + @"microphoneCaptureState" : @"webViewMicrophoneCaptureStateDidChange", + }]; + } if (@available(iOS 16.0, *)) { if (base::FeatureList::IsEnabled(web::features::kEnableFullscreenAPI)) {
diff --git a/ios/web/web_state/web_state_impl.mm b/ios/web/web_state/web_state_impl.mm index 86496082..44b962be 100644 --- a/ios/web/web_state/web_state_impl.mm +++ b/ios/web/web_state/web_state_impl.mm
@@ -9,6 +9,8 @@ #import "base/compiler_specific.h" #include "base/debug/dump_without_crashing.h" +#import "base/feature_list.h" +#import "ios/web/common/features.h" #import "ios/web/public/js_messaging/web_frame.h" #import "ios/web/public/permissions/permissions.h" #import "ios/web/public/session/crw_session_storage.h"
diff --git a/media/formats/BUILD.gn b/media/formats/BUILD.gn index f45e689..2cd5dc2 100644 --- a/media/formats/BUILD.gn +++ b/media/formats/BUILD.gn
@@ -335,6 +335,7 @@ "hls/multivariant_playlist_test_builder.h", "hls/multivariant_playlist_unittest.cc", "hls/playlist_test_builder.h", + "hls/playlist_unittest.cc", "hls/tags_unittest.cc", "hls/test_util.h", "hls/types_unittest.cc",
diff --git a/media/formats/hls/media_playlist.cc b/media/formats/hls/media_playlist.cc index 61a4466..b142cb5 100644 --- a/media/formats/hls/media_playlist.cc +++ b/media/formats/hls/media_playlist.cc
@@ -51,6 +51,10 @@ MediaPlaylist::~MediaPlaylist() = default; +Playlist::Kind MediaPlaylist::GetKind() const { + return Kind::kMediaPlaylist; +} + // static ParseStatus::Or<MediaPlaylist> MediaPlaylist::Parse( base::StringPiece source,
diff --git a/media/formats/hls/media_playlist.h b/media/formats/hls/media_playlist.h index deb2dcc2..a5194d4 100644 --- a/media/formats/hls/media_playlist.h +++ b/media/formats/hls/media_playlist.h
@@ -42,7 +42,10 @@ MediaPlaylist(MediaPlaylist&&); MediaPlaylist& operator=(const MediaPlaylist&) = delete; MediaPlaylist& operator=(MediaPlaylist&&); - ~MediaPlaylist(); + ~MediaPlaylist() override; + + // `Playlist` implementation + Kind GetKind() const override; // Returns all segments in this playlist, in chronological order. This vector // may be copied independently of this Playlist.
diff --git a/media/formats/hls/media_playlist_fuzzer.cc b/media/formats/hls/media_playlist_fuzzer.cc index e113c22..abe4cb3c 100644 --- a/media/formats/hls/media_playlist_fuzzer.cc +++ b/media/formats/hls/media_playlist_fuzzer.cc
@@ -10,8 +10,10 @@ #include "base/check.h" #include "base/i18n/icu_util.h" #include "base/strings/string_piece.h" +#include "base/strings/string_piece_forward.h" #include "media/formats/hls/media_playlist.h" #include "media/formats/hls/multivariant_playlist.h" +#include "media/formats/hls/playlist.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/gurl.h" @@ -23,6 +25,18 @@ IcuEnvironment* env = new IcuEnvironment(); +// Attempts to determine playlist version from the given source (excercising +// `Playlist::IdentifyPlaylist`). Since we don't necessarily want to exit early +// on a failure here, return `kDefaultVersion` on error. +media::hls::types::DecimalInteger GetPlaylistVersion(base::StringPiece source) { + auto ident_result = media::hls::Playlist::IdentifyPlaylist(source); + if (ident_result.has_error()) { + return media::hls::Playlist::kDefaultVersion; + } + + return std::move(ident_result).value().version; +} + extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { FuzzedDataProvider data_provider(data, size); @@ -32,6 +46,9 @@ if (data_provider.ConsumeBool()) { auto multivariant_playlist_source = data_provider.ConsumeRandomLengthString(); + + // Determine playlist version (ignore type mismatch) + GetPlaylistVersion(multivariant_playlist_source); auto multivariant_playlist_result = media::hls::MultivariantPlaylist::Parse( multivariant_playlist_source, GURL("http://localhost/multi_playlist.m3u8")); @@ -44,6 +61,9 @@ } auto media_playlist_source = data_provider.ConsumeRemainingBytesAsString(); + + // Determine playlist version (ignore type mismatch) + GetPlaylistVersion(media_playlist_source); media::hls::MediaPlaylist::Parse(media_playlist_source, GURL("http://localhost/playlist.m3u8"), multivariant_playlist.get());
diff --git a/media/formats/hls/multivariant_playlist.cc b/media/formats/hls/multivariant_playlist.cc index dfbd6f53..7346ed2 100644 --- a/media/formats/hls/multivariant_playlist.cc +++ b/media/formats/hls/multivariant_playlist.cc
@@ -12,6 +12,7 @@ #include "base/strings/string_piece.h" #include "media/formats/hls/items.h" #include "media/formats/hls/parse_status.h" +#include "media/formats/hls/playlist.h" #include "media/formats/hls/playlist_common.h" #include "media/formats/hls/source_string.h" #include "media/formats/hls/tags.h" @@ -31,6 +32,10 @@ MultivariantPlaylist::~MultivariantPlaylist() = default; +Playlist::Kind MultivariantPlaylist::GetKind() const { + return Kind::kMultivariantPlaylist; +} + // static ParseStatus::Or<MultivariantPlaylist> MultivariantPlaylist::Parse( base::StringPiece source,
diff --git a/media/formats/hls/multivariant_playlist.h b/media/formats/hls/multivariant_playlist.h index 6411bab..28cd8ff 100644 --- a/media/formats/hls/multivariant_playlist.h +++ b/media/formats/hls/multivariant_playlist.h
@@ -25,7 +25,7 @@ MultivariantPlaylist(MultivariantPlaylist&&); MultivariantPlaylist& operator=(const MultivariantPlaylist&) = delete; MultivariantPlaylist& operator=(MultivariantPlaylist&&); - ~MultivariantPlaylist(); + ~MultivariantPlaylist() override; // Returns all variants described by this playlist. const std::vector<VariantStream>& GetVariants() const { return variants_; } @@ -35,6 +35,9 @@ return variable_dictionary_; } + // `Playlist` implementation + Kind GetKind() const override; + // Attempts to parse the multivariant playlist represented by `source`. `uri` // must be a valid, non-empty GURL referring to the URI of this playlist. If // the playlist source is invalid, returns an error. If the playlist source
diff --git a/media/formats/hls/multivariant_playlist_fuzzer.cc b/media/formats/hls/multivariant_playlist_fuzzer.cc index b22286a..79dc0284 100644 --- a/media/formats/hls/multivariant_playlist_fuzzer.cc +++ b/media/formats/hls/multivariant_playlist_fuzzer.cc
@@ -10,6 +10,7 @@ #include "base/i18n/icu_util.h" #include "base/strings/string_piece.h" #include "media/formats/hls/multivariant_playlist.h" +#include "media/formats/hls/playlist.h" #include "third_party/abseil-cpp/absl/types/variant.h" #include "url/gurl.h" @@ -21,10 +22,25 @@ IcuEnvironment* env = new IcuEnvironment(); +// Attempts to determine playlist version from the given source (excercising +// `Playlist::IdentifyPlaylist`). Since we don't necessarily want to exit early +// on a failure here, return `kDefaultVersion` on error. +media::hls::types::DecimalInteger GetPlaylistVersion(base::StringPiece source) { + auto ident_result = media::hls::Playlist::IdentifyPlaylist(source); + if (ident_result.has_error()) { + return media::hls::Playlist::kDefaultVersion; + } + + return std::move(ident_result).value().version; +} + extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { // Create a StringPiece from the given input const base::StringPiece source(reinterpret_cast<const char*>(data), size); + // Determine playlist version (ignoring type mismatch) + GetPlaylistVersion(source); + // Try to parse it as a multivariant playlist media::hls::MultivariantPlaylist::Parse( source, GURL("http://localhost/playlist.m3u8"));
diff --git a/media/formats/hls/playlist.cc b/media/formats/hls/playlist.cc index 1aa8664..eb652e6 100644 --- a/media/formats/hls/playlist.cc +++ b/media/formats/hls/playlist.cc
@@ -4,6 +4,9 @@ #include "media/formats/hls/playlist.h" +#include "media/formats/hls/items.h" +#include "media/formats/hls/playlist_common.h" +#include "media/formats/hls/tags.h" #include "media/formats/hls/types.h" #include "url/gurl.h" @@ -20,4 +23,84 @@ Playlist& Playlist::operator=(Playlist&&) = default; Playlist::~Playlist() = default; +// static +ParseStatus::Or<Playlist::Identification> Playlist::IdentifyPlaylist( + base::StringPiece source) { + absl::optional<Kind> playlist_kind; + absl::optional<XVersionTag> version_tag; + + // Iterate through playlist lines until we can identify the version and the + // playlist kind. + SourceLineIterator iter(source); + while (!playlist_kind.has_value() || !version_tag.has_value()) { + auto item_result = GetNextLineItem(&iter); + if (item_result.has_error()) { + auto error = std::move(item_result).error(); + + // Only tolerated error is EOF + if (error.code() == ParseStatusCode::kReachedEOF) { + break; + } + + return error; + } + + auto item = std::move(item_result).value(); + if (auto* tag = absl::get_if<TagItem>(&item)) { + // We can't make any assumptions on unknown tags + if (!tag->GetName().has_value()) { + continue; + } + const auto tag_name = tag->GetName().value(); + + // If this is a version tag, try parsing it to determine the version + if (tag_name == ToTagName(CommonTagName::kXVersion)) { + auto error = ParseUniqueTag(*tag, version_tag); + if (error.has_value()) { + return std::move(error).value(); + } + + // Ensure that the version is supported by this implementation + if (version_tag->version < Playlist::kMinSupportedVersion || + version_tag->version > Playlist::kMaxSupportedVersion) { + return ParseStatusCode::kPlaylistHasUnsupportedVersion; + } + + continue; + } + + // Otherwise use the tag's kind to identify playlist kind without + // attempting to parse it. + switch (GetTagKind(tag_name)) { + case TagKind::kCommonTag: + break; + case TagKind::kMultivariantPlaylistTag: + if (playlist_kind == Kind::kMediaPlaylist) { + return ParseStatusCode::kMediaPlaylistHasMultivariantPlaylistTag; + } + playlist_kind = Kind::kMultivariantPlaylist; + break; + case TagKind::kMediaPlaylistTag: + if (playlist_kind == Kind::kMultivariantPlaylist) { + return ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag; + } + playlist_kind = Kind::kMediaPlaylist; + break; + } + } + } + + return Identification{ + // If the playlist did not contain a version tag, version is implicitly + // `kDefaultVersion`. + .version = version_tag ? version_tag->version : kDefaultVersion, + + // Media playlists must contain the EXT-X-TARGETDURATION tag, so if we + // never encountered a media playlist tag it must be an (empty) + // multivariant playlist. + .kind = + playlist_kind ? playlist_kind.value() : Kind::kMultivariantPlaylist, + }; +} + } // namespace media::hls
diff --git a/media/formats/hls/playlist.h b/media/formats/hls/playlist.h index 4854afc..f6d59d5 100644 --- a/media/formats/hls/playlist.h +++ b/media/formats/hls/playlist.h
@@ -17,14 +17,37 @@ // playlist version is `1`. static constexpr types::DecimalInteger kDefaultVersion = 1; + // The min and max HLS version supported by this implementation. + static constexpr types::DecimalInteger kMinSupportedVersion = 1; + static constexpr types::DecimalInteger kMaxSupportedVersion = 10; + + enum class Kind { + kMultivariantPlaylist, + kMediaPlaylist, + }; + + struct Identification { + // The playlist version. If none was specified this will be + // `kDefaultVersion`. + types::DecimalInteger version; + + // The playlist kind. + Kind kind; + }; + + // Identifies the type and version of the given playlist. + // This function does the minimum amount of parsing necessary to determine + // these properties, so it is not a guarantee that this playlist is valid. + static ParseStatus::Or<Identification> IdentifyPlaylist( + base::StringPiece src); + Playlist(const Playlist&) = delete; Playlist& operator=(const Playlist&) = delete; // Returns the resolved URI of this playlist. const GURL& Uri() const { return uri_; } - // Returns the HLS version number defined by the playlist. The default version - // is `1`. + // Returns the HLS version number defined by the playlist. types::DecimalInteger GetVersion() const { return version_; } // Indicates that all media samples in a Segment can be decoded without @@ -33,11 +56,14 @@ // Segment in every Media Playlist referenced by this playlist. bool AreSegmentsIndependent() const { return independent_segments_; } + // Returns the kind of playlist this instance is. + virtual Kind GetKind() const = 0; + protected: Playlist(GURL uri, types::DecimalInteger version, bool independent_segments); Playlist(Playlist&&); Playlist& operator=(Playlist&&); - ~Playlist(); + virtual ~Playlist(); private: GURL uri_;
diff --git a/media/formats/hls/playlist_unittest.cc b/media/formats/hls/playlist_unittest.cc new file mode 100644 index 0000000..6b680bf --- /dev/null +++ b/media/formats/hls/playlist_unittest.cc
@@ -0,0 +1,127 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/formats/hls/playlist.h" +#include "base/location.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_piece_forward.h" +#include "base/strings/stringprintf.h" +#include "media/formats/hls/parse_status.h" +#include "media/formats/hls/tag_name.h" +#include "media/formats/hls/types.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace media::hls { + +TEST(HlsPlaylistTest, IdentifyPlaylist) { + constexpr auto ok_test = [](types::DecimalInteger version, + Playlist::Kind kind, base::StringPiece src, + const base::Location& from = + base::Location::Current()) { + auto result = Playlist::IdentifyPlaylist(src); + ASSERT_TRUE(result.has_value()) << from.ToString(); + + auto ident = std::move(result).value(); + EXPECT_EQ(ident.version, version) << from.ToString(); + EXPECT_EQ(ident.kind, kind) << from.ToString(); + }; + + constexpr auto error_test = + [](ParseStatusCode expected_error, base::StringPiece src, + const base::Location& from = base::Location::Current()) { + auto result = Playlist::IdentifyPlaylist(src); + ASSERT_TRUE(result.has_error()) << from.ToString(); + + auto error = std::move(result).error(); + EXPECT_EQ(error.code(), expected_error) << from.ToString(); + }; + + // A completely empty playlist should be identified as a multivariant playlist + // with the default version. This will obviously fail to parse as a + // multivariant playlist, but the goal of this function is to do the minimum + // work necessary to determine the version and disambiguate a media playlist + // from a multivariant playlist, not necessarily a valid playlist from an + // invalid playlist. There are many reasons a playlist might be invalid, so + // that's best left to the actual parsing function. + ok_test(Playlist::kDefaultVersion, Playlist::Kind::kMultivariantPlaylist, ""); + ok_test(5, Playlist::Kind::kMultivariantPlaylist, "#EXT-X-VERSION:5\n"); + + // Playlists with invalid line endings should still be rejected + error_test(ParseStatusCode::kInvalidEOL, "#EXTINF"); + + // Playlists with kind-specific tags should deduce to that kind of playlist. + // These tags do not need to be valid. + for (TagName tag = kMinTagName; tag <= kMaxTagName; ++tag) { + if (tag == ToTagName(CommonTagName::kXVersion)) { + continue; + } + + // Test with a couple different version numbers + for (types::DecimalInteger version : {0, 1, 5, 10}) { + // Test with and without a common tag + for (bool common_tag : {true, false}) { + std::string src; + + if (common_tag) { + src += "#EXTM3U\n"; + } + + if (version) { + src += "#EXT-X-VERSION:" + base::NumberToString(version) + "\n"; + } + + src += "#" + std::string(TagNameToString(tag)) + "\n"; + + switch (GetTagKind(tag)) { + case TagKind::kCommonTag: + ok_test(version ? version : Playlist::kDefaultVersion, + Playlist::Kind::kMultivariantPlaylist, src); + break; + case TagKind::kMultivariantPlaylistTag: + ok_test(version ? version : Playlist::kDefaultVersion, + Playlist::Kind::kMultivariantPlaylist, src); + break; + case TagKind::kMediaPlaylistTag: + ok_test(version ? version : Playlist::kDefaultVersion, + Playlist::Kind::kMediaPlaylist, src); + break; + } + } + } + } + + // Invalid or unsupported versions should result in an error + error_test(ParseStatusCode::kMalformedTag, "#EXT-X-VERSION:-1\n"); + error_test(ParseStatusCode::kInvalidPlaylistVersion, "#EXT-X-VERSION:0\n"); + error_test(ParseStatusCode::kPlaylistHasUnsupportedVersion, + "#EXT-X-VERSION:11\n"); + + // Conflicting tag kinds should result in an error + error_test(ParseStatusCode::kMultivariantPlaylistHasMediaPlaylistTag, + "#EXT-X-STREAM-INF\n#EXTINF\n"); + error_test(ParseStatusCode::kMediaPlaylistHasMultivariantPlaylistTag, + "#EXTINF\n#EXT-X-STREAM-INF\n"); + + // ...unless the error occurs after this function has determined version and + // playlist kind + ok_test(5, Playlist::Kind::kMediaPlaylist, + "#EXT-X-VERSION:5\n#EXTINF\n#EXT-X-STREAM-INF\n"); + + // Duplicate or conflicting version tags should result in an error + error_test(ParseStatusCode::kPlaylistHasDuplicateTags, + "#EXT-X-VERSION:3\n#EXT-X-VERSION:3\n"); + error_test(ParseStatusCode::kPlaylistHasDuplicateTags, + "#EXT-X-VERSION:3\n#EXT-X-VERSION:4\n"); + + // ...unless the error occurs after this function has determined version and + // playlist kind + ok_test(5, Playlist::Kind::kMediaPlaylist, + "#EXT-X-VERSION:5\n#EXTINF\n#EXT-X-VERSION:6\n"); + + // Unknown tags should not affect this function + ok_test(5, Playlist::Kind::kMediaPlaylist, + "#EXT-X-VERSION:5\n#EXT-X-FAKE-TAG\n#EXTINF\n"); +} + +} // namespace media::hls
diff --git a/net/base/features.cc b/net/base/features.cc index b4154a26..c8a1f85 100644 --- a/net/base/features.cc +++ b/net/base/features.cc
@@ -301,11 +301,7 @@ const base::Feature kStaticKeyPinningEnforcement( "StaticKeyPinningEnforcement", -#if BUILDFLAG(IS_ANDROID) - base::FEATURE_DISABLED_BY_DEFAULT); -#else base::FEATURE_ENABLED_BY_DEFAULT); -#endif const base::Feature kCookieDomainRejectNonASCII{ "CookieDomainRejectNonASCII", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/net/cookies/cookie_access_delegate.cc b/net/cookies/cookie_access_delegate.cc index 63ccc28..8742283 100644 --- a/net/cookies/cookie_access_delegate.cc +++ b/net/cookies/cookie_access_delegate.cc
@@ -17,11 +17,11 @@ namespace { CookiePartitionKey CreateCookiePartitionKeyFromFirstPartySetEntry( const CookiePartitionKey& cookie_partition_key, - absl::optional<FirstPartySetEntry> first_party_set_entry) { - if (!first_party_set_entry) { + base::flat_map<net::SchemefulSite, FirstPartySetEntry> entries) { + if (entries.empty()) { return cookie_partition_key; } - return CookiePartitionKey::FromWire(first_party_set_entry.value().primary(), + return CookiePartitionKey::FromWire(entries.begin()->second.primary(), cookie_partition_key.nonce()); } } // namespace @@ -47,15 +47,15 @@ return cookie_partition_key; } - absl::optional<absl::optional<FirstPartySetEntry>> maybe_entry = - delegate->FindFirstPartySetOwner( - cookie_partition_key.site(), + absl::optional<base::flat_map<net::SchemefulSite, FirstPartySetEntry>> + maybe_entries = delegate->FindFirstPartySetOwners( + {cookie_partition_key.site()}, base::BindOnce(&CreateCookiePartitionKeyFromFirstPartySetEntry, cookie_partition_key) .Then(std::move(callback))); - if (maybe_entry.has_value()) - return CreateCookiePartitionKeyFromFirstPartySetEntry(cookie_partition_key, - maybe_entry.value()); + if (maybe_entries.has_value()) + return CreateCookiePartitionKeyFromFirstPartySetEntry( + cookie_partition_key, maybe_entries.value()); return absl::nullopt; }
diff --git a/net/cookies/cookie_access_delegate.h b/net/cookies/cookie_access_delegate.h index 1de6b03..3d69dbe 100644 --- a/net/cookies/cookie_access_delegate.h +++ b/net/cookies/cookie_access_delegate.h
@@ -68,22 +68,9 @@ const std::set<net::SchemefulSite>& party_context, base::OnceCallback<void(FirstPartySetMetadata)> callback) const = 0; - // Computes the owner of a `site`'s First-Party Set if `site` is in a - // non-trivial set; `nullopt` otherwise. - // - // This may return a result synchronously, or asynchronously invoke `callback` - // with the result. The callback will be invoked iff the return value is - // nullopt; i.e. a result will be provided via return value or callback, but - // not both, and not neither. - [[nodiscard]] virtual absl::optional<absl::optional<net::FirstPartySetEntry>> - FindFirstPartySetOwner( - const net::SchemefulSite& site, - base::OnceCallback<void(absl::optional<net::FirstPartySetEntry>)> - callback) const = 0; - - // Computes the owners of a set of sites' First-Party Sets if the site are in - // non-trivial sets. If a given site is not in a non-trivial set, the output - // does not contain a corresponding owner. + // Returns the entries of a set of sites if the sites are in non-trivial sets. + // If a given site is not in a non-trivial set, the output does not contain a + // corresponding entry. // // This may return a result synchronously, or asynchronously invoke `callback` // with the result. The callback will be invoked iff the return value is
diff --git a/net/cookies/test_cookie_access_delegate.cc b/net/cookies/test_cookie_access_delegate.cc index 95df366..3145188 100644 --- a/net/cookies/test_cookie_access_delegate.cc +++ b/net/cookies/test_cookie_access_delegate.cc
@@ -75,14 +75,6 @@ : absl::nullopt; } -absl::optional<absl::optional<FirstPartySetEntry>> -TestCookieAccessDelegate::FindFirstPartySetOwner( - const SchemefulSite& site, - base::OnceCallback<void(absl::optional<FirstPartySetEntry>)> callback) - const { - return RunMaybeAsync(FindFirstPartySetOwnerSync(site), std::move(callback)); -} - absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>> TestCookieAccessDelegate::FindFirstPartySetOwners( const base::flat_set<SchemefulSite>& sites,
diff --git a/net/cookies/test_cookie_access_delegate.h b/net/cookies/test_cookie_access_delegate.h index 77d4b7f..c07c887 100644 --- a/net/cookies/test_cookie_access_delegate.h +++ b/net/cookies/test_cookie_access_delegate.h
@@ -17,7 +17,6 @@ #include "net/cookies/cookie_constants.h" #include "net/cookies/first_party_set_entry.h" #include "net/cookies/first_party_set_metadata.h" -#include "net/cookies/same_party_context.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace net { @@ -47,10 +46,6 @@ const SchemefulSite* top_frame_site, const std::set<SchemefulSite>& party_context, base::OnceCallback<void(FirstPartySetMetadata)> callback) const override; - absl::optional<absl::optional<FirstPartySetEntry>> FindFirstPartySetOwner( - const SchemefulSite& site, - base::OnceCallback<void(absl::optional<FirstPartySetEntry>)> callback) - const override; absl::optional<base::flat_map<SchemefulSite, FirstPartySetEntry>> FindFirstPartySetOwners( const base::flat_set<SchemefulSite>& sites,
diff --git a/services/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensor.java b/services/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensor.java index 19e26802..d2778e4 100644 --- a/services/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensor.java +++ b/services/device/generic_sensor/android/java/src/org/chromium/device/sensors/PlatformSensor.java
@@ -92,37 +92,35 @@ int readingCount; switch (type) { case SensorType.AMBIENT_LIGHT: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_LIGHT); + sensors = sensorManager.getSensorList(Sensor.TYPE_LIGHT); readingCount = 1; break; case SensorType.ACCELEROMETER: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_ACCELEROMETER); + sensors = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER); readingCount = 3; break; case SensorType.LINEAR_ACCELERATION: - sensors = - provider.getSensorManager().getSensorList(Sensor.TYPE_LINEAR_ACCELERATION); + sensors = sensorManager.getSensorList(Sensor.TYPE_LINEAR_ACCELERATION); readingCount = 3; break; case SensorType.GRAVITY: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_GRAVITY); + sensors = sensorManager.getSensorList(Sensor.TYPE_GRAVITY); readingCount = 3; break; case SensorType.GYROSCOPE: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_GYROSCOPE); + sensors = sensorManager.getSensorList(Sensor.TYPE_GYROSCOPE); readingCount = 3; break; case SensorType.MAGNETOMETER: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_MAGNETIC_FIELD); + sensors = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); readingCount = 3; break; case SensorType.ABSOLUTE_ORIENTATION_QUATERNION: - sensors = provider.getSensorManager().getSensorList(Sensor.TYPE_ROTATION_VECTOR); + sensors = sensorManager.getSensorList(Sensor.TYPE_ROTATION_VECTOR); readingCount = 4; break; case SensorType.RELATIVE_ORIENTATION_QUATERNION: - sensors = - provider.getSensorManager().getSensorList(Sensor.TYPE_GAME_ROTATION_VECTOR); + sensors = sensorManager.getSensorList(Sensor.TYPE_GAME_ROTATION_VECTOR); readingCount = 4; break; default:
diff --git a/services/network/cookie_access_delegate_impl.cc b/services/network/cookie_access_delegate_impl.cc index 18acdee..35c4653 100644 --- a/services/network/cookie_access_delegate_impl.cc +++ b/services/network/cookie_access_delegate_impl.cc
@@ -72,19 +72,6 @@ site, top_frame_site, party_context, std::move(callback)); } -absl::optional<FirstPartySetsAccessDelegate::OwnerResult> -CookieAccessDelegateImpl::FindFirstPartySetOwner( - const net::SchemefulSite& site, - base::OnceCallback<void(FirstPartySetsManager::OwnerResult)> callback) - const { - if (!first_party_sets_access_delegate_) { - return absl::make_optional<FirstPartySetsManager::OwnerResult>( - absl::nullopt); - } - return first_party_sets_access_delegate_->FindOwner(site, - std::move(callback)); -} - absl::optional<FirstPartySetsAccessDelegate::OwnersResult> CookieAccessDelegateImpl::FindFirstPartySetOwners( const base::flat_set<net::SchemefulSite>& sites,
diff --git a/services/network/cookie_access_delegate_impl.h b/services/network/cookie_access_delegate_impl.h index 022a370..3bf540d9 100644 --- a/services/network/cookie_access_delegate_impl.h +++ b/services/network/cookie_access_delegate_impl.h
@@ -62,11 +62,6 @@ const std::set<net::SchemefulSite>& party_context, base::OnceCallback<void(net::FirstPartySetMetadata)> callback) const override; - [[nodiscard]] absl::optional<FirstPartySetsAccessDelegate::OwnerResult> - FindFirstPartySetOwner( - const net::SchemefulSite& site, - base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)> - callback) const override; [[nodiscard]] absl::optional<FirstPartySetsAccessDelegate::OwnersResult> FindFirstPartySetOwners( const base::flat_set<net::SchemefulSite>& sites,
diff --git a/services/network/cookie_access_delegate_impl_unittest.cc b/services/network/cookie_access_delegate_impl_unittest.cc index 8c0c9405a..425e4f41 100644 --- a/services/network/cookie_access_delegate_impl_unittest.cc +++ b/services/network/cookie_access_delegate_impl_unittest.cc
@@ -45,19 +45,13 @@ // Same as the default ctor, but just to be explicit: net::FirstPartySetMetadata expected_metadata(net::SamePartyContext(), - /*frame_owner=*/nullptr, - /*top_frame_owner=*/nullptr); + /*frame_entry=*/nullptr, + /*top_frame_entry=*/nullptr); EXPECT_THAT(delegate().ComputeFirstPartySetMetadataMaybeAsync( site, &site, {}, base::BindOnce([](net::FirstPartySetMetadata) { FAIL(); })), Optional(std::ref(expected_metadata))); - EXPECT_THAT(delegate().FindFirstPartySetOwner( - site, base::BindOnce([](FirstPartySetsManager::OwnerResult) { - FAIL(); - })), - Optional(absl::nullopt)); - EXPECT_THAT( delegate().FindFirstPartySetOwners( {site},
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.cc b/services/network/first_party_sets/first_party_sets_access_delegate.cc index 1d0e307..cd1b4fb1 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate.cc +++ b/services/network/first_party_sets/first_party_sets_access_delegate.cc
@@ -71,30 +71,6 @@ context_config_, std::move(callback)); } -absl::optional<FirstPartySetsAccessDelegate::OwnerResult> -FirstPartySetsAccessDelegate::FindOwner( - const net::SchemefulSite& site, - base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)> - callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (!context_config_.is_enabled()) { - return absl::make_optional<FirstPartySetsManager::OwnerResult>( - absl::nullopt); - } - if (pending_queries_) { - // base::Unretained() is safe because `this` owns `pending_queries_` and - // `pending_queries_` will not run the enqueued callbacks after `this` is - // destroyed. - EnqueuePendingQuery( - base::BindOnce(&FirstPartySetsAccessDelegate::FindOwnerAndInvoke, - base::Unretained(this), site, std::move(callback))); - return absl::nullopt; - } - - return manager_->FindOwner(site, context_config_, std::move(callback)); -} - absl::optional<FirstPartySetsAccessDelegate::OwnersResult> FirstPartySetsAccessDelegate::FindOwners( const base::flat_set<net::SchemefulSite>& sites, @@ -139,24 +115,6 @@ std::move(callbacks.second).Run(std::move(sync_result.value())); } -void FirstPartySetsAccessDelegate::FindOwnerAndInvoke( - const net::SchemefulSite& site, - base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)> - callback) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(context_config_.is_enabled()); - - std::pair<base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>, - base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnerResult)>> - callbacks = base::SplitOnceCallback(std::move(callback)); - - absl::optional<FirstPartySetsAccessDelegate::OwnerResult> sync_result = - manager_->FindOwner(site, context_config_, std::move(callbacks.first)); - - if (sync_result.has_value()) - std::move(callbacks.second).Run(sync_result.value()); -} - void FirstPartySetsAccessDelegate::FindOwnersAndInvoke( const base::flat_set<net::SchemefulSite>& sites, base::OnceCallback<void(FirstPartySetsAccessDelegate::OwnersResult)>
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.h b/services/network/first_party_sets/first_party_sets_access_delegate.h index 922973e..43a77ee 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate.h +++ b/services/network/first_party_sets/first_party_sets_access_delegate.h
@@ -30,7 +30,6 @@ class FirstPartySetsAccessDelegate : public mojom::FirstPartySetsAccessDelegate { public: - using OwnerResult = FirstPartySetsManager::OwnerResult; using OwnersResult = FirstPartySetsManager::OwnersResult; using FlattenedSets = FirstPartySetsManager::FlattenedSets; @@ -68,22 +67,6 @@ const std::set<net::SchemefulSite>& party_context, base::OnceCallback<void(net::FirstPartySetMetadata)> callback); - // Returns optional(nullopt) if First-Party Sets is disabled or if the input - // is not in a nontrivial set. - // If FPS is enabled and the input site is in a nontrivial set, then this - // returns a non-empty optional containing the owner site of that set. - // - // This may return a result synchronously, or asynchronously invoke `callback` - // with the result. The callback will be invoked iff the return value is - // nullopt; i.e. a result will be provided via return value or callback, but - // not both, and not neither. - // - // Note that there is a semantic difference between optional(nullopt) and - // nullopt. - [[nodiscard]] absl::optional<OwnerResult> FindOwner( - const net::SchemefulSite& site, - base::OnceCallback<void(OwnerResult)> callback); - // Batched version of `FindOwner`. Returns the mapping of sites to owners for // the given input sites (if an owner exists). // @@ -109,11 +92,6 @@ const std::set<net::SchemefulSite>& party_context, base::OnceCallback<void(net::FirstPartySetMetadata)> callback) const; - // Same as `FindOwner`, but plumbs the result into the callback. Must only be - // called once the instance is fully initialized. - void FindOwnerAndInvoke(const net::SchemefulSite& site, - base::OnceCallback<void(OwnerResult)> callback) const; - // Same as `FindOwners`, but plumbs the result into the callback. Must only be // called once the instance is fully initialized. void FindOwnersAndInvoke(
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc index 53a4356..538644b 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_access_delegate_unittest.cc
@@ -105,15 +105,6 @@ net::SamePartyContext(Type::kSameParty)); } -TEST_F(NoopFirstPartySetsAccessDelegateTest, FindOwner) { - EXPECT_THAT(delegate().FindOwner(kSet1Owner, base::NullCallback()), - absl::make_optional(net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kPrimary, absl::nullopt))); - EXPECT_THAT(delegate().FindOwner(kSet2Member1, base::NullCallback()), - absl::make_optional(net::FirstPartySetEntry( - kSet2Owner, net::SiteType::kAssociated, 0))); -} - TEST_F(NoopFirstPartySetsAccessDelegateTest, FindOwners) { EXPECT_THAT( delegate().FindOwners({kSet1Member1, kSet2Member1}, base::NullCallback()), @@ -157,14 +148,6 @@ return result.has_value() ? std::move(result).value() : future.Take(); } - FirstPartySetsAccessDelegate::OwnerResult FindOwnerAndWait( - const net::SchemefulSite& site) { - base::test::TestFuture<FirstPartySetsAccessDelegate::OwnerResult> future; - absl::optional<FirstPartySetsAccessDelegate::OwnerResult> result = - delegate_.FindOwner(site, future.GetCallback()); - return result.has_value() ? result.value() : future.Get(); - } - FirstPartySetsAccessDelegate::OwnersResult FindOwnersAndWait( const base::flat_set<net::SchemefulSite>& site) { base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future; @@ -207,20 +190,6 @@ Optional(std::ref(expected_metadata))); } -TEST_F(FirstPartySetsAccessDelegateDisabledTest, FindOwner) { - EXPECT_THAT( - delegate().FindOwner( - kSet1Owner, - base::BindOnce([](FirstPartySetsManager::OwnerResult) { FAIL(); })), - Optional(absl::nullopt)); - - EXPECT_THAT( - delegate().FindOwner( - kSet1Member1, - base::BindOnce([](FirstPartySetsManager::OwnerResult) { FAIL(); })), - Optional(absl::nullopt)); -} - TEST_F(FirstPartySetsAccessDelegateDisabledTest, FindOwners) { EXPECT_THAT( delegate().FindOwners( @@ -256,16 +225,6 @@ &entry, &entry)); } -TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_FindOwner) { - base::test::TestFuture<FirstPartySetsAccessDelegate::OwnerResult> future; - EXPECT_FALSE(delegate().FindOwner(kSet1Member1, future.GetCallback())); - - delegate_remote()->NotifyReady(mojom::FirstPartySetsReadyEvent::New()); - - EXPECT_THAT(future.Get(), absl::make_optional(net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 0))); -} - TEST_F(AsyncFirstPartySetsAccessDelegateTest, QueryBeforeReady_FindOwners) { base::test::TestFuture<FirstPartySetsAccessDelegate::OwnersResult> future; EXPECT_FALSE(delegate().FindOwners({kSet1Member1, kSet2Member1}, @@ -301,16 +260,6 @@ &primary_entry, &associated_entry)); } -TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindOwner) { - delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ - {kSet3Owner, - {net::FirstPartySetEntry(kSet3Owner, net::SiteType::kPrimary, - absl::nullopt)}}, - })); - - EXPECT_THAT(FindOwnerAndWait(kSet3Owner), Optional(_)); -} - TEST_F(AsyncFirstPartySetsAccessDelegateTest, OverrideSets_FindOwners) { delegate_remote()->NotifyReady(CreateFirstPartySetsReadyEvent({ {kSet3Owner, @@ -343,12 +292,6 @@ &entry, &entry)); } -TEST_F(SyncFirstPartySetsAccessDelegateTest, FindOwner) { - EXPECT_THAT(FindOwnerAndWait(kSet1Member1), - absl::make_optional(net::FirstPartySetEntry( - kSet1Owner, net::SiteType::kAssociated, 0))); -} - TEST_F(SyncFirstPartySetsAccessDelegateTest, FindOwners) { EXPECT_THAT( FindOwnersAndWait({kSet1Member1, kSet2Member1, kSet3Member1}),
diff --git a/services/network/first_party_sets/first_party_sets_manager.cc b/services/network/first_party_sets/first_party_sets_manager.cc index d08e661..79d8caf 100644 --- a/services/network/first_party_sets/first_party_sets_manager.cc +++ b/services/network/first_party_sets/first_party_sets_manager.cc
@@ -56,16 +56,16 @@ const std::set<net::SchemefulSite>& party_context, const FirstPartySetsContextConfig& fps_context_config) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - const FirstPartySetsManager::OwnerResult site_entry = - FindOwnerInternal(site, fps_context_config); + const absl::optional<net::FirstPartySetEntry> site_entry = + FindEntry(site, fps_context_config); if (!site_entry.has_value()) return false; const auto is_in_same_set_as_frame_site = [this, &site_entry, &fps_context_config](const net::SchemefulSite& context_site) -> bool { - const FirstPartySetsManager::OwnerResult context_entry = - FindOwnerInternal(context_site, fps_context_config); + const absl::optional<net::FirstPartySetEntry> context_entry = + FindEntry(context_site, fps_context_config); return context_entry.has_value() && context_entry->primary() == site_entry->primary(); }; @@ -137,17 +137,16 @@ "Cookie.FirstPartySets.ComputeContext.Latency", timer.Elapsed(), base::Microseconds(1), base::Milliseconds(100), 50); - FirstPartySetsManager::OwnerResult top_frame_owner = - top_frame_site ? FindOwnerInternal(*top_frame_site, fps_context_config) + absl::optional<net::FirstPartySetEntry> top_frame_owner = + top_frame_site ? FindEntry(*top_frame_site, fps_context_config) : absl::nullopt; return net::FirstPartySetMetadata( - context, - base::OptionalOrNullptr(FindOwnerInternal(site, fps_context_config)), + context, base::OptionalOrNullptr(FindEntry(site, fps_context_config)), base::OptionalOrNullptr(top_frame_owner)); } -FirstPartySetsManager::OwnerResult FirstPartySetsManager::FindOwnerInternal( +absl::optional<net::FirstPartySetEntry> FirstPartySetsManager::FindEntry( const net::SchemefulSite& site, const FirstPartySetsContextConfig& fps_context_config) const { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -158,7 +157,7 @@ net::SchemefulSite normalized_site = site; normalized_site.ConvertWebSocketToHttp(); - FirstPartySetsManager::OwnerResult entry; + absl::optional<net::FirstPartySetEntry> entry; if (is_enabled()) { // Check if `normalized_site` can be found in the customizations first. @@ -181,37 +180,6 @@ return entry; } -absl::optional<FirstPartySetsManager::OwnerResult> -FirstPartySetsManager::FindOwner( - const net::SchemefulSite& site, - const FirstPartySetsContextConfig& fps_context_config, - base::OnceCallback<void(FirstPartySetsManager::OwnerResult)> callback) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (!sets_.has_value()) { - EnqueuePendingQuery(base::BindOnce( - &FirstPartySetsManager::FindOwnerAndInvoke, weak_factory_.GetWeakPtr(), - site, fps_context_config, std::move(callback), base::ElapsedTimer())); - return absl::nullopt; - } - - return FindOwnerInternal(site, fps_context_config); -} - -void FirstPartySetsManager::FindOwnerAndInvoke( - const net::SchemefulSite& site, - const FirstPartySetsContextConfig& fps_context_config, - base::OnceCallback<void(FirstPartySetsManager::OwnerResult)> callback, - base::ElapsedTimer timer) const { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - DCHECK(sets_.has_value()); - - UMA_HISTOGRAM_TIMES("Cookie.FirstPartySets.EnqueueingDelay.FindOwner", - timer.Elapsed()); - - std::move(callback).Run(FindOwnerInternal(site, fps_context_config)); -} - absl::optional<FirstPartySetsManager::OwnersResult> FirstPartySetsManager::FindOwners( const base::flat_set<net::SchemefulSite>& sites, @@ -253,8 +221,8 @@ std::vector<std::pair<net::SchemefulSite, net::FirstPartySetEntry>> sites_to_entries; for (const net::SchemefulSite& site : sites) { - const FirstPartySetsManager::OwnerResult entry = - FindOwnerInternal(site, fps_context_config); + const absl::optional<net::FirstPartySetEntry> entry = + FindEntry(site, fps_context_config); if (entry.has_value()) { sites_to_entries.emplace_back(site, entry.value()); }
diff --git a/services/network/first_party_sets/first_party_sets_manager.h b/services/network/first_party_sets/first_party_sets_manager.h index 381ce5e..ab4ba36 100644 --- a/services/network/first_party_sets/first_party_sets_manager.h +++ b/services/network/first_party_sets/first_party_sets_manager.h
@@ -29,7 +29,6 @@ // answers queries about First-Party Sets after they've been loaded. class FirstPartySetsManager { public: - using OwnerResult = absl::optional<net::FirstPartySetEntry>; using OwnersResult = base::flat_map<net::SchemefulSite, net::FirstPartySetEntry>; using FlattenedSets = @@ -68,28 +67,11 @@ // Sets the enabled_ attribute for testing. void SetEnabledForTesting(bool enabled); - // Returns optional(nullopt) if First-Party Sets is disabled or if the input - // is not in a nontrivial set. - // If FPS is enabled and the input site is in a nontrivial set, then this - // returns a non-empty optional containing the owner site of that set. - // - // This may return a result synchronously, or asynchronously invoke `callback` - // with the result. The callback will be invoked iff the return value is - // nullopt; i.e. a result will be provided via return value or callback, but - // not both, and not neither. - // - // Note that there is a semantic difference between optional(nullopt) and - // nullopt. - [[nodiscard]] absl::optional<OwnerResult> FindOwner( - const net::SchemefulSite& site, - const FirstPartySetsContextConfig& fps_context_config, - base::OnceCallback<void(OwnerResult)> callback); - - // Batched version of `FindOwner`. Returns the mapping of sites to owners for - // the given input sites (if an owner exists). + // Returns the mapping of sites to entries for the given input sites (if an + // entry exists). // // When FPS is disabled, returns an empty map. - // When FPS is enabled, this maps each input site to its owner (if one + // When FPS is enabled, this maps each input site to its entry (if one // exists), and returns the resulting mapping. If a site isn't in a // non-trivial First-Party Set, it is not added to the output map. // @@ -133,20 +115,12 @@ const std::set<net::SchemefulSite>& party_context, const FirstPartySetsContextConfig& fps_context_config) const; - // Same as `FindOwner`, but plumbs the result into the callback. Must only be - // called once the instance is fully initialized. - void FindOwnerAndInvoke(const net::SchemefulSite& site, - const FirstPartySetsContextConfig& fps_context_config, - base::OnceCallback<void(OwnerResult)> callback, - base::ElapsedTimer timer) const; - - // Returns `site`'s owner (optionally inferring a singleton set if necessary), - // or `nullopt` if `site` has no owner. `fps_context_config` is the - // configuration to be used in this context. + // Returns `site`'s entry, or `nullopt` if `site` has no entry. + // `fps_context_config` is the configuration to be used in this context. // // This is synchronous, and must not be called until the instance is fully // initialized. - OwnerResult FindOwnerInternal( + absl::optional<net::FirstPartySetEntry> FindEntry( const net::SchemefulSite& site, const FirstPartySetsContextConfig& fps_context_config) const; @@ -196,9 +170,6 @@ SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<FirstPartySetsManager> weak_factory_{this}; - - FRIEND_TEST_ALL_PREFIXES(PopulatedFirstPartySetsManagerTest, - ComputeContextType); }; } // namespace network
diff --git a/services/network/first_party_sets/first_party_sets_manager_unittest.cc b/services/network/first_party_sets/first_party_sets_manager_unittest.cc index 60dc3861..5e8de9f 100644 --- a/services/network/first_party_sets/first_party_sets_manager_unittest.cc +++ b/services/network/first_party_sets/first_party_sets_manager_unittest.cc
@@ -58,14 +58,6 @@ return result.has_value() ? std::move(result).value() : future.Take(); } - FirstPartySetsManager::OwnerResult FindOwnerAndWait( - const net::SchemefulSite& site) { - base::test::TestFuture<FirstPartySetsManager::OwnerResult> future; - absl::optional<FirstPartySetsManager::OwnerResult> result = - manager_.FindOwner(site, fps_context_config_, future.GetCallback()); - return result.has_value() ? result.value() : future.Get(); - } - FirstPartySetsManager::OwnersResult FindOwnersAndWait( const base::flat_set<net::SchemefulSite>& site) { base::test::TestFuture<FirstPartySetsManager::OwnersResult> future; @@ -156,32 +148,6 @@ net::SamePartyContext(Type::kCrossParty)); } -TEST_F(FirstPartySetsManagerDisabledTest, FindOwner) { - SetCompleteSets({{net::SchemefulSite(GURL("https://member.test")), - net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://example.test")), - net::SiteType::kAssociated, 0)}, - {net::SchemefulSite(GURL("https://example.test")), - net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://example.test")), - net::SiteType::kPrimary, absl::nullopt)}}); - - SetFirstPartySetsContextConfig( - true, {{net::SchemefulSite(GURL("https://aaaa.test")), - {net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://example.test")), - net::SiteType::kAssociated, 0)}}, - {net::SchemefulSite(GURL("https://example.test")), - {net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://example.test")), - net::SiteType::kPrimary, absl::nullopt)}}}); - - EXPECT_FALSE( - FindOwnerAndWait(net::SchemefulSite(GURL("https://example.test")))); - EXPECT_FALSE( - FindOwnerAndWait(net::SchemefulSite(GURL("https://member.test")))); -} - class FirstPartySetsEnabledTest : public FirstPartySetsManagerTest { public: FirstPartySetsEnabledTest() @@ -304,20 +270,6 @@ } } -TEST_F(AsyncPopulatedFirstPartySetsManagerTest, QueryBeforeReady_FindOwner) { - base::test::TestFuture<FirstPartySetsManager::OwnerResult> future; - EXPECT_FALSE( - manager().FindOwner(net::SchemefulSite(GURL("https://member1.test")), - fps_context_config(), future.GetCallback())); - - Populate(); - - EXPECT_THAT(future.Get(), - absl::make_optional(net::FirstPartySetEntry( - net::SchemefulSite(GURL("https://example.test")), - net::SiteType::kAssociated, 0))); -} - TEST_F(AsyncPopulatedFirstPartySetsManagerTest, QueryBeforeReady_FindOwners) { base::test::TestFuture<FirstPartySetsManager::OwnersResult> future; EXPECT_FALSE(manager().FindOwners( @@ -830,39 +782,6 @@ &associated_entry, &associated_entry)); } -TEST_F(PopulatedFirstPartySetsManagerTest, FindOwner) { - const net::SchemefulSite kSetOwner1(GURL("https://example.test")); - const net::SchemefulSite kSetOwner2(GURL("https://foo.test")); - - struct TestCase { - const std::string url; - const absl::optional<net::FirstPartySetEntry> expected; - } test_cases[] = { - {"https://example.test", - net::FirstPartySetEntry(kSetOwner1, net::SiteType::kPrimary, - absl::nullopt)}, - // Insecure URL - {"http://example.test", absl::nullopt}, - // Test member - {"https://member1.test", - net::FirstPartySetEntry(kSetOwner1, net::SiteType::kAssociated, 0)}, - {"http://member1.test", absl::nullopt}, - // Test another disjoint set - {"https://foo.test", - net::FirstPartySetEntry(kSetOwner2, net::SiteType::kPrimary, - absl::nullopt)}, - {"https://member2.test", - net::FirstPartySetEntry(kSetOwner2, net::SiteType::kAssociated, 0)}, - // Test a site not in a set - {"https://nonmember.test", absl::nullopt}, - }; - - for (const auto& test_case : test_cases) { - EXPECT_EQ(test_case.expected, - FindOwnerAndWait(net::SchemefulSite(GURL(test_case.url)))); - } -} - TEST_F(PopulatedFirstPartySetsManagerTest, FindOwners) { net::SchemefulSite kExample(GURL("https://example.test")); net::SchemefulSite kFoo(GURL("https://foo.test")); @@ -977,19 +896,6 @@ } }; -TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwner) { - EXPECT_EQ( - FindOwnerAndWait(net::SchemefulSite(GURL("https://foo.test"))), - net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")), - net::SiteType::kPrimary, absl::nullopt)); - EXPECT_EQ(FindOwnerAndWait(net::SchemefulSite(GURL("https://member1.test"))), - absl::nullopt); - EXPECT_EQ( - FindOwnerAndWait(net::SchemefulSite(GURL("https://member2.test"))), - net::FirstPartySetEntry(net::SchemefulSite(GURL("https://foo.test")), - net::SiteType::kAssociated, 0)); -} - TEST_F(OverrideSetsFirstPartySetsManagerTest, FindOwners) { EXPECT_THAT(FindOwnersAndWait({ net::SchemefulSite(GURL("https://member1.test")), @@ -1019,24 +925,17 @@ absl::nullopt); net::FirstPartySetEntry foo_associated_entry(foo, net::SiteType::kAssociated, 0); - { - // member1 has been removed from its set. - net::FirstPartySetMetadata expected( - net::SamePartyContext(Type::kCrossParty), nullptr, - &example_primary_entry); - EXPECT_THAT(ComputeMetadataAndWait(member1, &example, {}), - testing::Eq(std::ref(expected))); - } - { - // member2 and foo are sites in a new set. - net::FirstPartySetMetadata expected(net::SamePartyContext(Type::kSameParty), - &foo_associated_entry, - &foo_primary_entry); + // member1 has been removed from its set. + EXPECT_EQ(ComputeMetadataAndWait(member1, &example, {}), + net::FirstPartySetMetadata(net::SamePartyContext(Type::kCrossParty), + nullptr, &example_primary_entry)); - EXPECT_THAT(ComputeMetadataAndWait(member2, &foo, {}), - testing::Eq(std::ref(expected))); - } + // member2 and foo are sites in a new set. + EXPECT_EQ( + ComputeMetadataAndWait(member2, &foo, {}), + net::FirstPartySetMetadata(net::SamePartyContext(Type::kSameParty), + &foo_associated_entry, &foo_primary_entry)); } -} // namespace network \ No newline at end of file +} // namespace network
diff --git a/services/tracing/public/cpp/trace_event_agent.cc b/services/tracing/public/cpp/trace_event_agent.cc index 3477d0a..c697868 100644 --- a/services/tracing/public/cpp/trace_event_agent.cc +++ b/services/tracing/public/cpp/trace_event_agent.cc
@@ -70,7 +70,16 @@ DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); metadata_generator_functions_.push_back(generator); - TraceEventMetadataSource::GetInstance()->AddGeneratorFunction(generator); + TraceEventMetadataSource::GetInstance()->AddGeneratorFunction( + base::BindRepeating( + [](MetadataGeneratorFunction const& generator) + -> absl::optional<base::Value> { + if (auto rv = generator.Run()) { + return base::Value(std::move(rv.value())); + } + return absl::nullopt; + }, + std::move(generator))); } } // namespace tracing
diff --git a/services/tracing/public/cpp/trace_event_agent.h b/services/tracing/public/cpp/trace_event_agent.h index b505185d..be02428 100644 --- a/services/tracing/public/cpp/trace_event_agent.h +++ b/services/tracing/public/cpp/trace_event_agent.h
@@ -32,7 +32,7 @@ void GetCategories(std::set<std::string>* category_set) override; using MetadataGeneratorFunction = - base::RepeatingCallback<absl::optional<base::Value>()>; + base::RepeatingCallback<absl::optional<base::Value::Dict>()>; void AddMetadataGeneratorFunction(MetadataGeneratorFunction generator); private:
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index 2a5d947..497c5ee 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -910,74 +910,6 @@ "--bucket", "chromium-result-details", "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android23", - "path": ".android_emulator/generic_android23" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android23" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "cc_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -3157,73 +3089,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android24.textpb" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android25", - "path": ".android_emulator/generic_android25" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android25" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -8685,73 +8550,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb", - "--gtest_also_run_disabled_tests" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices",
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index bee67d3..f7d48db 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -2370,56 +2370,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -6002,57 +5952,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MRA58Z", - "device_os_type": "userdebug", - "device_type": "flo", - "os": "Android" - } - ], - "expiration": 10800, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -11115,72 +11014,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android30.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android30", - "path": ".android_emulator/generic_android30" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android30" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -15804,72 +15637,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android31.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "e2-standard-8", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android31", - "path": ".android_emulator/generic_android31" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android31" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices", @@ -20563,56 +20330,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -28671,57 +28388,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -32231,73 +31897,6 @@ "args": [ "--gs-results-bucket=chromium-result-details", "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android23", - "path": ".android_emulator/generic_android23" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android23" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.cc_unittests.filter" ], @@ -37183,58 +36782,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -42088,72 +41635,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "n1-standard-4|e2-standard-4", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices",
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index ff17918f..c1a8537 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5753,21 +5753,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -5780,7 +5780,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true, @@ -5918,21 +5918,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -5944,7 +5944,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "args": [ @@ -6064,21 +6064,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -6090,7 +6090,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 3e89378..c0166c1 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -5572,56 +5572,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices"
diff --git a/testing/buildbot/chromium.dawn.json b/testing/buildbot/chromium.dawn.json index e9af35a7..2a3c32b 100644 --- a/testing/buildbot/chromium.dawn.json +++ b/testing/buildbot/chromium.dawn.json
@@ -2312,12 +2312,12 @@ }, { "args": [ - "--flag-specific=webgpu-with-backend-validation", - "--timeout-ms=30000", + "--flag-specific=webgpu", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--platform=mac-mac11", "--git-revision=${got_revision}" ], + "check_flakiness_for_new_tests": false, "isolate_name": "webgpu_blink_web_tests", "merge": { "args": [ @@ -2325,7 +2325,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_backend_validation", + "name": "webgpu_blink_web_tests", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -2352,46 +2352,6 @@ }, { "args": [ - "webgpu_cts", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", - "--retry-limit=3", - "--jobs=4" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgpu_cts_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "display_attached": "1", - "gpu": "1002:6821", - "hidpi": "1", - "os": "Mac-12.1", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 14 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ "--flag-specific=webgpu-swiftshader", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--platform=mac-mac11", @@ -4380,12 +4340,12 @@ }, { "args": [ - "--flag-specific=webgpu-with-backend-validation", - "--timeout-ms=30000", + "--flag-specific=webgpu", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--platform=mac-mac11", "--git-revision=${got_revision}" ], + "check_flakiness_for_new_tests": false, "isolate_name": "webgpu_blink_web_tests", "merge": { "args": [ @@ -4393,7 +4353,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_backend_validation", + "name": "webgpu_blink_web_tests", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -4420,46 +4380,6 @@ }, { "args": [ - "webgpu_cts", - "--show-stdout", - "--browser=release", - "--passthrough", - "-v", - "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc --force_high_performance_gpu", - "--retry-limit=3", - "--jobs=4" - ], - "isolate_name": "telemetry_gpu_integration_test", - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "webgpu_cts_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "should_retry_with_patch": false, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "display_attached": "1", - "gpu": "1002:6821", - "hidpi": "1", - "os": "Mac-12.1", - "pool": "chromium.tests.gpu" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 14 - }, - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/" - }, - { - "args": [ "--flag-specific=webgpu-swiftshader", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--platform=mac-mac11", @@ -5364,6 +5284,48 @@ }, { "args": [ + "--flag-specific=webgpu-with-backend-validation", + "--timeout-ms=30000", + "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", + "--target=Release_x64", + "--git-revision=${got_revision}" + ], + "isolate_name": "webgpu_blink_web_tests", + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webgpu_blink_web_tests_with_backend_validation", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + }, + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:webgpu_blink_web_tests/" + }, + { + "args": [ "webgpu_cts", "--show-stdout", "--browser=release_x64", @@ -5444,6 +5406,48 @@ "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test_id_prefix": "ninja://:webgpu_blink_web_tests/" + }, + { + "args": [ + "--flag-specific=webgpu-swiftshader-with-backend-validation", + "--timeout-ms=30000", + "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", + "--target=Release_x64", + "--git-revision=${got_revision}" + ], + "isolate_name": "webgpu_blink_web_tests", + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:2184-27.21.14.5638", + "os": "Windows-10-18363", + "pool": "chromium.tests.gpu" + }, + { + "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", + "os": "Windows-10", + "pool": "chromium.tests.gpu" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:webgpu_blink_web_tests/" } ] }, @@ -5693,43 +5697,6 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", - "--timeout-ms=30000", - "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--target=Release_x64", - "--git-revision=${got_revision}" - ], - "isolate_name": "webgpu_blink_web_tests", - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", - "os": "Windows-10", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://:webgpu_blink_web_tests/" - }, - { - "args": [ "webgpu_cts", "--show-stdout", "--browser=release_x64", @@ -5803,7 +5770,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -5816,7 +5783,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -6123,7 +6090,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -6136,7 +6103,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -6271,7 +6238,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -6284,7 +6251,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -6631,43 +6598,6 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", - "--timeout-ms=30000", - "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", - "--target=Release_x64", - "--git-revision=${got_revision}" - ], - "isolate_name": "webgpu_blink_web_tests", - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:5912-26.20.100.8141|8086:3e92-26.20.100.8141", - "os": "Windows-10", - "pool": "chromium.tests.gpu" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://:webgpu_blink_web_tests/" - }, - { - "args": [ "webgpu_cts", "--show-stdout", "--browser=release_x64", @@ -6741,7 +6671,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -6754,7 +6684,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -7061,7 +6991,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -7074,7 +7004,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -7209,7 +7139,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--target=Release_x64", @@ -7222,7 +7152,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -7543,7 +7473,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -7555,7 +7485,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -7651,7 +7581,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -7663,7 +7593,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -7969,7 +7899,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -7981,7 +7911,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -8115,7 +8045,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -8127,7 +8057,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -8446,7 +8376,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -8458,7 +8388,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -8554,7 +8484,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -8566,7 +8496,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -8872,7 +8802,7 @@ }, { "args": [ - "--flag-specific=webgpu-with-partial-backend-validation", + "--flag-specific=webgpu-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -8884,7 +8814,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -9018,7 +8948,7 @@ }, { "args": [ - "--flag-specific=webgpu-swiftshader-with-partial-backend-validation", + "--flag-specific=webgpu-swiftshader-with-backend-validation", "--timeout-ms=30000", "--initialize-webgpu-adapter-at-startup-timeout-ms=60000", "--git-revision=${got_revision}" @@ -9030,7 +8960,7 @@ ], "script": "//third_party/blink/tools/merge_web_test_results.py" }, - "name": "webgpu_swiftshader_blink_web_tests_with_partial_backend_validation", + "name": "webgpu_swiftshader_blink_web_tests_with_backend_validation", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}",
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 5ee0266..c68f9db 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -15140,57 +15140,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -19207,58 +19156,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "PQ3A.190801.002", - "device_os_flavor": "google", - "device_os_type": "userdebug", - "device_type": "walleye", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -99293,21 +99190,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -99315,7 +99212,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true, @@ -99428,28 +99325,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "args": [ @@ -99549,28 +99446,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true, @@ -100908,20 +100805,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -100935,7 +100832,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "merge": { @@ -101073,20 +100970,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -101099,7 +100996,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "args": [ @@ -101219,20 +101116,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -101245,7 +101142,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "merge": { @@ -102741,20 +102638,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -102768,7 +102665,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "merge": { @@ -102906,20 +102803,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -102932,7 +102829,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "args": [ @@ -103052,20 +102949,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -103078,7 +102975,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "merge": { @@ -103813,20 +103710,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -103839,7 +103736,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" } ] }, @@ -103901,6 +103798,2493 @@ } ] }, + "linux-rel-no-external-ip": { + "gtest_tests": [ + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "absl_hardening_tests", + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "accessibility_unittests", + "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_unittests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", + "use_isolated_scripts_api": true + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "app_shell_unittests", + "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "aura_unittests", + "test_id_prefix": "ninja://ui/aura:aura_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "base_unittests", + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_common_unittests", + "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_fuzzer_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_heap_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_platform_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "webkit_unit_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_crypto_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_ssl_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test": "browser_tests", + "test_id_prefix": "ninja://chrome/test:browser_tests/" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "capture_unittests", + "test_id_prefix": "ninja://media/capture:capture_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cast_unittests", + "test_id_prefix": "ninja://media/cast:cast_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_app_unittests", + "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chromedriver_unittests", + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_browsertests", + "test_id_prefix": "ninja://components:components_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_unittests", + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "compositor_unittests", + "test_id_prefix": "ninja://ui/compositor:compositor_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test": "content_browsertests", + "test_id_prefix": "ninja://content/test:content_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "content_unittests", + "test_id_prefix": "ninja://content/test:content_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crashpad_tests", + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_tests", + "test_id_prefix": "ninja://components/cronet:cronet_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_unittests", + "test_id_prefix": "ninja://components/cronet:cronet_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crypto_unittests", + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "dbus_unittests", + "test_id_prefix": "ninja://dbus:dbus_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "device_unittests", + "test_id_prefix": "ninja://device:device_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "display_unittests", + "test_id_prefix": "ninja://ui/display:display_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "events_unittests", + "test_id_prefix": "ninja://ui/events:events_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_browsertests", + "test_id_prefix": "ninja://extensions:extensions_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_unittests", + "test_id_prefix": "ninja://extensions:extensions_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "filesystem_service_unittests", + "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcm_unit_tests", + "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gfx_unittests", + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gin_unittests", + "test_id_prefix": "ninja://gin:gin_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "google_apis_unittests", + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gwp_asan_unittests", + "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_browsertests", + "test_id_prefix": "ninja://headless:headless_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_unittests", + "test_id_prefix": "ninja://headless:headless_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "interactive_ui_tests", + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ipc_tests", + "test_id_prefix": "ninja://ipc:ipc_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "latency_unittests", + "test_id_prefix": "ninja://ui/latency:latency_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "libjingle_xmpp_unittests", + "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "liburlpattern_unittests", + "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "media_unittests", + "test_id_prefix": "ninja://media:media_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "message_center_unittests", + "test_id_prefix": "ninja://ui/message_center:message_center_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "midi_unittests", + "test_id_prefix": "ninja://media/midi:midi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_core_unittests", + "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_unittests", + "test_id_prefix": "ninja://mojo:mojo_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "nacl_loader_unittests", + "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "native_theme_unittests", + "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "net_unittests", + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "openscreen_unittests", + "test_id_prefix": "ninja://chrome/browser/media/router:openscreen_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ozone_x11_unittests", + "test_id_prefix": "ninja://ui/ozone:ozone_x11_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "pdf_unittests", + "test_id_prefix": "ninja://pdf:pdf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "perfetto_unittests", + "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ppapi_unittests", + "test_id_prefix": "ninja://ppapi:ppapi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "printing_unittests", + "test_id_prefix": "ninja://printing:printing_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "remoting_unittests", + "test_id_prefix": "ninja://remoting:remoting_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sandbox_linux_unittests", + "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "service_manager_unittests", + "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "services_unittests", + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "shell_dialogs_unittests", + "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "skia_unittests", + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "snapshot_unittests", + "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sql_unittests", + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "storage_unittests", + "test_id_prefix": "ninja://storage:storage_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sync_integration_tests", + "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_base_unittests", + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_touch_selection_unittests", + "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "unit_tests", + "test_id_prefix": "ninja://chrome/test:unit_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "url_unittests", + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "views_unittests", + "test_id_prefix": "ninja://ui/views:views_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "args": [ + "--enable-features=EnableOverlayPrioritization" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "overlay_prioritization_viz_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "vr_common_unittests", + "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "vr_pixeltests", + "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_browsertests", + "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_unittests", + "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wm_unittests", + "test_id_prefix": "ninja://ui/wm:wm_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wtf_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "xr_browser_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "xr_browser_tests", + "test_id_prefix": "ninja://chrome/test:xr_browser_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zlib_unittests", + "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" + } + ], + "isolated_scripts": [ + { + "isolate_name": "blink_python_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "blink_python_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:blink_python_tests/" + }, + { + "isolate_name": "blink_pytype", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "blink_pytype", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/blink/tools:blink_pytype/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 5 + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_wpt_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 7 + }, + "test_id_prefix": "ninja://:blink_wpt_tests/" + }, + { + "args": [ + "--test-type=integration" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "chromedriver_py_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_py_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/" + }, + { + "isolate_name": "chromedriver_replay_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_replay_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/" + }, + { + "isolate_name": "content_shell_crash_test", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "content_shell_crash_test", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://content/shell:content_shell_crash_test/" + }, + { + "isolate_name": "flatbuffers_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "flatbuffers_unittests", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/" + }, + { + "isolate_name": "fuchsia_pytype", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "fuchsia_pytype", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://testing:fuchsia_pytype/" + }, + { + "isolate_name": "gold_common_pytype", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gold_common_pytype", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://build:gold_common_pytype/" + }, + { + "isolate_name": "gpu_pytype", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gpu_pytype", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://content/test:gpu_pytype/" + }, + { + "isolate_name": "grit_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "grit_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://tools/grit:grit_python_unittests/" + }, + { + "args": [ + "--flag-specific=highdpi", + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "high_dpi_blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "args": [ + "--flag-specific=highdpi", + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "high_dpi_blink_wpt_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test_id_prefix": "ninja://:blink_wpt_tests/" + }, + { + "isolate_name": "mojo_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mojo_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/" + }, + { + "args": [ + "--flag-specific=disable-site-isolation-trials", + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "not_site_per_process_blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "args": [ + "--flag-specific=disable-site-isolation-trials", + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "not_site_per_process_blink_wpt_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test_id_prefix": "ninja://:blink_wpt_tests/" + }, + { + "isolate_name": "telemetry_gpu_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_gpu_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/" + }, + { + "args": [ + "--extra-browser-args=--enable-crashpad" + ], + "isolate_name": "telemetry_perf_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_perf_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/" + }, + { + "args": [ + "--jobs=1", + "--extra-browser-args=--disable-gpu" + ], + "isolate_name": "telemetry_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_unittests/" + }, + { + "isolate_name": "unexpected_passes_common_pytype", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "unexpected_passes_common_pytype", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://testing:unexpected_passes_common_pytype/" + }, + { + "args": [ + "--gtest-benchmark-name=views_perftests" + ], + "isolate_name": "views_perftests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "views_perftests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/views:views_perftests/" + }, + { + "args": [ + "--num-retries=3", + "--skipped=always", + "--test-list=../../testing/buildbot/filters/gpu.skiarenderer_vulkan_blink_web_tests.filter", + "--flag-specific=skia-vulkan-swiftshader", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "vulkan_swiftshader_blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "isolate_name": "webdriver_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "webdriver_tests_suite", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "os": "Ubuntu-18.04", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 4 + }, + "test_id_prefix": "ninja://:webdriver_wpt_tests/" + } + ] + }, "linux-upload-perfetto": { "additional_compile_targets": [ "trace_processor_shell" @@ -113629,6 +116013,2665 @@ } ] }, + "win10-rel-no-external-ip": { + "gtest_tests": [ + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "absl_hardening_tests", + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "accessibility_unittests", + "test_id_prefix": "ninja://ui/accessibility:accessibility_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_unittests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", + "use_isolated_scripts_api": true + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "app_shell_unittests", + "test_id_prefix": "ninja://extensions/shell:app_shell_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "aura_unittests", + "test_id_prefix": "ninja://ui/aura:aura_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "base_unittests", + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_common_unittests", + "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_fuzzer_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_fuzzer_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_heap_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_platform_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "webkit_unit_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_crypto_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_ssl_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test": "browser_tests", + "test_id_prefix": "ninja://chrome/test:browser_tests/" + }, + { + "args": [ + "--browser-ui-tests-verify-pixels", + "--enable-pixel-output-in-tests", + "--test-launcher-filter-file=../../testing/buildbot/filters/pixel_tests.filter", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "pixel_browser_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "browser_tests", + "test_id_prefix": "ninja://chrome/test:browser_tests/" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "capture_unittests", + "test_id_prefix": "ninja://media/capture:capture_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cast_unittests", + "test_id_prefix": "ninja://media/cast:cast_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_app_unittests", + "test_id_prefix": "ninja://chrome/test:chrome_app_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_cleaner_unittests", + "test_id_prefix": "ninja://chrome/chrome_cleaner:chrome_cleaner_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_elf_unittests", + "test_id_prefix": "ninja://chrome/chrome_elf:chrome_elf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chromedriver_unittests", + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "color_unittests", + "test_id_prefix": "ninja://ui/color:color_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_browsertests", + "test_id_prefix": "ninja://components:components_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_unittests", + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "compositor_unittests", + "test_id_prefix": "ninja://ui/compositor:compositor_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test": "content_browsertests", + "test_id_prefix": "ninja://content/test:content_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "content_unittests", + "test_id_prefix": "ninja://content/test:content_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "courgette_unittests", + "test_id_prefix": "ninja://courgette:courgette_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crashpad_tests", + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_tests", + "test_id_prefix": "ninja://components/cronet:cronet_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_unittests", + "test_id_prefix": "ninja://components/cronet:cronet_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crypto_unittests", + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "delayloads_unittests", + "test_id_prefix": "ninja://chrome/test:delayloads_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "device_unittests", + "test_id_prefix": "ninja://device:device_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "display_unittests", + "test_id_prefix": "ninja://ui/display:display_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "elevation_service_unittests", + "test_id_prefix": "ninja://chrome/elevation_service:elevation_service_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "events_unittests", + "test_id_prefix": "ninja://ui/events:events_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_browsertests", + "test_id_prefix": "ninja://extensions:extensions_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "extensions_unittests", + "test_id_prefix": "ninja://extensions:extensions_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "filesystem_service_unittests", + "test_id_prefix": "ninja://components/services/filesystem:filesystem_service_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcm_unit_tests", + "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcp_unittests", + "test_id_prefix": "ninja://chrome/credential_provider/test:gcp_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gfx_unittests", + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gin_unittests", + "test_id_prefix": "ninja://gin:gin_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "google_apis_unittests", + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gwp_asan_unittests", + "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_browsertests", + "test_id_prefix": "ninja://headless:headless_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "headless_unittests", + "test_id_prefix": "ninja://headless:headless_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "install_static_unittests", + "test_id_prefix": "ninja://chrome/install_static:install_static_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "integrity": "high", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "installer_util_unittests", + "test_id_prefix": "ninja://chrome/installer/util:installer_util_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "interactive_ui_tests", + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + }, + { + "args": [ + "--browser-ui-tests-verify-pixels", + "--enable-pixel-output-in-tests", + "--test-launcher-filter-file=../../testing/buildbot/filters/pixel_tests.filter", + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "name": "pixel_interactive_ui_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "interactive_ui_tests", + "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ipc_tests", + "test_id_prefix": "ninja://ipc:ipc_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "latency_unittests", + "test_id_prefix": "ninja://ui/latency:latency_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "libjingle_xmpp_unittests", + "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "liburlpattern_unittests", + "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "media_unittests", + "test_id_prefix": "ninja://media:media_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "message_center_unittests", + "test_id_prefix": "ninja://ui/message_center:message_center_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "midi_unittests", + "test_id_prefix": "ninja://media/midi:midi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_core_unittests", + "test_id_prefix": "ninja://mojo/core:mojo_core_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_unittests", + "test_id_prefix": "ninja://mojo:mojo_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "nacl_loader_unittests", + "test_id_prefix": "ninja://components/nacl/loader:nacl_loader_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "native_theme_unittests", + "test_id_prefix": "ninja://ui/native_theme:native_theme_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "net_unittests", + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "notification_helper_unittests", + "test_id_prefix": "ninja://chrome/notification_helper:notification_helper_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "pdf_unittests", + "test_id_prefix": "ninja://pdf:pdf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "perfetto_unittests", + "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ppapi_unittests", + "test_id_prefix": "ninja://ppapi:ppapi_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "printing_unittests", + "test_id_prefix": "ninja://printing:printing_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "remoting_unittests", + "test_id_prefix": "ninja://remoting:remoting_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "integrity": "high", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sbox_integration_tests", + "test_id_prefix": "ninja://sandbox/win:sbox_integration_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sbox_unittests", + "test_id_prefix": "ninja://sandbox/win:sbox_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sbox_validation_tests", + "test_id_prefix": "ninja://sandbox/win:sbox_validation_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "service_manager_unittests", + "test_id_prefix": "ninja://services/service_manager/tests:service_manager_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "services_unittests", + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "integrity": "high", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "setup_unittests", + "test_id_prefix": "ninja://chrome/installer/setup:setup_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "shell_dialogs_unittests", + "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "skia_unittests", + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "snapshot_unittests", + "test_id_prefix": "ninja://ui/snapshot:snapshot_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sql_unittests", + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "storage_unittests", + "test_id_prefix": "ninja://storage:storage_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sync_integration_tests", + "test_id_prefix": "ninja://chrome/test:sync_integration_tests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_base_unittests", + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_touch_selection_unittests", + "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "unit_tests", + "test_id_prefix": "ninja://chrome/test:unit_tests/" + }, + { + "args": [ + "--test-launcher-timeout=90000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "updater_tests", + "test_id_prefix": "ninja://chrome/updater:updater_tests/" + }, + { + "args": [ + "--test-launcher-print-test-stdio=always", + "--test-launcher-timeout=90000", + "--ui-test-action-max-timeout=45000", + "--ui-test-action-timeout=40000", + "--ui-test-action-timeout=40000" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "updater_tests_system", + "test_id_prefix": "ninja://chrome/updater:updater_tests_system/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "url_unittests", + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "args": [ + "--git-revision=${got_revision}" + ], + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "views_examples_unittests", + "test_id_prefix": "ninja://ui/views/examples:views_examples_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "views_unittests", + "test_id_prefix": "ninja://ui/views:views_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "vr_common_unittests", + "test_id_prefix": "ninja://chrome/browser/vr:vr_common_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "vr_pixeltests", + "test_id_prefix": "ninja://chrome/browser/vr:vr_pixeltests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_browsertests", + "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "weblayer_unittests", + "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wm_unittests", + "test_id_prefix": "ninja://ui/wm:wm_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wtf_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zlib_unittests", + "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" + }, + { + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_gtest_merge.py" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zucchini_unittests", + "test_id_prefix": "ninja://components/zucchini:zucchini_unittests/" + } + ], + "isolated_scripts": [ + { + "isolate_name": "blink_python_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "blink_python_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://:blink_python_tests/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_web_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_web_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 5 + }, + "test_id_prefix": "ninja://:blink_web_tests/" + }, + { + "args": [ + "--num-retries=3", + "--write-run-histories-to=${ISOLATED_OUTDIR}/run_histories.json", + "--git-revision=${got_revision}" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "blink_wpt_tests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--verbose" + ], + "script": "//third_party/blink/tools/merge_web_test_results.py" + }, + "name": "blink_wpt_tests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true + }, + "results_handler": "layout tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 7 + }, + "test_id_prefix": "ninja://:blink_wpt_tests/" + }, + { + "args": [ + "--test-type=integration" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "chromedriver_py_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_py_tests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_py_tests/" + }, + { + "isolate_name": "chromedriver_replay_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "chromedriver_replay_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/chromedriver:chromedriver_replay_unittests/" + }, + { + "args": [ + "--gtest-benchmark-name=components_perftests" + ], + "isolate_name": "components_perftests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "components_perftests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_perftests/" + }, + { + "isolate_name": "content_shell_crash_test", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "content_shell_crash_test", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://content/shell:content_shell_crash_test/" + }, + { + "isolate_name": "flatbuffers_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "flatbuffers_unittests", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/flatbuffers:flatbuffers_unittests/" + }, + { + "isolate_name": "grit_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "grit_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://tools/grit:grit_python_unittests/" + }, + { + "isolate_name": "mini_installer_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mini_installer_tests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "integrity": "high", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test/mini_installer:mini_installer_tests/" + }, + { + "isolate_name": "mojo_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "mojo_python_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://mojo/public/tools:mojo_python_unittests/" + }, + { + "experiment_percentage": 100, + "isolate_name": "polymer_tools_python_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "polymer_tools_python_unittests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://tools/polymer:polymer_tools_python_unittests/" + }, + { + "args": [ + "BrowserMinidumpTest", + "-v", + "--passthrough", + "--retry-limit=2" + ], + "check_flakiness_for_new_tests": false, + "isolate_name": "telemetry_perf_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_desktop_minidump_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/" + }, + { + "isolate_name": "telemetry_gpu_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_gpu_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://chrome/test:telemetry_gpu_unittests/" + }, + { + "args": [ + "--extra-browser-args=--enable-crashpad" + ], + "isolate_name": "telemetry_perf_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_perf_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_perf_unittests/" + }, + { + "args": [ + "--jobs=1", + "--extra-browser-args=--disable-gpu" + ], + "isolate_name": "telemetry_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "telemetry_unittests", + "resultdb": { + "enable": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "idempotent": false, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://chrome/test:telemetry_unittests/" + }, + { + "args": [ + "--gtest-benchmark-name=views_perftests" + ], + "isolate_name": "views_perftests", + "isolate_profile_data": true, + "merge": { + "args": [ + "--smoke-test-mode" + ], + "script": "//tools/perf/process_perf_results.py" + }, + "name": "views_perftests", + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Windows-10-19042", + "pool": "chromium.tests.no-external-ip" + } + ], + "expiration": 43200, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/views:views_perftests/" + } + ] + }, "win10.20h2-blink-rel": { "isolated_scripts": [ {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 94aa109c..de82cc0 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -15045,57 +15045,6 @@ }, { "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.asan.breakpad_unittests.filter" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "breakpad_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "cipd_packages": [ - { - "cipd_package": "infra/tools/luci/logdog/butler/${platform}", - "location": "bin", - "revision": "git_revision:ff387eadf445b24c935f1cf7d6ddd279f8a6b04c" - } - ], - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "os": "Android" - } - ], - "output_links": [ - { - "link": [ - "https://luci-logdog.appspot.com/v/?s", - "=android%2Fswarming%2Flogcats%2F", - "${TASK_ID}%2F%2B%2Funified_logcats" - ], - "name": "shard #${SHARD_INDEX} logcats" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "breakpad_unittests", - "test_id_prefix": "ninja://third_party/breakpad:breakpad_unittests/" - }, - { - "args": [ "--gtest_filter=-*UsingRealWebcam*", "--gs-results-bucket=chromium-result-details", "--recover-devices" @@ -20871,21 +20820,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5235.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -20898,7 +20847,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true, @@ -21036,21 +20985,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -21062,7 +21011,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "args": [ @@ -21182,21 +21131,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5235.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5236.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5235.0", - "revision": "version:106.0.5235.0" + "location": "lacros_version_skew_tests_v106.0.5236.0", + "revision": "version:106.0.5236.0" } ], "dimension_sets": [ @@ -21208,7 +21157,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5235.0" + "variant_id": "Lacros version skew testing ash 106.0.5236.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/filters/BUILD.gn b/testing/buildbot/filters/BUILD.gn index 321df91..35ec065 100644 --- a/testing/buildbot/filters/BUILD.gn +++ b/testing/buildbot/filters/BUILD.gn
@@ -57,12 +57,6 @@ ] } -source_set("breakpad_unittests_filters") { - testonly = true - - data = [ "//testing/buildbot/filters/android.asan.breakpad_unittests.filter" ] -} - source_set("browser_tests_filters") { testonly = true
diff --git a/testing/buildbot/filters/android.asan.breakpad_unittests.filter b/testing/buildbot/filters/android.asan.breakpad_unittests.filter deleted file mode 100644 index cac82b6..0000000 --- a/testing/buildbot/filters/android.asan.breakpad_unittests.filter +++ /dev/null
@@ -1,9 +0,0 @@ --ExceptionHandlerTest.AdditionalMemory --ExceptionHandlerTest.AdditionalMemoryRemove --ExceptionHandlerTest.GenerateMultipleDumpsWithFD --ExceptionHandlerTest.GenerateMultipleDumpsWithPath --ExceptionHandlerTest.InstructionPointerMemory --ExceptionHandlerTest.InstructionPointerMemoryMaxBound --ExceptionHandlerTest.InstructionPointerMemoryMinBound --ExceptionHandlerTest.ModuleInfo --ExceptionHandlerTest.WriteMinidumpExceptionStream
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index 8dac0d61..a0a1724d 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -286,10 +286,6 @@ "label": "//third_party/boringssl:boringssl_ssl_tests", "type": "console_test_launcher", }, - "breakpad_unittests": { - "label": "//third_party/breakpad:breakpad_unittests", - "type": "console_test_launcher", - }, "browser_tests": { "label": "//chrome/test:browser_tests", "type": "windowed_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 16140d62..2247dfbd 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -392,10 +392,6 @@ 'args': [ '--release', '--android', - # TODO(crbug.com/912120): Breakpad was entirely disabled on - # Android. Remove this when it no longer affects Android crash - # log handling. - '--disable-breakpad', # TODO(crbug.com/875172): run on the real GPU since the # software fallback, SwiftShader, isn't yet for 32-bit ARM. '--additional-driver-flag=--use-gpu-in-tests', @@ -682,10 +678,6 @@ 'args': [ '--release', '--android', - # TODO(crbug.com/912120): Breakpad was entirely disabled on - # Android. Remove this when it no longer affects Android crash - # log handling. - '--disable-breakpad', # TODO(crbug.com/875172): run on the real GPU since the # software fallback, SwiftShader, isn't yet for 32-bit ARM. '--additional-driver-flag=--use-gpu-in-tests', @@ -780,15 +772,6 @@ } }, }, - 'breakpad_unittests': { - 'modifications': { - 'android-asan': { - 'args': [ - '--test-launcher-filter-file=../../testing/buildbot/filters/android.asan.breakpad_unittests.filter', - ], - }, - }, - }, 'browser_tests': { 'remove_from': [ 'CrWinAsan(dll)', # https://crbug.com/935598 @@ -3806,11 +3789,6 @@ }, } }, - 'remove_from': [ - # GPU hang kills the bot. https://crbug.com/dawn/1511 - 'Dawn Mac x64 Release (AMD)', - 'Dawn Mac x64 DEPS Release (AMD)', - ], }, 'webgpu_blink_web_tests_with_backend_validation': { 'replacements': { @@ -3820,6 +3798,60 @@ }, }, }, + # Remove from bots where capacity is constrained. + 'remove_from': [ + 'Dawn Mac x64 DEPS Release (AMD)', + 'Dawn Mac x64 Release (AMD)', + 'Dawn Win10 x64 DEPS Release (Intel HD 630)', + 'Dawn Win10 x64 Release (Intel HD 630)', + ], + }, + 'webgpu_cts_tests': { + 'remove_from': [ + # GPU hang kills the bot. https://crbug.com/dawn/1511 + 'Dawn Mac x64 Release (AMD)', + 'Dawn Mac x64 DEPS Release (AMD)', + ], + }, + 'webgpu_cts_with_validation_tests': { + # Remove from bots where capacity is constrained. + 'remove_from': [ + 'Dawn Mac x64 DEPS Release (AMD)', + 'Dawn Mac x64 Release (AMD)', + 'Dawn Win10 x64 DEPS Release (Intel HD 630)', + 'Dawn Win10 x64 Release (Intel HD 630)', + 'Dawn Win10 x86 DEPS Release (Intel HD 630)', + 'Dawn Win10 x86 Release (Intel HD 630)', + ], + 'modifications': { + # ci_only for bots where capacity is constrained. + 'Dawn Linux x64 DEPS Release (Intel UHD 630)': { + 'ci_only': True, + }, + 'Dawn Linux x64 Release (Intel UHD 630)': { + 'ci_only': True, + }, + }, + }, + 'webgpu_swiftshader_web_platform_cts_with_validation_tests': { + # Remove from bots where capacity is constrained. + 'remove_from': [ + 'Dawn Mac x64 DEPS Release (AMD)', + 'Dawn Mac x64 Release (AMD)', + 'Dawn Win10 x64 DEPS Release (Intel HD 630)', + 'Dawn Win10 x64 Release (Intel HD 630)', + 'Dawn Win10 x86 DEPS Release (Intel HD 630)', + 'Dawn Win10 x86 Release (Intel HD 630)', + ], + 'modifications': { + # ci_only for bots where capacity is constrained. + 'Dawn Linux x64 DEPS Release (Intel UHD 630)': { + 'ci_only': True, + }, + 'Dawn Linux x64 Release (Intel UHD 630)': { + 'ci_only': True, + }, + }, }, 'webkit_unit_tests': { 'remove_from': [
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 16bc107..91711ac 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -266,7 +266,6 @@ ], }, 'android_webview_unittests': {}, - 'breakpad_unittests': {}, 'content_shell_test_apk': { 'swarming': { 'shards': 3, @@ -2301,6 +2300,18 @@ }, }, + 'gpu_dawn_common_isolated_scripts': { + # Test that expectations files are well-formed. + 'telemetry_gpu_unittests': { + 'swarming': { + 'idempotent': False, # https://crbug.com/549140 + }, + 'resultdb': { + 'enable': True, + }, + }, + }, + # GPU gtests that test only Dawn 'gpu_dawn_gtests': { 'dawn_end2end_skip_validation_tests': { @@ -2368,35 +2379,7 @@ }, }, - 'gpu_dawn_telemetry_cts_asan_tests': { - 'webgpu_cts': { - 'args': [ - '--extra-browser-args=--force_high_performance_gpu', - '--retry-limit=3', - '--jobs=4', - ], - 'linux_args': [ - '--extra-browser-args=--enable-features=Vulkan', - ], - 'mixins': [ - 'has_native_resultdb_integration', - ], - 'swarming': { - 'shards': 8, - }, - }, - }, - - 'gpu_dawn_telemetry_cts_tests': { - 'webgpu_cts': { - 'mixins': [ - 'has_native_resultdb_integration', - 'webgpu_telemetry_cts', - ], - 'swarming': { - 'shards': 14, - }, - }, + 'gpu_dawn_web_platform_webgpu_cts_force_swiftshader': { 'webgpu_swiftshader_web_platform_cts': { 'args': [ '--use-webgpu-adapter=swiftshader', @@ -2411,27 +2394,7 @@ }, 'telemetry_test_name': 'webgpu_cts', }, - }, - - # Test suites to run the CTS with validation layers only on CI for - # configurations where capacity is constrained. - 'gpu_dawn_telemetry_cts_tests_with_ci_only_validation': { - 'webgpu_cts_with_validation': { - 'ci_only': True, - 'args': [ - '--enable-dawn-backend-validation', - ], - 'mixins': [ - 'has_native_resultdb_integration', - 'webgpu_telemetry_cts', - ], - 'swarming': { - 'shards': 14, - }, - 'telemetry_test_name': 'webgpu_cts', - }, 'webgpu_swiftshader_web_platform_cts_with_validation': { - 'ci_only': True, 'args': [ '--use-webgpu-adapter=swiftshader', '--test-filter=*web_platform*', @@ -2448,7 +2411,72 @@ }, }, - 'gpu_dawn_telemetry_cts_tests_with_validation': { + 'gpu_dawn_webgpu_blink_web_tests': { + 'webgpu_blink_web_tests': { + 'name': 'webgpu_blink_web_tests', + 'isolate_name': 'webgpu_blink_web_tests', + 'args': [ + '--flag-specific=webgpu', + ], + 'mixins': [ + # TODO(crbug.com/1327314): Enable for blink web tests. + 'disable_check_flakiness_web_tests', + 'webgpu_cts', + 'skia_gold_test', + ], + }, + 'webgpu_blink_web_tests_with_backend_validation': { + 'name': 'webgpu_blink_web_tests_with_backend_validation', + 'isolate_name': 'webgpu_blink_web_tests', + 'args': [ + '--flag-specific=webgpu-with-backend-validation', + # Increase the timeout when using backend validation layers (crbug.com/1208253) + '--timeout-ms=30000', + ], + 'mixins': [ + 'webgpu_cts', + 'skia_gold_test', + ], + }, + }, + + 'gpu_dawn_webgpu_blink_web_tests_force_swiftshader': { + 'webgpu_swiftshader_blink_web_tests': { + 'name': 'webgpu_swiftshader_blink_web_tests', + 'isolate_name': 'webgpu_blink_web_tests', + 'args': [ + '--flag-specific=webgpu-swiftshader', + ], + 'mixins': [ + 'webgpu_cts', + 'skia_gold_test', + ], + }, + 'webgpu_swiftshader_blink_web_tests_with_backend_validation': { + 'name': 'webgpu_swiftshader_blink_web_tests_with_backend_validation', + 'isolate_name': 'webgpu_blink_web_tests', + 'args': [ + '--flag-specific=webgpu-swiftshader-with-backend-validation', + # Increase the timeout when using backend validation layers (crbug.com/1208253) + '--timeout-ms=30000', + ], + 'mixins': [ + 'webgpu_cts', + 'skia_gold_test', + ], + }, + }, + + 'gpu_dawn_webgpu_cts': { + 'webgpu_cts': { + 'mixins': [ + 'has_native_resultdb_integration', + 'webgpu_telemetry_cts', + ], + 'swarming': { + 'shards': 14, + }, + }, 'webgpu_cts_with_validation': { 'args': [ '--enable-dawn-backend-validation', @@ -2462,20 +2490,17 @@ }, 'telemetry_test_name': 'webgpu_cts', }, - 'webgpu_swiftshader_web_platform_cts_with_validation': { - 'args': [ - '--use-webgpu-adapter=swiftshader', - '--test-filter=*web_platform*', - '--enable-dawn-backend-validation', - ], + }, + + 'gpu_dawn_webgpu_cts_asan': { + 'webgpu_cts': { 'mixins': [ 'has_native_resultdb_integration', 'webgpu_telemetry_cts', ], 'swarming': { - 'shards': 2, + 'shards': 8, }, - 'telemetry_test_name': 'webgpu_cts', }, }, @@ -3409,102 +3434,6 @@ }, }, - 'gpu_webgpu_integration_backend_validation_isolated_scripts': { - 'webgpu_blink_web_tests_with_backend_validation': { - 'name': 'webgpu_blink_web_tests_with_backend_validation', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu-with-backend-validation', - # Increase the timeout when using backend validation layers (crbug.com/1208253) - '--timeout-ms=30000', - ], - 'mixins': [ - 'webgpu_cts', - 'skia_gold_test', - ], - }, - 'webgpu_swiftshader_blink_web_tests_with_backend_validation': { - 'name': 'webgpu_swiftshader_blink_web_tests_with_backend_validation', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu-swiftshader-with-backend-validation', - # Increase the timeout when using backend validation layers (crbug.com/1208253) - '--timeout-ms=30000', - ], - 'mixins': [ - 'webgpu_cts', - 'skia_gold_test', - ], - }, - }, - - 'gpu_webgpu_integration_isolated_scripts': { - # Test that expectations files are well-formed. - 'telemetry_gpu_unittests': { - 'swarming': { - 'idempotent': False, # https://crbug.com/549140 - }, - 'resultdb': { - 'enable': True, - }, - }, - 'webgpu_blink_web_tests': { - 'name': 'webgpu_blink_web_tests', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu', - ], - 'mixins': [ - # TODO(crbug.com/1327314): Enable for blink web tests. - 'disable_check_flakiness_web_tests', - 'webgpu_cts', - 'skia_gold_test', - ], - }, - 'webgpu_swiftshader_blink_web_tests': { - 'name': 'webgpu_swiftshader_blink_web_tests', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu-swiftshader', - ], - 'mixins': [ - 'webgpu_cts', - 'skia_gold_test', - ], - }, - }, - - # For Windows. Use the D3D12 backend validation layers but without GPU-based - # validation and shader patching. This avoids hangs on less powerful systems. - 'gpu_webgpu_integration_partial_backend_validation_isolated_scripts': { - 'webgpu_blink_web_tests_with_backend_validation': { - 'name': 'webgpu_blink_web_tests_with_partial_backend_validation', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu-with-partial-backend-validation', - # Increase the timeout when using backend validation layers (crbug.com/1208253) - '--timeout-ms=30000', - ], - 'mixins': [ - 'webgpu_cts', - 'skia_gold_test', - ], - }, - 'webgpu_swiftshader_blink_web_tests_with_backend_validation': { - 'name': 'webgpu_swiftshader_blink_web_tests_with_partial_backend_validation', - 'isolate_name': 'webgpu_blink_web_tests', - 'args': [ - '--flag-specific=webgpu-swiftshader-with-partial-backend-validation', - # Increase the timeout when using backend validation layers (crbug.com/1208253) - '--timeout-ms=30000', - ], - 'mixins': [ - 'webgpu_cts', - 'skia_gold_test', - ], - }, - }, - 'gpu_win_intel_specific_telemetry_tests': { 'power_measurement_test': { 'telemetry_test_name': 'power', @@ -5717,8 +5646,10 @@ ], 'gpu_dawn_asan_isolated_scripts': [ + 'gpu_dawn_common_isolated_scripts', 'gpu_dawn_perf_smoke_isolated_scripts', - 'gpu_webgpu_integration_isolated_scripts', + 'gpu_dawn_webgpu_blink_web_tests', + 'gpu_dawn_webgpu_blink_web_tests_force_swiftshader', ], 'gpu_dawn_integration_asan_gtests_passthrough': [ @@ -5743,32 +5674,15 @@ ], 'gpu_dawn_isolated_scripts': [ + 'gpu_dawn_common_isolated_scripts', 'gpu_dawn_perf_smoke_isolated_scripts', - 'gpu_webgpu_integration_isolated_scripts', - 'gpu_webgpu_integration_backend_validation_isolated_scripts', + 'gpu_dawn_webgpu_blink_web_tests', + 'gpu_dawn_webgpu_blink_web_tests_force_swiftshader', ], - 'gpu_dawn_isolated_scripts_win': [ - 'gpu_dawn_perf_smoke_isolated_scripts', - 'gpu_webgpu_integration_isolated_scripts', - 'gpu_webgpu_integration_partial_backend_validation_isolated_scripts', - ], - - 'gpu_dawn_telemetry_cts_regular': [ - 'gpu_dawn_telemetry_cts_tests', - ], - - # TODO(crbug.com/1321877): Instead of having CI-only test suites, we should - # split CI and CQ configurations so we can make manual trybots that mirror the - # CI bots as well. - 'gpu_dawn_telemetry_cts_regular_and_ci_only_validation': [ - 'gpu_dawn_telemetry_cts_tests', - 'gpu_dawn_telemetry_cts_tests_with_ci_only_validation', - ], - - 'gpu_dawn_telemetry_cts_regular_and_validation': [ - 'gpu_dawn_telemetry_cts_tests', - 'gpu_dawn_telemetry_cts_tests_with_validation', + 'gpu_dawn_telemetry_tests': [ + 'gpu_dawn_webgpu_cts', + 'gpu_dawn_web_platform_webgpu_cts_force_swiftshader', ], 'gpu_desktop_mac_gtests': [
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index 26f4789..0dee025 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5235.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5236.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 106.0.5235.0', + 'identifier': 'Lacros version skew testing ash 106.0.5236.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v106.0.5235.0', - 'revision': 'version:106.0.5235.0', + 'location': 'lacros_version_skew_tests_v106.0.5236.0', + 'revision': 'version:106.0.5236.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index a326d64..9dde0ea 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -2190,7 +2190,7 @@ 'linux_intel_uhd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_ci_only_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2202,7 +2202,7 @@ 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2214,7 +2214,7 @@ 'linux_intel_uhd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_ci_only_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2226,7 +2226,7 @@ 'linux_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2240,7 +2240,7 @@ 'mac_retina_amd_gpu_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2252,7 +2252,7 @@ 'mac_mini_intel_gpu_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2265,7 +2265,7 @@ 'mac_retina_amd_gpu_experimental', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2281,7 +2281,7 @@ # driver. If it's upgraded, change these test_suites to be the same as # 'Dawn Mac x64 Release (Intel)'. 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2293,7 +2293,7 @@ 'mac_retina_amd_gpu_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2305,7 +2305,7 @@ 'mac_mini_intel_gpu_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, @@ -2318,7 +2318,7 @@ 'win10_intel_hd_630_stable_dimension_set', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_asan_tests', + 'gpu_telemetry_tests': 'gpu_dawn_webgpu_cts_asan', 'gtest_tests': 'gpu_dawn_integration_asan_gtests_passthrough', 'isolated_scripts': 'gpu_dawn_asan_isolated_scripts', }, @@ -2332,9 +2332,9 @@ 'win10_intel_hd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x64 DEPS Release (NVIDIA)': { @@ -2344,9 +2344,9 @@ 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x64 Release (Intel HD 630)': { @@ -2356,9 +2356,9 @@ 'win10_intel_hd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x64 Release (NVIDIA)': { @@ -2368,9 +2368,9 @@ 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x86 Builder' : {}, @@ -2382,9 +2382,9 @@ 'win10_intel_hd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x86 DEPS Release (NVIDIA)': { @@ -2394,9 +2394,9 @@ 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x86 Release (Intel HD 630)': { @@ -2406,9 +2406,9 @@ 'win10_intel_hd_630_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough_win_intel', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, 'Dawn Win10 x86 Release (NVIDIA)': { @@ -2418,9 +2418,9 @@ 'win10_nvidia_gtx_1660_stable', ], 'test_suites': { - 'gpu_telemetry_tests': 'gpu_dawn_telemetry_cts_regular_and_validation', + 'gpu_telemetry_tests': 'gpu_dawn_telemetry_tests', 'gtest_tests': 'gpu_dawn_integration_gtests_passthrough', - 'isolated_scripts': 'gpu_dawn_isolated_scripts_win', + 'isolated_scripts': 'gpu_dawn_isolated_scripts', }, }, } @@ -3686,6 +3686,24 @@ 'gtest_tests': 'perfetto_gtests', }, }, + 'linux-rel-no-external-ip': { + 'mixins': [ + 'isolate_profile_data', + 'linux-bionic', + ], + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.tests.no-external-ip', + } + ], + 'expiration': 43200, + }, + 'test_suites': { + 'gtest_tests': 'chromium_linux_gtests', + 'isolated_scripts': 'chromium_linux_rel_isolated_scripts', + }, + }, 'linux-upload-perfetto': { 'additional_compile_targets': [ 'trace_processor_shell' ], 'test_suites': { @@ -3896,6 +3914,25 @@ 'gtest_tests': 'chromium_win_gtests', }, }, + 'win10-rel-no-external-ip': { + 'mixins': [ + 'x86-64', + 'win10', + 'isolate_profile_data', + ], + 'swarming': { + 'dimension_sets': [ + { + 'pool': 'chromium.tests.no-external-ip', + } + ], + 'expiration': 43200, + }, + 'test_suites': { + 'gtest_tests': 'chromium_win10_gtests', + 'isolated_scripts': 'chromium_win_rel_isolated_scripts', + }, + }, 'win10.20h2-blink-rel': { 'mixins': [ 'win10',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 6bd8171..5333498 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -3000,27 +3000,6 @@ ] } ], - "CompositedCaret": [ - { - "platforms": [ - "android", - "android_webview", - "chromeos", - "chromeos_lacros", - "linux", - "mac", - "windows" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "CompositedCaret" - ] - } - ] - } - ], "ConsolidatedSiteStorageControls": [ { "platforms": [ @@ -5236,6 +5215,21 @@ ] } ], + "IOSMediaPermissionsControl": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "MediaPermissionsControl" + ] + } + ] + } + ], "IOSNewOverflowMenu": [ { "platforms": [ @@ -5753,22 +5747,6 @@ ] } ], - "KeyPinningAndroid": [ - { - "platforms": [ - "android" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "KeyPinningComponentUpdater", - "StaticKeyPinningEnforcement" - ] - } - ] - } - ], "KeyboardAccessoryAddressIPH": [ { "platforms": [ @@ -8154,6 +8132,24 @@ ] } ], + "SearchResumptionModuleAndroid": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "use_new_service": "true" + }, + "enable_features": [ + "SearchResumptionModuleAndroid" + ] + } + ] + } + ], "SegmentationStructuredMetrics": [ { "platforms": [
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 86ec16c..ce77b33 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1380,9 +1380,6 @@ base::FEATURE_ENABLED_BY_DEFAULT}; #endif -const base::Feature kCompositedCaret{"CompositedCaret", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kBackForwardCacheAppBanner{ "BackForwardCacheAppBanner", base::FEATURE_DISABLED_BY_DEFAULT};
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 91e4bcd..7eb7d951 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -647,8 +647,6 @@ BLINK_COMMON_EXPORT extern const base::Feature kPrefetchAndroidFonts; #endif -BLINK_COMMON_EXPORT extern const base::Feature kCompositedCaret; - // Allows pages that support App Install Banners to stay eligible for the // back/forward cache. BLINK_COMMON_EXPORT extern const base::Feature kBackForwardCacheAppBanner;
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc index 126a8f5..f5e1ba3 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc +++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.cc
@@ -127,9 +127,9 @@ TRACE_ID_LOCAL(this), TRACE_EVENT_FLAG_FLOW_IN | TRACE_EVENT_FLAG_FLOW_OUT, "data", [&](perfetto::TracedValue context) { - inspector_deserialize_script_event::Data( - std::move(context), script_resource_identifier_, - script_url_string_.IsolatedCopy()); + inspector_deserialize_script_event::Data(std::move(context), + script_resource_identifier_, + script_url_string_); }); consume_task_->MergeWithExistingScript();
diff --git a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h index 5b03e52..f0bd97d 100644 --- a/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h +++ b/third_party/blink/renderer/bindings/core/v8/script_cache_consumer.h
@@ -157,8 +157,7 @@ // The task runner on which the finish callback should be run. scoped_refptr<base::SingleThreadTaskRunner> finish_callback_task_runner_; - // Keep the script URL string for event tracing. This is owned by the main - // thread, and should be copied when used off-thread. + // Keep the script URL string for event tracing. const String script_url_string_; // Keep the script resource dentifier for event tracing.
diff --git a/third_party/blink/renderer/build/scripts/json5_generator.py b/third_party/blink/renderer/build/scripts/json5_generator.py index 0a9aa53c..b6a6ed6 100644 --- a/third_party/blink/renderer/build/scripts/json5_generator.py +++ b/third_party/blink/renderer/build/scripts/json5_generator.py
@@ -332,9 +332,16 @@ parser.add_argument("--gperf", default="gperf") parser.add_argument("--output_dir", default=os.getcwd()) + parser.add_argument("--generate_tag_enum", + default=False, + action='store_true') args = parser.parse_args() - writer = self._writer_class(args.files, args.output_dir) + if args.generate_tag_enum: + writer = self._writer_class(args.files, args.output_dir, + args.generate_tag_enum) + else: + writer = self._writer_class(args.files, args.output_dir) writer.set_gperf_path(args.gperf) writer.write_files(args.output_dir) writer.cleanup_files(args.output_dir)
diff --git a/third_party/blink/renderer/build/scripts/make_element_factory.py b/third_party/blink/renderer/build/scripts/make_element_factory.py index bb3e5f4..0ec343d 100755 --- a/third_party/blink/renderer/build/scripts/make_element_factory.py +++ b/third_party/blink/renderer/build/scripts/make_element_factory.py
@@ -55,7 +55,7 @@ }) filters = MakeQualifiedNamesWriter.filters - def __init__(self, json5_file_paths, output_dir): + def __init__(self, json5_file_paths, output_dir, generate_tag_enum=False): super(MakeElementFactoryWriter, self).__init__(json5_file_paths, output_dir) @@ -96,6 +96,8 @@ fallback_js_interface, 'input_files': self._input_files, + 'generate_tag_enum': + generate_tag_enum }) @template_expander.use_jinja(
diff --git a/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.cc.tmpl index 0b7e7c9..5777bbd 100644 --- a/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.cc.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.cc.tmpl
@@ -10,15 +10,33 @@ #include "third_party/blink/renderer/core/{{namespace|lower}}_names.h" namespace blink { +namespace { -const AtomicString& lookup{{namespace}}Tag(const UChar* data, unsigned length) { +template <typename CharType> +{{namespace|lower}}_names::HTMLTag lookup{{namespace}}TagImpl( + const CharType* data, + unsigned length) { DCHECK(data); DCHECK(length); {% macro trie_return_statement(tag) -%} - {{namespace|lower}}_names::{{tag|symbol}}Tag.LocalName() + {{namespace|lower}}_names::HTMLTag::{{tag|symbol}}; {%- endmacro %} {{ trie_length_switch(length_tries, trie_return_statement, false) | indent(4) }} - return g_null_atom; + return {{namespace|lower}}_names::HTMLTag::kUnknown; +} + +} // namespace + +CORE_EXPORT {{namespace|lower}}_names::HTMLTag lookup{{namespace}}Tag( + const UChar* data, + unsigned length) { + return lookupHTMLTagImpl(data, length); +} + +CORE_EXPORT {{namespace|lower}}_names::HTMLTag lookup{{namespace}}Tag( + const LChar* data, + unsigned length) { + return lookupHTMLTagImpl(data, length); } } // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.h.tmpl b/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.h.tmpl index fc240a9..8645c72 100644 --- a/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.h.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/element_lookup_trie.h.tmpl
@@ -7,11 +7,24 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_{{namespace|upper}}_ELEMENT_LOOKUP_TRIE_H_ #include "third_party/blink/renderer/core/core_export.h" -#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_uchar.h" namespace blink { +namespace {{namespace|lower}}_names { +enum class HTMLTag; +} -CORE_EXPORT const AtomicString& lookup{{namespace}}Tag(const UChar* data, unsigned length); +// Returns the tag for the supplied string. If the string matches a valid tag, +// `tag` is set and true is returned, otherwise this returns false. +CORE_EXPORT {{namespace|lower}}_names::HTMLTag lookup{{namespace}}Tag( + const UChar* data, + unsigned length); + +// Returns the tag for the supplied string. If the string matches a valid tag, +// `tag` is set and true is returned, otherwise this returns false. +CORE_EXPORT {{namespace|lower}}_names::HTMLTag lookup{{namespace}}Tag( + const LChar* data, + unsigned length); } // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/templates/make_qualified_names.cc.tmpl b/third_party/blink/renderer/build/scripts/templates/make_qualified_names.cc.tmpl index ed042c3..134660b 100644 --- a/third_party/blink/renderer/build/scripts/templates/make_qualified_names.cc.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/make_qualified_names.cc.tmpl
@@ -104,5 +104,19 @@ DCHECK_EQ(attr_i, kAttrsCount); } +{% if generate_tag_enum %} +const blink::{{namespace}}QualifiedName& TagToQualifedName( + {{namespace}}Tag tag) { + switch (tag) { +{% for tag in tags|sort(attribute='name', case_sensitive=True) %} + case {{namespace}}Tag::{{tag|symbol}}: + return {{tag|symbol}}Tag; +{% endfor %} + case {{namespace}}Tag::kUnknown: + return static_cast<const blink::{{namespace}}QualifiedName&>(g_null_name); + } +} +{% endif %} + } // namespace {{cpp_namespace}} } // namespace blink
diff --git a/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl b/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl index bd5566b0..cc27e09 100644 --- a/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl +++ b/third_party/blink/renderer/build/scripts/templates/make_qualified_names.h.tmpl
@@ -24,6 +24,18 @@ {{symbol_export}}extern const WTF::AtomicString& {{namespace_prefix}}NamespaceURI; // Tags + +{% if generate_tag_enum %} +enum class {{namespace}}Tag { + // Explicitly give unknown a value of 0 as comparison to unknown happens a + // lot, and comparing to 0 saves an instruction on some hardware. + kUnknown = 0, +{% for tag in tags|sort(attribute='name') %} + {{tag|symbol}}, +{% endfor %} +}; +{% endif %} + {% for tag in tags|sort(attribute='name') %} {{symbol_export}}extern const blink::{{namespace}}QualifiedName& {{tag|symbol}}Tag; {% endfor %} @@ -43,6 +55,10 @@ std::unique_ptr<const QualifiedName*[]> GetAttrs(); {% endif %} +{% if generate_tag_enum %} +{{symbol_export}} extern const blink::{{namespace}}QualifiedName& TagToQualifedName({{namespace}}Tag tag); +{% endif %} + void Init(); } // namespace {{cpp_namespace}}
diff --git a/third_party/blink/renderer/core/BUILD.gn b/third_party/blink/renderer/core/BUILD.gn index 67e1ab8..5bea05b0 100644 --- a/third_party/blink/renderer/core/BUILD.gn +++ b/third_party/blink/renderer/core/BUILD.gn
@@ -802,6 +802,7 @@ "$blink_core_output_dir/html_names.cc", "$blink_core_output_dir/html_names.h", ] + other_args = [ "--generate_tag_enum" ] } process_json5_files("make_core_generated_html_element_type_helpers") {
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 2df1357..33208a1 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -3126,6 +3126,8 @@ // nothing. if (GetPopupData()->visibilityState() == PopupVisibilityState::kHidden) return; + if (!GetComputedStyle()) + return; float hide_delay_seconds = GetComputedStyle()->PopUpHideDelay(); // If the value is infinite or NaN, don't hide the pop-up. if (!std::isfinite(hide_delay_seconds)) @@ -3187,58 +3189,61 @@ // If we've just hovered an element (or the descendant of an element), see // if it has a popuphovertarget attribute that points to a valid pop-up // element. If so, queue a task to show the pop-up after a timeout. - if (Element* popup_element = PopupHoverTargetElement()) { - auto& hover_tasks = popup_element->GetPopupData()->hoverShowTasks(); - DCHECK(!hover_tasks.Contains(this)); - - float hover_delay_seconds = GetComputedStyle()->PopUpShowDelay(); - // If the value is infinite or NaN, don't queue a task at all. - DCHECK_GE(hover_delay_seconds, 0); - if (std::isfinite(hover_delay_seconds)) { - // It's possible that multiple nested elements have popuphovertarget - // attributes pointing to the same pop-up, and in that case, we want to - // trigger on the first of them that reaches its timeout threshold. - hover_tasks.insert( - this, - PostDelayedCancellableTask( - *GetExecutionContext()->GetTaskRunner( - TaskType::kInternalDefault), - FROM_HERE, - WTF::Bind( - [](Element* trigger_element, Element* popup_element) { - if (!popup_element || - !popup_element->HasValidPopupAttribute()) - return; - // Remove this element from hoverShowTasks always. - popup_element->GetPopupData()->hoverShowTasks().erase( - trigger_element); - // Only trigger the pop-up if the popuphovertarget - // attribute still points to the same pop-up, and the - // pop-up is in the tree and still not showing. - if (popup_element->IsInTreeScope() && - !popup_element->popupOpen() && - popup_element == - trigger_element->GetTreeScope().getElementById( - trigger_element->FastGetAttribute( - html_names::kPopuphovertargetAttr))) { - popup_element->InvokePopup(trigger_element); - } - }, - WrapWeakPersistent(this), - WrapWeakPersistent(popup_element)), - base::Seconds(hover_delay_seconds))); - } - } + Element* popup_element = PopupHoverTargetElement(); + if (!popup_element) + return; + auto& hover_tasks = popup_element->GetPopupData()->hoverShowTasks(); + DCHECK(!hover_tasks.Contains(this)); + if (!GetComputedStyle()) + return; + float hover_delay_seconds = GetComputedStyle()->PopUpShowDelay(); + // If the value is infinite or NaN, don't queue a task at all. + DCHECK_GE(hover_delay_seconds, 0); + if (!std::isfinite(hover_delay_seconds)) + return; + // It's possible that multiple nested elements have popuphovertarget + // attributes pointing to the same pop-up, and in that case, we want to + // trigger on the first of them that reaches its timeout threshold. + hover_tasks.insert( + this, + PostDelayedCancellableTask( + *GetExecutionContext()->GetTaskRunner(TaskType::kInternalDefault), + FROM_HERE, + WTF::Bind( + [](Element* trigger_element, Element* popup_element) { + if (!popup_element || + !popup_element->HasValidPopupAttribute()) + return; + // Remove this element from hoverShowTasks always. + popup_element->GetPopupData()->hoverShowTasks().erase( + trigger_element); + // Only trigger the pop-up if the popuphovertarget attribute + // still points to the same pop-up, and the pop-up is in the + // tree and still not showing. + auto* current_target = + trigger_element->GetTreeScope().getElementById( + trigger_element->FastGetAttribute( + html_names::kPopuphovertargetAttr)); + if (popup_element->IsInTreeScope() && + !popup_element->popupOpen() && + popup_element == current_target) { + popup_element->InvokePopup(trigger_element); + } + }, + WrapWeakPersistent(this), WrapWeakPersistent(popup_element)), + base::Seconds(hover_delay_seconds))); } else { // If we have a hover show task still waiting, cancel it. Based on this // logic, if you hover a popuphovertarget element, then remove the // popuphovertarget attribute, there will be no way to stop the pop-up from // being shown after the delay, even if you subsequently de-hover the // element. - if (Element* hover_pop_up = PopupHoverTargetElement()) { - auto& hover_tasks = hover_pop_up->GetPopupData()->hoverShowTasks(); - if (hover_tasks.Contains(this)) - hover_tasks.Take(this).Cancel(); + Element* hover_pop_up = PopupHoverTargetElement(); + if (!hover_pop_up) + return; + if (auto& hover_tasks = hover_pop_up->GetPopupData()->hoverShowTasks(); + hover_tasks.Contains(this)) { + hover_tasks.Take(this).Cancel(); } } }
diff --git a/third_party/blink/renderer/core/editing/frame_caret.cc b/third_party/blink/renderer/core/editing/frame_caret.cc index 6dd8ae51d..02b14e5 100644 --- a/third_party/blink/renderer/core/editing/frame_caret.cc +++ b/third_party/blink/renderer/core/editing/frame_caret.cc
@@ -26,7 +26,6 @@ #include "third_party/blink/renderer/core/editing/frame_caret.h" #include "base/location.h" -#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/platform/task_type.h" #include "third_party/blink/renderer/core/editing/caret_display_item_client.h" #include "third_party/blink/renderer/core/editing/editing_utilities.h" @@ -37,7 +36,6 @@ #include "third_party/blink/renderer/core/editing/visible_position.h" #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/local_frame_view.h" -#include "third_party/blink/renderer/core/frame/settings.h" #include "third_party/blink/renderer/core/html/forms/text_control_element.h" #include "third_party/blink/renderer/core/layout/layout_block.h" #include "third_party/blink/renderer/core/layout/layout_embedded_content.h" @@ -61,8 +59,6 @@ caret_blink_timer_(frame.GetTaskRunner(TaskType::kInternalDefault), this, &FrameCaret::CaretBlinkTimerFired), - is_composited_caret_enabled_( - base::FeatureList::IsEnabled(features::kCompositedCaret)), effect_(EffectPaintPropertyNode::Create( EffectPaintPropertyNode::Root(), CaretEffectNodeState(/*visible*/ true, @@ -95,10 +91,7 @@ (CompositorElementIdFromUniqueObjectId( NewUniqueObjectId(), CompositorElementIdNamespace::kPrimaryEffect))); state.compositor_element_id = element_id; - if (is_composited_caret_enabled_) { - state.direct_compositing_reasons = - CompositingReason::kActiveOpacityAnimation; - } + state.direct_compositing_reasons = CompositingReason::kActiveOpacityAnimation; return state; } @@ -216,13 +209,11 @@ auto change_type = effect_->Update( *effect_->Parent(), CaretEffectNodeState(visible, effect_->LocalTransformSpace())); - if (is_composited_caret_enabled_) { - DCHECK_EQ(PaintPropertyChangeType::kChangedOnlySimpleValues, change_type); - if (auto* compositor = frame_->View()->GetPaintArtifactCompositor()) { - if (compositor->DirectlyUpdateCompositedOpacityValue(*effect_)) { - effect_->CompositorSimpleValuesUpdated(); - return; - } + DCHECK_EQ(PaintPropertyChangeType::kChangedOnlySimpleValues, change_type); + if (auto* compositor = frame_->View()->GetPaintArtifactCompositor()) { + if (compositor->DirectlyUpdateCompositedOpacityValue(*effect_)) { + effect_->CompositorSimpleValuesUpdated(); + return; } } // Fallback to full update if direct update is not available.
diff --git a/third_party/blink/renderer/core/editing/frame_caret.h b/third_party/blink/renderer/core/editing/frame_caret.h index b92b2dd1..b4cfe41 100644 --- a/third_party/blink/renderer/core/editing/frame_caret.h +++ b/third_party/blink/renderer/core/editing/frame_caret.h
@@ -115,7 +115,6 @@ bool is_caret_enabled_ = false; bool should_show_caret_ = false; bool is_caret_blinking_suspended_ = false; - bool is_composited_caret_enabled_ = true; // Controls visibility of caret with opacity when the caret is blinking. scoped_refptr<EffectPaintPropertyNode> effect_; };
diff --git a/third_party/blink/renderer/core/html/parser/atomic_html_token.cc b/third_party/blink/renderer/core/html/parser/atomic_html_token.cc index 1bc6d194..7c8b5e5 100644 --- a/third_party/blink/renderer/core/html/parser/atomic_html_token.cc +++ b/third_party/blink/renderer/core/html/parser/atomic_html_token.cc
@@ -44,7 +44,7 @@ printf(" selfclosing"); [[fallthrough]]; case HTMLToken::DOCTYPE: - printf(" name \"%s\"", name_.GetString().Utf8().c_str()); + printf(" name \"%s\"", GetName().GetString().Utf8().c_str()); break; case HTMLToken::kComment: case HTMLToken::kCharacter:
diff --git a/third_party/blink/renderer/core/html/parser/atomic_html_token.h b/third_party/blink/renderer/core/html/parser/atomic_html_token.h index 0198aa2..fbec459 100644 --- a/third_party/blink/renderer/core/html/parser/atomic_html_token.h +++ b/third_party/blink/renderer/core/html/parser/atomic_html_token.h
@@ -31,10 +31,12 @@ #include "base/check_op.h" #include "base/containers/contains.h" #include "base/notreached.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/dom/attribute.h" #include "third_party/blink/renderer/core/html/parser/html_token.h" #include "third_party/blink/renderer/core/html_element_lookup_trie.h" +#include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/hash_set.h" #include "third_party/blink/renderer/platform/wtf/text/atomic_string_hash.h" @@ -49,6 +51,78 @@ // Controls whether attribute name lookup uses LookupHTMLAttributeName(). CORE_EXPORT extern bool g_use_html_attribute_name_lookup; +class AtomicHTMLToken; + +// HTMLTokenName represents a parsed token name (the local name of a +// QualifiedName). The token name contains the local name as an AtomicString and +// if the name is a valid html tag name, an HTMLTag. As this class is created +// from tokenized input, it does not know the namespace, the namespace is +// determined later in parsing (see HTMLTreeBuilder and HTMLStackItem). +class CORE_EXPORT HTMLTokenName { + public: + explicit HTMLTokenName(html_names::HTMLTag tag) : tag_(tag) { + if (tag != html_names::HTMLTag::kUnknown) + local_name_ = html_names::TagToQualifedName(tag).LocalName(); + } + + // Returns an HTMLTokenName for the specified string. This function looks up + // the HTMLTag from the supplied string. + static HTMLTokenName FromLocalName(const AtomicString& local_name) { + if (local_name.IsEmpty()) + return HTMLTokenName(html_names::HTMLTag::kUnknown); + + if (local_name.Is8Bit()) { + return HTMLTokenName( + lookupHTMLTag(local_name.Characters8(), local_name.length()), + local_name); + } + return HTMLTokenName( + lookupHTMLTag(local_name.Characters16(), local_name.length()), + local_name); + } + + bool operator==(const HTMLTokenName& other) const { + return other.local_name_ == local_name_; + } + + bool IsValidHTMLTag() const { return tag_ != html_names::HTMLTag::kUnknown; } + + html_names::HTMLTag GetHTMLTag() const { return tag_; } + + const AtomicString& GetLocalName() const { return local_name_; } + + private: + // For access to constructor. + friend class AtomicHTMLToken; + + explicit HTMLTokenName(html_names::HTMLTag tag, const AtomicString& name) + : tag_(tag), local_name_(name) { +#if DCHECK_IS_ON() + if (tag == html_names::HTMLTag::kUnknown) { + // If the tag is unknown, then `name` must either be empty, or not + // identify any other HTMLTag. + if (!name.IsEmpty()) { + if (name.Is8Bit()) { + DCHECK_EQ(html_names::HTMLTag::kUnknown, + lookupHTMLTag(name.Characters8(), name.length())); + } else { + DCHECK_EQ(html_names::HTMLTag::kUnknown, + lookupHTMLTag(name.Characters16(), name.length())); + } + } + } +#endif + } + + // This constructor is intended for use by AtomicHTMLToken when it is known + // the string is not a known html tag. + explicit HTMLTokenName(const AtomicString& name) + : HTMLTokenName(html_names::HTMLTag::kUnknown, name) {} + + html_names::HTMLTag tag_; + AtomicString local_name_; +}; + class CORE_EXPORT AtomicHTMLToken { STACK_ALLOCATED(); @@ -60,16 +134,23 @@ HTMLToken::TokenType GetType() const { return type_; } + // TODO(sky): for consistency, rename to GetLocalName(). const AtomicString& GetName() const { DCHECK(UsesName()); - return name_; + return name_.GetLocalName(); } void SetName(const AtomicString& name) { DCHECK(UsesName()); - name_ = name; + name_ = HTMLTokenName::FromLocalName(name); } + html_names::HTMLTag GetHTMLTag() const { return name_.GetHTMLTag(); } + + bool IsValidHTMLTag() const { return name_.IsValidHTMLTag(); } + + const HTMLTokenName& GetTokenName() const { return name_; } + bool SelfClosing() const { DCHECK(type_ == HTMLToken::kStartTag || type_ == HTMLToken::kEndTag); return self_closing_; @@ -114,13 +195,13 @@ return doctype_data_->system_identifier_; } - explicit AtomicHTMLToken(HTMLToken& token) : type_(token.GetType()) { + explicit AtomicHTMLToken(HTMLToken& token) + : type_(token.GetType()), name_(HTMLTokenNameFromToken(token)) { switch (type_) { case HTMLToken::kUninitialized: NOTREACHED(); break; case HTMLToken::DOCTYPE: - name_ = token.GetName().AsAtomicString(); doctype_data_ = token.ReleaseDoctypeData(); break; case HTMLToken::kEndOfFile: @@ -128,11 +209,6 @@ case HTMLToken::kStartTag: case HTMLToken::kEndTag: { self_closing_ = token.SelfClosing(); - if (const AtomicString& tag_name = - lookupHTMLTag(token.GetName().data(), token.GetName().size())) - name_ = tag_name; - else - name_ = token.GetName().AsAtomicString(); const HTMLToken::AttributeList& attributes = token.Attributes(); // This limit is set fairly arbitrarily; the main point is to avoid @@ -157,12 +233,15 @@ } } - explicit AtomicHTMLToken(HTMLToken::TokenType type) : type_(type) {} + explicit AtomicHTMLToken(HTMLToken::TokenType type) + : type_(type), name_(html_names::HTMLTag::kUnknown) {} AtomicHTMLToken(HTMLToken::TokenType type, const AtomicString& name, const Vector<Attribute>& attributes = Vector<Attribute>()) - : type_(type), name_(name), attributes_(attributes) { + : type_(type), + name_(HTMLTokenName::FromLocalName(name)), + attributes_(attributes) { DCHECK(UsesName()); } @@ -174,7 +253,25 @@ #endif private: - HTMLToken::TokenType type_; + static HTMLTokenName HTMLTokenNameFromToken(const HTMLToken& token) { + switch (token.GetType()) { + case HTMLToken::DOCTYPE: + // Doctype name may be empty, but not start/end tags. + if (token.GetName().IsEmpty()) + return HTMLTokenName(html_names::HTMLTag::kUnknown); + [[fallthrough]]; + case HTMLToken::kStartTag: + case HTMLToken::kEndTag: { + const html_names::HTMLTag html_tag = + lookupHTMLTag(token.GetName().data(), token.GetName().size()); + if (html_tag != html_names::HTMLTag::kUnknown) + return HTMLTokenName(html_tag); + return HTMLTokenName(token.GetName().AsAtomicString()); + } + default: + return HTMLTokenName(html_names::HTMLTag::kUnknown); + } + } // Sets up and deduplicates attributes. // @@ -192,8 +289,10 @@ bool UsesAttributes() const; + HTMLToken::TokenType type_; + // "name" for DOCTYPE, StartTag, and EndTag - AtomicString name_; + HTMLTokenName name_; // "data" for Comment, "characters" for Character String data_;
diff --git a/third_party/blink/renderer/core/html/parser/background_html_scanner.cc b/third_party/blink/renderer/core/html/parser/background_html_scanner.cc index 387c817..aedb8b1b 100644 --- a/third_party/blink/renderer/core/html/parser/background_html_scanner.cc +++ b/third_party/blink/renderer/core/html/parser/background_html_scanner.cc
@@ -114,10 +114,8 @@ token_scanner_->set_first_script_in_scan(true); source_.Append(source); while (tokenizer_->NextToken(source_, token_)) { - if (token_.GetType() == HTMLToken::kStartTag) { - tokenizer_->UpdateStateFor( - AttemptStaticStringCreation(token_.GetName(), kLikely8Bit)); - } + if (token_.GetType() == HTMLToken::kStartTag) + tokenizer_->UpdateStateFor(token_); token_scanner_->ScanToken(token_); token_.Clear(); }
diff --git a/third_party/blink/renderer/core/html/parser/html_construction_site.cc b/third_party/blink/renderer/core/html/parser/html_construction_site.cc index cdb4268..2e2fc84d 100644 --- a/third_party/blink/renderer/core/html/parser/html_construction_site.cc +++ b/third_party/blink/renderer/core/html/parser/html_construction_site.cc
@@ -84,16 +84,17 @@ } static bool HasImpliedEndTag(const HTMLStackItem* item) { - return item->HasTagName(html_names::kDdTag) || - item->HasTagName(html_names::kDtTag) || - item->HasTagName(html_names::kLiTag) || - item->HasTagName(html_names::kOptionTag) || - item->HasTagName(html_names::kOptgroupTag) || - item->HasTagName(html_names::kPTag) || - item->HasTagName(html_names::kRbTag) || - item->HasTagName(html_names::kRpTag) || - item->HasTagName(html_names::kRtTag) || - item->HasTagName(html_names::kRTCTag); + if (item->NamespaceURI() != html_names::xhtmlNamespaceURI) + return false; + + auto tag = item->GetHTMLTag(); + return tag == html_names::HTMLTag::kDd || tag == html_names::HTMLTag::kDt || + tag == html_names::HTMLTag::kLi || + tag == html_names::HTMLTag::kOption || + tag == html_names::HTMLTag::kOptgroup || + tag == html_names::HTMLTag::kP || tag == html_names::HTMLTag::kRb || + tag == html_names::HTMLTag::kRp || tag == html_names::HTMLTag::kRt || + tag == html_names::HTMLTag::kRTC; } static bool ShouldUseLengthLimit(const ContainerNode& node) { @@ -484,7 +485,7 @@ } void HTMLConstructionSite::SetCompatibilityModeFromDoctype( - const String& name, + html_names::HTMLTag tag, const String& public_id, const String& system_id) { // There are three possible compatibility modes: @@ -496,7 +497,7 @@ // letter. // Check for Quirks Mode. - if (name != "html" || + if (tag != html_names::HTMLTag::kHTML || public_id.StartsWithIgnoringASCIICase( "+//Silmaril//dtd html Pro v0r11 19970101//") || public_id.StartsWithIgnoringASCIICase( @@ -661,7 +662,7 @@ if (token->ForceQuirks()) SetCompatibilityMode(Document::kQuirksMode); else { - SetCompatibilityModeFromDoctype(token->GetName(), public_id, system_id); + SetCompatibilityModeFromDoctype(token->GetHTMLTag(), public_id, system_id); } } @@ -928,7 +929,12 @@ Document& document = OwnerDocumentForCurrentNode(); // "2. Let local name be the tag name of the token." - QualifiedName tag_name(g_null_atom, token->GetName(), namespace_uri); + QualifiedName tag_name = + ((token->IsValidHTMLTag() && + namespace_uri == html_names::xhtmlNamespaceURI) + ? static_cast<const QualifiedName&>( + html_names::TagToQualifedName(token->GetHTMLTag())) + : QualifiedName(g_null_atom, token->GetName(), namespace_uri)); // "3. Let is be the value of the "is" attribute in the given token ..." etc. const Attribute* is_attribute = token->GetAttributeItem(html_names::kIsAttr); const AtomicString& is = is_attribute ? is_attribute->Value() : g_null_atom; @@ -1105,9 +1111,9 @@ } void HTMLConstructionSite::GenerateImpliedEndTagsWithExclusion( - const AtomicString& tag_name) { + const HTMLTokenName& name) { while (HasImpliedEndTag(CurrentStackItem()) && - !CurrentStackItem()->MatchesHTMLTag(tag_name)) + !CurrentStackItem()->MatchesHTMLTag(name)) open_elements_.Pop(); }
diff --git a/third_party/blink/renderer/core/html/parser/html_construction_site.h b/third_party/blink/renderer/core/html/parser/html_construction_site.h index 663e4cf..43dce25 100644 --- a/third_party/blink/renderer/core/html/parser/html_construction_site.h +++ b/third_party/blink/renderer/core/html/parser/html_construction_site.h
@@ -189,7 +189,7 @@ void ReconstructTheActiveFormattingElements(); void GenerateImpliedEndTags(); - void GenerateImpliedEndTagsWithExclusion(const AtomicString& tag_name); + void GenerateImpliedEndTagsWithExclusion(const HTMLTokenName& name); bool InQuirksMode(); @@ -251,7 +251,7 @@ typedef HeapVector<HTMLConstructionSiteTask, 1> TaskQueue; void SetCompatibilityMode(Document::CompatibilityMode); - void SetCompatibilityModeFromDoctype(const String& name, + void SetCompatibilityModeFromDoctype(const html_names::HTMLTag tag, const String& public_id, const String& system_id);
diff --git a/third_party/blink/renderer/core/html/parser/html_element_stack.cc b/third_party/blink/renderer/core/html/parser/html_element_stack.cc index 61383ee..2dca0a9b 100644 --- a/third_party/blink/renderer/core/html/parser/html_element_stack.cc +++ b/third_party/blink/renderer/core/html/parser/html_element_stack.cc
@@ -44,23 +44,32 @@ } inline bool IsScopeMarker(HTMLStackItem* item) { - return item->HasTagName(html_names::kAppletTag) || - item->HasTagName(html_names::kCaptionTag) || - item->HasTagName(html_names::kMarqueeTag) || - item->HasTagName(html_names::kObjectTag) || - item->HasTagName(html_names::kTableTag) || - item->HasTagName(html_names::kTdTag) || - item->HasTagName(html_names::kThTag) || - item->HasTagName(mathml_names::kMiTag) || - item->HasTagName(mathml_names::kMoTag) || - item->HasTagName(mathml_names::kMnTag) || - item->HasTagName(mathml_names::kMsTag) || - item->HasTagName(mathml_names::kMtextTag) || - item->HasTagName(mathml_names::kAnnotationXmlTag) || - item->HasTagName(svg_names::kForeignObjectTag) || - item->HasTagName(svg_names::kDescTag) || - item->HasTagName(svg_names::kTitleTag) || - item->HasTagName(html_names::kTemplateTag) || IsRootNode(item); + if (item->NamespaceURI() == html_names::xhtmlNamespaceURI) { + switch (item->GetHTMLTag()) { + case html_names::HTMLTag::kApplet: + case html_names::HTMLTag::kCaption: + case html_names::HTMLTag::kMarquee: + case html_names::HTMLTag::kObject: + case html_names::HTMLTag::kTable: + case html_names::HTMLTag::kTd: + case html_names::HTMLTag::kTemplate: + case html_names::HTMLTag::kTh: + return true; + default: + break; + } + } else if (item->HasTagName(mathml_names::kMiTag) || + item->HasTagName(mathml_names::kMoTag) || + item->HasTagName(mathml_names::kMnTag) || + item->HasTagName(mathml_names::kMsTag) || + item->HasTagName(mathml_names::kMtextTag) || + item->HasTagName(mathml_names::kAnnotationXmlTag) || + item->HasTagName(svg_names::kForeignObjectTag) || + item->HasTagName(svg_names::kDescTag) || + item->HasTagName(svg_names::kTitleTag)) { + return true; + } + return IsRootNode(item); } inline bool IsListItemScopeMarker(HTMLStackItem* item) {
diff --git a/third_party/blink/renderer/core/html/parser/html_meta_charset_parser.cc b/third_party/blink/renderer/core/html/parser/html_meta_charset_parser.cc index 33e4633..dd37d52 100644 --- a/third_party/blink/renderer/core/html/parser/html_meta_charset_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_meta_charset_parser.cc
@@ -28,6 +28,7 @@ #include "third_party/blink/renderer/core/html/parser/html_parser_idioms.h" #include "third_party/blink/renderer/core/html/parser/html_parser_options.h" #include "third_party/blink/renderer/core/html/parser/html_tokenizer.h" +#include "third_party/blink/renderer/core/html_element_lookup_trie.h" #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/platform/wtf/text/text_encoding_registry.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" @@ -88,26 +89,28 @@ while (tokenizer_->NextToken(input_, token_)) { bool end = token_.GetType() == HTMLToken::kEndTag; if (end || token_.GetType() == HTMLToken::kStartTag) { - String tag_name = - AttemptStaticStringCreation(token_.GetName(), kLikely8Bit); - if (!end) { - tokenizer_->UpdateStateFor(tag_name); - if (ThreadSafeMatch(tag_name, html_names::kMetaTag) && ProcessMeta()) { + const html_names::HTMLTag tag = + token_.GetName().IsEmpty() + ? html_names::HTMLTag::kUnknown + : lookupHTMLTag(token_.GetName().data(), token_.GetName().size()); + if (!end && tag != html_names::HTMLTag::kUnknown) { + tokenizer_->UpdateStateFor(tag); + if (tag == html_names::HTMLTag::kMeta && ProcessMeta()) { done_checking_ = true; return true; } } - if (!ThreadSafeMatch(tag_name, html_names::kScriptTag) && - !ThreadSafeMatch(tag_name, html_names::kNoscriptTag) && - !ThreadSafeMatch(tag_name, html_names::kStyleTag) && - !ThreadSafeMatch(tag_name, html_names::kLinkTag) && - !ThreadSafeMatch(tag_name, html_names::kMetaTag) && - !ThreadSafeMatch(tag_name, html_names::kObjectTag) && - !ThreadSafeMatch(tag_name, html_names::kTitleTag) && - !ThreadSafeMatch(tag_name, html_names::kBaseTag) && - (end || !ThreadSafeMatch(tag_name, html_names::kHTMLTag)) && - (end || !ThreadSafeMatch(tag_name, html_names::kHeadTag))) { + if (tag != html_names::HTMLTag::kScript && + tag != html_names::HTMLTag::kNoscript && + tag != html_names::HTMLTag::kStyle && + tag != html_names::HTMLTag::kLink && + tag != html_names::HTMLTag::kMeta && + tag != html_names::HTMLTag::kObject && + tag != html_names::HTMLTag::kTitle && + tag != html_names::HTMLTag::kBase && + (end || tag != html_names::HTMLTag::kHTML) && + (end || tag != html_names::HTMLTag::kHead)) { in_head_section_ = false; } }
diff --git a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc index 0289f48..51d44a0 100644 --- a/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc +++ b/third_party/blink/renderer/core/html/parser/html_preload_scanner.cc
@@ -1127,8 +1127,7 @@ while (tokenizer_->NextToken(source_, token_)) { if (token_.GetType() == HTMLToken::kStartTag) - tokenizer_->UpdateStateFor( - AttemptStaticStringCreation(token_.GetName(), kLikely8Bit)); + tokenizer_->UpdateStateFor(token_); bool seen_csp_meta_tag = false; scanner_.Scan(token_, source_, pending_data->requests, pending_data->meta_ch_values, &pending_data->viewport,
diff --git a/third_party/blink/renderer/core/html/parser/html_stack_item.h b/third_party/blink/renderer/core/html/parser/html_stack_item.h index aadac11..408c89d 100644 --- a/third_party/blink/renderer/core/html/parser/html_stack_item.h +++ b/third_party/blink/renderer/core/html/parser/html_stack_item.h
@@ -44,13 +44,14 @@ public: enum ItemType { kItemForContextElement, kItemForDocumentFragmentNode }; - HTMLStackItem(ContainerNode* node, ItemType type) : node_(node) { + HTMLStackItem(ContainerNode* node, ItemType type) + : node_(node), token_name_(html_names::HTMLTag::kUnknown) { switch (type) { case kItemForDocumentFragmentNode: is_document_fragment_node_ = true; break; case kItemForContextElement: - token_local_name_ = GetElement()->localName(); + token_name_ = HTMLTokenName::FromLocalName(GetElement()->localName()); namespace_uri_ = GetElement()->namespaceURI(); is_document_fragment_node_ = false; break; @@ -64,7 +65,7 @@ AtomicHTMLToken* token, const AtomicString& namespace_uri) : node_(node), - token_local_name_(token->GetName()), + token_name_(token->GetTokenName()), namespace_uri_(namespace_uri), num_token_attributes_(token->Attributes().size()), is_document_fragment_node_(false) { @@ -101,43 +102,55 @@ bool IsElementNode() const { return !is_document_fragment_node_; } const AtomicString& NamespaceURI() const { return namespace_uri_; } - const AtomicString& LocalName() const { return token_local_name_; } + const AtomicString& LocalName() const { return token_name_.GetLocalName(); } const base::span<Attribute> Attributes() { - DCHECK(token_local_name_); + DCHECK(LocalName()); return {TokenAttributesData(), num_token_attributes_}; } const base::span<const Attribute> Attributes() const { - DCHECK(token_local_name_); + DCHECK(LocalName()); return {TokenAttributesData(), num_token_attributes_}; } Attribute* GetAttributeItem(const QualifiedName& attribute_name) { - DCHECK(token_local_name_); + DCHECK(LocalName()); return FindAttributeInVector(Attributes(), attribute_name); } + html_names::HTMLTag GetHTMLTag() const { return token_name_.GetHTMLTag(); } + bool HasLocalName(const AtomicString& name) const { - return token_local_name_ == name; + return token_name_.GetLocalName() == name; } bool HasTagName(const QualifiedName& name) const { - return token_local_name_ == name.LocalName() && + return HasLocalName(name.LocalName()) && namespace_uri_ == name.NamespaceURI(); } bool MatchesHTMLTag(const AtomicString& name) const { - return token_local_name_ == name && + return HasLocalName(name) && namespace_uri_ == html_names::xhtmlNamespaceURI; } bool MatchesHTMLTag(const QualifiedName& name) const { - return token_local_name_ == name && + return HasLocalName(name.LocalName()) && + namespace_uri_ == html_names::xhtmlNamespaceURI; + } + bool MatchesHTMLTag(const HTMLTokenName& name) const { + return name == token_name_ && namespace_uri_ == html_names::xhtmlNamespaceURI; } bool CausesFosterParenting() { - return HasTagName(html_names::kTableTag) || - HasTagName(html_names::kTbodyTag) || - HasTagName(html_names::kTfootTag) || - HasTagName(html_names::kTheadTag) || HasTagName(html_names::kTrTag); + switch (GetHTMLTag()) { + case html_names::HTMLTag::kTable: + case html_names::HTMLTag::kTbody: + case html_names::HTMLTag::kTfoot: + case html_names::HTMLTag::kThead: + case html_names::HTMLTag::kTr: + return namespace_uri_ == html_names::xhtmlNamespaceURI; + default: + return false; + } } bool IsInHTMLNamespace() const { @@ -149,19 +162,121 @@ } bool IsNumberedHeaderElement() const { - return HasTagName(html_names::kH1Tag) || HasTagName(html_names::kH2Tag) || - HasTagName(html_names::kH3Tag) || HasTagName(html_names::kH4Tag) || - HasTagName(html_names::kH5Tag) || HasTagName(html_names::kH6Tag); + switch (GetHTMLTag()) { + case html_names::HTMLTag::kH1: + case html_names::HTMLTag::kH2: + case html_names::HTMLTag::kH3: + case html_names::HTMLTag::kH4: + case html_names::HTMLTag::kH5: + case html_names::HTMLTag::kH6: + return namespace_uri_ == html_names::xhtmlNamespaceURI; + default: + return false; + } } bool IsTableBodyContextElement() const { - return HasTagName(html_names::kTbodyTag) || - HasTagName(html_names::kTfootTag) || - HasTagName(html_names::kTheadTag); + switch (GetHTMLTag()) { + case html_names::HTMLTag::kTbody: + case html_names::HTMLTag::kTfoot: + case html_names::HTMLTag::kThead: + return namespace_uri_ == html_names::xhtmlNamespaceURI; + default: + return false; + } } // http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#special bool IsSpecialNode() const { + if (IsDocumentFragmentNode()) + return true; + if (IsInHTMLNamespace()) { + switch (GetHTMLTag()) { + case html_names::HTMLTag::kAddress: + case html_names::HTMLTag::kArea: + case html_names::HTMLTag::kApplet: + case html_names::HTMLTag::kArticle: + case html_names::HTMLTag::kAside: + case html_names::HTMLTag::kBase: + case html_names::HTMLTag::kBasefont: + case html_names::HTMLTag::kBgsound: + case html_names::HTMLTag::kBlockquote: + case html_names::HTMLTag::kBody: + case html_names::HTMLTag::kBr: + case html_names::HTMLTag::kButton: + case html_names::HTMLTag::kCaption: + case html_names::HTMLTag::kCenter: + case html_names::HTMLTag::kCol: + case html_names::HTMLTag::kColgroup: + case html_names::HTMLTag::kCommand: + case html_names::HTMLTag::kDd: + case html_names::HTMLTag::kDetails: + case html_names::HTMLTag::kDir: + case html_names::HTMLTag::kDiv: + case html_names::HTMLTag::kDl: + case html_names::HTMLTag::kDt: + case html_names::HTMLTag::kEmbed: + case html_names::HTMLTag::kFieldset: + case html_names::HTMLTag::kFigcaption: + case html_names::HTMLTag::kFigure: + case html_names::HTMLTag::kFooter: + case html_names::HTMLTag::kForm: + case html_names::HTMLTag::kFrame: + case html_names::HTMLTag::kFrameset: + case html_names::HTMLTag::kH1: + case html_names::HTMLTag::kH2: + case html_names::HTMLTag::kH3: + case html_names::HTMLTag::kH4: + case html_names::HTMLTag::kH5: + case html_names::HTMLTag::kH6: + case html_names::HTMLTag::kHead: + case html_names::HTMLTag::kHeader: + case html_names::HTMLTag::kHgroup: + case html_names::HTMLTag::kHr: + case html_names::HTMLTag::kHTML: + case html_names::HTMLTag::kIFrame: + case html_names::HTMLTag::kImg: + case html_names::HTMLTag::kInput: + case html_names::HTMLTag::kLi: + case html_names::HTMLTag::kLink: + case html_names::HTMLTag::kListing: + case html_names::HTMLTag::kMain: + case html_names::HTMLTag::kMarquee: + case html_names::HTMLTag::kMenu: + case html_names::HTMLTag::kMeta: + case html_names::HTMLTag::kNav: + case html_names::HTMLTag::kNoembed: + case html_names::HTMLTag::kNoframes: + case html_names::HTMLTag::kNoscript: + case html_names::HTMLTag::kObject: + case html_names::HTMLTag::kOl: + case html_names::HTMLTag::kP: + case html_names::HTMLTag::kParam: + case html_names::HTMLTag::kPlaintext: + case html_names::HTMLTag::kPre: + case html_names::HTMLTag::kScript: + case html_names::HTMLTag::kSection: + case html_names::HTMLTag::kSelect: + case html_names::HTMLTag::kStyle: + case html_names::HTMLTag::kSummary: + case html_names::HTMLTag::kTable: + case html_names::HTMLTag::kTbody: + case html_names::HTMLTag::kTfoot: + case html_names::HTMLTag::kThead: + case html_names::HTMLTag::kTd: + case html_names::HTMLTag::kTemplate: + case html_names::HTMLTag::kTextarea: + case html_names::HTMLTag::kTh: + case html_names::HTMLTag::kTitle: + case html_names::HTMLTag::kTr: + case html_names::HTMLTag::kUl: + case html_names::HTMLTag::kWbr: + case html_names::HTMLTag::kXmp: + return true; + default: + return false; + } + } if (HasTagName(mathml_names::kMiTag) || HasTagName(mathml_names::kMoTag) || HasTagName(mathml_names::kMnTag) || HasTagName(mathml_names::kMsTag) || HasTagName(mathml_names::kMtextTag) || @@ -169,74 +284,7 @@ HasTagName(svg_names::kForeignObjectTag) || HasTagName(svg_names::kDescTag) || HasTagName(svg_names::kTitleTag)) return true; - if (IsDocumentFragmentNode()) - return true; - if (!IsInHTMLNamespace()) - return false; - const AtomicString& tag_name = LocalName(); - return tag_name == html_names::kAddressTag || - tag_name == html_names::kAreaTag || - tag_name == html_names::kAppletTag || - tag_name == html_names::kArticleTag || - tag_name == html_names::kAsideTag || - tag_name == html_names::kBaseTag || - tag_name == html_names::kBasefontTag || - tag_name == html_names::kBgsoundTag || - tag_name == html_names::kBlockquoteTag || - tag_name == html_names::kBodyTag || tag_name == html_names::kBrTag || - tag_name == html_names::kButtonTag || - tag_name == html_names::kCaptionTag || - tag_name == html_names::kCenterTag || - tag_name == html_names::kColTag || - tag_name == html_names::kColgroupTag || - tag_name == html_names::kCommandTag || - tag_name == html_names::kDdTag || - tag_name == html_names::kDetailsTag || - tag_name == html_names::kDirTag || tag_name == html_names::kDivTag || - tag_name == html_names::kDlTag || tag_name == html_names::kDtTag || - tag_name == html_names::kEmbedTag || - tag_name == html_names::kFieldsetTag || - tag_name == html_names::kFigcaptionTag || - tag_name == html_names::kFigureTag || - tag_name == html_names::kFooterTag || - tag_name == html_names::kFormTag || - tag_name == html_names::kFrameTag || - tag_name == html_names::kFramesetTag || IsNumberedHeaderElement() || - tag_name == html_names::kHeadTag || - tag_name == html_names::kHeaderTag || - tag_name == html_names::kHgroupTag || - tag_name == html_names::kHrTag || tag_name == html_names::kHTMLTag || - tag_name == html_names::kIFrameTag || - tag_name == html_names::kImgTag || - tag_name == html_names::kInputTag || - tag_name == html_names::kLiTag || tag_name == html_names::kLinkTag || - tag_name == html_names::kListingTag || - tag_name == html_names::kMainTag || - tag_name == html_names::kMarqueeTag || - tag_name == html_names::kMenuTag || - tag_name == html_names::kMetaTag || - tag_name == html_names::kNavTag || - tag_name == html_names::kNoembedTag || - tag_name == html_names::kNoframesTag || - tag_name == html_names::kNoscriptTag || - tag_name == html_names::kObjectTag || - tag_name == html_names::kOlTag || tag_name == html_names::kPTag || - tag_name == html_names::kParamTag || - tag_name == html_names::kPlaintextTag || - tag_name == html_names::kPreTag || - tag_name == html_names::kScriptTag || - tag_name == html_names::kSectionTag || - tag_name == html_names::kSelectTag || - tag_name == html_names::kStyleTag || - tag_name == html_names::kSummaryTag || - tag_name == html_names::kTableTag || IsTableBodyContextElement() || - tag_name == html_names::kTdTag || - tag_name == html_names::kTemplateTag || - tag_name == html_names::kTextareaTag || - tag_name == html_names::kThTag || - tag_name == html_names::kTitleTag || - tag_name == html_names::kTrTag || tag_name == html_names::kUlTag || - tag_name == html_names::kWbrTag || tag_name == html_names::kXmpTag; + return false; } void Trace(Visitor* visitor) const { visitor->Trace(node_); } @@ -256,7 +304,7 @@ Member<ContainerNode> node_; - AtomicString token_local_name_; + HTMLTokenName token_name_; AtomicString namespace_uri_; wtf_size_t num_token_attributes_ = 0; bool is_document_fragment_node_;
diff --git a/third_party/blink/renderer/core/html/parser/html_tokenizer.cc b/third_party/blink/renderer/core/html/parser/html_tokenizer.cc index 3497a2ad..bfe6a5a 100644 --- a/third_party/blink/renderer/core/html/parser/html_tokenizer.cc +++ b/third_party/blink/renderer/core/html/parser/html_tokenizer.cc
@@ -1667,27 +1667,42 @@ return characters.ToString(); } -void HTMLTokenizer::UpdateStateFor(const String& tag_name) { - auto state = SpeculativeStateForTag(AtomicString(tag_name)); +void HTMLTokenizer::UpdateStateFor(const HTMLToken& token) { + if (!token.GetName().IsEmpty()) { + UpdateStateFor( + lookupHTMLTag(token.GetName().data(), token.GetName().size())); + } +} + +void HTMLTokenizer::UpdateStateFor(html_names::HTMLTag tag) { + auto state = SpeculativeStateForTag(tag); if (state) SetState(*state); } absl::optional<HTMLTokenizer::State> HTMLTokenizer::SpeculativeStateForTag( - const AtomicString& tag_name) const { - if (tag_name == html_names::kTextareaTag || tag_name == html_names::kTitleTag) - return HTMLTokenizer::kRCDATAState; - if (tag_name == html_names::kPlaintextTag) - return HTMLTokenizer::kPLAINTEXTState; - if (tag_name == html_names::kScriptTag) - return HTMLTokenizer::kScriptDataState; - if (tag_name == html_names::kStyleTag || tag_name == html_names::kIFrameTag || - tag_name == html_names::kXmpTag || tag_name == html_names::kNoembedTag || - tag_name == html_names::kNoframesTag || - (tag_name == html_names::kNoscriptTag && options_.scripting_flag)) { - return HTMLTokenizer::kRAWTEXTState; + html_names::HTMLTag tag) const { + switch (tag) { + case html_names::HTMLTag::kTextarea: + case html_names::HTMLTag::kTitle: + return HTMLTokenizer::kRCDATAState; + case html_names::HTMLTag::kPlaintext: + return HTMLTokenizer::kPLAINTEXTState; + case html_names::HTMLTag::kScript: + return HTMLTokenizer::kScriptDataState; + case html_names::HTMLTag::kStyle: + case html_names::HTMLTag::kIFrame: + case html_names::HTMLTag::kXmp: + case html_names::HTMLTag::kNoembed: + case html_names::HTMLTag::kNoframes: + return HTMLTokenizer::kRAWTEXTState; + case html_names::HTMLTag::kNoscript: + if (options_.scripting_flag) + return HTMLTokenizer::kRAWTEXTState; + return absl::nullopt; + default: + return absl::nullopt; } - return absl::nullopt; } inline bool HTMLTokenizer::TemporaryBufferIs(const String& expected_string) {
diff --git a/third_party/blink/renderer/core/html/parser/html_tokenizer.h b/third_party/blink/renderer/core/html/parser/html_tokenizer.h index 63cba1e..1302e0e 100644 --- a/third_party/blink/renderer/core/html/parser/html_tokenizer.h +++ b/third_party/blink/renderer/core/html/parser/html_tokenizer.h
@@ -34,6 +34,7 @@ #include "third_party/blink/renderer/core/html/parser/html_parser_options.h" #include "third_party/blink/renderer/core/html/parser/html_token.h" #include "third_party/blink/renderer/core/html/parser/input_stream_preprocessor.h" +#include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/platform/text/segmented_string.h" namespace blink { @@ -146,12 +147,13 @@ // Potentially sets the tokenizer state for the given tag name. Specifically // the state is set if SpeculativeStateForTag() returns a value, see it for // details and caveats. - void UpdateStateFor(const String& tag_name); + void UpdateStateFor(const HTMLToken& token); + void UpdateStateFor(html_names::HTMLTag tag); - // Returns the tokenizer state for the given tag name. This is - // an approximation of how the tree builder would update the tokenizer's - // state. This method is useful for approximating HTML tokenization. To - // get exactly the correct tokenization, you need the real tree builder. + // Returns the tokenizer state for the given tag. This is an approximation of + // how the tree builder would update the tokenizer's state. This method is + // useful for approximating HTML tokenization. To get exactly the correct + // tokenization, you need the real tree builder. // // The main failures in the approximation are as follows: // @@ -163,8 +165,7 @@ // instead of as character tokens. // // The return value is empty if a state change is not necessary. - absl::optional<State> SpeculativeStateForTag( - const AtomicString& tag_name) const; + absl::optional<State> SpeculativeStateForTag(html_names::HTMLTag tag) const; bool ForceNullCharacterReplacement() const { return force_null_character_replacement_;
diff --git a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc index 1561b3d..e51918b8 100644 --- a/third_party/blink/renderer/core/html/parser/html_tree_builder.cc +++ b/third_party/blink/renderer/core/html/parser/html_tree_builder.cc
@@ -810,7 +810,7 @@ case TagParsingGroup::kRtOrRpTag: if (tree_.OpenElements()->InScope(html_names::kRubyTag.LocalName())) { tree_.GenerateImpliedEndTagsWithExclusion( - html_names::kRTCTag.LocalName()); + HTMLTokenName(html_names::HTMLTag::kRTC)); if (!tree_.CurrentStackItem()->HasTagName(html_names::kRubyTag) && !tree_.CurrentStackItem()->HasTagName(html_names::kRTCTag)) ParseError(token); @@ -1475,7 +1475,7 @@ while (true) { HTMLStackItem* item = record->StackItem(); if (item->MatchesHTMLTag(token->GetName())) { - tree_.GenerateImpliedEndTagsWithExclusion(token->GetName()); + tree_.GenerateImpliedEndTagsWithExclusion(token->GetTokenName()); if (!tree_.CurrentStackItem()->MatchesHTMLTag(token->GetName())) ParseError(token); tree_.OpenElements()->PopUntilPopped(item->GetElement()); @@ -1859,7 +1859,7 @@ ProcessEndTag(token); return; } - tree_.GenerateImpliedEndTagsWithExclusion(token->GetName()); + tree_.GenerateImpliedEndTagsWithExclusion(token->GetTokenName()); if (!tree_.CurrentStackItem()->MatchesHTMLTag(token->GetName())) ParseError(token); tree_.OpenElements()->PopUntilPopped(token->GetName()); @@ -1870,7 +1870,7 @@ ParseError(token); return; } - tree_.GenerateImpliedEndTagsWithExclusion(token->GetName()); + tree_.GenerateImpliedEndTagsWithExclusion(token->GetTokenName()); if (!tree_.CurrentStackItem()->MatchesHTMLTag(token->GetName())) ParseError(token); tree_.OpenElements()->PopUntilPopped(token->GetName()); @@ -1882,7 +1882,7 @@ ParseError(token); return; } - tree_.GenerateImpliedEndTagsWithExclusion(token->GetName()); + tree_.GenerateImpliedEndTagsWithExclusion(token->GetTokenName()); if (!tree_.CurrentStackItem()->MatchesHTMLTag(token->GetName())) ParseError(token); tree_.OpenElements()->PopUntilPopped(token->GetName());
diff --git a/third_party/blink/renderer/core/html/parser/html_view_source_parser.cc b/third_party/blink/renderer/core/html/parser/html_view_source_parser.cc index 4d1bd53..ecfa65e5 100644 --- a/third_party/blink/renderer/core/html/parser/html_view_source_parser.cc +++ b/third_party/blink/renderer/core/html/parser/html_view_source_parser.cc
@@ -51,10 +51,8 @@ GetDocument()->AddSource(SourceForToken(token_), token_); - // FIXME: The tokenizer should do this work for us. if (token_.GetType() == HTMLToken::kStartTag) - tokenizer_->UpdateStateFor( - AttemptStaticStringCreation(token_.GetName(), kLikely8Bit)); + tokenizer_->UpdateStateFor(token_); token_.Clear(); } }
diff --git a/third_party/blink/renderer/core/loader/frame_fetch_context.cc b/third_party/blink/renderer/core/loader/frame_fetch_context.cc index 18788b2..dd157192 100644 --- a/third_party/blink/renderer/core/loader/frame_fetch_context.cc +++ b/third_party/blink/renderer/core/loader/frame_fetch_context.cc
@@ -739,7 +739,14 @@ return frozen_state_->reduced_accept_language; LocalFrame* frame = document_->GetFrame(); DCHECK(frame); - return frame->GetReducedAcceptLanguage().GetString(); + // If accept language override from inspector emulation, set Accept-Language + // header as the overridden value. + String override_accept_language; + probe::ApplyAcceptLanguageOverride(Probe(), &override_accept_language); + return override_accept_language.IsEmpty() + ? frame->GetReducedAcceptLanguage().GetString() + : network_utils::GenerateAcceptLanguageHeader( + override_accept_language); } float FrameFetchContext::GetDevicePixelRatio() const {
diff --git a/third_party/blink/renderer/core/paint/fragment_data.cc b/third_party/blink/renderer/core/paint/fragment_data.cc index 4cd382d..3b36a03 100644 --- a/third_party/blink/renderer/core/paint/fragment_data.cc +++ b/third_party/blink/renderer/core/paint/fragment_data.cc
@@ -131,6 +131,20 @@ return LocalBorderBoxProperties().Clip(); } +const EffectPaintPropertyNodeOrAlias& FragmentData::PreEffect() const { + if (const auto* properties = PaintProperties()) { + if (const auto* effect = properties->Effect()) { + DCHECK(effect->Parent()); + return *effect->Parent(); + } + if (const auto* filter = properties->Filter()) { + DCHECK(filter->Parent()); + return *filter->Parent(); + } + } + return LocalBorderBoxProperties().Effect(); +} + const EffectPaintPropertyNodeOrAlias& FragmentData::ContentsEffect() const { if (const auto* properties = PaintProperties()) { if (properties->EffectIsolationNode())
diff --git a/third_party/blink/renderer/core/paint/fragment_data.h b/third_party/blink/renderer/core/paint/fragment_data.h index da8cc657..36133a2d 100644 --- a/third_party/blink/renderer/core/paint/fragment_data.h +++ b/third_party/blink/renderer/core/paint/fragment_data.h
@@ -189,9 +189,10 @@ const TransformPaintPropertyNodeOrAlias& PreTransform() const; const ClipPaintPropertyNodeOrAlias& PreClip() const; + const EffectPaintPropertyNodeOrAlias& PreEffect() const; - const ClipPaintPropertyNodeOrAlias& ContentsClip() const; const TransformPaintPropertyNodeOrAlias& ContentsTransform() const; + const ClipPaintPropertyNodeOrAlias& ContentsClip() const; const EffectPaintPropertyNodeOrAlias& ContentsEffect() const; ~FragmentData() = default;
diff --git a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc index 4880cd7c..0130940 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_clipper.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_clipper.cc
@@ -291,6 +291,8 @@ context.root_fragment->LocalBorderBoxProperties(); if (context.ShouldRespectRootLayerClip()) { destination_property_tree_state.SetClip(context.root_fragment->PreClip()); + destination_property_tree_state.SetEffect( + context.root_fragment->PreEffect()); } else { destination_property_tree_state.SetClip( context.root_fragment->ContentsClip());
diff --git a/third_party/blink/renderer/core/probe/core_probes.pidl b/third_party/blink/renderer/core/probe/core_probes.pidl index ad23e3a8..df454194 100644 --- a/third_party/blink/renderer/core/probe/core_probes.pidl +++ b/third_party/blink/renderer/core/probe/core_probes.pidl
@@ -87,6 +87,7 @@ void DidFireWebGLErrorOrWarning(Element*, const String& message); void DidResizeMainFrame(LocalFrame*); void ApplyAcceptLanguageOverride(ExecutionContext*, String* accept_language); + void ApplyAcceptLanguageOverride(CoreProbeSink*, String* accept_language); void ApplyHardwareConcurrencyOverride(CoreProbeSink*, unsigned int& hardware_concurrency); void ApplyUserAgentOverride(CoreProbeSink*, String* user_agent); void ApplyUserAgentMetadataOverride(CoreProbeSink*, absl::optional<blink::UserAgentMetadata>* ua_metadata_override);
diff --git a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_test.cc b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_test.cc index 16fe436..ccfcaea 100644 --- a/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_test.cc +++ b/third_party/blink/renderer/modules/canvas/offscreencanvas/offscreen_canvas_test.cc
@@ -171,9 +171,14 @@ EXPECT_NE(shared_quad_state_list.front()->are_contents_opaque, context_alpha); }))); - offscreen_canvas().PushFrame(canvas_resource, SkIRect::MakeWH(10, 10)); + offscreen_canvas().PushFrame(std::move(canvas_resource), + SkIRect::MakeWH(10, 10)); platform->RunUntilIdle(); + const auto canvas_resource2 = CanvasResourceSharedBitmap::Create( + SkImageInfo::MakeN32Premul(offscreen_canvas().Size().width(), + offscreen_canvas().Size().height()), + nullptr /* provider */, cc::PaintFlags::FilterQuality::kLow); EXPECT_CALL(mock_embedded_frame_sink_provider.mock_compositor_frame_sink(), SubmitCompositorFrameSync_(_)) .WillOnce(::testing::WithArg<0>( @@ -190,7 +195,8 @@ EXPECT_NE(shared_quad_state_list.front()->are_contents_opaque, context_alpha); }))); - offscreen_canvas().Commit(canvas_resource, SkIRect::MakeWH(10, 10)); + offscreen_canvas().Commit(std::move(canvas_resource2), + SkIRect::MakeWH(10, 10)); platform->RunUntilIdle(); }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc index e2d29c3..668f42565 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_2d_layer_bridge.cc
@@ -660,6 +660,19 @@ return ResourceProvider(); } +namespace { + +// Adapter for wrapping a CanvasResourceReleaseCallback into a +// viz::ReleaseCallback +void ReleaseCanvasResource(CanvasResource::ReleaseCallback callback, + scoped_refptr<CanvasResource> canvas_resource, + const gpu::SyncToken& sync_token, + bool is_lost) { + std::move(callback).Run(std::move(canvas_resource), sync_token, is_lost); +} + +} // unnamed namespace + bool Canvas2DLayerBridge::PrepareTransferableResource( cc::SharedBitmapIdRegistrar* bitmap_registrar, viz::TransferableResource* out_resource, @@ -690,16 +703,20 @@ if (!frame || !frame->IsValid()) return false; - // Note frame is kept alive via a reference kept in out_release_callback. - if (!frame->PrepareTransferableResource(out_resource, out_release_callback, + CanvasResource::ReleaseCallback release_callback; + if (!frame->PrepareTransferableResource(out_resource, &release_callback, kUnverifiedSyncToken) || *out_resource == layer_->current_transferable_resource()) { // If the resource did not change, the release will be handled correctly // when the callback from the previous frame is dispatched. But run the - // |out_release_callback| to release the ref acquired above. - std::move(*out_release_callback).Run(gpu::SyncToken(), false /* is_lost */); + // |release_callback| to release the ref acquired above. + std::move(release_callback) + .Run(std::move(frame), gpu::SyncToken(), false /* is_lost */); return false; } + // Note: frame is kept alive via a reference kept in out_release_callback. + *out_release_callback = base::BindOnce( + ReleaseCanvasResource, std::move(release_callback), std::move(frame)); return true; }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.cc b/third_party/blink/renderer/platform/graphics/canvas_resource.cc index 8ef0246..6987d405 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.cc
@@ -104,9 +104,12 @@ static void ReleaseFrameResources( base::WeakPtr<CanvasResourceProvider> resource_provider, - scoped_refptr<CanvasResource> resource, + scoped_refptr<CanvasResource>&& resource, const gpu::SyncToken& sync_token, bool lost_resource) { + if (!resource) + return; + resource->WaitSyncToken(sync_token); if (resource_provider) @@ -123,13 +126,12 @@ bool CanvasResource::PrepareTransferableResource( viz::TransferableResource* out_resource, - viz::ReleaseCallback* out_callback, + CanvasResource::ReleaseCallback* out_callback, MailboxSyncMode sync_mode) { DCHECK(IsValid()); DCHECK(out_callback); - *out_callback = - WTF::Bind(&ReleaseFrameResources, provider_, base::WrapRefCounted(this)); + *out_callback = WTF::Bind(&ReleaseFrameResources, provider_); if (!out_resource) return true;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource.h b/third_party/blink/renderer/platform/graphics/canvas_resource.h index 8d14499..2ac0468 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource.h
@@ -65,6 +65,11 @@ class PLATFORM_EXPORT CanvasResource : public WTF::ThreadSafeRefCounted<CanvasResource> { public: + using ReleaseCallback = base::OnceCallback<void( + scoped_refptr<blink::CanvasResource>&& canvas_resource, + const gpu::SyncToken& sync_token, + bool is_lost)>; + virtual ~CanvasResource(); // We perform a lazy copy on write if the canvas content needs to be updated @@ -121,7 +126,7 @@ // Provides a TransferableResource representation of this resource to share it // with the compositor. bool PrepareTransferableResource(viz::TransferableResource*, - viz::ReleaseCallback*, + ReleaseCallback*, MailboxSyncMode); // Issues a wait for this sync token on the context used by this resource for
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc index 0e6f747..447e2f5 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.cc
@@ -43,14 +43,26 @@ struct CanvasResourceDispatcher::FrameResource { FrameResource() = default; ~FrameResource() { - if (release_callback) - std::move(release_callback).Run(sync_token, is_lost); + if (release_callback) { + std::move(release_callback) + .Run(std::move(canvas_resource), sync_token, is_lost); + } } - // TODO(junov): What does this do? + // This is to ensure the resource only gets reclaimed for real at the second + // reclaim attempt. This is because the resource needs to be returned by + // both the compositor and the placeholder canvas before it is safe to + // reclaim it. bool spare_lock = true; - viz::ReleaseCallback release_callback; + // The 'canvas_resource' field is not set at construction time: It gets set + // when the placeholder canvas returns it. This makes it simpler to write + // DCHECKs that detect potential concurrency issues by checking + // RefCounted::HasOneRef() in critical places. This also allows + // OffscreenCanvasPlaceholder to detect when to return a resource by using + // CanvasResource::SetLastUnrefCallback. + scoped_refptr<CanvasResource> canvas_resource; + CanvasResource::ReleaseCallback release_callback; gpu::SyncToken sync_token; bool is_lost = false; }; @@ -130,7 +142,7 @@ scoped_refptr<CanvasResource>&& canvas_resource, viz::ResourceId resource_id) { if (placeholder_canvas_id_ == kInvalidPlaceholderCanvasId) { - ReclaimResourceInternal(resource_id); + ReclaimResourceInternal(resource_id, std::move(canvas_resource)); return; } // Determines whether the main thread may be blocked. If unblocked, post @@ -142,7 +154,8 @@ DCHECK(num_unreclaimed_frames_posted_ == kMaxUnreclaimedPlaceholderFrames); if (latest_unposted_image_) { // The previous unposted resource becomes obsolete now. - ReclaimResourceInternal(latest_unposted_resource_id_); + ReclaimResourceInternal(latest_unposted_resource_id_, + std::move(latest_unposted_image_)); } latest_unposted_image_ = std::move(canvas_resource); @@ -417,8 +430,10 @@ } } -void CanvasResourceDispatcher::ReclaimResource(viz::ResourceId resource_id) { - ReclaimResourceInternal(resource_id); +void CanvasResourceDispatcher::ReclaimResource( + viz::ResourceId resource_id, + scoped_refptr<CanvasResource>&& canvas_resource) { + ReclaimResourceInternal(resource_id, std::move(canvas_resource)); num_unreclaimed_frames_posted_--; @@ -492,10 +507,13 @@ } void CanvasResourceDispatcher::ReclaimResourceInternal( - viz::ResourceId resource_id) { + viz::ResourceId resource_id, + scoped_refptr<CanvasResource>&& canvas_resource) { auto it = resources_.find(resource_id); - if (it != resources_.end()) + if (it != resources_.end()) { + it->value->canvas_resource = std::move(canvas_resource); ReclaimResourceInternal(it); + } } void CanvasResourceDispatcher::ReclaimResourceInternal( @@ -504,6 +522,7 @@ it->value->spare_lock = false; return; } + DCHECK(it->value->canvas_resource); resources_.erase(it); }
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h index d3f532e..18d18a4 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher.h
@@ -63,7 +63,7 @@ const SkIRect& damage_rect, bool needs_vertical_flip, bool is_opaque); - void ReclaimResource(viz::ResourceId); + void ReclaimResource(viz::ResourceId, scoped_refptr<CanvasResource>&&); void DispatchFrameSync(scoped_refptr<CanvasResource>&&, base::TimeTicks commit_start_time, const SkIRect& damage_rect, @@ -127,7 +127,8 @@ virtual void PostImageToPlaceholder(scoped_refptr<CanvasResource>&&, viz::ResourceId resource_id); - void ReclaimResourceInternal(viz::ResourceId resource_id); + void ReclaimResourceInternal(viz::ResourceId resource_id, + scoped_refptr<CanvasResource>&&); void ReclaimResourceInternal(const ResourceMap::iterator&); mojo::Remote<viz::mojom::blink::CompositorFrameSink> sink_;
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher_test.cc index 5d3fce8d3..f8bc3403 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_dispatcher_test.cc
@@ -43,8 +43,6 @@ return viz::ResourceId(id.GetUnsafeValue() + 1); } -} // namespace - class MockCanvasResourceDispatcher : public CanvasResourceDispatcher { public: MockCanvasResourceDispatcher() @@ -60,15 +58,20 @@ viz::ResourceId resource_id)); }; +} // namespace + class CanvasResourceDispatcherTest : public testing::Test, public ::testing::WithParamInterface<TestParams> { public: - void DispatchOneFrame() { - dispatcher_->DispatchFrame(resource_provider_->ProduceCanvasResource(), - base::TimeTicks(), SkIRect::MakeEmpty(), - false /* needs_vertical_flip */, - false /* is-opaque */); + scoped_refptr<CanvasResource> DispatchOneFrame() { + scoped_refptr<CanvasResource> canvas_resource = + resource_provider_->ProduceCanvasResource(); + auto canvas_resource_extra = canvas_resource; + dispatcher_->DispatchFrame( + std::move(canvas_resource), base::TimeTicks(), SkIRect::MakeEmpty(), + false /* needs_vertical_flip */, false /* is-opaque */); + return canvas_resource_extra; } unsigned GetNumUnreclaimedFramesPosted() { @@ -116,7 +119,7 @@ // Post first frame viz::ResourceId post_resource_id(1u); EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, post_resource_id)); - DispatchOneFrame(); + auto frame1 = DispatchOneFrame(); EXPECT_EQ(1u, GetNumUnreclaimedFramesPosted()); EXPECT_EQ(NextId(post_resource_id), PeekNextResourceId()); Mock::VerifyAndClearExpectations(Dispatcher()); @@ -124,7 +127,7 @@ // Post second frame post_resource_id = NextId(post_resource_id); EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, post_resource_id)); - DispatchOneFrame(); + auto frame2 = DispatchOneFrame(); EXPECT_EQ(2u, GetNumUnreclaimedFramesPosted()); EXPECT_EQ(NextId(post_resource_id), PeekNextResourceId()); Mock::VerifyAndClearExpectations(Dispatcher()); @@ -132,7 +135,7 @@ // Post third frame post_resource_id = NextId(post_resource_id); EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, post_resource_id)); - DispatchOneFrame(); + auto frame3 = DispatchOneFrame(); EXPECT_EQ(3u, GetNumUnreclaimedFramesPosted()); EXPECT_EQ(NextId(post_resource_id), PeekNextResourceId()); EXPECT_EQ(nullptr, GetLatestUnpostedImage()); @@ -142,17 +145,17 @@ * the resources in order. */ // Reclaim first frame viz::ResourceId reclaim_resource_id(1u); - Dispatcher()->ReclaimResource(reclaim_resource_id); + Dispatcher()->ReclaimResource(reclaim_resource_id, std::move(frame1)); EXPECT_EQ(2u, GetNumUnreclaimedFramesPosted()); // Reclaim second frame reclaim_resource_id = NextId(reclaim_resource_id); - Dispatcher()->ReclaimResource(reclaim_resource_id); + Dispatcher()->ReclaimResource(reclaim_resource_id, std::move(frame2)); EXPECT_EQ(1u, GetNumUnreclaimedFramesPosted()); // Reclaim third frame reclaim_resource_id = NextId(reclaim_resource_id); - Dispatcher()->ReclaimResource(reclaim_resource_id); + Dispatcher()->ReclaimResource(reclaim_resource_id, std::move(frame3)); EXPECT_EQ(0u, GetNumUnreclaimedFramesPosted()); } @@ -164,8 +167,8 @@ EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, _)).Times(3); // Attempt to post 4 times - DispatchOneFrame(); - DispatchOneFrame(); + auto frame1 = DispatchOneFrame(); + auto frame2 = DispatchOneFrame(); DispatchOneFrame(); DispatchOneFrame(); viz::ResourceId post_resource_id(4u); @@ -189,7 +192,7 @@ * Resource reclaim happens in the same order as frame posting. */ viz::ResourceId reclaim_resource_id(1u); EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, post_resource_id)); - Dispatcher()->ReclaimResource(reclaim_resource_id); + Dispatcher()->ReclaimResource(reclaim_resource_id, std::move(frame1)); // Reclaim 1 frame and post 1 frame, so numPostImagesUnresponded remains as 3 EXPECT_EQ(3u, GetNumUnreclaimedFramesPosted()); // Not generating new resource Id @@ -198,9 +201,11 @@ EXPECT_EQ(viz::kInvalidResourceId, GetLatestUnpostedResourceId()); Mock::VerifyAndClearExpectations(Dispatcher()); + EXPECT_CALL(*(Dispatcher()), PostImageToPlaceholder(_, _)).Times(0); reclaim_resource_id = NextId(reclaim_resource_id); - Dispatcher()->ReclaimResource(reclaim_resource_id); + Dispatcher()->ReclaimResource(reclaim_resource_id, std::move(frame2)); EXPECT_EQ(2u, GetNumUnreclaimedFramesPosted()); + Mock::VerifyAndClearExpectations(Dispatcher()); } TEST_P(CanvasResourceDispatcherTest, DispatchFrame) {
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc index a3a671a..ba4f85c7 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_provider_test.cc
@@ -198,12 +198,11 @@ // Resource recycled. viz::TransferableResource transferable_resource; - viz::ReleaseCallback release_callback; + CanvasResource::ReleaseCallback release_callback; ASSERT_TRUE(resource->PrepareTransferableResource( &transferable_resource, &release_callback, kUnverifiedSyncToken)); auto* resource_ptr = resource.get(); - resource = nullptr; - std::move(release_callback).Run(sync_token, false); + std::move(release_callback).Run(std::move(resource), sync_token, false); provider->Canvas()->clear(SkColors::kBlack); auto resource_again = provider->ProduceCanvasResource();
diff --git a/third_party/blink/renderer/platform/graphics/canvas_resource_test.cc b/third_party/blink/renderer/platform/graphics/canvas_resource_test.cc index 34673ac..e2fd19d3 100644 --- a/third_party/blink/renderer/platform/graphics/canvas_resource_test.cc +++ b/third_party/blink/renderer/platform/graphics/canvas_resource_test.cc
@@ -5,7 +5,6 @@ #include "third_party/blink/renderer/platform/graphics/canvas_resource.h" #include "base/run_loop.h" -#include "components/viz/common/resources/release_callback.h" #include "components/viz/common/resources/transferable_resource.h" #include "components/viz/test/test_gpu_memory_buffer_manager.h" #include "gpu/GLES2/gl2extchromium.h" @@ -29,14 +28,15 @@ cc::PaintFlags::FilterQuality::kLow); EXPECT_TRUE(!!canvas_resource); viz::TransferableResource resource; - viz::ReleaseCallback release_callback; + CanvasResource::ReleaseCallback release_callback; bool success = canvas_resource->PrepareTransferableResource( &resource, &release_callback, kUnverifiedSyncToken); EXPECT_TRUE(success); EXPECT_TRUE(resource.is_software); - std::move(release_callback).Run(gpu::SyncToken(), false); + std::move(release_callback) + .Run(std::move(canvas_resource), gpu::SyncToken(), false); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc index c0ec671..f8fa1a13 100644 --- a/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc +++ b/third_party/blink/renderer/platform/graphics/offscreen_canvas_placeholder.cc
@@ -23,13 +23,12 @@ return s_placeholderRegistry; } -void releaseFrameToDispatcher( +void ReleaseFrameToDispatcher( base::WeakPtr<blink::CanvasResourceDispatcher> dispatcher, - scoped_refptr<blink::CanvasResource>&& oldImage, + scoped_refptr<blink::CanvasResource> oldImage, viz::ResourceId resourceId) { - oldImage = nullptr; // Needed to unref'ed on the right thread if (dispatcher) { - dispatcher->ReclaimResource(resourceId); + dispatcher->ReclaimResource(resourceId, std::move(oldImage)); } } @@ -102,7 +101,7 @@ placeholder_frame_->Transfer(); PostCrossThreadTask( *frame_dispatcher_task_runner_, FROM_HERE, - CrossThreadBindOnce(releaseFrameToDispatcher, frame_dispatcher_, + CrossThreadBindOnce(ReleaseFrameToDispatcher, frame_dispatcher_, std::move(placeholder_frame_), placeholder_frame_resource_id_)); }
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc index ad9d69b..3c63f25 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
@@ -230,63 +230,13 @@ return true; } - PropertyTreeState last_state = local_state; - const auto* ancestor_filter_clip = - ancestor_state.Clip().NearestPixelMovingFilterClip(); - const auto* filter_clip = local_state.Clip().NearestPixelMovingFilterClip(); - while (filter_clip != ancestor_filter_clip) { - if (!filter_clip) { - // Abnormal clip hierarchy. - rect_to_map = InfiniteLooseFloatClipRect(); - return true; - } - - PropertyTreeState new_state(filter_clip->LocalTransformSpace().Unalias(), - *filter_clip, last_state.Effect()); - const auto* filter = filter_clip->PixelMovingFilter(); - DCHECK(filter); - DCHECK_EQ(&filter->LocalTransformSpace().Unalias(), &new_state.Transform()); - if (for_compositing_overlap == ForCompositingOverlap::kYes && - filter->HasActiveFilterAnimation()) { - // Assume during the animation the filter can map |rect_to_map| to - // anywhere. Ancestor clips will still apply. - // TODO(crbug.com/1026653): Use animation bounds instead of infinite rect. - rect_to_map = InfiniteLooseFloatClipRect(); - } else { - bool intersects = - LocalToAncestorVisualRectUnderSameFilterClip<for_compositing_overlap>( - last_state, new_state, rect_to_map, clip_behavior, - inclusive_behavior); - if (!intersects) { - rect_to_map = FloatClipRect(gfx::RectF()); - return false; - } - if (!rect_to_map.IsInfinite()) - rect_to_map.Rect() = filter->MapRect(rect_to_map.Rect()); - } - - last_state = new_state; - const auto* next_clip = filter_clip->UnaliasedParent(); - DCHECK(next_clip); - last_state.SetClip(*next_clip); - filter_clip = next_clip->NearestPixelMovingFilterClip(); + if (&local_state.Effect() != &ancestor_state.Effect() && + &local_state.Clip() != &ancestor_state.Clip()) { + return SlowLocalToAncestorVisualRectWithEffects<for_compositing_overlap>( + local_state, ancestor_state, rect_to_map, clip_behavior, + inclusive_behavior); } - return LocalToAncestorVisualRectUnderSameFilterClip<for_compositing_overlap>( - last_state, ancestor_state, rect_to_map, clip_behavior, - inclusive_behavior); -} - -template <GeometryMapper::ForCompositingOverlap for_compositing_overlap> -bool GeometryMapper::LocalToAncestorVisualRectUnderSameFilterClip( - const PropertyTreeState& local_state, - const PropertyTreeState& ancestor_state, - FloatClipRect& rect_to_map, - OverlayScrollbarClipBehavior clip_behavior, - InclusiveIntersectOrNot inclusive_behavior) { - DCHECK_EQ(local_state.Clip().NearestPixelMovingFilterClip(), - ancestor_state.Clip().NearestPixelMovingFilterClip()); - ExtraProjectionResult extra_result; bool success = false; const auto& translation_2d_or_matrix = SourceToDestinationProjectionInternal( @@ -342,6 +292,62 @@ return !rect_to_map.Rect().IsEmpty(); } +template <GeometryMapper::ForCompositingOverlap for_compositing_overlap> +bool GeometryMapper::SlowLocalToAncestorVisualRectWithEffects( + const PropertyTreeState& local_state, + const PropertyTreeState& ancestor_state, + FloatClipRect& rect_to_map, + OverlayScrollbarClipBehavior clip_behavior, + InclusiveIntersectOrNot inclusive_behavior) { + PropertyTreeState last_state = local_state; + last_state.SetEffect(ancestor_state.Effect()); + const auto* ancestor_filter_clip = + ancestor_state.Clip().NearestPixelMovingFilterClip(); + const auto* filter_clip = local_state.Clip().NearestPixelMovingFilterClip(); + while (filter_clip != ancestor_filter_clip) { + if (!filter_clip) { + // Abnormal clip hierarchy. + rect_to_map = InfiniteLooseFloatClipRect(); + return true; + } + + PropertyTreeState new_state(filter_clip->LocalTransformSpace().Unalias(), + *filter_clip, last_state.Effect()); + const auto* filter = filter_clip->PixelMovingFilter(); + DCHECK(filter); + DCHECK_EQ(&filter->LocalTransformSpace().Unalias(), &new_state.Transform()); + if (for_compositing_overlap == ForCompositingOverlap::kYes && + filter->HasActiveFilterAnimation()) { + // Assume during the animation the filter can map |rect_to_map| to + // anywhere. Ancestor clips will still apply. + // TODO(crbug.com/1026653): Use animation bounds instead of infinite + // rect. + rect_to_map = InfiniteLooseFloatClipRect(); + } else { + bool intersects = + LocalToAncestorVisualRectInternal<for_compositing_overlap>( + last_state, new_state, rect_to_map, clip_behavior, + inclusive_behavior); + if (!intersects) { + rect_to_map = FloatClipRect(gfx::RectF()); + return false; + } + if (!rect_to_map.IsInfinite()) + rect_to_map.Rect() = filter->MapRect(rect_to_map.Rect()); + } + + last_state = new_state; + const auto* next_clip = filter_clip->UnaliasedParent(); + DCHECK(next_clip); + last_state.SetClip(*next_clip); + filter_clip = next_clip->NearestPixelMovingFilterClip(); + } + + return LocalToAncestorVisualRectInternal<for_compositing_overlap>( + last_state, ancestor_state, rect_to_map, clip_behavior, + inclusive_behavior); +} + FloatClipRect GeometryMapper::LocalToAncestorClipRect( const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state, @@ -502,6 +508,9 @@ if (!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) return MightOverlapForCompositingLegacy(rect1, state1, rect2, state2); + if (&state1.Transform() == &state2.Transform()) + return MightOverlapForCompositingInternal(rect1, state1, rect2, state2); + const auto* scroll_translation1 = &state1.Transform().NearestScrollTranslationNode(); const auto* scroll_translation2 =
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h index 5284d34..a6e6f5bb 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
@@ -281,7 +281,7 @@ InclusiveIntersectOrNot); template <ForCompositingOverlap> - static bool LocalToAncestorVisualRectUnderSameFilterClip( + static bool SlowLocalToAncestorVisualRectWithEffects( const PropertyTreeState& local_state, const PropertyTreeState& ancestor_state, FloatClipRect& mapping_rect,
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc index 6d7b7cb4..729d329 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
@@ -1162,21 +1162,26 @@ } if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) { - auto scroll_state2 = CreateScrollTranslationState( - scroll_state1.GetPropertyTreeState(), -2345, -678, - gfx::Rect(20, 10, 200, 100), gfx::Size(3000, 2000)); - // The result is false because the container rect of scroll_state2 doesn't - // intersect with the expanded fixed-position rect in scroll_state1. - EXPECT_FALSE(MightOverlapForCompositing( - gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), - scroll_state2.GetPropertyTreeState())); - - auto scroll_state3 = CreateScrollTranslationState( - scroll_state1.GetPropertyTreeState(), -234, -567, - gfx::Rect(0, 300, 500, 500), gfx::Size(1000, 2000)); - EXPECT_TRUE(MightOverlapForCompositing( - gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), - scroll_state3.GetPropertyTreeState())); + { + SCOPED_TRACE("fixed_state and scroll_state1"); + auto scroll_state2 = CreateScrollTranslationState( + scroll_state1.GetPropertyTreeState(), -2345, -678, + gfx::Rect(20, 10, 200, 100), gfx::Size(3000, 2000)); + // The result is false because the container rect of scroll_state2 doesn't + // intersect with the expanded fixed-position rect in scroll_state1. + EXPECT_FALSE(MightOverlapForCompositing( + gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), + scroll_state2.GetPropertyTreeState())); + } + { + SCOPED_TRACE("fixed_state and scroll_state1"); + auto scroll_state3 = CreateScrollTranslationState( + scroll_state1.GetPropertyTreeState(), -234, -567, + gfx::Rect(0, 300, 500, 500), gfx::Size(1000, 2000)); + EXPECT_TRUE(MightOverlapForCompositing( + gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), + scroll_state3.GetPropertyTreeState())); + } } }
diff --git a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc index 42bae04..69908aa 100644 --- a/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc +++ b/third_party/blink/renderer/platform/graphics/paint/property_tree_state.cc
@@ -71,13 +71,20 @@ &Transform().LowestCommonAncestor(guest.Transform()).Unalias(); } - const auto& clip_lca = Clip().LowestCommonAncestor(guest.Clip()).Unalias(); - if (ClipChainHasCompositedTransformTo(Clip(), clip_lca, *upcast_transform) || - ClipChainHasCompositedTransformTo(guest.Clip(), clip_lca, - *upcast_transform)) - return absl::nullopt; + const ClipPaintPropertyNode* upcast_clip = nullptr; + if (&Clip() == &guest.Clip()) { + upcast_clip = &Clip(); + } else { + upcast_clip = &Clip().LowestCommonAncestor(guest.Clip()).Unalias(); + if (ClipChainHasCompositedTransformTo(Clip(), *upcast_clip, + *upcast_transform) || + ClipChainHasCompositedTransformTo(guest.Clip(), *upcast_clip, + *upcast_transform)) { + return absl::nullopt; + } + } - return PropertyTreeState(*upcast_transform, clip_lca, Effect()); + return PropertyTreeState(*upcast_transform, *upcast_clip, Effect()); } String PropertyTreeStateOrAlias::ToString() const {
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index dab6a93..65566a2 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -1362,9 +1362,7 @@ UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } } - if (result != WebInputEventResult::kNotHandled && - result != WebInputEventResult::kHandledSuppressed && - !PendingUserInput::IsContinuousEventType(web_input_event.GetType())) { + if (!PendingUserInput::IsContinuousEventType(web_input_event.GetType())) { main_thread_only().did_handle_discrete_input_event = true; } }
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py index 280d624..b2b45de 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline.py
@@ -67,6 +67,12 @@ ('Do not optimize (de-duplicate) the expectations after rebaselining ' '(default is to de-dupe automatically). You can use "blink_tool.py ' 'optimize-baselines" to optimize separately.')) + dry_run_option = optparse.make_option( + '--dry-run', + action='store_true', + default=False, + help=('Dry run mode; list actions that would be performed ' + 'but do not actually download any new baselines.')) results_directory_option = optparse.make_option( '--results-directory', action='callback', @@ -133,6 +139,7 @@ self._baseline_suffix_list = BASELINE_SUFFIX_LIST self.expectation_line_changes = ChangeSet() self._tool = None + self._dry_run = False def baseline_directory(self, builder_name): port = self._tool.port_factory.get_from_builder_name(builder_name) @@ -604,6 +611,13 @@ if port.test_configuration().version.lower() in all_versions: to_remove[test].add( port.test_configuration().version.lower()) + + if self._dry_run: + for test, versions in to_remove.items(): + _log.debug('Would have removed expectations for %s: %s', test, + ', '.join(sorted(versions))) + return + port = self._tool.port_factory.get() path = port.path_to_generic_test_expectations_file() test_expectations = TestExpectations( @@ -620,6 +634,12 @@ if not commands: return [] + if self._dry_run: + for command, _ in commands: + _log.debug('Would have run: "%s"', + self._tool.executive.command_for_printing(command)) + return [(0, '', '')] * len(commands) + command_results = self._tool.executive.run_in_parallel(commands) for _, _, stderr in command_results: if stderr: @@ -637,8 +657,8 @@ test_baseline_set: A TestBaselineSet instance, which represents a set of tests/platform combinations to rebaseline. """ - if self._tool.git().has_working_directory_changes( - pathspec=self._web_tests_dir()): + if not self._dry_run and self._tool.git( + ).has_working_directory_changes(pathspec=self._web_tests_dir()): _log.error( 'There are uncommitted changes in the web tests directory; aborting.' ) @@ -668,14 +688,19 @@ self._update_expectations_files(lines_to_remove) if options.optimize: - optimize_commands = self._optimize_commands( - test_baseline_set, options.verbose, options.resultDB) + # No point in optimizing during a dry run where no files were + # downloaded. + if self._dry_run: + _log.info('Skipping optimization during dry run.') + else: + optimize_commands = self._optimize_commands( + test_baseline_set, options.verbose, options.resultDB) + for _, (cmd, cwd) in optimize_commands.items(): + output = self._tool.executive.run_command(cmd, cwd) + print(output) - for _, (cmd, cwd) in optimize_commands.items(): - output = self._tool.executive.run_command(cmd, cwd) - print(output) - - self._tool.git().add_list(self.unstaged_baselines()) + if not self._dry_run: + self._tool.git().add_list(self.unstaged_baselines()) def unstaged_baselines(self): """Returns absolute paths for unstaged (including untracked) baselines.""" @@ -795,6 +820,7 @@ def __init__(self): super(Rebaseline, self).__init__(options=[ self.no_optimize_option, + self.dry_run_option, # FIXME: should we support the platform options in addition to (or instead of) --builders? self.results_directory_option, optparse.make_option( @@ -814,6 +840,7 @@ def execute(self, options, args, tool): self._tool = tool + self._dry_run = options.dry_run if not args: _log.error('Must list tests to rebaseline.') return
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py index 2560a618a..62f1527 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl.py
@@ -36,12 +36,6 @@ def __init__(self): super(RebaselineCL, self).__init__(options=[ optparse.make_option( - '--dry-run', - action='store_true', - default=False, - help='Dry run mode; list actions that would be performed but ' - 'do not actually download any new baselines.'), - optparse.make_option( '--only-changed-tests', action='store_true', default=False, @@ -110,6 +104,7 @@ 'Works with --test-name-file ' 'and positional parameters')), self.no_optimize_option, + self.dry_run_option, self.results_directory_option, ]) self.git_cl = None @@ -118,7 +113,10 @@ def execute(self, options, args, tool): self._tool = tool + self._dry_run = options.dry_run self.git_cl = self.git_cl or GitCL(tool) + # '--dry-run' implies '--no-trigger-jobs'. + options.trigger_jobs = options.trigger_jobs and not self._dry_run if args and options.test_name_file: _log.error('Aborted: Cannot combine --test-name-file and ' 'positional parameters.') @@ -155,7 +153,8 @@ } if not options.trigger_jobs and not jobs: - _log.info('Aborted: no try jobs and --no-trigger-jobs passed.') + _log.info("Aborted: no try jobs and '--no-trigger-jobs' or " + "'--dry-run' passed.") return 1 if options.use_blink_try_bots_only: @@ -207,8 +206,7 @@ if options.fill_missing: self.fill_in_missing_results(test_baseline_set) - if not options.dry_run: - self.rebaseline(options, test_baseline_set) + self.rebaseline(options, test_baseline_set) return 0 def check_ok_to_run(self):
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py index 48292e063..0e66762c 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_cl_unittest.py
@@ -3,6 +3,7 @@ # found in the LICENSE file. import json +import logging import optparse import textwrap @@ -300,27 +301,7 @@ 'resultDB': None } options.update(kwargs) - return optparse.Values(dict(**options)) - - @staticmethod - def command_options_resultDB(**kwargs): - options = { - 'dry_run': False, - 'only_changed_tests': False, - 'trigger_jobs': True, - 'fill_missing': None, - 'optimize': True, - 'results_directory': None, - 'test_name_file': None, - 'verbose': False, - 'builders': [], - 'patchset': None, - 'use_blink_try_bots_only': False, - 'flag_specific': None, - 'resultDB': True - } - options.update(kwargs) - return optparse.Values(dict(**options)) + return optparse.Values(options) def test_execute_basic(self): # By default, with no arguments or options, rebaseline-cl rebaselines @@ -336,6 +317,35 @@ 'INFO: Rebaselining two/image-fail.html\n', ]) + def test_execute_basic_dry_run(self): + """Dry running does not execute any commands or write any files.""" + self.set_logging_level(logging.DEBUG) + # This shallow copy prevents a spurious pass when the filesystem + # contents mapping mutates. + files_before = dict(self.tool.filesystem.files) + exit_code = self.command.execute(self.command_options(dry_run=True), + [], self.tool) + self.assertEqual(exit_code, 0) + messages = self.logMessages() + # Asserting an exact count is brittle. + # Just verify one of each internal command. + self.assertTrue( + any( + message.startswith('DEBUG: Would have run: "python echo ' + 'copy-existing-baselines-internal ') + for message in messages)) + self.assertTrue( + any( + message.startswith('DEBUG: Would have run: "python echo ' + 'rebaseline-test-internal ') + for message in messages)) + # `optimize-baselines` commands are not useful to look at, since many + # are no-ops anyways. We don't look at them here. + self.assertEqual(self.tool.executive.calls, []) + self.assertEqual(self.command.git_cl.calls, []) + self.assertEqual(self.tool.filesystem.files, files_before) + self.assertEqual(self.tool.git().added_paths, set()) + def test_execute_basic_resultDB(self): # By default, with no arguments or options, rebaseline-cl rebaselines # all of the tests that unexpectedly failed. @@ -344,8 +354,8 @@ build, self.web_test_resultsdb) self.tool.results_fetcher.set_artifact_list_for_test( build, self.test_artifacts_list) - exit_code = self.command.execute(self.command_options_resultDB(), [], - self.tool) + exit_code = self.command.execute(self.command_options(resultDB=True), + [], self.tool) self.assertEqual(exit_code, 0) self.assertLog([ 'INFO: Finished try jobs found for all try bots.\n', @@ -445,16 +455,26 @@ ]) def test_execute_no_try_jobs_started_and_no_trigger_jobs(self): - # If there are no try jobs started yet and --no-trigger-jobs is passed, - # then we just abort immediately. + # If there are no try jobs started yet and '--no-trigger-jobs' or + # '--dry-run' is passed, then we just abort immediately. self.command.git_cl = MockGitCL(self.tool, {}) exit_code = self.command.execute( self.command_options(trigger_jobs=False), [], self.tool) self.assertEqual(exit_code, 1) self.assertLog([ 'INFO: No finished try jobs.\n', - 'INFO: Aborted: no try jobs and --no-trigger-jobs passed.\n', + "INFO: Aborted: no try jobs and '--no-trigger-jobs' or '--dry-run' " + "passed.\n", ]) + exit_code = self.command.execute(self.command_options(dry_run=True), + [], self.tool) + self.assertEqual(exit_code, 1) + self.assertLog([ + 'INFO: No finished try jobs.\n', + "INFO: Aborted: no try jobs and '--no-trigger-jobs' or '--dry-run' " + "passed.\n", + ]) + self.assertEqual(self.command.git_cl.calls, []) def test_execute_one_missing_build(self): builds = { @@ -700,7 +720,6 @@ 'not_site_per_process_blink_web_tests (with patch)' ], ]) - print(self.tool.executive.calls) self.assertEqual(self.tool.executive.calls[2], [ 'python', 'echo', 'optimize-baselines', '--no-manifest-update', '--suffixes', 'txt', 'one/text-fail.html'
diff --git a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py index b65a9c8..d059bc0 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/rebaseline_unittest.py
@@ -393,6 +393,7 @@ dict( { 'optimize': True, + 'dry_run': False, 'verbose': True, 'results_directory': None, 'flag_specific': None, @@ -661,6 +662,7 @@ def options(): return optparse.Values({ 'optimize': False, + 'dry_run': False, 'verbose': True, 'results_directory': None, 'flag_specific': None, @@ -1024,6 +1026,7 @@ return optparse.Values({ 'results_directory': False, 'optimize': False, + 'dry_run': False, 'builders': None, 'suffixes': 'png,txt', 'verbose': True,
diff --git a/third_party/blink/web_tests/FlagSpecificConfig b/third_party/blink/web_tests/FlagSpecificConfig index c602b9b1..16feebe 100644 --- a/third_party/blink/web_tests/FlagSpecificConfig +++ b/third_party/blink/web_tests/FlagSpecificConfig
@@ -112,27 +112,6 @@ ] }, { - "name": "webgpu-swiftshader-with-partial-backend-validation", - "args": [ - "--enable-unsafe-webgpu", - "--use-webgpu-adapter=swiftshader", - "--enable-dawn-backend-validation=partial", - "--disable-dawn-features=disallow_unsafe_apis", - "--use-gpu-in-tests", - "--enable-accelerated-2d-canvas" - ], - "comments": [ - "--disable-dawn-features=disallow_unsafe_apis is added so 'unsafe'", - "APIs can be tested with WebGPU CTS", - "--use-webgpu-adapter=swiftshader forces usage for the SwiftShader adapter", - "--use-gpu-in-tests is needed to initialize ANGLE, which in turn is", - "needed to tell Dawn which ANGLE adapter Chromium is using. This", - "helps match the test behavior with the browser.", - "--enable-accelerated-2d-canvas ensures that the canvas reference", - "tests are using GPU rather than CPU" - ] - }, - { "name": "webgpu-with-backend-validation", "args": [ "--enable-unsafe-webgpu",
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 3fb5c1b..0c6a5dd 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -3365,9 +3365,6 @@ # ====== New tests from wpt-importer added here ====== crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/background-image-tiled.https.html [ Failure ] -crbug.com/626703 [ Mac10.15 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Timeout ] -crbug.com/626703 [ Mac12 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Timeout ] -crbug.com/626703 [ Mac11-arm64 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Timeout ] crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/dynamic-import.https.html [ Failure ] crbug.com/626703 external/wpt/custom-elements/form-associated/ElementInternals-target-element-is-held-strongly.html [ Timeout ] crbug.com/626703 [ Mac11-arm64 ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Timeout ] @@ -7094,14 +7091,17 @@ crbug.com/1351811 external/wpt/css/css-transitions/no-transition-from-ua-to-blocking-stylesheet.html [ Failure Pass ] # Flakes on all platforms. -crbug.com/1352209 [ Fuchsia ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Linux ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Mac10.13 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Mac10.14 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Mac11 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Mac12-arm64 ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] -crbug.com/1352209 [ Win ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass ] +crbug.com/1310202 [ Fuchsia ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass Timeout ] +crbug.com/1310202 [ Linux ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass Timeout ] +crbug.com/1310202 [ Mac ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass Timeout ] +crbug.com/1310202 [ Win ] wpt_internal/navigation-api/ordering-and-transition/navigate-cross-document-double.html [ Failure Pass Timeout ] # Sheriff 2022-08-12 crbug.com/1350611 [ Mac10.15 ] external/wpt/html/browsers/browsing-the-web/remote-context-helper-tests/navigation-same-document.window.html [ Failure Pass ] crbug.com/1352248 [ Mac10.15 ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-non-ad-followed-by-ad.html [ Failure Pass ] +crbug.com/1352543 [ Linux ] http/tests/devtools/elements/styles-3/styles-disable-then-delete.js [ Failure Pass ] +crbug.com/1352545 [ Linux ] external/wpt/html/cross-origin-opener-policy/coop-sandbox-redirects-cuts-opener.https.html [ Failure Pass ] +crbug.com/1352545 [ Linux ] external/wpt/html/interaction/focus/chrome-object-tab-focus-bug.html [ Failure Pass ] +crbug.com/1352566 [ Mac ] external/wpt/html/browsers/browsing-the-web/history-traversal/event-order/before-load-hash-twice.html [ Failure Pass ] +crbug.com/1352576 [ Linux ] external/wpt/content-security-policy/media-src/media-src-7_2_2.sub.html [ Failure Pass ] +crbug.com/1352607 external/wpt/css/css-transitions/transition-base-response-002.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/fast/canvas/canvas-oncontextlost.html b/third_party/blink/web_tests/fast/canvas/canvas-oncontextlost.html index 3568dd4..b87cc9c 100644 --- a/third_party/blink/web_tests/fast/canvas/canvas-oncontextlost.html +++ b/third_party/blink/web_tests/fast/canvas/canvas-oncontextlost.html
@@ -8,21 +8,30 @@ <body> <script> -test(function(t) { - var ctx; - var lostEventHasFired = false; +let ctx; +let lostEventHasFired = false; + +function contextLostWrapper() { + contextLost(lostEventHasFired, ctx); +} + +function contextRestoredWrapper() { + contextRestored(lostEventHasFired, ctx); +} + +async_test(function(t) { var contextLostTest; if (window.internals) { var canvas = document.createElement('canvas'); - canvas.oncontextlost = contextLost; - canvas.oncontextrestored = contextRestored; + canvas.oncontextlost = contextLostWrapper; + canvas.oncontextrestored = contextRestoredWrapper; ctx = canvas.getContext('2d'); document.body.appendChild(ctx.canvas); ctx.fillRect(0, 0, 1, 1); // setTimeout creates a frame barrier that locks the canvas into gpu // acceleration mode when running under virtual/gpu - setTimeout(() => { + setTimeout(t.step_func_done(() => { // Now it is safe to use verifyContextLost without fearing side-effects // because a rendering mode was fixed. verifyContextLost(false, ctx); @@ -33,19 +42,11 @@ } else { verifyContextLost(true, ctx); } - }, 0); + }), 0); } else { assert_true(false, "This test requires window.internals."); } -}, "Test the behavior of disconneced canvas recovery after a gpu context loss"); - -function contextLost() { - contextLost(lostEventHasFired, ctx); -} - -function contextRestored() { - contextRestored(lostEventHasFired, ctx); -} +}, "Test the behavior of disconnected canvas recovery after a gpu context loss"); </script> </body>
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect.js b/third_party/blink/web_tests/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect.js index 384b802..c4c9a63 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect.js
@@ -4,7 +4,7 @@ await dp.Page.enable(); await dp.Network.enable(); - await dp.Emulation.setUserAgentOverride({userAgent: 'ua-set-by-devtools'}); + await dp.Emulation.setUserAgentOverride({userAgent: 'ua-set-by-devtools', acceptLanguage: 'ko, en'}); // redirect.php redirects to /inspector-protocol/emulation/resources/echo-headers.php. const redirectUrl = testRunner.url('resources/redirect.php'); @@ -16,11 +16,13 @@ await dp.Network.onceLoadingFinished(); var navigationResponse = (await dp.Network.getResponseBody({requestId: navigationResponseReceived.params.requestId})); printHeader(navigationResponse.result.body, 'User-Agent'); + printHeader(navigationResponse.result.body, 'Accept-Language'); // Use the fetch() API. testRunner.log("Fetch redirect.php"); const fetchResponseBody = await session.evaluateAsync(`fetch("${redirectUrl}").then(r => r.text())`); printHeader(fetchResponseBody, 'User-Agent'); + printHeader(fetchResponseBody, 'Accept-Language'); // Use an XHR request. testRunner.log("XHR redirect.php"); @@ -33,6 +35,7 @@ `}); const xhrResponse = await dp.Network.getResponseBody({requestId: (await dp.Network.onceResponseReceived()).params.requestId}); printHeader(xhrResponse.result.body, 'User-Agent'); + printHeader(xhrResponse.result.body, 'Accept-Language'); function printHeader(response_body, name) { for (const header of response_body.split('\n')) {
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js index 8bf11c3..ee4384e8 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/prefetch/request-will-be-sent.https.js
@@ -8,31 +8,32 @@ let finalizedRequests = 0; let events = []; let requestIds = []; - function store(event, title){ + function store(event, title, order){ const requestId = event.params.requestId; if(!requestIds.includes(requestId)) { requestIds.push(requestId) } - events.push({id: requestId, title: title, params: event.params}); + events.push({id: requestId, title: title, order: order, params: event.params}); } function checkResolve() { finalizedRequests++; if(finalizedRequests >= 2) { - resolve({requestIds, events}); + resolve({requestIds, events: events.sort((x,y)=>x.order-y.order)}); } } - dp.Network.onRequestWillBeSent(event => store(event, 'Network.onRequestWillBeSent')); - dp.Network.onRequestWillBeSentExtraInfo(event => store(event, 'Network.onRequestWillBeSentExtraInfo')); - dp.Network.onResponseReceived(event => store(event, 'Network.onResponseReceived')); - dp.Network.onLoadingFinished(event => { store(event, 'Network.onLoadingFinished'); checkResolve();}); - dp.Network.onLoadingFailed(event => { store(event, 'Network.onLoadingFailed'); checkResolve();}); + dp.Network.onRequestWillBeSent(event => store(event, 'Network.onRequestWillBeSent', 0)); + dp.Network.onRequestWillBeSentExtraInfo(event => store(event, 'Network.onRequestWillBeSentExtraInfo', 1)); + dp.Network.onResponseReceived(event => store(event, 'Network.onResponseReceived', 2)); + dp.Network.onResponseReceivedExtraInfo(event => store(event, 'Network.onResponseReceivedExtraInfo', 3)); + dp.Network.onLoadingFinished(event => { store(event, 'Network.onLoadingFinished', 4); checkResolve();}); + dp.Network.onLoadingFailed(event => { store(event, 'Network.onLoadingFailed', 5); checkResolve();}); }); page.navigate("https://127.0.0.1:8443/inspector-protocol/prefetch/resources/prefetch.https.html") let prefetchRequestId = await testPromise.then((result) => { let prefetchRequestId = undefined; - const stabilizeNames = [...TestRunner.stabilizeNames, 'wallTime', 'requestTime', 'responseTime', 'Date', 'receiveHeadersEnd', 'sendStart', 'sendEnd', 'ETag', 'Last-Modified', 'User-Agent']; + const stabilizeNames = [...TestRunner.stabilizeNames, 'wallTime', 'requestTime', 'responseTime', 'Date', 'receiveHeadersEnd', 'sendStart', 'sendEnd', 'ETag', 'Last-Modified', 'User-Agent', 'headersText']; let {requestIds, events} = result; for(let i=0; i<requestIds.length; ++i) { testRunner.log(`Message ${i}`);
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect-expected.txt index 3864d73..a90ebaa 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/emulation/emulation-user-agent-override-redirect-expected.txt
@@ -1,8 +1,11 @@ Tests emulation of User-Agent header string when the request is redirected. Navigate to redirect.php User-Agent: ua-set-by-devtools +Accept-Language: ko, en;q=0.9 Fetch redirect.php User-Agent: ua-set-by-devtools +Accept-Language: ko, en;q=0.9 XHR redirect.php User-Agent: ua-set-by-devtools +Accept-Language: ko, en;q=0.9
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt index 961ed3e7..08e8ea29 100644 --- a/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt +++ b/third_party/blink/web_tests/platform/generic/http/tests/inspector-protocol/prefetch/request-will-be-sent.https-expected.txt
@@ -127,6 +127,25 @@ timestamp : <number> type : Document } +Network.onResponseReceivedExtraInfo{ + blockedCookies : [ + ] + headers : { + Accept-Ranges : bytes + Connection : Keep-Alive + Content-Length : 395 + Content-Type : text/html + Date : <string> + ETag : <string> + Keep-Alive : timeout=9999 + Last-Modified : <string> + Server : Apache + } + headersText : <string> + requestId : <string> + resourceIPAddressSpace : Local + statusCode : 200 +} Network.onLoadingFinished{ encodedDataLength : 658 requestId : <string> @@ -166,14 +185,22 @@ requestTime : <number> } headers : { + Accept-Encoding : gzip, deflate, br + Accept-Language : en-us,en + Connection : keep-alive + Host : 127.0.0.1:8443 Purpose : prefetch + Sec-Fetch-Dest : empty + Sec-Fetch-Mode : no-cors + Sec-Fetch-Site : none Sec-Purpose : prefetch + User-Agent : <string> } requestId : <string> } Network.onResponseReceived{ frameId : <string> - hasExtraInfo : false + hasExtraInfo : true loaderId : <string> requestId : <string> response : { @@ -245,6 +272,25 @@ timestamp : <number> type : Prefetch } +Network.onResponseReceivedExtraInfo{ + blockedCookies : [ + ] + headers : { + Accept-Ranges : bytes + Connection : Keep-Alive + Content-Length : 395 + Content-Type : text/html + Date : <string> + ETag : <string> + Keep-Alive : timeout=9999 + Last-Modified : <string> + Server : Apache + } + headersText : <string> + requestId : <string> + resourceIPAddressSpace : Local + statusCode : 200 +} Network.onLoadingFinished{ encodedDataLength : 658 requestId : <string>
diff --git a/third_party/breakpad/BUILD.gn b/third_party/breakpad/BUILD.gn index 2df7b35..bf0f4f2 100644 --- a/third_party/breakpad/BUILD.gn +++ b/third_party/breakpad/BUILD.gn
@@ -733,10 +733,7 @@ "//testing/gtest:gtest_main", ] - data_deps = [ - ":linux_dumper_unittest_helper", - "//testing/buildbot/filters:breakpad_unittests_filters", - ] + data_deps = [ ":linux_dumper_unittest_helper" ] include_dirs = [ "linux", # Use our copy of breakpad_googletest_includes.h
diff --git a/third_party/protobuf/README.chromium b/third_party/protobuf/README.chromium index bfcfd86..e42357a 100644 --- a/third_party/protobuf/README.chromium +++ b/third_party/protobuf/README.chromium
@@ -123,4 +123,12 @@ Imports https://critique.corp.google.com/cl/451177197 (a portion of https://github.com/protocolbuffers/protobuf/commit/6dd8af4ecfa7987bddb309862932886b84f1e4ef - ). \ No newline at end of file + ). + +- 0033-no-enum-conversion-warn.patch + + Avoid hitting the clang error -Wenum-constexpr-conversion by specifying width + of the enum. + + Imports https://critique.corp.google.com/cl/466986872. +
diff --git a/third_party/protobuf/patches/0033-no-enum-conversion-warn.patch b/third_party/protobuf/patches/0033-no-enum-conversion-warn.patch new file mode 100644 index 0000000..c7239fc --- /dev/null +++ b/third_party/protobuf/patches/0033-no-enum-conversion-warn.patch
@@ -0,0 +1,17 @@ +diff --git a/third_party/protobuf/src/google/protobuf/wire_format_lite.h b/third_party/protobuf/src/google/protobuf/wire_format_lite.h +index 32fe0c7711bc4..5f1a11e4e2cab 100644 +--- a/third_party/protobuf/src/google/protobuf/wire_format_lite.h ++++ b/third_party/protobuf/src/google/protobuf/wire_format_lite.h +@@ -101,7 +101,11 @@ class PROTOBUF_EXPORT WireFormatLite { + // identifies the encoding of this data, it is possible to skip + // unrecognized fields for forwards compatibility. + +- enum WireType { ++ enum WireType ++#ifndef SWIG ++ : int ++#endif // !SWIG ++ { + WIRETYPE_VARINT = 0, + WIRETYPE_FIXED64 = 1, + WIRETYPE_LENGTH_DELIMITED = 2,
diff --git a/third_party/protobuf/src/google/protobuf/wire_format_lite.h b/third_party/protobuf/src/google/protobuf/wire_format_lite.h index 32fe0c77..5f1a11e 100644 --- a/third_party/protobuf/src/google/protobuf/wire_format_lite.h +++ b/third_party/protobuf/src/google/protobuf/wire_format_lite.h
@@ -101,7 +101,11 @@ // identifies the encoding of this data, it is possible to skip // unrecognized fields for forwards compatibility. - enum WireType { + enum WireType +#ifndef SWIG + : int +#endif // !SWIG + { WIRETYPE_VARINT = 0, WIRETYPE_FIXED64 = 1, WIRETYPE_LENGTH_DELIMITED = 2,
diff --git a/tools/android/checkxmlstyle/checkxmlstyle.py b/tools/android/checkxmlstyle/checkxmlstyle.py index 2066c1b2..022da17c 100644 --- a/tools/android/checkxmlstyle/checkxmlstyle.py +++ b/tools/android/checkxmlstyle/checkxmlstyle.py
@@ -261,24 +261,26 @@ def _CheckSemanticColorsReferences(input_api, output_api): """ Checks colors defined in semantic_colors_non_adaptive.xml only referencing - resources in color_palette.xml. + resources in self or color_palette.xml. """ errors = [] - color_palette = None + usable_colors = None for f in IncludedFiles(input_api): if not f.LocalPath().endswith('/semantic_colors_non_adaptive.xml'): continue - if color_palette is None: + if usable_colors is None: color_palette = _colorXml2Dict( input_api.ReadFile(helpers.COLOR_PALETTE_PATH)) + self_palette = _colorXml2Dict(input_api.ReadFile(f.AbsoluteLocalPath())) + usable_colors = {**color_palette, **self_palette} for line_number, line in f.ChangedContents(): r = helpers.COLOR_REFERENCE_PATTERN.search(line) if not r: continue - color = r.group() - if _removePrefix(color) not in color_palette: + color_ref = r.group() + if _removePrefix(color_ref) not in usable_colors: errors.append( ' %s:%d\n \t%s' % (f.LocalPath(), line_number, line.strip()))
diff --git a/tools/android/checkxmlstyle/checkxmlstyle_test.py b/tools/android/checkxmlstyle/checkxmlstyle_test.py index d01dc2c3..05c20a2 100755 --- a/tools/android/checkxmlstyle/checkxmlstyle_test.py +++ b/tools/android/checkxmlstyle/checkxmlstyle_test.py
@@ -142,11 +142,13 @@ ['<resources><color name="a">#f0f0f0</color></resources>']), MockFile('ui/android/java/res/values/semantic_colors_non_adaptive.xml', [ - '<color name="b">@color/hello<color>', - '<color name="c">@color/a<color>' + '<resources>', + '<color name="b">@color/hello</color>', + '<color name="c">@color/a</color>', + '</resources>' ]), MockFile('ui/android/java/res/values/semantic_colors_adaptive.xml', - ['<color name="c">@color/a<color>']) + ['<color name="c">@color/a</color>']) ] errors = checkxmlstyle._CheckSemanticColorsReferences( mock_input_api, MockOutputApi()) @@ -158,7 +160,7 @@ MockFile(helpers.COLOR_PALETTE_PATH, ['<resources><color name="foo">#f0f0f0</color></resources>']), MockFile('ui/android/java/res/values/semantic_colors_adaptive.xml', - ['<color name="b">@color/foo<color>']), + ['<color name="b">@color/foo</color>']), MockFile('ui/android/java/res/values/colors.xml', [ '<color name="c">@color/b</color>', '<color name="d">@color/b</color>', @@ -169,6 +171,23 @@ mock_input_api, MockOutputApi()) self.assertEqual(1, len(warnings)) + def testValidReferenceInNonAdaptive(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile(helpers.COLOR_PALETTE_PATH, + ['<resources><color name="a">#f0f0f0</color></resources>']), + MockFile('ui/android/java/res/values/semantic_colors_non_adaptive.xml', + [ + '<resources>', + '<color name="b">@color/a</color>', + '<color name="c">@color/b</color>', + '</resources>' + ]) + ] + errors = checkxmlstyle._CheckSemanticColorsReferences( + mock_input_api, MockOutputApi()) + self.assertEqual(0, len(errors)) + class DuplicateColorsTest(unittest.TestCase):
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index 99211811..6998859 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -329,10 +329,6 @@ "META": {"sizes": {"includes": [10]}}, "includes": [2140], }, - "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/password_manager/resources.grd": { - "META": {"sizes": {"includes": [10]}}, - "includes": [2150], - }, # END chrome/browser section. # START chrome/ WebUI resources section
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 0ddeb9a..afbf243f 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -446,6 +446,7 @@ 'linux-lacros-tester-fyi-rel': 'lacros_on_linux_release_bot', 'linux-lacros-version-skew-fyi': 'lacros_on_linux_release_not_build_ash_bot_reclient', 'linux-perfetto-rel': 'perfetto_release_bot_reclient', + 'linux-rel-no-external-ip': 'gpu_tests_release_bot_do_typecheck_reclient', 'linux-upload-perfetto': 'release_bot_perfetto_zlib_reclient', 'linux-wpt-fyi-rel': 'release_trybot_minimal_symbols_reclient', 'linux-wpt-identity-fyi-rel': 'release_bot_minimal_symbols_reclient', @@ -464,6 +465,7 @@ 'win-fieldtrial-rel': 'release_bot_minimal_symbols_reclient', 'win-upload-perfetto': 'release_bot_perfetto_zlib_reclient', 'win10-code-coverage': 'clang_code_coverage_reclient', + 'win10-rel-no-external-ip': 'gpu_tests_release_bot_minimal_symbols_reclient', 'win32-archive-rel-goma-rbe-canary': 'release_bot_x86_minimal_symbols_enable_archive_compression', 'win32-archive-rel-goma-rbe-latest': 'release_bot_x86_minimal_symbols_enable_archive_compression', 'win32-arm64-rel': 'win32_arm64_release_bot_reclient',
diff --git a/tools/mb/mb_config_expectations/chromium.fyi.json b/tools/mb/mb_config_expectations/chromium.fyi.json index 527c685..09d8343 100644 --- a/tools/mb/mb_config_expectations/chromium.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.fyi.json
@@ -1361,6 +1361,17 @@ "use_remoteexec": true } }, + "linux-rel-no-external-ip": { + "gn_args": { + "dcheck_always_on": false, + "devtools_skip_typecheck": false, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "use_remoteexec": true + } + }, "linux-upload-perfetto": { "gn_args": { "dcheck_always_on": false, @@ -1532,6 +1543,17 @@ "use_remoteexec": true } }, + "win10-rel-no-external-ip": { + "gn_args": { + "dcheck_always_on": false, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "symbol_level": 1, + "use_remoteexec": true + } + }, "win32-archive-rel-goma-rbe-canary": { "gn_args": { "dcheck_always_on": false,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 6a7d3fe..e0d2faf1 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -3332,6 +3332,9 @@ </action> <action name="Android.MultiWindowMode.Enter"> + <obsolete> + Deprecated as the data is not valid any more from M100 onward. + </obsolete> <owner>jinsukkim@chromium.org</owner> <owner>twellington@chromium.org</owner> <description>The activity entered Android N multi-window mode.</description> @@ -3346,7 +3349,20 @@ </description> </action> +<action name="Android.MultiWindowMode.Enter2"> + <owner>jinsukkim@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <description> + The activity entered Android N multi-window mode. This is identical to + Android.MultiWindowMode.Enter, but introduced after a bug that affected the + logging was fixed. + </description> +</action> + <action name="Android.MultiWindowMode.Exit"> + <obsolete> + Deprecated as the data is not valid any more from M100 onward. + </obsolete> <owner>twellington@chromium.org</owner> <description>The activity exited Android N multi-window mode.</description> </action> @@ -3360,6 +3376,16 @@ </description> </action> +<action name="Android.MultiWindowMode.Exit2"> + <owner>jinsukkim@chromium.org</owner> + <owner>twellington@chromium.org</owner> + <description> + The activity exited Android N multi-window mode. This is identical to + Android.MultiWindowMode.Exit, but introduced after a bug that affected the + logging was fixed. + </description> +</action> + <action name="Android.MultiWindowMode.MultiInstance.Enter"> <owner>twellington@chromium.org</owner> <description> @@ -16786,6 +16812,33 @@ </description> </action> +<action name="Mobile.OmniboxPasteButton.SearchCopiedImage"> + <owner>christianxu@chromium.org</owner> + <owner>stkhapugin@chromium.org</owner> + <description> + User tapped the paste button in Omnibox's keyboard accessory to search for + an image. + </description> +</action> + +<action name="Mobile.OmniboxPasteButton.SearchCopiedLink"> + <owner>christianxu@chromium.org</owner> + <owner>stkhapugin@chromium.org</owner> + <description> + User tapped the paste button in Omnibox's keyboard accessory to search for a + link. + </description> +</action> + +<action name="Mobile.OmniboxPasteButton.SearchCopiedText"> + <owner>christianxu@chromium.org</owner> + <owner>stkhapugin@chromium.org</owner> + <description> + User tapped the paste button in Omnibox's keyboard accessory to search for + text. + </description> +</action> + <action name="Mobile.SystemNotification.Content.Click.Downloads_Files"> <owner>chrome-analysis-team@google.com</owner> <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index c19753a37..dc0b731 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -57253,7 +57253,6 @@ <int value="-1182087678" label="CrossOriginOpenerPolicyAccessReporting:disabled"/> <int value="-1179917414" label="DefaultChromeAppUninstallSync:disabled"/> - <int value="-1178536416" label="PasswordManagerRedesign:disabled"/> <int value="-1178350793" label="RemoteCopyReceiver:disabled"/> <int value="-1177802205" label="enable-hosted-app-quit-notification"/> <int value="-1177230990" label="PrefetchAndroidFonts:enabled"/> @@ -57381,6 +57380,7 @@ <int value="-1099496822" label="CaptureModeSelfieCamera:enabled"/> <int value="-1099142083" label="V8Ignition:disabled"/> <int value="-1099135056" label="AsyncDns:enabled"/> + <int value="-1098963611" label="ProjectorLocalPlayback:disabled"/> <int value="-1097977406" label="SupervisedUserCommittedInterstitials:enabled"/> <int value="-1096595907" label="disable-new-virtual-keyboard-behavior"/> @@ -57867,6 +57867,7 @@ <int value="-800464360" label="ContextualPageActions:enabled"/> <int value="-800127303" label="OmniboxPedalsTranslationConsole:disabled"/> <int value="-799931058" label="UseMultiloginEndpoint:disabled"/> + <int value="-798521418" label="ArcInputOverlayBeta:disabled"/> <int value="-798187384" label="try-supported-channel-layouts"/> <int value="-797520931" label="ExtensionsToolbarMenu:disabled"/> <int value="-797310986" label="CSSFragmentIdentifiers:disabled"/> @@ -58222,6 +58223,8 @@ <int value="-577982497" label="CupsPrintersUiOverhaul:enabled"/> <int value="-577503348" label="GridTabSwitcherForTablets:disabled"/> <int value="-576759065" label="HoldingSpaceInProgressAnimationV2:disabled"/> + <int value="-575081438" + label="OmniboxMostVisitedTilesFadingOnTablet:disabled"/> <int value="-574965003" label="LauncherLacrosIntegration:disabled"/> <int value="-574354898" label="PostQuantumCECPQ2:enabled"/> <int value="-574217217" label="kSignInProfileCreationEnterprise:enabled"/> @@ -58653,6 +58656,7 @@ <int value="-297716805" label="CrossOriginMediaPlaybackRequiresUserGesture:disabled"/> <int value="-296762162" label="ExoOrdinalMotion:enabled"/> + <int value="-296493265" label="ProjectorAppDebug:enabled"/> <int value="-296179618" label="CookiesWithoutSameSiteMustBeSecure:enabled"/> <int value="-295237704" label="EnableRemovingAllThirdPartyCookies:enabled"/> <int value="-291936879" label="UsernameFirstFlowFilling:disabled"/> @@ -58771,6 +58775,7 @@ <int value="-214618160" label="ESimPolicy:enabled"/> <int value="-213518852" label="protect-sync-credential:enabled"/> <int value="-213214894" label="enable-chromevox-arc-support"/> + <int value="-211162053" label="OmniboxHeaderPaddingUpdate:enabled"/> <int value="-208587977" label="OmniboxMaterialDesignWeatherIcons:enabled"/> <int value="-208435024" label="EnableUsernameCorrection:enabled"/> <int value="-206393363" label="enable-scroll-prediction"/> @@ -58858,6 +58863,7 @@ <int value="-152632720" label="RuntimeHostPermissions:enabled"/> <int value="-152596707" label="NearbySharingSelfShare:enabled"/> <int value="-152439608" label="download-later-debug-on-wifi"/> + <int value="-150820109" label="ProjectorAppDebug:disabled"/> <int value="-150077791" label="FontAccessChooser:disabled"/> <int value="-148356419" label="PdfViewerPresentationMode:disabled"/> <int value="-147560822" label="ArcInputOverlay:enabled"/> @@ -60266,6 +60272,7 @@ <int value="730024226" label="enable-out-of-process-pdf"/> <int value="730478037" label="FilesAppExperimental:disabled"/> <int value="730750097" label="PermissionsBlacklist:disabled"/> + <int value="731201083" label="FeedWebUi:disabled"/> <int value="731318054" label="WebAssemblySimd:enabled"/> <int value="731593144" label="ReadPrinterCapabilitiesWithXps:enabled"/> <int value="731757746" label="ArcEnableDocumentsProviderInFilesApp:disabled"/> @@ -60342,6 +60349,7 @@ <int value="774866229" label="AndroidPWAsDefaultOfflinePage:disabled"/> <int value="775075949" label="ImeInputLogicHmm:enabled"/> <int value="775148009" label="OsSettingsDeepLinking:disabled"/> + <int value="777569794" label="FeedWebUi:enabled"/> <int value="777667507" label="DesktopPWAsLinkCapturing:enabled"/> <int value="778000757" label="EnableInputEventLogging:disabled"/> <int value="779086132" label="enable-data-reduction-proxy-alt"/> @@ -60356,6 +60364,7 @@ <int value="781785788" label="ClipboardSuggestionContentHidden:disabled"/> <int value="782167080" label="enable-new-qp-input-view"/> <int value="783270752" label="AndroidHistoryManager:enabled"/> + <int value="783443490" label="ArcInputOverlayBeta:enabled"/> <int value="783502146" label="AutofillConsiderPlaceholderForParsing:enabled"/> <int value="785273919" label="CompositingBasedThrottling:disabled"/> <int value="787080596" label="DynamicTcmallocTuning:enabled"/> @@ -60554,6 +60563,7 @@ <int value="914708297" label="CCTResizableAllowResizeByUserGesture:enabled"/> <int value="915402820" label="RequestDesktopSiteExceptions:disabled"/> <int value="916316159" label="disable-new-app-list-mixer"/> + <int value="916841877" label="OmniboxMostVisitedTilesFadingOnTablet:enabled"/> <int value="917285134" label="AutofillAddressProfileSavePrompt:enabled"/> <int value="917561046" label="ConversionMeasurement:disabled"/> <int value="918046854" label="NtlmV2Enabled:disabled"/> @@ -60630,7 +60640,6 @@ <int value="972228058" label="SyncUSSSessions:disabled"/> <int value="973601997" label="SafeBrowsingUseLocalBlacklistsV2:disabled"/> <int value="975104092" label="show-taps"/> - <int value="975249239" label="PasswordManagerRedesign:enabled"/> <int value="975463471" label="WebViewExtraHeadersSameOriginOnly:enabled"/> <int value="976079108" label="TouchpadOverscrollHistoryNavigation:disabled"/> <int value="976767701" label="CategoricalSearch:disabled"/> @@ -61539,6 +61548,7 @@ <int value="1548776701" label="AllBookmarks:disabled"/> <int value="1548942246" label="PassiveDocumentEventListeners:disabled"/> <int value="1552753678" label="DnsHttpssvc:disabled"/> + <int value="1553017633" label="OmniboxHeaderPaddingUpdate:disabled"/> <int value="1553310752" label="AccessibilityCursorColor:enabled"/> <int value="1553422694" label="EnablePalmOnMaxTouchMajor:enabled"/> <int value="1553430984" label="Projector:enabled"/> @@ -61742,6 +61752,7 @@ <int value="1685280468" label="AppServiceShelf:enabled"/> <int value="1687544136" label="AndroidManagedByMenuItem:enabled"/> <int value="1688075820" label="OmniboxExperimentalKeywordMode:disabled"/> + <int value="1689001971" label="ProjectorLocalPlayback:enabled"/> <int value="1689123607" label="enable-app-link"/> <int value="1689183477" label="enable-merge-key-char-events"/> <int value="1690248203" label="HelpAppV2:enabled"/> @@ -80658,6 +80669,14 @@ <int value="5" label="Magenta"/> </enum> +<enum name="ProjectorPolicyChangeHandlingError"> + <int value="0" label="SWA manager is not available"/> + <int value="1" label="Web app provider is not available"/> + <int value="2" + label="Web app provider is not available when registry is ready"/> + <int value="3" label="Sync bridge is not available"/> +</enum> + <enum name="ProjectorToolbar"> <int value="0" label="Toolbar opened (Obsolete)"/> <int value="1" label="Toolbar closed (Obsolete)"/>
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index 1a96e1de..6f2c74d 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -3731,6 +3731,16 @@ </summary> </histogram> +<histogram name="Ash.Projector.PolicyChangeHandlingError" + enum="ProjectorPolicyChangeHandlingError" expires_after="2022-12-01"> + <owner>llin@chromium.org</owner> + <owner>cros-projector@google.com</owner> + <summary> + Records the nullptr error that potentially caused a crash when handling + policy changes. + </summary> +</histogram> + <histogram name="Ash.Projector.Toolbar.{TabletOrClamshell}" enum="ProjectorToolbar" expires_after="2022-12-01"> <owner>tobyhuang@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml index 90919e7..ee84bd7 100644 --- a/tools/metrics/histograms/metadata/custom_tabs/histograms.xml +++ b/tools/metrics/histograms/metadata/custom_tabs/histograms.xml
@@ -549,7 +549,7 @@ </histogram> <histogram name="TrustedWebActivity.LocationDelegationEnrolled" enum="Boolean" - expires_after="2023-01-15"> + expires_after="2023-06-30"> <owner>eirage@chromium.org</owner> <owner>peconn@chromium.org</owner> <summary> @@ -560,7 +560,7 @@ </histogram> <histogram name="TrustedWebActivity.LocationPermissionChanged" - enum="TrustedWebActivityPermissionChanged" expires_after="2022-09-18"> + enum="TrustedWebActivityPermissionChanged" expires_after="2023-06-30"> <owner>eirage@chromium.org</owner> <owner>peconn@chromium.org</owner> <summary> @@ -570,7 +570,7 @@ </histogram> <histogram name="TrustedWebActivity.LocationPermissionRequestIsGranted" - enum="Boolean" expires_after="2022-09-18"> + enum="Boolean" expires_after="2023-06-30"> <owner>eirage@chromium.org</owner> <owner>peconn@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/gpu/histograms.xml b/tools/metrics/histograms/metadata/gpu/histograms.xml index b1a0eda..a4263fe 100644 --- a/tools/metrics/histograms/metadata/gpu/histograms.xml +++ b/tools/metrics/histograms/metadata/gpu/histograms.xml
@@ -876,6 +876,28 @@ </summary> </histogram> +<histogram name="GPU.GPUInitializationTime.V4" units="ms" + expires_after="2023-02-01"> + <owner>zmo@chromium.org</owner> + <owner>spvw@chromium.org</owner> + <summary> + The time between the GPU process start and the collection of GPU info during + the process's startup phase. The time range is between 5ms and 90s. Emitted + after the collection of GPU info. Reported for all clients. + + This metric is similar to GPU.GPUInitializationTime.V3, but there are two + main differences. First, the range for GPU.GPUInitializationTime.V4 is + capped at 90s while the range of the other metric is capped at 5s. Second, + this metric is emitted earlier in the execution because this metric is + recorded at the same time as trace events which require the timestamp + marking the start and end of the GPU initialization to be in scope, whereas + V3 only requires the time spent. + + The purpose of this metric is to investigate the long tail of GPU startup + time. See crbug/1350257. + </summary> +</histogram> + <histogram name="GPU.GPUProcessExitCode" enum="GPUProcessExitCode" expires_after="2023-01-01"> <owner>zmo@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index ea6a32c..6bd4304e 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -8491,12 +8491,17 @@ </histogram> <histogram base="true" name="Mouse.ScrollSensitivity" enum="PointerSensitivity" - expires_after="2020-12-01"> + expires_after="2023-08-09"> <!-- Name completed by histogram_suffixes name="PreferenceChangeType" --> - <owner>khorimoto@chromium.org</owner> <owner>zentaro@chromium.org</owner> - <summary>Mouse scroll sensitivity value. Only reported on Chrome OS.</summary> + <owner>cros-peripherals@google.com</owner> + <summary> + Mouse scroll sensitivity value. Only reported on Chrome OS. + + Warning: this histogram was expired from 2020-12-01 to M105; data may be + missing. + </summary> </histogram> <histogram name="MPArch.ChildProcessLaunchFirst" units="ms" @@ -13571,21 +13576,8 @@ <summary>Number of retries until the final response was recorded.</summary> </histogram> -<histogram name="Toolbar.ChromeLabs.AshOwnerCheckTime" units="ms" - expires_after="M107"> - <owner>elainechien@chromium.org</owner> - <owner>labs-on-chrome@google.com</owner> - <summary> - Chrome Labs features user-facing experiments through a button in the - toolbar. - - Tracks time elapsed between when IsOwnerAsync is called and the callback to - show the Chrome Labs bubble is called when IsOwnerAsync returns. - </summary> -</histogram> - <histogram name="Toolbar.ChromeLabs.{State}LabAction" - enum="ChromeLabsSelectedLab" expires_after="M107"> + enum="ChromeLabsSelectedLab" expires_after="M112"> <owner>elainechien@chromium.org</owner> <owner>robliao@chromium.org</owner> <summary> @@ -13717,17 +13709,20 @@ </histogram> <histogram name="Touchpad.NaturalScroll.Changed" enum="BooleanEnabled" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad natural scroll setting changes by the user. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.NaturalScroll.Started" enum="BooleanEnabled" - expires_after="2022-12-04"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> @@ -13737,78 +13732,99 @@ </histogram> <histogram name="Touchpad.PointerSensitivity.Changed" enum="PointerSensitivity" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad sensitivity setting changes by the user. This replaces the old Touchpad.Sensitivity.Changed metric. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.PointerSensitivity.Started" enum="PointerSensitivity" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad sensitivity setting on startup. This replaces the old Touchpad.Sensitivity.Started metric. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram base="true" name="Touchpad.ScrollAcceleration" enum="BooleanEnabled" - expires_after="2020-12-01"> + expires_after="2023-08-09"> <!-- Name completed by histogram_suffixes name="PreferenceChangeType" --> - <owner>khorimoto@chromium.org</owner> <owner>zentaro@chromium.org</owner> + <owner>cros-peripherals@google.com</owner> <summary> Whether touchpad scroll acceleration is enabled. Only reported on Chrome OS. + + Warning: this histogram was expired from 2020-12-01 to M105; data may be + missing. </summary> </histogram> <histogram base="true" name="Touchpad.ScrollSensitivity" - enum="PointerSensitivity" expires_after="2020-12-01"> + enum="PointerSensitivity" expires_after="2023-08-09"> <!-- Name completed by histogram_suffixes name="PreferenceChangeType" --> - <owner>khorimoto@chromium.org</owner> <owner>zentaro@chromium.org</owner> + <owner>cros-peripherals@google.com</owner> <summary> Touchpad scroll sensitivity value. Only reported on Chrome OS. + + Warning: this histogram was expired from 2020-12-01 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.TapDragging.Changed" enum="BooleanEnabled" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad TapDragging setting changes by the user. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.TapDragging.Started" enum="BooleanEnabled" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad TapDragging setting on startup. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.TapToClick.Changed" enum="BooleanEnabled" - expires_after="2022-06-15"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary> Tracks touchpad TapToClick setting changes by the user. Only reported on Chrome OS. + + Warning: this histogram was expired from 2022-06-15 to M105; data may be + missing. </summary> </histogram> <histogram name="Touchpad.TapToClick.Started" enum="BooleanEnabled" - expires_after="2022-12-04"> + expires_after="2023-08-09"> <owner>zentaro@chromium.org</owner> <owner>cros-peripherals@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml index 88dd64e0..875c38e 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/histograms.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/histograms.xml
@@ -2161,6 +2161,21 @@ </summary> </histogram> +<histogram name="SafeBrowsing.V4Database.SizeLinear{ThreatTypeKB}" + units="100 KB" expires_after="2023-01-01"> + <owner>kristianm@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + The size of {ThreatTypeKB} SafeBrowsing database or file on disk in 100 KB, + after reading it from disk on startup and after a database update has + occurred. Linear version of V4Database.Size histogram. + </summary> + <token key="ThreatTypeKB"> + <variant name=".ChromeExtMalware" summary="extension malware"/> + <variant name=".UrlMalBin" summary="malware"/> + </token> +</histogram> + <histogram name="SafeBrowsing.V4Database.SizeLinear{ThreatType}" units="MB" expires_after="2023-01-01"> <owner>richche@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index 3277719..e29d454 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -868,27 +868,32 @@ </summary> </histogram> -<histogram name="UMA.UnsentLogs.Dropped" units="units" - expires_after="2022-12-04"> +<histogram name="UMA.UnsentLogs.Dropped" units="logs" + expires_after="2023-08-01"> <owner>holte@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> - Counter for number of UMA unsent logs removed from persistent storage. + The number of unsent UMA logs removed from persistent storage. Emitted just + before unsent logs are trimmed. Unsent log trimming occurs immediately after + logs creation, upon successful log upload, or whenever MetricsService stops + recording. </summary> </histogram> <histogram name="UMA.UnsentLogs.DroppedSize" units="bytes" - expires_after="2022-12-04"> + expires_after="2023-08-01"> <owner>akirabaruah@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> Size of unsent logs removed from persistent storage due to exceeding the - individual log size limit. Unsent log trimming occurs immediately after - initial logs creation, upon successful log upload, or whenever - MetricsService stops recording. + individual log size limit. Unsent log trimming occurs immediately after logs + creation, upon successful log upload, or whenever MetricsService stops + recording. </summary> </histogram> @@ -896,6 +901,7 @@ expires_after="2023-08-01"> <owner>michaelbai@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> The size of all persistent initial or ongoing logs that have been @@ -908,10 +914,11 @@ expires_after="2023-08-01"> <owner>michaelbai@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> - The number of UMA sent samples in the previous browser run; it is recorded - on the browser start up. + The number of UMA histogram samples that were sent in the previous browser + run. Emitted when the browser starts up. </summary> </histogram> @@ -919,10 +926,11 @@ expires_after="2023-08-01"> <owner>michaelbai@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> - The number of UMA unsent samples in the previous browser run; it is recorded - on the browser start up. + The number of UMA histogram samples that were not yet sent in the previous + browser run. Emitted when the browser starts up. </summary> </histogram> @@ -930,6 +938,7 @@ expires_after="2023-08-01"> <owner>michaelbai@chromium.org</owner> <owner>asvitkine@chromium.org</owner> + <owner>lucnguyen@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> The percentage of the unsent samples over the total in the previous browser
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 687c3c54..6df3a1c 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -12836,6 +12836,36 @@ </metric> </event> +<event name="NavigationThrottleDeferredTime" singular="False"> + <owner>ryansturm@chromium.org</owner> + <owner>chrome-brapp-loading@google.com</owner> + <summary> + Information recorded about a navigation throttle when a navigation is + deferred at any stage of the navigation. Only recorded for main frame + navigations that were deferred and later resumed. + </summary> + <metric name="DurationOfNavigationDeferralMs"> + <summary> + The duration from the start of the navigation deferral until the throttle + resumes the navigation recorded in milliseconds. + </summary> + </metric> + <metric name="NavigationThrottleEventType"> + <summary> + An enum representing each event that can cause deferral method + (WillFailRequest, WillProcessResponse, WillRedirectRequest, + WillStartRequest). See NavigationThrottleRunner::Event for enum details. + </summary> + </metric> + <metric name="NavigationThrottleNameHash"> + <summary> + A (MD5) hash of the logging name string which represents a unique + navigation throttle class (subclass of NavigationThrottle). See + NavigationThrottle::GetNameForLogging(). + </summary> + </metric> +</event> + <event name="NavigationTiming" singular="True"> <owner>nhiroki@chromium.org</owner> <owner>chrome-loading@google.com</owner> @@ -21729,17 +21759,38 @@ <summary> Records the display mode of the added Webapp. </summary> + <aggregation> + <history> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> </metric> <metric name="SameAsManifestStartUrl" enum="Boolean"> <summary> Record whether `start_url` for the Shortcuts is the same as the current page url. </summary> + <aggregation> + <history> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> </metric> <metric name="ShortcutReason" enum="InstallableStatusCode"> <summary> Record an StatusCode for why this site is not WebAPK compatible. </summary> + <aggregation> + <history> + <statistics> + <enumeration/> + </statistics> + </history> + </aggregation> </metric> </event>
diff --git a/ui/accessibility/ax_node.cc b/ui/accessibility/ax_node.cc index a424230..be838b2 100644 --- a/ui/accessibility/ax_node.cc +++ b/ui/accessibility/ax_node.cc
@@ -20,7 +20,6 @@ #include "ui/accessibility/ax_table_info.h" #include "ui/accessibility/ax_tree.h" #include "ui/accessibility/ax_tree_manager.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/gfx/color_utils.h" #include "ui/gfx/geometry/transform.h" @@ -63,8 +62,7 @@ size_t AXNode::GetChildCountCrossingTreeBoundary() const { DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) return 1u; @@ -81,8 +79,7 @@ // TODO(nektar): Should DCHECK that this node is not ignored. DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) { DCHECK_EQ(unignored_child_count_, 0u) << "A node cannot be hosting both a child tree and other nodes as " @@ -103,8 +100,7 @@ AXNode* AXNode::GetChildAtIndexCrossingTreeBoundary(size_t index) const { DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) { DCHECK_EQ(index, 0u) << "A node cannot be hosting both a child tree and other nodes as " @@ -133,8 +129,7 @@ // TODO(nektar): Should DCHECK that this node is not ignored. DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) { DCHECK_EQ(index, 0u) << "A node cannot be hosting both a child tree and other nodes as " @@ -218,8 +213,7 @@ AXNode* AXNode::GetFirstUnignoredChildCrossingTreeBoundary() const { DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) return child_tree_manager->GetRootAsAXNode(); @@ -250,8 +244,7 @@ AXNode* AXNode::GetLastUnignoredChildCrossingTreeBoundary() const { DCHECK(!tree_->GetTreeUpdateInProgressState()); - const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + const AXTreeManager* child_tree_manager = AXTreeManager::ForChildTree(*this); if (child_tree_manager) return child_tree_manager->GetRootAsAXNode(); @@ -773,7 +766,75 @@ } AXTreeManager* AXNode::GetManager() const { - return AXTreeManagerMap::GetInstance().GetManager(tree_->GetAXTreeID()); + return AXTreeManager::FromID(tree_->GetAXTreeID()); +} + +bool AXNode::HasVisibleCaretOrSelection() const { + const OwnerTree::Selection selection = GetSelection(); + const AXNode* focus = tree()->GetFromId(selection.focus_object_id); + if (!focus || !focus->IsDescendantOf(this)) + return false; + + // A selection or the caret will be visible in a focused text field (including + // a content editable). + const AXNode* text_field = GetTextFieldAncestor(); + if (text_field) + return true; + + // The selection will be visible in non-editable content only if it is not + // collapsed. + return !selection.IsCollapsed(); +} + +AXNode::OwnerTree::Selection AXNode::GetSelection() const { + DCHECK(tree()) << "Cannot retrieve the current selection if the node is not " + "attached to an accessibility tree.\n" + << *this; + return tree()->GetSelection(); +} + +AXNode::OwnerTree::Selection AXNode::GetUnignoredSelection() const { + DCHECK(tree()) << "Cannot retrieve the current selection if the node is not " + "attached to an accessibility tree.\n" + << *this; + OwnerTree::Selection selection = tree()->GetUnignoredSelection(); + + // "selection.anchor_offset" and "selection.focus_ofset" might need to be + // adjusted if the anchor or the focus nodes include ignored children. + // + // TODO(nektar): Move this logic into its own "AXSelection" class and cache + // the result for faster reuse. + const AXNode* anchor = tree()->GetFromId(selection.anchor_object_id); + if (anchor && !anchor->IsLeaf()) { + DCHECK_GE(selection.anchor_offset, 0); + if (static_cast<size_t>(selection.anchor_offset) < + anchor->GetChildCount()) { + const AXNode* anchor_child = + anchor->GetChildAtIndex(selection.anchor_offset); + DCHECK(anchor_child); + selection.anchor_offset = + static_cast<int>(anchor_child->GetUnignoredIndexInParent()); + } else { + selection.anchor_offset = + static_cast<int>(anchor->GetUnignoredChildCount()); + } + } + + const AXNode* focus = tree()->GetFromId(selection.focus_object_id); + if (focus && !focus->IsLeaf()) { + DCHECK_GE(selection.focus_offset, 0); + if (static_cast<size_t>(selection.focus_offset) < focus->GetChildCount()) { + const AXNode* focus_child = + focus->GetChildAtIndex(selection.focus_offset); + DCHECK(focus_child); + selection.focus_offset = + static_cast<int>(focus_child->GetUnignoredIndexInParent()); + } else { + selection.focus_offset = + static_cast<int>(focus->GetUnignoredChildCount()); + } + } + return selection; } bool AXNode::HasStringAttribute(ax::mojom::StringAttribute attribute) const { @@ -879,7 +940,7 @@ if (GetRole() == ax::mojom::Role::kPortal && GetNameFrom() == ax::mojom::NameFrom::kNone) { const AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManagerForChildTree(*this); + AXTreeManager::ForChildTree(*this); if (child_tree_manager) node = child_tree_manager->GetRootAsAXNode(); }
diff --git a/ui/accessibility/ax_node.h b/ui/accessibility/ax_node.h index a40f016..971cf7f 100644 --- a/ui/accessibility/ax_node.h +++ b/ui/accessibility/ax_node.h
@@ -61,13 +61,32 @@ // be necessary. class OwnerTree { public: - struct Selection { - bool is_backward; - AXNodeID anchor_object_id; - int anchor_offset; + // A data structure that can store either the selected range of nodes in the + // accessibility tree, or the location of the caret in the case of a + // "collapsed" selection. + // + // TODO(nektar): Move this struct into its own file called "AXSelection", + // turn it into a class and make it compute the unignored selection given + // the `AXTreeData`. + struct Selection final { + Selection() = default; + ~Selection() = default; + constexpr Selection(const Selection&) = default; + constexpr Selection& operator=(const Selection&) = default; + + // Returns true if this instance represents the position of the caret. + constexpr bool IsCollapsed() const { + return focus_object_id != kInvalidAXNodeID && + anchor_object_id == focus_object_id && + anchor_offset == focus_offset; + } + + bool is_backward = false; + AXNodeID anchor_object_id = kInvalidAXNodeID; + int anchor_offset = -1; ax::mojom::TextAffinity anchor_affinity; - AXNodeID focus_object_id; - int focus_offset; + AXNodeID focus_object_id = kInvalidAXNodeID; + int focus_offset = -1; ax::mojom::TextAffinity focus_affinity; }; @@ -83,8 +102,13 @@ virtual absl::optional<int> GetPosInSet(const AXNode& node) = 0; virtual absl::optional<int> GetSetSize(const AXNode& node) = 0; + // See `AXTree::GetSelection`. + virtual Selection GetSelection() const = 0; + // See `AXTree::GetUnignoredSelection`. virtual Selection GetUnignoredSelection() const = 0; + // See `AXTree::GetTreeUpdateInProgressState`. virtual bool GetTreeUpdateInProgressState() const = 0; + // See `AXTree::HasPaginationSupport`. virtual bool HasPaginationSupport() const = 0; }; @@ -314,6 +338,22 @@ AXTreeManager* GetManager() const; // + // Methods for accessing caret and selection information. + // + + // Returns true if the caret is visible or there is an active selection inside + // this node. + bool HasVisibleCaretOrSelection() const; + + // Gets the current selection from the accessibility tree. + OwnerTree::Selection GetSelection() const; + + // Gets the unignored selection from the accessibility tree, meaning the + // selection whose endpoints are on unignored nodes. (An "ignored" node is a + // node that is not exposed to platform APIs: See `IsIgnored`.) + OwnerTree::Selection GetUnignoredSelection() const; + + // // Methods for accessing accessibility attributes including attributes that // are computed on the browser side. (See `AXNodeData` and // `AXComputedNodeData` for more information.)
diff --git a/ui/accessibility/ax_position.h b/ui/accessibility/ax_position.h index 5e34d479..3ada31c 100644 --- a/ui/accessibility/ax_position.h +++ b/ui/accessibility/ax_position.h
@@ -35,7 +35,6 @@ #include "ui/accessibility/ax_text_attributes.h" #include "ui/accessibility/ax_tree_id.h" #include "ui/accessibility/ax_tree_manager.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/gfx/utf16_indexing.h" namespace ui { @@ -402,7 +401,7 @@ DCHECK(GetManager()); std::ostringstream str; str << "* Position: " << ToString() - << "\n* Manager: " << GetManager()->ToString() + << "\n* Manager: " << GetManager()->ax_tree()->data().ToString() << "\n* Anchor node: " << *GetAnchor(); return str.str(); } @@ -411,9 +410,7 @@ AXTreeID tree_id() const { return tree_id_; } AXNodeID anchor_id() const { return anchor_id_; } - AXTreeManager* GetManager() const { - return AXTreeManagerMap::GetInstance().GetManager(tree_id()); - } + AXTreeManager* GetManager() const { return AXTreeManager::FromID(tree_id()); } AXNode* GetAnchor() const { if (tree_id_ == AXTreeIDUnknown() || anchor_id_ == kInvalidAXNodeID)
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc index 966b3c9..9e716fc9 100644 --- a/ui/accessibility/ax_tree.cc +++ b/ui/accessibility/ax_tree.cc
@@ -2684,12 +2684,15 @@ } // namespace +AXTree::Selection AXTree::GetSelection() const { + return {data().sel_is_backward, data().sel_anchor_object_id, + data().sel_anchor_offset, data().sel_anchor_affinity, + data().sel_focus_object_id, data().sel_focus_offset, + data().sel_focus_affinity}; +} + AXTree::Selection AXTree::GetUnignoredSelection() const { - Selection unignored_selection = { - data().sel_is_backward, data().sel_anchor_object_id, - data().sel_anchor_offset, data().sel_anchor_affinity, - data().sel_focus_object_id, data().sel_focus_offset, - data().sel_focus_affinity}; + Selection unignored_selection = GetSelection(); // If one of the selection endpoints is invalid, then the other endpoint // should also be unset.
diff --git a/ui/accessibility/ax_tree.h b/ui/accessibility/ax_tree.h index fd17b85a..554c202 100644 --- a/ui/accessibility/ax_tree.h +++ b/ui/accessibility/ax_tree.h
@@ -215,6 +215,14 @@ // present in the cache. absl::optional<int> GetSetSize(const AXNode& node) override; + // Returns the part of the current selection that falls within this + // accessibility tree, if any. + Selection GetSelection() const override; + + // Returns the part of the current selection that falls within this + // accessibility tree, if any, adjusting its endpoints to be within unignored + // nodes. (An "ignored" node is a node that is not exposed to platform APIs: + // See `AXNode::IsIgnored`.) Selection GetUnignoredSelection() const override; bool GetTreeUpdateInProgressState() const override;
diff --git a/ui/accessibility/ax_tree_manager.cc b/ui/accessibility/ax_tree_manager.cc index f65fb53..5fa63b8 100644 --- a/ui/accessibility/ax_tree_manager.cc +++ b/ui/accessibility/ax_tree_manager.cc
@@ -4,20 +4,79 @@ #include "ui/accessibility/ax_tree_manager.h" +#include "base/no_destructor.h" #include "ui/accessibility/ax_export.h" #include "ui/accessibility/ax_node.h" #include "ui/accessibility/ax_tree_id.h" +#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/accessibility/ax_tree_observer.h" namespace ui { +// static +AXTreeManagerMap& AXTreeManager::GetMap() { + static base::NoDestructor<AXTreeManagerMap> map; + return *map; +} + +// static +AXTreeManager* AXTreeManager::FromID(AXTreeID ax_tree_id) { + return ax_tree_id != AXTreeIDUnknown() ? GetMap().GetManager(ax_tree_id) + : nullptr; +} + +// static +AXTreeManager* AXTreeManager::ForChildTree(const AXNode& parent_node) { + if (!parent_node.HasStringAttribute( + ax::mojom::StringAttribute::kChildTreeId)) { + return nullptr; + } + + AXTreeID child_tree_id = AXTreeID::FromString( + parent_node.GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId)); + AXTreeManager* child_tree_manager = GetMap().GetManager(child_tree_id); + + // Some platforms do not use AXTreeManagers, so child trees don't exist in + // the browser process. + DCHECK(!child_tree_manager || + !child_tree_manager->GetParentNodeFromParentTreeAsAXNode() || + child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() == + parent_node.id()); + return child_tree_manager; +} + AXTreeManager::AXTreeManager() : ax_tree_id_(AXTreeIDUnknown()), ax_tree_(nullptr) {} +AXTreeManager::AXTreeManager(std::unique_ptr<AXTree> tree) + : ax_tree_id_(tree ? tree->data().tree_id : AXTreeIDUnknown()), + ax_tree_(std::move(tree)) { + GetMap().AddTreeManager(ax_tree_id_, this); +} + AXTreeManager::AXTreeManager(const AXTreeID& tree_id, std::unique_ptr<AXTree> tree) - : ax_tree_id_(tree_id), ax_tree_(std::move(tree)) {} + : ax_tree_id_(tree_id), ax_tree_(std::move(tree)) { + GetMap().AddTreeManager(ax_tree_id_, this); + if (ax_tree()) + tree_observation_.Observe(ax_tree()); +} -AXTreeManager::~AXTreeManager() = default; +AXTreeManager::~AXTreeManager() { + if (ax_tree_) + GetMap().RemoveTreeManager(ax_tree_id_); +} + +void AXTreeManager::OnTreeDataChanged(AXTree* tree, + const AXTreeData& old_data, + const AXTreeData& new_data) { + GetMap().RemoveTreeManager(ax_tree_id_); + ax_tree_id_ = new_data.tree_id; + GetMap().AddTreeManager(ax_tree_id_, this); +} + +void AXTreeManager::RemoveFromMap() { + GetMap().RemoveTreeManager(ax_tree_id_); +} } // namespace ui
diff --git a/ui/accessibility/ax_tree_manager.h b/ui/accessibility/ax_tree_manager.h index 8f448abe..8828d2d 100644 --- a/ui/accessibility/ax_tree_manager.h +++ b/ui/accessibility/ax_tree_manager.h
@@ -13,12 +13,18 @@ namespace ui { class AXNode; +class AXTreeManagerMap; // Abstract interface for a class that owns an AXTree and manages its // connections to other AXTrees in the same page or desktop (parent and child // trees). class AX_EXPORT AXTreeManager : public AXTreeObserver { public: + static AXTreeManager* FromID(AXTreeID ax_tree_id); + // If the child of `parent_node` exists in a separate child tree, return the + // tree manager for that child tree. Otherwise, return nullptr. + static AXTreeManager* ForChildTree(const AXNode& parent_node); + AXTreeManager(const AXTreeManager&) = delete; AXTreeManager& operator=(const AXTreeManager&) = delete; @@ -35,11 +41,6 @@ // Returns nullptr if |node_id| is not found. virtual AXNode* GetNodeFromTree(const AXNodeID node_id) const = 0; - // Use `AddObserver` and `RemoveObserver` when you want to be notified when - // changes happen to an `XTree` - virtual void AddObserver(AXTreeObserver* observer) {} - virtual void RemoveObserver(AXTreeObserver* observer) {} - // Returns the tree id of the tree managed by this AXTreeManager. virtual AXTreeID GetTreeID() const = 0; @@ -59,18 +60,13 @@ // `AXTreeManagerMap`. virtual void WillBeRemovedFromMap() {} - // For debugging. - // TODO(benjamin.beaudry) Instead of this, implement GetTreeData() on all - // AXTreeManager subclasses, and have callers use GetTreeData().ToString(); - virtual std::string ToString() const = 0; - const AXTreeID& ax_tree_id() const { return ax_tree_id_; } AXTree* ax_tree() const { return ax_tree_.get(); } // AXTreeObserver implementation. void OnTreeDataChanged(ui::AXTree* tree, const ui::AXTreeData& old_data, - const ui::AXTreeData& new_data) override {} + const ui::AXTreeData& new_data) override; void OnNodeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override {} void OnSubtreeWillBeDeleted(ui::AXTree* tree, ui::AXNode* node) override {} void OnNodeCreated(ui::AXTree* tree, ui::AXNode* node) override {} @@ -87,10 +83,31 @@ protected: AXTreeManager(); + explicit AXTreeManager(std::unique_ptr<AXTree> tree); explicit AXTreeManager(const AXTreeID& tree_id, std::unique_ptr<AXTree> tree); + // TODO(benjamin.beaudry): Remove this helper once we move the logic related + // to the parent connection from `BrowserAccessibilityManager` to this class. + // `BrowserAccessibilityManager` needs to remove the manager from the map + // before calling `BrowserAccessibilityManager::ParentConnectionChanged`, so + // the default removal of the manager in `~AXTreeManager` occurs too late. + void RemoveFromMap(); + AXTreeID ax_tree_id_; std::unique_ptr<AXTree> ax_tree_; + + private: + friend class TestAXTreeManager; + + static AXTreeManagerMap& GetMap(); + + // Automatically stops observing notifications from the AXTree when this class + // is destructed. + // + // This member needs to be destructed before any observed AXTrees. Since + // destructors for non-static member fields are called in the reverse order of + // declaration, do not move this member above other members. + base::ScopedObservation<AXTree, AXTreeObserver> tree_observation_{this}; }; } // namespace ui
diff --git a/ui/accessibility/ax_tree_manager_map.cc b/ui/accessibility/ax_tree_manager_map.cc index 8e12b19..574f12c 100644 --- a/ui/accessibility/ax_tree_manager_map.cc +++ b/ui/accessibility/ax_tree_manager_map.cc
@@ -5,8 +5,6 @@ #include "ui/accessibility/ax_tree_manager_map.h" #include "base/containers/contains.h" -#include "base/no_destructor.h" -#include "ui/accessibility/ax_enums.mojom.h" namespace ui { @@ -14,26 +12,20 @@ AXTreeManagerMap::~AXTreeManagerMap() = default; -// static -AXTreeManagerMap& AXTreeManagerMap::GetInstance() { - static base::NoDestructor<AXTreeManagerMap> instance; - return *instance; -} - -void AXTreeManagerMap::AddTreeManager(AXTreeID tree_id, +void AXTreeManagerMap::AddTreeManager(const AXTreeID& tree_id, AXTreeManager* manager) { if (tree_id != AXTreeIDUnknown()) map_[tree_id] = manager; } -void AXTreeManagerMap::RemoveTreeManager(AXTreeID tree_id) { +void AXTreeManagerMap::RemoveTreeManager(const AXTreeID& tree_id) { if (auto* manager = GetManager(tree_id)) { manager->WillBeRemovedFromMap(); map_.erase(tree_id); } } -AXTreeManager* AXTreeManagerMap::GetManager(AXTreeID tree_id) { +AXTreeManager* AXTreeManagerMap::GetManager(const AXTreeID& tree_id) { if (tree_id == AXTreeIDUnknown()) return nullptr; auto iter = map_.find(tree_id); @@ -43,25 +35,4 @@ return iter->second; } -AXTreeManager* AXTreeManagerMap::GetManagerForChildTree( - const AXNode& parent_node) { - if (!parent_node.HasStringAttribute( - ax::mojom::StringAttribute::kChildTreeId)) { - return nullptr; - } - - AXTreeID child_tree_id = AXTreeID::FromString( - parent_node.GetStringAttribute(ax::mojom::StringAttribute::kChildTreeId)); - AXTreeManager* child_tree_manager = - AXTreeManagerMap::GetInstance().GetManager(child_tree_id); - - // Some platforms do not use AXTreeManagers, so child trees don't exist in - // the browser process. - DCHECK(!child_tree_manager || - !child_tree_manager->GetParentNodeFromParentTreeAsAXNode() || - child_tree_manager->GetParentNodeFromParentTreeAsAXNode()->id() == - parent_node.id()); - return child_tree_manager; -} - } // namespace ui
diff --git a/ui/accessibility/ax_tree_manager_map.h b/ui/accessibility/ax_tree_manager_map.h index f09c6389..4a444e9 100644 --- a/ui/accessibility/ax_tree_manager_map.h +++ b/ui/accessibility/ax_tree_manager_map.h
@@ -11,10 +11,10 @@ namespace ui { -// This class manages AXTreeManager instances. It is a singleton wrapper -// around a base::flat_map. AXTreeID's are used as the key for the map. -// Since AXTreeID's might refer to AXTreeIDUnknown, callers should not expect -// AXTreeIDUnknown to map to a particular AXTreeManager. +// This class manages AXTreeManager instances. It is a wrapper around a +// base::flat_map. AXTreeID's are used as the key for the map. Since AXTreeID's +// might refer to AXTreeIDUnknown, callers should not expect AXTreeIDUnknown to +// map to a particular AXTreeManager. class AX_EXPORT AXTreeManagerMap { public: AXTreeManagerMap(); @@ -22,14 +22,9 @@ AXTreeManagerMap(const AXTreeManagerMap& map) = delete; AXTreeManagerMap& operator=(const AXTreeManagerMap& map) = delete; - static AXTreeManagerMap& GetInstance(); - void AddTreeManager(AXTreeID tree_id, AXTreeManager* manager); - void RemoveTreeManager(AXTreeID tree_id); - AXTreeManager* GetManager(AXTreeID tree_id); - - // If the child of `parent_node` exists in a separate child tree, return the - // tree manager for that child tree. Otherwise, return nullptr. - AXTreeManager* GetManagerForChildTree(const AXNode& parent_node); + void AddTreeManager(const AXTreeID& tree_id, AXTreeManager* manager); + void RemoveTreeManager(const AXTreeID& tree_id); + AXTreeManager* GetManager(const AXTreeID& tree_id); private: base::flat_map<AXTreeID, AXTreeManager*> map_;
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux.cc b/ui/accessibility/platform/ax_platform_node_auralinux.cc index 733e57c..9650287f 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux.cc
@@ -3895,14 +3895,7 @@ return; } -#if DCHECK_IS_ON() - AXTree::Selection unignored_selection = - GetDelegate()->GetUnignoredSelection(); - DCHECK(HasCaret(&unignored_selection)); -#endif - std::pair<int, int> selection = GetSelectionOffsetsForAtk(); - AtkObject* atk_object = GetOrCreateAtkObject(); if (!atk_object) return; @@ -4729,9 +4722,7 @@ } int AXPlatformNodeAuraLinux::GetCaretOffset() { - AXTree::Selection unignored_selection = - GetDelegate()->GetUnignoredSelection(); - if (!HasCaret(&unignored_selection)) { + if (!HasVisibleCaretOrSelection()) { absl::optional<FindInPageResultInfo> result = GetSelectionOffsetsFromFindInPage(); AtkObject* atk_object = GetOrCreateAtkObject();
diff --git a/ui/accessibility/platform/ax_platform_node_base.cc b/ui/accessibility/platform/ax_platform_node_base.cc index 440ebf11..0bf97a3 100644 --- a/ui/accessibility/platform/ax_platform_node_base.cc +++ b/ui/accessibility/platform/ax_platform_node_base.cc
@@ -1113,27 +1113,8 @@ return absl::nullopt; } -bool AXPlatformNodeBase::HasCaret(const AXTree::Selection* selection) { - if (IsAtomicTextField() && - HasIntAttribute(ax::mojom::IntAttribute::kTextSelStart) && - HasIntAttribute(ax::mojom::IntAttribute::kTextSelEnd)) { - return true; - } - - // The caret is always at the focus of the selection. - int32_t focus_id; - if (selection) - focus_id = selection->focus_object_id; - else - focus_id = delegate_->GetTreeData().sel_focus_object_id; - - AXPlatformNodeBase* focus_object = - static_cast<AXPlatformNodeBase*>(delegate_->GetFromNodeID(focus_id)); - - if (!focus_object) - return false; - - return focus_object->IsDescendantOf(this); +bool AXPlatformNodeBase::HasVisibleCaretOrSelection() const { + return delegate_ && delegate_->HasVisibleCaretOrSelection(); } bool AXPlatformNodeBase::IsLeaf() const { @@ -1151,7 +1132,7 @@ if (HasState(ax::mojom::State::kFocusable)) return !IsFocused(); - return !const_cast<AXPlatformNodeBase*>(this)->HasCaret(); + return !HasVisibleCaretOrSelection(); } bool AXPlatformNodeBase::IsFocused() const { @@ -2021,7 +2002,7 @@ // outside this object in their entirety. // Selections that span more than one character are by definition inside // this object, so checking them is not necessary. - if (*selection_start == *selection_end && !HasCaret(selection)) { + if (*selection_start == *selection_end && !HasVisibleCaretOrSelection()) { *selection_start = -1; *selection_end = -1; return;
diff --git a/ui/accessibility/platform/ax_platform_node_base.h b/ui/accessibility/platform/ax_platform_node_base.h index 0b80dab..9a78c92e 100644 --- a/ui/accessibility/platform/ax_platform_node_base.h +++ b/ui/accessibility/platform/ax_platform_node_base.h
@@ -267,13 +267,8 @@ // Returns the font size converted to points, if available. absl::optional<float> GetFontSizeInPoints() const; - // Returns true if either a descendant has selection (sel_focus_object_id) or - // if this node is a simple text element and has text selection attributes. - // Optionally accepts a selection, which can be useful if checking the - // unignored selection is required. If not provided, uses the selection from - // the tree data, which is safe and fast but does not take ignored nodes into - // account. - bool HasCaret(const AXTree::Selection* selection = nullptr); + // See `AXNode::HasVisibleCaretOrSelection`. + bool HasVisibleCaretOrSelection() const; // See AXPlatformNodeDelegate::IsChildOfLeaf(). bool IsChildOfLeaf() const;
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.h b/ui/accessibility/platform/ax_platform_node_delegate.h index d883424..4e4b7cb 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.h +++ b/ui/accessibility/platform/ax_platform_node_delegate.h
@@ -189,9 +189,7 @@ // field. virtual std::u16string GetValueForControl() const = 0; - // Get the unignored selection from the tree, meaning the selection whose - // endpoints are on unignored nodes. (An ignored node means that the node - // should not be exposed to platform APIs: See `IsIgnored`.) + // See `AXNode::GetUnignoredSelection`. virtual const AXTree::Selection GetUnignoredSelection() const = 0; // Creates a text position rooted at this object if it's a leaf node, or a @@ -463,7 +461,7 @@ // Get whether this node is marked as read-only or is disabled. virtual bool IsReadOnlyOrDisabled() const = 0; - // Returns true if the caret or selection is visible on this object. + // See `AXNode::HasVisibleCaretOrSelection`. virtual bool HasVisibleCaretOrSelection() const = 0; // Get another node from this same tree.
diff --git a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc index 033dd9b..ad2a2d7e 100644 --- a/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc +++ b/ui/accessibility/platform/ax_platform_node_textrangeprovider_win.cc
@@ -1379,8 +1379,7 @@ AXPlatformNodeDelegate* AXPlatformNodeTextRangeProviderWin::GetRootDelegate( const ui::AXTreeID tree_id) { - const AXTreeManager* ax_tree_manager = - AXTreeManagerMap::GetInstance().GetManager(tree_id); + const AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id); DCHECK(ax_tree_manager); AXNode* root_node = ax_tree_manager->GetRootAsAXNode(); const AXPlatformNode* root_platform_node = @@ -1615,18 +1614,16 @@ void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::AddObserver( const AXTreeID tree_id) { - AXTreeManager* ax_tree_manager = - AXTreeManagerMap::GetInstance().GetManager(tree_id); + AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id); DCHECK(ax_tree_manager); - ax_tree_manager->AddObserver(this); + ax_tree_manager->ax_tree()->AddObserver(this); } void AXPlatformNodeTextRangeProviderWin::TextRangeEndpoints::RemoveObserver( const AXTreeID tree_id) { - AXTreeManager* ax_tree_manager = - AXTreeManagerMap::GetInstance().GetManager(tree_id); + AXTreeManager* ax_tree_manager = AXTreeManager::FromID(tree_id); if (ax_tree_manager) - ax_tree_manager->RemoveObserver(this); + ax_tree_manager->ax_tree()->RemoveObserver(this); } // Ensures that our endpoints are located on non-deleted nodes (step 1, case A
diff --git a/ui/accessibility/platform/ax_platform_node_win.cc b/ui/accessibility/platform/ax_platform_node_win.cc index d59e1fb..36f633b 100644 --- a/ui/accessibility/platform/ax_platform_node_win.cc +++ b/ui/accessibility/platform/ax_platform_node_win.cc
@@ -4157,7 +4157,7 @@ AXPlatformNode::NotifyAddAXModeFlags(kScreenReaderAndHTMLAccessibilityModes); *offset = 0; - if (!HasCaret()) + if (!HasVisibleCaretOrSelection()) return S_FALSE; int selection_start, selection_end;
diff --git a/ui/accessibility/platform/ax_platform_node_win_unittest.cc b/ui/accessibility/platform/ax_platform_node_win_unittest.cc index 906bf06..9c9dfb7 100644 --- a/ui/accessibility/platform/ax_platform_node_win_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_win_unittest.cc
@@ -3485,19 +3485,6 @@ EXPECT_EQ(0, offset); } -TEST_F(AXPlatformNodeWinTest, IAccessibleTextTextFieldGetCaretOffsetHasCaret) { - Init(BuildTextFieldWithSelectionRange(1, 2)); - - ComPtr<IAccessible2> ia2_text_field = ToIAccessible2(GetRootIAccessible()); - ComPtr<IAccessibleText> text_field; - ia2_text_field.As(&text_field); - ASSERT_NE(nullptr, text_field.Get()); - - LONG offset; - EXPECT_HRESULT_SUCCEEDED(text_field->get_caretOffset(&offset)); - EXPECT_EQ(2, offset); -} - TEST_F(AXPlatformNodeWinTest, IAccessibleTextContextEditableGetCaretOffsetNoCaret) { Init(BuildContentEditable());
diff --git a/ui/accessibility/test_ax_tree_manager.cc b/ui/accessibility/test_ax_tree_manager.cc index 817a2d2..6a6e074 100644 --- a/ui/accessibility/test_ax_tree_manager.cc +++ b/ui/accessibility/test_ax_tree_manager.cc
@@ -13,19 +13,13 @@ TestAXTreeManager::TestAXTreeManager() = default; TestAXTreeManager::TestAXTreeManager(std::unique_ptr<AXTree> tree) - : AXTreeManager(tree ? tree->data().tree_id : AXTreeIDUnknown(), - std::move(tree)) { - if (ax_tree_) - AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this); -} + : AXTreeManager(std::move(tree)) {} TestAXTreeManager::TestAXTreeManager(TestAXTreeManager&& manager) - : AXTreeManager(manager.ax_tree_ ? manager.ax_tree_->data().tree_id - : AXTreeIDUnknown(), - std::move(manager.ax_tree_)) { + : AXTreeManager(std::move(manager.ax_tree_)) { if (ax_tree_) { - AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); - AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this); + GetMap().RemoveTreeManager(GetTreeID()); + GetMap().AddTreeManager(GetTreeID(), this); } } @@ -33,23 +27,20 @@ if (this == &manager) return *this; if (manager.ax_tree_) - AXTreeManagerMap::GetInstance().RemoveTreeManager(manager.GetTreeID()); + GetMap().RemoveTreeManager(manager.GetTreeID()); // std::move(nullptr) == nullptr, so no need to check if `manager.tree_` is // assigned. SetTree(std::move(manager.ax_tree_)); return *this; } -TestAXTreeManager::~TestAXTreeManager() { - if (ax_tree_) - AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); -} +TestAXTreeManager::~TestAXTreeManager() = default; void TestAXTreeManager::DestroyTree() { if (!ax_tree_) return; - AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); + GetMap().RemoveTreeManager(GetTreeID()); ax_tree_.reset(); } @@ -60,12 +51,12 @@ void TestAXTreeManager::SetTree(std::unique_ptr<AXTree> tree) { if (ax_tree_) - AXTreeManagerMap::GetInstance().RemoveTreeManager(GetTreeID()); + GetMap().RemoveTreeManager(GetTreeID()); ax_tree_ = std::move(tree); ax_tree_id_ = GetTreeID(); if (ax_tree_) - AXTreeManagerMap::GetInstance().AddTreeManager(GetTreeID(), this); + GetMap().AddTreeManager(GetTreeID(), this); } AXNode* TestAXTreeManager::GetNodeFromTree(const AXTreeID tree_id, @@ -78,16 +69,6 @@ return ax_tree_ ? ax_tree_->GetFromId(node_id) : nullptr; } -void TestAXTreeManager::AddObserver(AXTreeObserver* observer) { - if (ax_tree_) - ax_tree_->AddObserver(observer); -} - -void TestAXTreeManager::RemoveObserver(AXTreeObserver* observer) { - if (ax_tree_) - ax_tree_->RemoveObserver(observer); -} - AXTreeID TestAXTreeManager::GetTreeID() const { return ax_tree_ ? ax_tree_->data().tree_id : AXTreeIDUnknown(); } @@ -102,8 +83,8 @@ AXNode* TestAXTreeManager::GetParentNodeFromParentTreeAsAXNode() const { AXTreeID parent_tree_id = GetParentTreeID(); - TestAXTreeManager* parent_manager = static_cast<TestAXTreeManager*>( - AXTreeManagerMap::GetInstance().GetManager(parent_tree_id)); + TestAXTreeManager* parent_manager = + static_cast<TestAXTreeManager*>(AXTreeManager::FromID(parent_tree_id)); if (!parent_manager) return nullptr; @@ -120,8 +101,4 @@ return nullptr; } -std::string TestAXTreeManager::ToString() const { - return "<TestAXTreeManager>"; -} - } // namespace ui
diff --git a/ui/accessibility/test_ax_tree_manager.h b/ui/accessibility/test_ax_tree_manager.h index e0b6717..ecb0bf4 100644 --- a/ui/accessibility/test_ax_tree_manager.h +++ b/ui/accessibility/test_ax_tree_manager.h
@@ -47,13 +47,10 @@ AXNode* GetNodeFromTree(const AXTreeID tree_id, const AXNodeID node_id) const override; AXNode* GetNodeFromTree(const AXNodeID node_id) const override; - void AddObserver(AXTreeObserver* observer) override; - void RemoveObserver(AXTreeObserver* observer) override; AXTreeID GetTreeID() const override; AXTreeID GetParentTreeID() const override; AXNode* GetRootAsAXNode() const override; AXNode* GetParentNodeFromParentTreeAsAXNode() const override; - std::string ToString() const override; }; } // namespace ui
diff --git a/ui/android/java/res/values/semantic_colors_non_adaptive.xml b/ui/android/java/res/values/semantic_colors_non_adaptive.xml index 7cb52c2..de93c9e40 100644 --- a/ui/android/java/res/values/semantic_colors_non_adaptive.xml +++ b/ui/android/java/res/values/semantic_colors_non_adaptive.xml
@@ -89,7 +89,7 @@ <color name="default_bg_color_blue_dark">@color/modern_blue_600</color> <color name="default_bg_color_blue_light">@color/modern_blue_300</color> <color name="default_scrim_color">@color/black_alpha_65</color> - <color name="incognito_card_bg_color">@color/baseline_neutral_900_with_neutral_200_alpha_5_with_primary_200_alpha_2</color> + <color name="incognito_card_bg_color">@color/default_bg_color_dark_elev_1_baseline</color> <!-- IPH Highlight Colors --> <color name="iph_highlight_blue_dark">@color/modern_blue_600_alpha_10</color>
diff --git a/ui/base/ime/OWNERS b/ui/base/ime/OWNERS index c4ce4012..1f76fb2d 100644 --- a/ui/base/ime/OWNERS +++ b/ui/base/ime/OWNERS
@@ -1,5 +1,4 @@ # primary reviewers. -shuchen@chromium.org yhanada@chromium.org keithlee@chromium.org shend@chromium.org
diff --git a/ui/views/BUILD.gn b/ui/views/BUILD.gn index cbcbd2e..f21364f 100644 --- a/ui/views/BUILD.gn +++ b/ui/views/BUILD.gn
@@ -1103,6 +1103,7 @@ use_xvfb = use_xvfb_in_this_config sources = [ + "accessibility/accessibility_paint_checks_unittest.cc", "accessible_pane_view_unittest.cc", "animation/animation_builder_unittest.cc", "animation/bounds_animator_unittest.cc",
diff --git a/ui/views/accessibility/accessibility_paint_checks.cc b/ui/views/accessibility/accessibility_paint_checks.cc index dba0008..fbda0e2 100644 --- a/ui/views/accessibility/accessibility_paint_checks.cc +++ b/ui/views/accessibility/accessibility_paint_checks.cc
@@ -13,6 +13,7 @@ #include "ui/views/accessibility/view_accessibility.h" #include "ui/views/view.h" #include "ui/views/view_utils.h" +#include "ui/views/widget/widget.h" namespace views { @@ -28,9 +29,12 @@ if (view->GetProperty(kSkipAccessibilityPaintChecks)) return; + // Get accessible node data from ViewAccessibility instead of View, because + // some additional fields are processed and set there. ui::AXNodeData node_data; view->GetViewAccessibility().GetAccessibleNodeData(&node_data); + // No checks for unfocusable items yet. if (!node_data.HasState(ax::mojom::State::kFocusable)) return; @@ -91,4 +95,14 @@ << GetViewDebugInfo(view); } +void RunAccessibilityPaintChecksRecursive(View* view) { + RunAccessibilityPaintChecks(view); + for (auto* v : view->children()) + RunAccessibilityPaintChecksRecursive(v); +} + +void RunAccessibilityPaintChecks(Widget* widget) { + RunAccessibilityPaintChecksRecursive(widget->GetRootView()); +} + } // namespace views
diff --git a/ui/views/accessibility/accessibility_paint_checks.h b/ui/views/accessibility/accessibility_paint_checks.h index 2c287e4..0ae28d1 100644 --- a/ui/views/accessibility/accessibility_paint_checks.h +++ b/ui/views/accessibility/accessibility_paint_checks.h
@@ -11,10 +11,14 @@ namespace views { class View; +class Widget; // This runs DCHECKs related to the view's state when painting. Generally, when // a View is ready to be displayed to the user it should also be accessible. -void RunAccessibilityPaintChecks(View* view); +VIEWS_EXPORT void RunAccessibilityPaintChecks(View* view); + +// Runs the paint checks recursively starting from the Widget's RootView. +VIEWS_EXPORT void RunAccessibilityPaintChecks(Widget* widget); // Skip accessibility paint checks on a specific View. // TODO(pbos): Remove this key. Do not add new uses to it, instead make sure
diff --git a/ui/views/accessibility/accessibility_paint_checks_unittest.cc b/ui/views/accessibility/accessibility_paint_checks_unittest.cc new file mode 100644 index 0000000..84fe4dfe --- /dev/null +++ b/ui/views/accessibility/accessibility_paint_checks_unittest.cc
@@ -0,0 +1,61 @@ +// Copyright 2022 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ui/views/accessibility/accessibility_paint_checks.h" + +#include <memory> +#include <utility> + +#include "base/strings/utf_string_conversions.h" +#include "base/test/gtest_util.h" +#include "ui/views/controls/button/image_button.h" +#include "ui/views/test/views_test_base.h" +#include "ui/views/view.h" +#include "ui/views/widget/widget.h" + +namespace views { + +using AccessibilityPaintChecksTest = ViewsTestBase; + +// Test that a view that is not accessible will fail the accessibility audit. +TEST_F(AccessibilityPaintChecksTest, VerifyAccessibilityCheckerFailAndPass) { + // Create containing widget. + Widget widget; + Widget::InitParams params = + Widget::InitParams(Widget::InitParams::TYPE_WINDOW); + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.bounds = gfx::Rect(0, 0, 650, 650); + params.context = GetContext(); + widget.Init(std::move(params)); + widget.Show(); + + // Add the button. + auto* button = + widget.GetContentsView()->AddChildView(std::make_unique<ImageButton>()); + + // Accessibility test should pass as it is focusable but has a name. + button->SetFocusBehavior(View::FocusBehavior::ALWAYS); + button->SetAccessibleName(u"Some name"); + RunAccessibilityPaintChecks(&widget); + + // Accessibility test should pass as it has no name but is not focusable. + button->SetFocusBehavior(View::FocusBehavior::NEVER); + button->SetAccessibleName(u""); + RunAccessibilityPaintChecks(&widget); + + // Accessibility test should fail as it has no name and is focusable. + button->SetFocusBehavior(View::FocusBehavior::ALWAYS); + EXPECT_DCHECK_DEATH_WITH(RunAccessibilityPaintChecks(&widget), "name"); + + // Restore the name of the button so that it is not the source of failure. + button->SetAccessibleName(u"Some name"); + + // Accessibility test should fail if the focusable view lacks a valid role. + auto* generic_view = + widget.GetContentsView()->AddChildView(std::make_unique<View>()); + generic_view->SetFocusBehavior(View::FocusBehavior::ALWAYS); + EXPECT_DCHECK_DEATH_WITH(RunAccessibilityPaintChecks(&widget), "role"); +} + +} // namespace views
diff --git a/ui/views/accessibility/view_accessibility.cc b/ui/views/accessibility/view_accessibility.cc index 7308394..5d78a88 100644 --- a/ui/views/accessibility/view_accessibility.cc +++ b/ui/views/accessibility/view_accessibility.cc
@@ -13,7 +13,6 @@ #include "build/chromeos_buildflags.h" #include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/ax_enums.mojom.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/accessibility/platform/ax_platform_node.h" #include "ui/accessibility/platform/ax_platform_node_delegate.h" #include "ui/base/buildflags.h" @@ -609,7 +608,7 @@ WidgetAXTreeIDMap::GetInstance().GetWidgetTreeID(widget); DCHECK_NE(tree_id, ui::AXTreeIDUnknown()); manager = static_cast<views::ViewsAXTreeManager*>( - ui::AXTreeManagerMap::GetInstance().GetManager(tree_id)); + ui::AXTreeManager::FromID(tree_id)); } #endif return manager;
diff --git a/ui/views/accessibility/views_ax_tree_manager.cc b/ui/views/accessibility/views_ax_tree_manager.cc index b7d91d5e..4de68763 100644 --- a/ui/views/accessibility/views_ax_tree_manager.cc +++ b/ui/views/accessibility/views_ax_tree_manager.cc
@@ -13,7 +13,6 @@ #include "ui/accessibility/accessibility_features.h" #include "ui/accessibility/ax_action_data.h" #include "ui/accessibility/ax_enums.mojom.h" -#include "ui/accessibility/ax_tree_manager_map.h" #include "ui/accessibility/ax_tree_source_checker.h" #include "ui/accessibility/ax_tree_update.h" #include "ui/views/accessibility/ax_aura_obj_wrapper.h" @@ -31,7 +30,6 @@ tree_serializer_(&tree_source_), event_generator_(ax_tree()) { DCHECK(widget); - ui::AXTreeManagerMap::GetInstance().AddTreeManager(ax_tree_id_, this); views::WidgetAXTreeIDMap::GetInstance().AddWidget(ax_tree_id_, widget); views_event_observer_.Observe(AXEventManager::Get()); widget_observer_.Observe(widget); @@ -50,7 +48,6 @@ event_generator_.ReleaseTree(); views_event_observer_.Reset(); widget_observer_.Reset(); - ui::AXTreeManagerMap::GetInstance().RemoveTreeManager(ax_tree_id_); } void ViewsAXTreeManager::SetGeneratedEventCallbackForTesting( @@ -68,8 +65,7 @@ if (!widget_ || !widget_->GetRootView()) return nullptr; - const ui::AXTreeManager* manager = - ui::AXTreeManagerMap::GetInstance().GetManager(tree_id); + const ui::AXTreeManager* manager = ui::AXTreeManager::FromID(tree_id); return manager ? manager->GetNodeFromTree(node_id) : nullptr; } @@ -104,10 +100,6 @@ return nullptr; } -std::string ViewsAXTreeManager::ToString() const { - return "<ViewsAXTreeManager>"; -} - void ViewsAXTreeManager::OnViewEvent(View* view, ax::mojom::Event event) { DCHECK(view); AXAuraObjWrapper* wrapper = cache_.GetOrCreate(view);
diff --git a/ui/views/accessibility/views_ax_tree_manager.h b/ui/views/accessibility/views_ax_tree_manager.h index 19e9bc6..6965c30 100644 --- a/ui/views/accessibility/views_ax_tree_manager.h +++ b/ui/views/accessibility/views_ax_tree_manager.h
@@ -87,7 +87,6 @@ ui::AXTreeID GetParentTreeID() const override; ui::AXNode* GetRootAsAXNode() const override; ui::AXNode* GetParentNodeFromParentTreeAsAXNode() const override; - std::string ToString() const override; // AXActionHandlerBase implementation. void PerformAction(const ui::AXActionData& data) override;
diff --git a/ui/webui/resources/cr_components/history_clusters/cluster.html b/ui/webui/resources/cr_components/history_clusters/cluster.html index df5732b..697eb4da 100644 --- a/ui/webui/resources/cr_components/history_clusters/cluster.html +++ b/ui/webui/resources/cr_components/history_clusters/cluster.html
@@ -51,6 +51,10 @@ font-weight: 500; } + .debug-info { + color: var(--cr-secondary-text-color); + } + #label-and-timestamp { align-items: center; display: flex; @@ -121,12 +125,14 @@ <div class="label-row" hidden="[[!inSidePanel]]"> <div id="label-and-timestamp"> <div id="labelSidePanel" class="label"></div> + <div class="debug-info">[[cluster.debugInfo]]</div> <div class="timestamp">[[cluster.visits.0.relativeDate]]</div> </div> <menu-container></menu-container> </div> <div class="label-row" hidden="[[inSidePanel]]"> <div id="label" class="label"></div> + <div class="debug-info">[[cluster.debugInfo]]</div> <div class="timestamp-and-menu"> <div class="timestamp">[[cluster.visits.0.relativeDate]]</div> <menu-container></menu-container>
diff --git a/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom b/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom index ab1e7b0..0eadaf9 100644 --- a/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom +++ b/ui/webui/resources/cr_components/history_clusters/history_clusters.mojom
@@ -114,7 +114,8 @@ bool hidden; // A key-value dictionary of additional debug info to show. This is not - // visible in production, and used for development only. + // visible in production, and used for development only. Disabled by default, + // but can be enabled by the 'JourneysUserVisibleDebug' flag. map<string, string> debug_info; }; @@ -139,6 +140,11 @@ // Search queries related to this cluster's visits. array<SearchQuery> related_searches; + + // Additional debug string to show. This is not visible in production, and + // used for development only. Disabled by default, but can be enabled by the + // 'JourneysUserVisibleDebug' flag. + string? debug_info; }; // Represents a set of Clusters returned by the browser in response to a request
diff --git a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js index a2d559df..1841fe3 100644 --- a/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js +++ b/ui/webui/resources/cr_elements/cr_checkbox/cr_checkbox.js
@@ -26,68 +26,89 @@ import '../shared_vars_css.m.js'; import {PaperRippleBehavior} from '//resources/polymer/v3_0/paper-behaviors/paper-ripple-behavior.js'; -import {html, Polymer} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {html, mixinBehaviors, PolymerElement} from '//resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -Polymer({ - is: 'cr-checkbox', +class PaperRippleBehaviorInterface { + /** @return {!PaperRippleElement} */ + getRipple() {} +} - _template: html`{__html_template__}`, +/** + * @constructor + * @extends {PolymerElement} + * @implements {PaperRippleBehaviorInterface} + */ +const CrCheckboxElementBase = + mixinBehaviors([PaperRippleBehavior], PolymerElement); - behaviors: [ - PaperRippleBehavior, - ], +/** @polymer */ +export class CrCheckboxElement extends CrCheckboxElementBase { + static get is() { + return 'cr-checkbox'; + } - properties: { - checked: { - type: Boolean, - value: false, - reflectToAttribute: true, - observer: 'checkedChanged_', - notify: true, - }, + static get template() { + return html`{__html_template__}`; + } - disabled: { - type: Boolean, - value: false, - reflectToAttribute: true, - observer: 'disabledChanged_', - }, + static get properties() { + return { + checked: { + type: Boolean, + value: false, + reflectToAttribute: true, + observer: 'checkedChanged_', + notify: true, + }, - ariaDescription: String, + disabled: { + type: Boolean, + value: false, + reflectToAttribute: true, + observer: 'disabledChanged_', + }, - tabIndex: { - type: Number, - value: 0, - observer: 'onTabIndexChanged_', - }, - }, + ariaDescription: String, - listeners: { - blur: 'hideRipple_', - click: 'onClick_', - focus: 'showRipple_', - up: 'hideRipple_', - }, + tabIndex: { + type: Number, + value: 0, + observer: 'onTabIndexChanged_', + }, + }; + } + + constructor() { + super(); + + /** @type {!Element} */ + this._rippleContainer; + } /** @override */ ready() { + super.ready(); this.removeAttribute('unresolved'); - }, + this.addEventListener('blur', this.hideRipple_.bind(this)); + this.addEventListener('click', this.onClick_.bind(this)); + this.addEventListener('focus', this.showRipple_.bind(this)); + this.addEventListener('up', this.hideRipple_.bind(this)); + } focus() { this.$.checkbox.focus(); - }, + } /** @return {!Element} */ getFocusableElement() { return this.$.checkbox; - }, + } /** @private */ checkedChanged_() { this.$.checkbox.setAttribute( 'aria-checked', this.checked ? 'true' : 'false'); - }, + } /** * @param {boolean} current @@ -102,17 +123,17 @@ this.tabIndex = this.disabled ? -1 : 0; this.$.checkbox.setAttribute( 'aria-disabled', this.disabled ? 'true' : 'false'); - }, + } /** @private */ showRipple_() { this.getRipple().showAndHoldDown(); - }, + } /** @private */ hideRipple_() { this.getRipple().clear(); - }, + } /** * @param {!Event} e @@ -129,8 +150,9 @@ e.preventDefault(); this.checked = !this.checked; - this.fire('change', this.checked); - }, + this.dispatchEvent(new CustomEvent( + 'change', {bubbles: true, composed: true, detail: this.checked})); + } /** * @param {!KeyboardEvent} e @@ -150,7 +172,7 @@ if (e.key === 'Enter') { this.click(); } - }, + } /** * @param {!KeyboardEvent} e @@ -165,13 +187,13 @@ if (e.key === ' ') { this.click(); } - }, + } /** @private */ onTabIndexChanged_() { // :host shouldn't have a tabindex because it's set on #checkbox. this.removeAttribute('tabindex'); - }, + } // customize the element's ripple _createRipple() { @@ -181,5 +203,7 @@ ripple.setAttribute('recenters', ''); ripple.classList.add('circle', 'toggle-ink'); return ripple; - }, -}); + } +} + +customElements.define(CrCheckboxElement.is, CrCheckboxElement);
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java index c444f56c..5373cad5 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/TabImpl.java
@@ -276,11 +276,17 @@ mWebContentsObserver = new WebContentsObserver() { @Override - public void didStartNavigation(NavigationHandle navigationHandle) { - if (navigationHandle.isInPrimaryMainFrame() && !navigationHandle.isSameDocument()) { + public void didStartNavigationInPrimaryMainFrame(NavigationHandle navigationHandle) { + if (!navigationHandle.isSameDocument()) { hideFindInPageUiAndNotifyClient(); } } + + @Override + public void didStartNavigationNoop(NavigationHandle navigationHandle) { + if (!navigationHandle.isInPrimaryMainFrame()) return; + } + @Override public void viewportFitChanged(@WebContentsObserver.ViewportFitType int value) { ensureDisplayCutoutController();