diff --git a/BUILD.gn b/BUILD.gn index fb53aa5..85ac19e 100644 --- a/BUILD.gn +++ b/BUILD.gn
@@ -218,20 +218,6 @@ ] } - if (is_win || is_linux || is_android) { - deps += [ - "//weblayer/shell:weblayer_shell", - "//weblayer/test:weblayer_browsertests", - "//weblayer/test:weblayer_unittests", - ] - if (is_android) { - deps += [ - "//weblayer/browser/android/javatests:weblayer_instrumentation_test_apk", - "//weblayer/browser/java:weblayer_junit_tests", - ] - } - } - if (!is_ios && !is_android) { deps += [ "//components/cronet:cronet_tests", @@ -388,9 +374,6 @@ "//tools/android/customtabs_benchmark:customtabs_benchmark_apk", "//tools/android/kerberos/SpnegoAuthenticator:spnego_authenticator_apk", "//ui/android:ui_junit_tests", - "//weblayer/public/java:client_aar", - "//weblayer/shell/android:weblayer_shell_apk", - "//weblayer/shell/android:weblayer_support_apk", ] deps -= [ "//net:net_perftests",
diff --git a/DEPS b/DEPS index b7ced73..da22321 100644 --- a/DEPS +++ b/DEPS
@@ -308,15 +308,15 @@ # 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': '9afb9e561f6131a36d951dd988551039d25ade88', + 'skia_revision': '2c005aa9f409babe21dfd8b36f3ca741512019af', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'ee71f06003a86c68e212b2ceb1443bd35ff3bc27', + 'v8_revision': '0cef614f7b6666116463c111790a6249e64b4935', # 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': '309520d0c1c9f38528db1cb32670f6e4630fbc59', + 'angle_revision': 'fb83e6c58f0486bc320149048b3230770286f219', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -379,7 +379,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '0237c57801ec63450b3af3050aed06ffcc31164e', + 'catapult_revision': '7b91c52bb4e64dc170ad0de5899c570b32384b24', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -387,7 +387,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': 'c7a8158ca71c49f099ed937f18343f49dd413e92', + 'devtools_frontend_revision': 'c80af5f3f1e54bd7401764ff7a48182790366d46', # 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. @@ -423,7 +423,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': '0c2909e4d4c8f4174acaa5db2bc3d578281f9c4e', + 'dawn_revision': '82023d6980e116eefd66217fcac12cee3e4d756b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1242,7 +1242,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '643ac32eb371bdabb273f3807a878a5b9b36b32f', + 'url': 'https://chrome-internal.googlesource.com/devtools/devtools-internal.git' + '@' + '2803824d1e05bddffcbbf61df6d13cc88dc8d6d7', 'condition': 'checkout_src_internal', }, @@ -1637,7 +1637,7 @@ Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'fac04ceb3e966f613ed17e98178e9d690280bba6', 'src/third_party/openscreen/src': - Var('chromium_git') + '/openscreen' + '@' + '1548c9a9822fd5e3c90602e5b2fd11a02ef4a8d5', + Var('chromium_git') + '/openscreen' + '@' + 'e66dfcc9a80bb31a16fc577d52fed09190c2400e', 'src/third_party/openxr/src': { 'url': Var('chromium_git') + '/external/github.com/KhronosGroup/OpenXR-SDK' + '@' + 'bf21ccb1007bb531b45d9978919a56ea5059c245', @@ -1654,7 +1654,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'e552de0d99aadf1bafaf00a31375477241cc43a9', + Var('android_git') + '/platform/external/perfetto.git' + '@' + '1bdc9fb7eb060b9581d3b7b3f207e44d51c13d1f', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1839,7 +1839,7 @@ Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'e84b11b1d90efe59e94bb24d1f1276071f50481e', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'edcae05bd4d66a564dca12741cc4912458d1c8a5', + Var('webrtc_git') + '/src.git' + '@' + '0e3cd63062007d7c67e70eac7a45f29964d9c9aa', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -1909,7 +1909,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@1bc12a00aeb34d33862c8f40f5ab35594b23ab56', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@acd252825da38b4136f5587427e59f4a783d784b', 'condition': 'checkout_src_internal', }, @@ -1950,7 +1950,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'YWYHKLL73SAhPWXA53VX_uOCe1FANTjnIPNQz8fsqMUC', + 'version': 'tx_guUSm3NtjVHmLmossrh_xFZsLTtVaOY8IlexHISMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java index c22543b..706073c 100644 --- a/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java +++ b/android_webview/nonembedded/java/src/org/chromium/android_webview/nonembedded/WebViewApkApplication.java
@@ -97,8 +97,8 @@ PathUtils.setPrivateDataDirectorySuffix("webview", "WebView"); CommandLineUtil.initCommandLine(); - PureJavaExceptionHandler.installHandler(() -> new AwPureJavaExceptionReporter()); - CustomAssertionHandler.installHandler(() -> new AwPureJavaExceptionReporter()); + PureJavaExceptionHandler.installHandler(AwPureJavaExceptionReporter::new); + CustomAssertionHandler.installPreNativeHandler(AwPureJavaExceptionReporter::new); // TODO(crbug.com/1182693): Do set up a native UMA recorder once we support recording // metrics from native nonembedded code.
diff --git a/ash/accelerators/accelerator_controller_impl.cc b/ash/accelerators/accelerator_controller_impl.cc index e8a5821..5ca43ec 100644 --- a/ash/accelerators/accelerator_controller_impl.cc +++ b/ash/accelerators/accelerator_controller_impl.cc
@@ -710,9 +710,10 @@ case TOGGLE_RESIZE_LOCK_MENU: return accelerators::CanToggleResizeLockMenu(); case TOGGLE_FLOATING: - case DEBUG_FLOAT_FLING_LEFT: - case DEBUG_FLOAT_FLING_RIGHT: return debug::CanToggleFloatingWindow(); + case DEBUG_TUCK_FLOATED_WINDOW_LEFT: + case DEBUG_TUCK_FLOATED_WINDOW_RIGHT: + return debug::CanTuckFloatedWindow(); // The following are always enabled. case BRIGHTNESS_DOWN: @@ -1196,8 +1197,8 @@ base::RecordAction(UserMetricsAction("Accel_Toggle_Docked_Magnifier")); accelerators::ToggleDockedMagnifier(); break; - case DEBUG_FLOAT_FLING_LEFT: - case DEBUG_FLOAT_FLING_RIGHT: + case DEBUG_TUCK_FLOATED_WINDOW_LEFT: + case DEBUG_TUCK_FLOATED_WINDOW_RIGHT: debug::PerformDebugActionIfEnabled(action); break; case TOGGLE_FLOATING:
diff --git a/ash/accelerators/accelerator_layout_table.cc b/ash/accelerators/accelerator_layout_table.cc index 689a03a..d6666a0 100644 --- a/ash/accelerators/accelerator_layout_table.cc +++ b/ash/accelerators/accelerator_layout_table.cc
@@ -514,11 +514,11 @@ {mojom::AcceleratorCategory::kDebug, mojom::AcceleratorSubcategory::kGeneral, /**locked=*/true, mojom::AcceleratorLayoutStyle::kDefault}}, - {DEBUG_FLOAT_FLING_LEFT, + {DEBUG_TUCK_FLOATED_WINDOW_LEFT, {mojom::AcceleratorCategory::kDebug, mojom::AcceleratorSubcategory::kGeneral, /**locked=*/true, mojom::AcceleratorLayoutStyle::kDefault}}, - {DEBUG_FLOAT_FLING_RIGHT, + {DEBUG_TUCK_FLOATED_WINDOW_RIGHT, {mojom::AcceleratorCategory::kDebug, mojom::AcceleratorSubcategory::kGeneral, /**locked=*/true, mojom::AcceleratorLayoutStyle::kDefault}},
diff --git a/ash/accelerators/accelerator_table.cc b/ash/accelerators/accelerator_table.cc index 7b77982a..015b5f54 100644 --- a/ash/accelerators/accelerator_table.cc +++ b/ash/accelerators/accelerator_table.cc
@@ -84,8 +84,8 @@ {true, ui::VKEY_K, kDebugModifier, DEBUG_TRIGGER_CRASH}, {true, ui::VKEY_G, kDebugModifier, DEBUG_TOGGLE_HUD_DISPLAY}, {true, ui::VKEY_D, kDebugModifier, DEBUG_TOGGLE_DARK_MODE}, - {true, ui::VKEY_OEM_4, kDebugModifier, DEBUG_FLOAT_FLING_LEFT}, - {true, ui::VKEY_OEM_6, kDebugModifier, DEBUG_FLOAT_FLING_RIGHT}, + {true, ui::VKEY_OEM_4, kDebugModifier, DEBUG_TUCK_FLOATED_WINDOW_LEFT}, + {true, ui::VKEY_OEM_6, kDebugModifier, DEBUG_TUCK_FLOATED_WINDOW_RIGHT}, {true, ui::VKEY_Y, kDebugModifier, DEBUG_TOGGLE_DYNAMIC_COLOR}, };
diff --git a/ash/accelerators/debug_commands.cc b/ash/accelerators/debug_commands.cc index 0c4c7f3..1e1a714 100644 --- a/ash/accelerators/debug_commands.cc +++ b/ash/accelerators/debug_commands.cc
@@ -198,21 +198,17 @@ hud_display::HUDDisplayView::Toggle(); } -void HandleFloatFling(AcceleratorAction action) { - aura::Window* window = window_util::GetActiveWindow(); - DCHECK(window); - - auto* window_state = WindowState::Get(window); - if (!window_state) - return; - +void HandleTuckFloatedWindow(AcceleratorAction action) { + // Find the active floated window. auto* float_controller = Shell::Get()->float_controller(); + auto* floated_window = float_controller->FindFloatedWindowOfDesk( + DesksController::Get()->GetTargetActiveDesk()); - if (!window_state->IsFloated()) - float_controller->ToggleFloat(window); + DCHECK(floated_window); float_controller->OnFlingOrSwipeForTablet( - window, /*left=*/action == DEBUG_FLOAT_FLING_LEFT, /*up=*/true); + floated_window, + /*left=*/action == DEBUG_TUCK_FLOATED_WINDOW_LEFT, /*up=*/true); } } // namespace @@ -233,6 +229,14 @@ return window_util::GetActiveWindow() != nullptr; } +bool CanTuckFloatedWindow() { + if (!chromeos::wm::features::IsFloatWindowEnabled()) + return false; + + return Shell::Get()->float_controller()->FindFloatedWindowOfDesk( + DesksController::Get()->GetTargetActiveDesk()); +} + bool DebugAcceleratorsEnabled() { return base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kAshDebugShortcuts); @@ -300,9 +304,9 @@ case DEBUG_TOGGLE_HUD_DISPLAY: HandleTriggerHUDDisplay(); break; - case DEBUG_FLOAT_FLING_LEFT: - case DEBUG_FLOAT_FLING_RIGHT: - HandleFloatFling(action); + case DEBUG_TUCK_FLOATED_WINDOW_LEFT: + case DEBUG_TUCK_FLOATED_WINDOW_RIGHT: + HandleTuckFloatedWindow(action); break; default: break;
diff --git a/ash/accelerators/debug_commands.h b/ash/accelerators/debug_commands.h index 24668f9..0519b9e 100644 --- a/ash/accelerators/debug_commands.h +++ b/ash/accelerators/debug_commands.h
@@ -16,8 +16,12 @@ namespace ash { namespace debug { +// Returns true if the active window can be floated. ASH_EXPORT bool CanToggleFloatingWindow(); +// Returns true if there is a floating window that can be tucked. +ASH_EXPORT bool CanTuckFloatedWindow(); + // Print the views::View, ui::Layer and aura::Window hierarchies. This may be // useful in debugging user reported bugs. ASH_EXPORT void PrintUIHierarchies();
diff --git a/ash/app_list/app_list_bubble_presenter.cc b/ash/app_list/app_list_bubble_presenter.cc index 0fd5a95a..5d88806 100644 --- a/ash/app_list/app_list_bubble_presenter.cc +++ b/ash/app_list/app_list_bubble_presenter.cc
@@ -25,6 +25,7 @@ #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/system/tray/tray_background_view.h" +#include "ash/wm/container_finder.h" #include "base/bind.h" #include "base/check.h" #include "base/check_op.h" @@ -406,13 +407,18 @@ if (!is_target_visibility_show_) return; - aura::Window* app_list_container = - bubble_widget_->GetNativeWindow()->parent(); - - // If the bubble or one of its children (e.g. an uninstall dialog) gained - // activation, the bubble should stay open. - if (gained_active && app_list_container->Contains(gained_active)) - return; + if (gained_active) { + if (auto* container = GetContainerForWindow(gained_active)) { + const int container_id = container->GetId(); + // If the bubble or one of its children (e.g. an uninstall dialog) gained + // activation, the bubble should stay open. Likewise, allow focus to move + // to the shelf (e.g. by pressing Alt-Shift-L). + if (container_id == kShellWindowId_AppListContainer || + container_id == kShellWindowId_ShelfContainer) { + return; + } + } + } // Closing the bubble for "press" type events is handled by // `bubble_event_filter_`. Activation can change when a user merely moves the @@ -421,6 +427,9 @@ if (reason == wm::ActivationChangeObserver::ActivationReason::INPUT_EVENT) return; + aura::Window* app_list_container = + bubble_widget_->GetNativeWindow()->parent(); + // Otherwise, if the bubble or one of its children lost activation or if // something other than the bubble gains activation, the bubble should close. if ((lost_active && app_list_container->Contains(lost_active)) ||
diff --git a/ash/app_list/app_list_bubble_presenter_unittest.cc b/ash/app_list/app_list_bubble_presenter_unittest.cc index 407a9d2..b712b4d 100644 --- a/ash/app_list/app_list_bubble_presenter_unittest.cc +++ b/ash/app_list/app_list_bubble_presenter_unittest.cc
@@ -36,6 +36,7 @@ #include "ui/compositor/scoped_animation_duration_scale_mode.h" #include "ui/compositor/test/layer_animation_stopped_waiter.h" #include "ui/display/display.h" +#include "ui/events/event_constants.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/geometry/vector2d.h" #include "ui/views/controls/textfield/textfield.h" @@ -356,6 +357,17 @@ EXPECT_FALSE(presenter->GetWindow()); } +TEST_F(AppListBubblePresenterTest, BubbleDoesNotCloseWhenShelfFocused) { + AppListBubblePresenter* presenter = GetBubblePresenter(); + presenter->Show(GetPrimaryDisplay().id()); + + // Press Alt-Shift-L to focus the home button on the shelf. + PressAndReleaseKey(ui::VKEY_L, ui::EF_ALT_DOWN | ui::EF_SHIFT_DOWN); + + EXPECT_TRUE(presenter->IsShowing()); + EXPECT_TRUE(presenter->GetWindow()); +} + TEST_F(AppListBubblePresenterTest, CanShowWhileAnimatingClosed) { AppListBubblePresenter* presenter = GetBubblePresenter(); presenter->Show(GetPrimaryDisplay().id());
diff --git a/ash/components/arc/metrics/arc_metrics_service_unittest.cc b/ash/components/arc/metrics/arc_metrics_service_unittest.cc index 4f3f3d26..503283c4 100644 --- a/ash/components/arc/metrics/arc_metrics_service_unittest.cc +++ b/ash/components/arc/metrics/arc_metrics_service_unittest.cc
@@ -412,17 +412,15 @@ TEST_F(ArcMetricsServiceTest, BootTypeObserver) { class Observer : public ArcMetricsService::BootTypeObserver { public: - void OnBootTypeRetrieved(mojom::BootType type) override { - this->type = type; - } - absl::optional<mojom::BootType> type; + void OnBootTypeRetrieved(mojom::BootType type) override { type_ = type; } + + absl::optional<mojom::BootType> type_; } observer; service()->AddBootTypeObserver(&observer); service()->ReportBootProgress({}, mojom::BootType::FIRST_BOOT_AFTER_UPDATE); - ASSERT_TRUE(observer.type); - EXPECT_EQ(mojom::BootType::FIRST_BOOT_AFTER_UPDATE, *observer.type); + EXPECT_EQ(mojom::BootType::FIRST_BOOT_AFTER_UPDATE, observer.type_); service()->RemoveBootTypeObserver(&observer); }
diff --git a/ash/constants/ash_features.h b/ash/constants/ash_features.h index dd9edc7..02e68ae 100644 --- a/ash/constants/ash_features.h +++ b/ash/constants/ash_features.h
@@ -743,7 +743,6 @@ COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPhoneHubMonochromeNotificationIconsEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPerformantSplitViewResizingEnabled(); -COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPersonalizationHubEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPhoneHubEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPhoneHubCallNotificationEnabled(); COMPONENT_EXPORT(ASH_CONSTANTS) bool IsPinAutosubmitBackfillFeatureEnabled();
diff --git a/ash/public/cpp/accelerators.h b/ash/public/cpp/accelerators.h index 90c1b6d..b201ecc8 100644 --- a/ash/public/cpp/accelerators.h +++ b/ash/public/cpp/accelerators.h
@@ -152,8 +152,8 @@ DEBUG_PRINT_WINDOW_HIERARCHY, DEBUG_SHOW_TOAST, // TODO(crbug.com/1336836): Remove fling accelerators after float is released. - DEBUG_FLOAT_FLING_LEFT, - DEBUG_FLOAT_FLING_RIGHT, + DEBUG_TUCK_FLOATED_WINDOW_LEFT, + DEBUG_TUCK_FLOATED_WINDOW_RIGHT, DEBUG_TOGGLE_DARK_MODE, DEBUG_TOGGLE_DYNAMIC_COLOR, DEBUG_TOGGLE_GLANCEABLES,
diff --git a/ash/quick_pair/keyed_service/quick_pair_mediator.cc b/ash/quick_pair/keyed_service/quick_pair_mediator.cc index b5d84ab3..cfd4de47 100644 --- a/ash/quick_pair/keyed_service/quick_pair_mediator.cc +++ b/ash/quick_pair/keyed_service/quick_pair_mediator.cc
@@ -173,7 +173,8 @@ void Mediator::OnDeviceLost(scoped_refptr<Device> device) { QP_LOG(INFO) << __func__ << ": " << device; - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); FastPairHandshakeLookup::GetInstance()->Erase(device); } @@ -197,8 +198,13 @@ scanner_broker_->StopScanning(Protocol::kFastPairInitial); - // Dismiss all UI notifications. - ui_broker_->RemoveNotifications(); + // Dismiss all UI notifications and reset the cache of devices that we prevent + // showing notifications for again. We only reset the cache when the Bluetooth + // toggle or when the Fast Pair scanning toggle are toggled, or when the user + // signs out -> signs in (although sign out/sign in is handled by the + // destruction of chrome resetting the cache). + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/true); } void Mediator::CancelPairing() { @@ -209,7 +215,8 @@ void Mediator::OnDevicePaired(scoped_refptr<Device> device) { QP_LOG(INFO) << __func__ << ": Device=" << device; - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); scanner_broker_->OnDevicePaired(device); fast_pair_repository_->PersistDeviceImages(device); } @@ -275,7 +282,8 @@ switch (action) { case AssociateAccountAction::kAssoicateAccount: pairer_broker_->PairDevice(device); - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); break; case AssociateAccountAction::kLearnMore: break;
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter.h b/ash/quick_pair/ui/fast_pair/fast_pair_presenter.h index bfd4609..bfb7320 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter.h +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter.h
@@ -36,7 +36,8 @@ AssociateAccountCallback callback) = 0; virtual void ShowCompanionApp(scoped_refptr<Device> device, CompanionAppCallback callback) = 0; - virtual void RemoveNotifications() = 0; + virtual void RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) = 0; virtual ~FastPairPresenter() = default; };
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc index a04f511..e8f7212 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc
@@ -228,8 +228,7 @@ base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryLearnMoreClicked, weak_pointer_factory_.GetWeakPtr(), callback), base::BindOnce(&FastPairPresenterImpl::OnDiscoveryDismissed, - weak_pointer_factory_.GetWeakPtr(), device->ble_address, - callback)); + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::ShowGuestDiscoveryNotification( @@ -244,8 +243,7 @@ base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryLearnMoreClicked, weak_pointer_factory_.GetWeakPtr(), callback), base::BindOnce(&FastPairPresenterImpl::OnDiscoveryDismissed, - weak_pointer_factory_.GetWeakPtr(), device->ble_address, - callback)); + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::ShowUserDiscoveryNotification( @@ -269,22 +267,26 @@ base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryLearnMoreClicked, weak_pointer_factory_.GetWeakPtr(), callback), base::BindOnce(&FastPairPresenterImpl::OnDiscoveryDismissed, - weak_pointer_factory_.GetWeakPtr(), device->ble_address, - callback)); + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::OnDiscoveryClicked(DiscoveryCallback callback) { callback.Run(DiscoveryAction::kPairToDevice); } -void FastPairPresenterImpl::OnDiscoveryDismissed(const std::string& ble_address, +void FastPairPresenterImpl::OnDiscoveryDismissed(scoped_refptr<Device> device, DiscoveryCallback callback, bool user_dismissed) { // If the discovery notification was not dismissed by user, we remove the - // device from the map in order to allow the notification to show again. - if (!user_dismissed) { + // device from the map in order to allow the notification to show again. We + // check |WasDiscoveryNotificationAlreadyShownForDevice| to make sure it is + // the same protocol, address, and metadata in the map before removing to + // prevent edge cases (for example, a device changes protocol but uses the + // same address). + if (!user_dismissed && + WasDiscoveryNotificationAlreadyShownForDevice(*device)) { address_to_devices_with_discovery_notification_already_shown_map_.erase( - ble_address); + device->ble_address); } callback.Run(user_dismissed ? DiscoveryAction::kDismissedByUser @@ -440,9 +442,13 @@ void FastPairPresenterImpl::ShowCompanionApp(scoped_refptr<Device> device, CompanionAppCallback callback) {} -void FastPairPresenterImpl::RemoveNotifications() { +void FastPairPresenterImpl::RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) { + if (clear_already_shown_discovery_notification_cache) { + address_to_devices_with_discovery_notification_already_shown_map_.clear(); + } + notification_controller_->RemoveNotifications(); - address_to_devices_with_discovery_notification_already_shown_map_.clear(); } } // namespace quick_pair
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h index 5b76903..aa2e5f9 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h
@@ -63,7 +63,8 @@ AssociateAccountCallback callback) override; void ShowCompanionApp(scoped_refptr<Device> device, CompanionAppCallback callback) override; - void RemoveNotifications() override; + void RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) override; private: FastPairPresenterImpl(const FastPairPresenterImpl&) = delete; @@ -94,7 +95,7 @@ DiscoveryCallback callback, DeviceMetadata* device_metadata); void OnDiscoveryClicked(DiscoveryCallback action_callback); - void OnDiscoveryDismissed(const std::string& ble_address, + void OnDiscoveryDismissed(scoped_refptr<Device> device, DiscoveryCallback callback, bool user_dismissed); void OnDiscoveryLearnMoreClicked(DiscoveryCallback action_callback);
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc index 7ab6736d3..0d093c2 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc
@@ -398,7 +398,8 @@ EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); - fast_pair_presenter_->RemoveNotifications(); + fast_pair_presenter_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.remove_notifications_for_notifier_id()); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -1438,6 +1439,44 @@ EXPECT_EQ(secondary_discovery_action_, DiscoveryAction::kAlreadyDisplayed); } +TEST_F(FastPairPresenterImplTest, ShowDiscoveryAgain_ProtocolChanged) { + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoveryUserNotificationId)); + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + ON_CALL(*browser_delegate_, GetIdentityManager()) + .WillByDefault(testing::Return(identity_manager_)); + + Login(user_manager::UserType::USER_TYPE_REGULAR); + base::RunLoop().RunUntilIdle(); + fast_pair_presenter_->ShowDiscovery( + initially_paired_device_, + base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoveryUserNotificationId)); + + fast_pair_presenter_->ShowDiscovery( + subsequently_paired_device_, + base::BindRepeating( + &FastPairPresenterImplTest::OnDiscoveryActionForSecondNotification, + weak_pointer_factory_.GetWeakPtr(), subsequently_paired_device_)); + base::RunLoop().RunUntilIdle(); + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + test_message_center_.ClickOnNotificationButton( + /*id=*/kFastPairDiscoverySubsequentNotificationId, /*button_index=*/0); + base::RunLoop().RunUntilIdle(); + + // We expect to be able to interact with this second notification and pair it + // since it was shown, not dismissed, since it was a different protocol with + // same address. + EXPECT_EQ(secondary_discovery_action_, DiscoveryAction::kPairToDevice); +} + TEST_F(FastPairPresenterImplTest, ShowDiscoveryAgain_MapCleared) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoverySubsequentNotificationId)); @@ -1460,7 +1499,8 @@ base::RunLoop().RunUntilIdle(); // Simulate the Bluetooth toggle or Fast Pair toggle being toggled off. - fast_pair_presenter_->RemoveNotifications(); + fast_pair_presenter_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/true); fast_pair_presenter_->ShowDiscovery( subsequently_paired_device_,
diff --git a/ash/quick_pair/ui/mock_ui_broker.h b/ash/quick_pair/ui/mock_ui_broker.h index 0587f6f..bf0494d 100644 --- a/ash/quick_pair/ui/mock_ui_broker.h +++ b/ash/quick_pair/ui/mock_ui_broker.h
@@ -27,7 +27,7 @@ MOCK_METHOD(void, ShowPairingFailed, (scoped_refptr<Device>), (override)); MOCK_METHOD(void, ShowAssociateAccount, (scoped_refptr<Device>), (override)); MOCK_METHOD(void, ShowCompanionApp, (scoped_refptr<Device>), (override)); - MOCK_METHOD(void, RemoveNotifications, (), (override)); + MOCK_METHOD(void, RemoveNotifications, (bool), (override)); void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override;
diff --git a/ash/quick_pair/ui/ui_broker.h b/ash/quick_pair/ui/ui_broker.h index 3a320d4..f55bb4ce2 100644 --- a/ash/quick_pair/ui/ui_broker.h +++ b/ash/quick_pair/ui/ui_broker.h
@@ -39,7 +39,8 @@ virtual void ShowPairingFailed(scoped_refptr<Device> device) = 0; virtual void ShowAssociateAccount(scoped_refptr<Device> device) = 0; virtual void ShowCompanionApp(scoped_refptr<Device> device) = 0; - virtual void RemoveNotifications() = 0; + virtual void RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) = 0; }; } // namespace quick_pair
diff --git a/ash/quick_pair/ui/ui_broker_impl.cc b/ash/quick_pair/ui/ui_broker_impl.cc index 86396c8b..8d81070 100644 --- a/ash/quick_pair/ui/ui_broker_impl.cc +++ b/ash/quick_pair/ui/ui_broker_impl.cc
@@ -101,8 +101,10 @@ } } -void UIBrokerImpl::RemoveNotifications() { - fast_pair_presenter_->RemoveNotifications(); +void UIBrokerImpl::RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) { + fast_pair_presenter_->RemoveNotifications( + clear_already_shown_discovery_notification_cache); } void UIBrokerImpl::NotifyDiscoveryAction(scoped_refptr<Device> device,
diff --git a/ash/quick_pair/ui/ui_broker_impl.h b/ash/quick_pair/ui/ui_broker_impl.h index 26ec2ab..97f6058 100644 --- a/ash/quick_pair/ui/ui_broker_impl.h +++ b/ash/quick_pair/ui/ui_broker_impl.h
@@ -33,7 +33,8 @@ void ShowPairingFailed(scoped_refptr<Device> device) override; void ShowAssociateAccount(scoped_refptr<Device> device) override; void ShowCompanionApp(scoped_refptr<Device> device) override; - void RemoveNotifications() override; + void RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) override; private: void NotifyDiscoveryAction(scoped_refptr<Device> device,
diff --git a/ash/quick_pair/ui/ui_broker_impl_unittest.cc b/ash/quick_pair/ui/ui_broker_impl_unittest.cc index 1fc3d40a2..284b6b7 100644 --- a/ash/quick_pair/ui/ui_broker_impl_unittest.cc +++ b/ash/quick_pair/ui/ui_broker_impl_unittest.cc
@@ -58,7 +58,10 @@ callback.Run(ash::quick_pair::CompanionAppAction::kDownloadAndLaunchApp); } - void RemoveNotifications() override { removed_ = true; } + void RemoveNotifications( + bool clear_already_shown_discovery_notification_cache) override { + removed_ = true; + } bool removed() { return removed_; } @@ -255,7 +258,8 @@ TEST_F(UIBrokerImplTest, RemoveNotifications_Initial) { auto device = base::MakeRefCounted<Device>(kValidModelId, kTestDeviceAddress, Protocol::kFastPairInitial); - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(presenter_factory_->fake_fast_pair_presenter()->removed()); @@ -264,7 +268,8 @@ TEST_F(UIBrokerImplTest, RemoveNotifications_Subsequent) { auto device = base::MakeRefCounted<Device>(kValidModelId, kTestDeviceAddress, Protocol::kFastPairSubsequent); - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(presenter_factory_->fake_fast_pair_presenter()->removed()); @@ -273,7 +278,8 @@ TEST_F(UIBrokerImplTest, RemoveNotifications_Retroactive) { auto device = base::MakeRefCounted<Device>(kValidModelId, kTestDeviceAddress, Protocol::kFastPairRetroactive); - ui_broker_->RemoveNotifications(); + ui_broker_->RemoveNotifications( + /*clear_already_shown_discovery_notification_cache=*/false); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(presenter_factory_->fake_fast_pair_presenter()->removed());
diff --git a/ash/shelf/scrollable_shelf_view.cc b/ash/shelf/scrollable_shelf_view.cc index ab6200d9..b00e641 100644 --- a/ash/shelf/scrollable_shelf_view.cc +++ b/ash/shelf/scrollable_shelf_view.cc
@@ -355,6 +355,10 @@ ScrollArrowView::kRight, GetShelf()->IsHorizontalAlignment(), shelf_view_, this)); + gradient_layer_delegate_ = + std::make_unique<GradientLayerDelegate>(/*animate_in=*/false); + layer()->SetMaskLayer(gradient_layer_delegate_->layer()); + focus_search_ = std::make_unique<ScrollableShelfFocusSearch>(this); GetShelf()->tooltip()->set_shelf_tooltip_delegate(this); @@ -778,6 +782,13 @@ right_arrow_->SetVisible(!right_arrow_bounds.IsEmpty()); right_arrow_->SetBoundsRect(right_arrow_bounds); + // Layer::Clone(), which may be triggered by screen rotation, does not copy + // the mask layer. So we may need to reset the mask layer. + if (ShouldApplyMaskLayerGradientZone() && !layer()->layer_mask_layer()) { + DCHECK(!gradient_layer_delegate_->layer()->layer_mask_back_link()); + layer()->SetMaskLayer(gradient_layer_delegate_->layer()); + } + MaybeUpdateGradientZone(); // Layout |shelf_container_view_|. @@ -840,6 +851,11 @@ } void ScrollableShelfView::OnBoundsChanged(const gfx::Rect& previous_bounds) { + if (ShouldApplyMaskLayerGradientZone() && + gradient_layer_delegate_->layer()->bounds() != layer()->bounds()) { + gradient_layer_delegate_->layer()->SetBounds(layer()->bounds()); + } + const gfx::Insets old_edge_padding_insets = edge_padding_insets_; const gfx::Vector2dF old_scroll_offset = scroll_offset_; @@ -960,7 +976,7 @@ } std::unique_ptr<ui::Layer> ScrollableShelfView::RecreateLayer() { - layer()->SetGradientMask(gfx::LinearGradient::GetEmpty()); + layer()->SetMaskLayer(nullptr); return views::View::RecreateLayer(); } @@ -1567,135 +1583,78 @@ return target_offset; } -void ScrollableShelfView::CalculateHorizontalGradient( - gfx::LinearGradient* gradient_mask) { - auto get_clamped = [](int position, int total) -> float { - return std::clamp(static_cast<float>(position) / total, 0.f, 1.f); - }; +GradientLayerDelegate::FadeZone +ScrollableShelfView::CalculateStartGradientZone() const { + if (!should_show_start_gradient_zone_) + return GradientLayerDelegate::FadeZone(); - float gradient_start, gradient_end; + gfx::Rect zone_rect; + bool fade_in = false; + const bool is_horizontal_alignment = GetShelf()->IsHorizontalAlignment(); - const bool rtl = ShouldAdaptToRTL(); + if (is_horizontal_alignment) { + int gradient_start; + int gradient_end; - // Horizontal linear gradient, from left to right - gradient_mask->set_angle(0); - - // If true, create a gradient area that fades in the shelf app buttons at - // the beginning - const bool show_fade_in = - rtl ? should_show_end_gradient_zone_ : should_show_start_gradient_zone_; - if (show_fade_in) { - gradient_start = get_clamped((visible_space_.x() - 1), width()); - gradient_end = get_clamped( - (visible_space_.x() + scrollable_shelf_constants::kGradientZoneLength), - width()); - - // When the scroll arrow button shows, `gradient_start` is greater than 0. - // Ensure that the area in the range [0, gradient_start) has an opaque - // opacity so that the scroll arrow button is visible. - if (gradient_start > 0) { - gradient_mask->AddStep(0, /*alpha=*/255); - gradient_mask->AddStep(get_clamped((visible_space_.x() - 2), width()), - 255); + // Calculates the bounds of the gradient zone. Enlarge the gradient zone by + // one-pixel to offset the potential rounding error during rendering (we + // also do it in CalculateEndGradientZone()). + if (ShouldAdaptToRTL()) { + const int border = visible_space_.right(); + gradient_start = border - scrollable_shelf_constants::kGradientZoneLength; + gradient_end = border + 1; + } else { + const int border = visible_space_.x(); + gradient_start = border - 1; + gradient_end = border + scrollable_shelf_constants::kGradientZoneLength; } - gradient_mask->AddStep(gradient_start, 0); - gradient_mask->AddStep(gradient_end, 255); - } - - // If true, create a gradient area that fades out the shelf app buttons at - // the end - bool show_fade_out = - rtl ? should_show_start_gradient_zone_ : should_show_end_gradient_zone_; - if (show_fade_out) { - gradient_start = - get_clamped((visible_space_.right() - - scrollable_shelf_constants::kGradientZoneLength), - width()); - gradient_end = get_clamped((visible_space_.right() + 1), width()); - gradient_mask->AddStep(gradient_start, /*alpha=*/255); - gradient_mask->AddStep(gradient_end, 0); - - // When the scroll arrow button shows, `gradient_end` is less than 1. - // Ensure that the area in the range (gradient_end, 1] has an opaque - // opacity so that the scroll arrow button is visible. - if (gradient_end < 1) { - gradient_mask->AddStep(get_clamped((visible_space_.right() + 2), width()), - 255); - gradient_mask->AddStep(1, 255); - } - } -} - -void ScrollableShelfView::CalculateVerticalGradient( - gfx::LinearGradient* gradient_mask) { - auto get_clamped = [](int position, int total) -> float { - return std::clamp(static_cast<float>(position) / total, 0.f, 1.f); - }; - - float gradient_start, gradient_end; - - DCHECK(!ShouldAdaptToRTL()); - - // Vertical gradient from top to bottom. - gradient_mask->set_angle(-90); - - if (should_show_start_gradient_zone_) { - gradient_start = get_clamped((visible_space_.y() - 1), height()); - gradient_end = get_clamped( - (visible_space_.y() + scrollable_shelf_constants::kGradientZoneLength), - height()); - - // When the scroll arrow button shows, `gradient_start` is greater than 0. - // Ensure that the area in the range [0, gradient_start) has an opaque - // opacity so that the scroll arrow button is visible. - if (gradient_start > 0) { - gradient_mask->AddStep(0, /*alpha=*/255); - gradient_mask->AddStep(get_clamped((visible_space_.y() - 2), height()), - 255); - } - gradient_mask->AddStep(gradient_start, 0); - gradient_mask->AddStep(gradient_end, 255); - } - - if (should_show_end_gradient_zone_) { - gradient_start = - get_clamped((visible_space_.bottom() - - scrollable_shelf_constants::kGradientZoneLength), - height()); - gradient_end = get_clamped((visible_space_.bottom() + 1), height()); - gradient_mask->AddStep(gradient_start, - /*alpha=*/255); - gradient_mask->AddStep(gradient_end, 0); - - // When the scroll arrow button shows, `gradient_end` is less than 1. - // Ensure that the area in the range (gradient_end, 1] has an opaque - // opacity so that the scroll arrow button is visible. - if (gradient_end < 1) { - gradient_mask->AddStep( - get_clamped((visible_space_.bottom() + 2), height()), 255); - gradient_mask->AddStep(1, 255); - } - } -} - -void ScrollableShelfView::UpdateGradientMask() { - // There is no visible shelf app buttons so return early - if (bounds().IsEmpty() || visible_space_.IsEmpty()) - return; - - gfx::LinearGradient gradient_mask; - - if (GetShelf()->IsHorizontalAlignment()) { - CalculateHorizontalGradient(&gradient_mask); + zone_rect = + gfx::Rect(gradient_start, 0, gradient_end - gradient_start, height()); } else { - CalculateVerticalGradient(&gradient_mask); + zone_rect = gfx::Rect(0, visible_space_.y() - 1, width(), + scrollable_shelf_constants::kGradientZoneLength + 1); } - // Return if the gradients do not change. - if (gradient_mask == layer()->gradient_mask()) - return; + fade_in = !ShouldAdaptToRTL(); - layer()->SetGradientMask(gradient_mask); + return {zone_rect, fade_in, is_horizontal_alignment}; +} + +GradientLayerDelegate::FadeZone ScrollableShelfView::CalculateEndGradientZone() + const { + if (!should_show_end_gradient_zone_) + return GradientLayerDelegate::FadeZone(); + + gfx::Rect zone_rect; + bool fade_in = false; + const bool is_horizontal_alignment = GetShelf()->IsHorizontalAlignment(); + + if (is_horizontal_alignment) { + int gradient_start; + int gradient_end; + + if (ShouldAdaptToRTL()) { + const int border = visible_space_.x(); + gradient_start = border - 1; + gradient_end = border + scrollable_shelf_constants::kGradientZoneLength; + } else { + const int border = visible_space_.right(); + gradient_start = border - scrollable_shelf_constants::kGradientZoneLength; + gradient_end = border + 1; + } + zone_rect = + gfx::Rect(gradient_start, 0, gradient_end - gradient_start, height()); + } else { + zone_rect = + gfx::Rect(0, + visible_space_.bottom() - + scrollable_shelf_constants::kGradientZoneLength, + width(), scrollable_shelf_constants::kGradientZoneLength + 1); + } + + fade_in = ShouldAdaptToRTL(); + + return {zone_rect, fade_in, is_horizontal_alignment}; } void ScrollableShelfView::UpdateGradientZoneState() { @@ -1727,7 +1686,31 @@ // (1) Fade zone's visibility changes. // (2) Fade zone should show and the arrow button's location changes. UpdateGradientZoneState(); - UpdateGradientMask(); + + const GradientLayerDelegate::FadeZone target_start_fade_zone = + CalculateStartGradientZone(); + const GradientLayerDelegate::FadeZone target_end_fade_zone = + CalculateEndGradientZone(); + + const bool should_update_start_fade_zone = + target_start_fade_zone.zone_rect != + gradient_layer_delegate_->start_fade_zone_bounds(); + const bool should_update_end_fade_zone = + target_end_fade_zone.zone_rect != + gradient_layer_delegate_->end_fade_zone_bounds(); + + if (!should_update_start_fade_zone && !should_update_end_fade_zone) + return; + + PaintGradientZone(CalculateStartGradientZone(), CalculateEndGradientZone()); +} + +void ScrollableShelfView::PaintGradientZone( + const GradientLayerDelegate::FadeZone& start_rect, + const GradientLayerDelegate::FadeZone& end_rect) { + gradient_layer_delegate_->set_start_fade_zone(start_rect); + gradient_layer_delegate_->set_end_fade_zone(end_rect); + SchedulePaint(); } bool ScrollableShelfView::ShouldApplyMaskLayerGradientZone() const { @@ -2113,10 +2096,15 @@ const bool strategy_needs_update = (layout_strategy_ != new_strategy); if (strategy_needs_update) { layout_strategy_ = new_strategy; - const bool has_gradient_zone = !layer()->gradient_mask().IsEmpty(); + const bool has_gradient_zone = layer()->layer_mask_layer(); const bool should_have_gradient_zone = ShouldApplyMaskLayerGradientZone(); if (has_gradient_zone && !should_have_gradient_zone) { - layer()->SetGradientMask(gfx::LinearGradient::GetEmpty()); + PaintGradientZone(GradientLayerDelegate::FadeZone(), + GradientLayerDelegate::FadeZone()); + layer()->SetMaskLayer(nullptr); + } else if (!has_gradient_zone && should_have_gradient_zone) { + gradient_layer_delegate_->layer()->SetBounds(layer()->bounds()); + layer()->SetMaskLayer(gradient_layer_delegate_->layer()); } InvalidateLayout(); }
diff --git a/ash/shelf/scrollable_shelf_view.h b/ash/shelf/scrollable_shelf_view.h index 6c38676..f08c3fe 100644 --- a/ash/shelf/scrollable_shelf_view.h +++ b/ash/shelf/scrollable_shelf_view.h
@@ -9,6 +9,7 @@ #include "ash/app_list/views/app_list_drag_and_drop_host.h" #include "ash/ash_export.h" +#include "ash/controls/gradient_layer_delegate.h" #include "ash/drag_drop/drag_image_view.h" #include "ash/public/cpp/shelf_config.h" #include "ash/public/cpp/shelf_model.h" @@ -22,9 +23,7 @@ #include "base/cancelable_callback.h" #include "base/time/time.h" #include "third_party/abseil-cpp/absl/types/optional.h" -#include "ui/compositor/layer.h" #include "ui/compositor/layer_animation_observer.h" -#include "ui/gfx/geometry/linear_gradient.h" #include "ui/views/animation/ink_drop_host_view.h" #include "ui/views/context_menu_controller.h" #include "ui/views/controls/button/button.h" @@ -335,11 +334,10 @@ float CalculateTargetOffsetAfterScroll(float start_offset, float scroll_distance) const; - // Updates the bounds of the gradient zone before/after the shelf + // Calculates the bounds of the gradient zone before/after the shelf // container. - void UpdateGradientMask(); - void CalculateHorizontalGradient(gfx::LinearGradient* gradient_mask); - void CalculateVerticalGradient(gfx::LinearGradient* gradient_mask); + GradientLayerDelegate::FadeZone CalculateStartGradientZone() const; + GradientLayerDelegate::FadeZone CalculateEndGradientZone() const; // Updates the visibility of gradient zones. void UpdateGradientZoneState(); @@ -348,6 +346,10 @@ // different from the actual values. void MaybeUpdateGradientZone(); + void PaintGradientZone( + const GradientLayerDelegate::FadeZone& start_gradient_zone, + const GradientLayerDelegate::FadeZone& end_gradient_zone); + bool ShouldApplyMaskLayerGradientZone() const; // Returns the actual scroll offset for the given scroll distance along the @@ -509,6 +511,8 @@ LayoutStrategy layout_strategy_before_main_axis_scrolling_ = kNotShowArrowButtons; + std::unique_ptr<GradientLayerDelegate> gradient_layer_delegate_; + std::unique_ptr<views::FocusSearch> focus_search_; // The index of the first/last tappable app index.
diff --git a/ash/shelf/scrollable_shelf_view_unittest.cc b/ash/shelf/scrollable_shelf_view_unittest.cc index 112d38d..40a8909d 100644 --- a/ash/shelf/scrollable_shelf_view_unittest.cc +++ b/ash/shelf/scrollable_shelf_view_unittest.cc
@@ -342,12 +342,12 @@ AddAppShortcut(); ASSERT_EQ(ScrollableShelfView::LayoutStrategy::kNotShowArrowButtons, scrollable_shelf_view_->layout_strategy_for_test()); - EXPECT_TRUE(scrollable_shelf_view_->layer()->gradient_mask().IsEmpty()); + EXPECT_FALSE(scrollable_shelf_view_->layer()->layer_mask_layer()); AddAppShortcutsUntilOverflow(); ASSERT_EQ(ScrollableShelfView::LayoutStrategy::kShowRightArrowButton, scrollable_shelf_view_->layout_strategy_for_test()); - EXPECT_FALSE(scrollable_shelf_view_->layer()->gradient_mask().IsEmpty()); + EXPECT_TRUE(scrollable_shelf_view_->layer()->layer_mask_layer()); } // When hovering mouse on a shelf icon, the tooltip only shows for the visible
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc index 45f9746..069d443 100644 --- a/ash/webui/personalization_app/personalization_app_ui.cc +++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -329,9 +329,6 @@ features::IsWallpaperGooglePhotosIntegrationEnabled() && wallpaper_provider_->IsEligibleForGooglePhotos()); - // TODO(b/249098543): Remove this boolean. - source->AddBoolean("isPersonalizationHubEnabled", true); - source->AddBoolean("isAmbientModeAnimationEnabled", features::IsAmbientModeAnimationEnabled());
diff --git a/ash/webui/personalization_app/resources/js/personalization_app.ts b/ash/webui/personalization_app/resources/js/personalization_app.ts index 2475184..c44940e 100644 --- a/ash/webui/personalization_app/resources/js/personalization_app.ts +++ b/ash/webui/personalization_app/resources/js/personalization_app.ts
@@ -110,10 +110,8 @@ PersonalizationStore.getInstance().init(emptyState()); const link = document.querySelector('link[rel=\'icon\']') as HTMLLinkElement; -if (link && loadTimeData.getBoolean('isPersonalizationHubEnabled')) { +if (link) { // |link| may be null in tests. link.href = '/hub_icon_192.png'; } -document.title = loadTimeData.getBoolean('isPersonalizationHubEnabled') ? - loadTimeData.getString('personalizationTitle') : - loadTimeData.getString('wallpaperLabel'); +document.title = loadTimeData.getString('personalizationTitle');
diff --git a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.html b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.html index 71b34cf..3273240 100644 --- a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.html +++ b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.html
@@ -64,24 +64,14 @@ </iron-a11y-keys> <iron-selector id="selector" selectable=".selectable" selected="0" selected-item="{{selectedBreadcrumb_}}"> - <template is="dom-if" if="[[showBackButton_]]"> - <cr-icon-button aria-label$="[[getBackButtonAriaLabel_()]]" - id="backButton" - class="icon-arrow-back selectable" - role="button" - on-click="onBackClick_"> - </cr-icon-button> - </template> - <template is="dom-if" if="[[showHomeButton_()]]"> - <cr-icon-button id="homeButton" - class="selectable" - role="link" - aria-label$="[[getHomeButtonAriaLabel_()]]" - iron-icon="personalization:home" - on-click="onHomeIconClick_"> - </cr-icon-button> - <iron-icon icon="cr:chevron-right" aria-hidden="true"></iron-icon> - </template> + <cr-icon-button id="homeButton" + class="selectable" + role="link" + aria-label$="[[getHomeButtonAriaLabel_()]]" + iron-icon="personalization:home" + on-click="onHomeIconClick_"> + </cr-icon-button> + <iron-icon icon="cr:chevron-right" aria-hidden="true"></iron-icon> <template is="dom-repeat" items="[[breadcrumbs_]]" as="breadcrumb"> <template is="dom-if" if="[[index]]"> <iron-icon icon="cr:chevron-right" aria-hidden="true"></iron-icon>
diff --git a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts index e45405e2..7356c12 100644 --- a/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts +++ b/ash/webui/personalization_app/resources/js/personalization_breadcrumb_element.ts
@@ -23,7 +23,7 @@ import {GooglePhotosAlbum, TopicSource, WallpaperCollection} from './personalization_app.mojom-webui.js'; import {getTemplate} from './personalization_breadcrumb_element.html.js'; -import {isPathValid, isPersonalizationHubEnabled, Paths, PersonalizationRouter} from './personalization_router_element.js'; +import {isPathValid, Paths, PersonalizationRouter} from './personalization_router_element.js'; import {WithPersonalizationStore} from './personalization_store.js'; import {inBetween, isNonEmptyArray, isNonEmptyString} from './utils.js'; @@ -224,15 +224,6 @@ return breadcrumbs; } - private computeShowBackButton_(): boolean { - // Do not show the back button if hub is enabled. - return !isPersonalizationHubEnabled() && this.path !== Paths.COLLECTIONS; - } - - private showHomeButton_(): boolean { - return isPersonalizationHubEnabled(); - } - private getBackButtonAriaLabel_(): string { return this.i18n('back', this.i18n('wallpaperLabel')); }
diff --git a/ash/webui/personalization_app/resources/js/personalization_router_element.ts b/ash/webui/personalization_app/resources/js/personalization_router_element.ts index 8d6fb4b..10431eb 100644 --- a/ash/webui/personalization_app/resources/js/personalization_router_element.ts +++ b/ash/webui/personalization_app/resources/js/personalization_router_element.ts
@@ -29,10 +29,6 @@ USER = '/user', } -export function isPersonalizationHubEnabled(): boolean { - return loadTimeData.getBoolean('isPersonalizationHubEnabled'); -} - export function isAmbientModeAllowed(): boolean { return loadTimeData.getBoolean('isAmbientModeAllowed'); } @@ -108,12 +104,6 @@ override connectedCallback() { super.connectedCallback(); - // Force the user onto the wallpaper subpage if personalization hub feature - // is not enabled, and the user is not already on a wallpaper page. - if (!loadTimeData.getBoolean('isPersonalizationHubEnabled') && - !this.shouldShowWallpaperSubpage_(this.path_)) { - PersonalizationRouter.reloadAtWallpaper(); - } } get collectionId() { @@ -148,21 +138,17 @@ } private shouldShowRootPage_(path: string|null): boolean { - if (!isPersonalizationHubEnabled()) { - return false; - } - // If the ambient mode is not allowed, will not show Ambient/AmbientAlbums // subpages. return (path === Paths.ROOT) || (isAmbientPathNotAllowed(path)); } private shouldShowAmbientSubpage_(path: string|null): boolean { - return isPersonalizationHubEnabled() && isAmbientPathAllowed(path); + return isAmbientPathAllowed(path); } private shouldShowUserSubpage_(path: string|null): boolean { - return isPersonalizationHubEnabled() && path === Paths.USER; + return path === Paths.USER; } private shouldShowWallpaperSubpage_(path: string|null): boolean {
diff --git a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts index 359e8bd..f6dd2f7 100644 --- a/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts +++ b/ash/webui/personalization_app/resources/js/wallpaper/wallpaper_subpage_element.ts
@@ -47,8 +47,7 @@ } private onCurrentSelectedChanged_(value: CurrentWallpaper|null) { - if (value && value.type === WallpaperType.kPolicy && - loadTimeData.getBoolean('isPersonalizationHubEnabled')) { + if (value && value.type === WallpaperType.kPolicy) { PersonalizationRouter.reloadAtRoot(); } }
diff --git a/ash/wm/float/tablet_mode_float_window_resizer.cc b/ash/wm/float/tablet_mode_float_window_resizer.cc index d276efb..c82cc64b 100644 --- a/ash/wm/float/tablet_mode_float_window_resizer.cc +++ b/ash/wm/float/tablet_mode_float_window_resizer.cc
@@ -124,6 +124,7 @@ } void TabletModeFloatWindowResizer::FlingOrSwipe(ui::GestureEvent* event) { + DCHECK(window_state_->IsFloated()); const ui::GestureEventDetails& details = event->details(); bool left, up; if (event->type() == ui::ET_SCROLL_FLING_START) {
diff --git a/ash/wm/overview/overview_session.cc b/ash/wm/overview/overview_session.cc index 0272240..65c552b 100644 --- a/ash/wm/overview/overview_session.cc +++ b/ash/wm/overview/overview_session.cc
@@ -1526,13 +1526,23 @@ if (grid && grid->IsDropTargetWindow(window)) return; - // Transfer focus from |window| to |overview_focus_widget_| to match the + // Transfer focus from `window` to `overview_focus_widget_` to match the // behavior of entering overview mode in the beginning. DCHECK(overview_focus_widget_); - // |overview_focus_widget_| might not visible yet as OnItemAdded() might be - // called before OnStartingAnimationComplete() is called, so use Show() - // instead of ActivateWindow() to show and activate the widget. - overview_focus_widget_->Show(); + // `overview_focus_widget_` might not visible yet as `OnItemAdded()` might be + // called before `OnStartingAnimationComplete()` is called, so use `Show()` or + // `ShowInactive()` instead of `ActivateWindow()` to show the widget. + // When the saved desk grid is on, do not switch focus to avoid unexpected + // name commit. + bool saved_desk_grid_should_keep_focus = + IsShowingDesksTemplatesGrid() && grid_list_.front() + ->saved_desk_library_widget() + ->GetLayer() + ->GetTargetOpacity() != 0.f; + if (saved_desk_grid_should_keep_focus) + overview_focus_widget_->ShowInactive(); + else + overview_focus_widget_->Show(); UpdateAccessibilityFocus(); }
diff --git a/base/test/scoped_feature_list.h b/base/test/scoped_feature_list.h index 46ad9835..c9766704 100644 --- a/base/test/scoped_feature_list.h +++ b/base/test/scoped_feature_list.h
@@ -22,10 +22,11 @@ namespace base { namespace test { +// A reference to a base::Feature and field trial params that should be force +// enabled and overwritten for test purposes. struct FeatureRefAndParams { - // TODO(https://crbug.com/1370851): Add ABSL_ATTRIBUTE_LIFETIME_BOUND here to - // match FeatureRef below. - FeatureRefAndParams(const Feature& feature, const FieldTrialParams& params); + FeatureRefAndParams(const Feature& feature ABSL_ATTRIBUTE_LIFETIME_BOUND, + const FieldTrialParams& params); ~FeatureRefAndParams(); FeatureRefAndParams(const FeatureRefAndParams& other);
diff --git a/build/android/pylib/constants/__init__.py b/build/android/pylib/constants/__init__.py index 272add9e..5294bd0 100644 --- a/build/android/pylib/constants/__init__.py +++ b/build/android/pylib/constants/__init__.py
@@ -80,11 +80,6 @@ chrome.PackageInfo('org.chromium.webview_ui_test', 'org.chromium.webview_ui_test.WebViewUiTestActivity', 'webview-command-line', None), - 'weblayer_browsertests': - chrome.PackageInfo( - 'org.chromium.weblayer_browsertests_apk', - 'org.chromium.weblayer_browsertests_apk.WebLayerBrowserTestsActivity', - 'chrome-native-tests-command-line', None), })
diff --git a/build/android/pylib/gtest/gtest_test_instance.py b/build/android/pylib/gtest/gtest_test_instance.py index d7201bf..d3bcb59 100644 --- a/build/android/pylib/gtest/gtest_test_instance.py +++ b/build/android/pylib/gtest/gtest_test_instance.py
@@ -31,7 +31,6 @@ 'android_sync_integration_tests', 'components_browsertests', 'content_browsertests', - 'weblayer_browsertests', ] # The max number of tests to run on a shard during the test run.
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 23d34fec..627d802 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -1639,7 +1639,7 @@ // Draw the expected image to a GPU accelerated SkCanvas. This must be done // from the GPU thread so wait until that is done here. - gpu_service->gpu_thread_task_runner()->PostTask( + gpu_service->gpu_main_thread_task_runner()->PostTask( FROM_HERE, base::BindOnce(&OopTextBlobPixelTest::DrawExpectedOnGpuThread, base::Unretained(this), image_size, std::ref(bitmap),
diff --git a/cc/tiles/gpu_image_decode_cache_unittest.cc b/cc/tiles/gpu_image_decode_cache_unittest.cc index 077c8b2..2f2b44e6 100644 --- a/cc/tiles/gpu_image_decode_cache_unittest.cc +++ b/cc/tiles/gpu_image_decode_cache_unittest.cc
@@ -385,7 +385,7 @@ bool /* no_discardable_memory */>> { public: void SetUp() override { - std::vector<base::Feature> enabled_features; + std::vector<base::test::FeatureRef> enabled_features; allow_accelerated_jpeg_decoding_ = std::get<3>(GetParam()); if (allow_accelerated_jpeg_decoding_) enabled_features.push_back(features::kVaapiJpegImageDecodeAcceleration);
diff --git a/chrome/android/features/start_surface/java/res/values/dimens.xml b/chrome/android/features/start_surface/java/res/values/dimens.xml index 51d57e2..bb1f0f6 100644 --- a/chrome/android/features/start_surface/java/res/values/dimens.xml +++ b/chrome/android/features/start_surface/java/res/values/dimens.xml
@@ -7,5 +7,6 @@ <resources xmlns:tools="http://schemas.android.com/tools"> <dimen name="tasks_surface_body_top_margin">24dp</dimen> <dimen name="mv_tiles_container_top_margin">17dp</dimen> + <dimen name="single_tab_view_top_margin_for_feed_improvement">32dp</dimen> <dimen name="tab_switcher_title_top_margin">16dp</dimen> </resources>
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java index 4835322..b90ff43 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinator.java
@@ -37,6 +37,7 @@ import org.chromium.chrome.browser.flags.CachedFeatureFlags; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; @@ -104,6 +105,7 @@ private final OneshotSupplierImpl<TabSwitcherCustomViewManager> mTabSwitcherCustomViewManagerSupplier; private final CrowButtonDelegate mCrowButtonDelegate; + private final OneshotSupplier<IncognitoReauthController> mIncognitoReauthControllerSupplier; @VisibleForTesting static final String START_SHOWN_AT_STARTUP_UMA = "Startup.Android.StartSurfaceShownAtStartup"; @@ -224,6 +226,8 @@ * @param toolbarSupplier Supplies the {@link Toolbar}. * @param crowButtonDelegate The {@link CrowButtonDelegate} to handle Crow click events. * @param backPressManager {@link BackPressManager} to handle back press. + * @param incognitoReauthControllerSupplier {@link OneshotSupplier<IncognitoReauthController>} + * to detect pending re-auth when tab switcher is shown. */ public StartSurfaceCoordinator(@NonNull Activity activity, @NonNull ScrimCoordinator scrimCoordinator, @@ -245,7 +249,8 @@ @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, @NonNull JankTracker jankTracker, @NonNull Supplier<Toolbar> toolbarSupplier, - @NonNull CrowButtonDelegate crowButtonDelegate, BackPressManager backPressManager) { + @NonNull CrowButtonDelegate crowButtonDelegate, BackPressManager backPressManager, + @NonNull OneshotSupplier<IncognitoReauthController> incognitoReauthControllerSupplier) { mConstructedTimeNs = SystemClock.elapsedRealtimeNanos(); mActivity = activity; mScrimCoordinator = scrimCoordinator; @@ -269,6 +274,7 @@ mMultiWindowModeStateDispatcher = multiWindowModeStateDispatcher; mToolbarSupplier = toolbarSupplier; mCrowButtonDelegate = crowButtonDelegate; + mIncognitoReauthControllerSupplier = incognitoReauthControllerSupplier; mTabSwitcherCustomViewManagerSupplier = new OneshotSupplierImpl<>(); boolean excludeQueryTiles = !mIsStartSurfaceEnabled @@ -280,7 +286,7 @@ browserControlsManager, tabCreatorManager, menuOrKeyboardActionController, containerView, shareDelegateSupplier, multiWindowModeStateDispatcher, scrimCoordinator, /* rootView= */ containerView, dynamicResourceLoaderSupplier, - snackbarManager, modalDialogManager); + snackbarManager, modalDialogManager, incognitoReauthControllerSupplier); mTabSwitcherCustomViewManagerSupplier.set( mTabSwitcher.getTabSwitcherCustomViewManager()); } else { @@ -621,6 +627,8 @@ * @param shareDelegateSupplier Supplies the current {@link ShareDelegate}. * @param multiWindowModeStateDispatcher Gives access to the multi window mode state. * @param rootView The root view of the app. + * @param incognitoReauthControllerSupplier {@link OneshotSupplier<IncognitoReauthController>} + * to detect pending re-auth when tab switcher is shown. * @return The {@link TasksSurface}. */ TasksSurface createTasksSurface(@NonNull Activity activity, @@ -637,13 +645,16 @@ @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, @NonNull Supplier<ShareDelegate> shareDelegateSupplier, @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, - @NonNull ViewGroup rootView) { + @NonNull ViewGroup rootView, + @Nullable OneshotSupplier<IncognitoReauthController> + incognitoReauthControllerSupplier) { return new TasksSurfaceCoordinator(activity, scrimCoordinator, propertyModel, tabSwitcherType, parentTabSupplier, hasMVTiles, hasQueryTiles, windowAndroid, activityLifecycleDispatcher, tabModelSelector, snackbarManager, dynamicResourceLoaderSupplier, tabContentManager, modalDialogManager, browserControlsStateProvider, tabCreatorManager, menuOrKeyboardActionController, - shareDelegateSupplier, multiWindowModeStateDispatcher, rootView); + shareDelegateSupplier, multiWindowModeStateDispatcher, rootView, + incognitoReauthControllerSupplier); } @VisibleForTesting @@ -691,7 +702,7 @@ mActivityLifecycleDispatcher, mTabModelSelector, mSnackbarManager, mDynamicResourceLoaderSupplier, mTabContentManager, mModalDialogManager, mBrowserControlsManager, mTabCreatorManager, mMenuOrKeyboardActionController, - mShareDelegateSupplier, mMultiWindowModeStateDispatcher, mContainerView); + mShareDelegateSupplier, mMultiWindowModeStateDispatcher, mContainerView, null); mTasksSurface.getView().setId(R.id.primary_tasks_surface_view); initializeOffsetChangedListener(); addHeaderOffsetChangeListener(mOffsetChangedListenerToGenerateScrollEvents); @@ -715,7 +726,8 @@ mActivityLifecycleDispatcher, mTabModelSelector, mSnackbarManager, mDynamicResourceLoaderSupplier, mTabContentManager, mModalDialogManager, mBrowserControlsManager, mTabCreatorManager, mMenuOrKeyboardActionController, - mShareDelegateSupplier, mMultiWindowModeStateDispatcher, mContainerView); + mShareDelegateSupplier, mMultiWindowModeStateDispatcher, mContainerView, + mIncognitoReauthControllerSupplier); if (mIsInitializedWithNative) { mSecondaryTasksSurface.onFinishNativeInitialization( mActivity, mOmniboxStubSupplier.get(), /*feedReliabilityLogger=*/null);
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java index a22a90d2..edb930a5 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceDelegate.java
@@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import org.chromium.base.jank_tracker.JankTracker; +import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.back_press.BackPressManager; @@ -19,6 +20,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; @@ -102,6 +104,8 @@ * @param toolbarSupplier Supplies the {@link Toolbar}. * @param crowButtonDelegate The {@link CrowButtonDelegate} to handle Crow click events. * @param backPressManager {@link BackPressManager} to handle back press gesture. + * @param incognitoReauthControllerSupplier {@link OneshotSupplier<IncognitoReauthController>} + * to detect pending re-auth when tab switcher is shown. * @return the {@link StartSurface} */ public static StartSurface createStartSurface(@NonNull Activity activity, @@ -124,7 +128,8 @@ @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, @NonNull JankTracker jankTracker, @NonNull Supplier<Toolbar> toolbarSupplier, - @NonNull CrowButtonDelegate crowButtonDelegate, BackPressManager backPressManager) { + @NonNull CrowButtonDelegate crowButtonDelegate, BackPressManager backPressManager, + @NonNull OneshotSupplier<IncognitoReauthController> incognitoReauthControllerSupplier) { return new StartSurfaceCoordinator(activity, scrimCoordinator, sheetController, startSurfaceOneshotSupplier, parentTabSupplier, hadWarmStart, windowAndroid, containerView, dynamicResourceLoaderSupplier, tabModelSelector, @@ -132,6 +137,6 @@ tabContentManager, modalDialogManager, chromeActivityNativeDelegate, activityLifecycleDispatcher, tabCreatorManager, menuOrKeyboardActionController, multiWindowModeStateDispatcher, jankTracker, toolbarSupplier, crowButtonDelegate, - backPressManager); + backPressManager, incognitoReauthControllerSupplier); } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java index 601a68d..b7f064ac 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/start_surface/StartSurfaceMediator.java
@@ -21,10 +21,12 @@ import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.QUERY_TILES_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.RESET_TASK_SURFACE_HEADER_SCROLL_POSITION; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.SINGLE_TAB_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TAB_SWITCHER_TITLE_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TASKS_SURFACE_BODY_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TOP_TOOLBAR_PLACEHOLDER_HEIGHT; @@ -124,7 +126,7 @@ new ObservableSupplierImpl<>(); private final CallbackController mCallbackController = new CallbackController(); private final View mLogoContainerView; - private final boolean mShouldCreateLogo; + private final boolean mIsFeedGoneImprovementEnabled; // Boolean histogram used to record whether cached // ChromePreferenceKeys.FEED_ARTICLES_LIST_VISIBLE is consistent with @@ -220,7 +222,8 @@ // here to keep consistent with toolbar's check. This cannot be moved to other places, since // FEED_ARTICLES_LIST_VISIBLE may be changed after feed header is rendered, which then // causes inconsistency with toolbar's check. - mShouldCreateLogo = ReturnToChromeUtil.shouldImproveStartWhenFeedIsDisabled(context); + mIsFeedGoneImprovementEnabled = + ReturnToChromeUtil.shouldImproveStartWhenFeedIsDisabled(context); if (mPropertyModel != null) { assert mIsStartSurfaceEnabled; @@ -388,14 +391,7 @@ } }; - // Tweak the margins between sections. - Resources resources = mContext.getResources(); - mPropertyModel.set(TASKS_SURFACE_BODY_TOP_MARGIN, - resources.getDimensionPixelSize(R.dimen.tasks_surface_body_top_margin)); - mPropertyModel.set(MV_TILES_CONTAINER_TOP_MARGIN, - resources.getDimensionPixelSize(R.dimen.mv_tiles_container_top_margin)); - mPropertyModel.set(TAB_SWITCHER_TITLE_TOP_MARGIN, - resources.getDimensionPixelSize(R.dimen.tab_switcher_title_top_margin)); + tweakMarginsBetweenSections(); } mController.addTabSwitcherViewObserver(this); @@ -1113,6 +1109,20 @@ // shouldn't show the tab switcher layout on Start. boolean shouldShowTabCarousel = isVisible && !(isSingleTabSwitcher() && isCurrentSelectedTabNTP()); + // If improving Start surface when Feed is disabled is needed, mvt grid layout is shown. We + // need to update the body top margin according to the visibility of carousel tab. + // TODO(crbug.com/1360486): After Feed divider is removed, remove this setting top margin + // since the body top margin should always be R.dimen.tasks_surface_body_top_margin then. + // Also, update |tile_grid_layout_bottom_margin| in NTPLayout to be equal to + // |tasks_surface_body_top_margin| too. + if (mIsFeedGoneImprovementEnabled) { + Resources resources = mContext.getResources(); + mPropertyModel.set(TASKS_SURFACE_BODY_TOP_MARGIN, + resources.getDimensionPixelSize(shouldShowTabCarousel + ? R.dimen.tasks_surface_body_top_margin + : R.dimen.tile_grid_layout_bottom_margin)); + } + if (shouldShowTabCarousel == mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE)) return; mPropertyModel.set(IS_TAB_CAROUSEL_VISIBLE, shouldShowTabCarousel); @@ -1127,7 +1137,7 @@ } private void setLogoVisibility(boolean isVisible) { - if (!mShouldCreateLogo) return; + if (!mIsFeedGoneImprovementEnabled) return; if (isVisible && mLogoCoordinator == null) { mLogoCoordinator = initializeLogo(); @@ -1335,4 +1345,30 @@ ExploreSurfaceCoordinator coordinator = mPropertyModel.get(EXPLORE_SURFACE_COORDINATOR); return coordinator != null ? coordinator.getFeedReliabilityLogger() : null; } + + private void tweakMarginsBetweenSections() { + Resources resources = mContext.getResources(); + mPropertyModel.set(TASKS_SURFACE_BODY_TOP_MARGIN, + resources.getDimensionPixelSize(R.dimen.tasks_surface_body_top_margin)); + mPropertyModel.set(MV_TILES_CONTAINER_TOP_MARGIN, + resources.getDimensionPixelSize(R.dimen.mv_tiles_container_top_margin)); + mPropertyModel.set(TAB_SWITCHER_TITLE_TOP_MARGIN, + resources.getDimensionPixelSize(R.dimen.tab_switcher_title_top_margin)); + + // If improving Start surface when Feed is disabled is needed, mvt grid layout (two row) is + // shown. + if (mIsFeedGoneImprovementEnabled) { + mPropertyModel.set(MV_TILES_CONTAINER_TOP_MARGIN, + resources.getDimensionPixelOffset(R.dimen.tile_grid_layout_top_margin) + + resources.getDimensionPixelOffset( + R.dimen.ntp_search_box_bottom_margin)); + mPropertyModel.set(MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN, + resources.getDimensionPixelSize(R.dimen.ntp_header_lateral_paddings_v2)); + if (isSingleTabSwitcher()) { + mPropertyModel.set(SINGLE_TAB_TOP_MARGIN, + resources.getDimensionPixelOffset( + R.dimen.single_tab_view_top_margin_for_feed_improvement)); + } + } + } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java index 45ad9f5..b1f35862 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceCoordinator.java
@@ -24,10 +24,13 @@ import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.feed.FeedReliabilityLogger; import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncherImpl; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; import org.chromium.chrome.browser.ntp.IncognitoCookieControlsManager; import org.chromium.chrome.browser.omnibox.OmniboxStub; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.profiles.OriginalProfileSupplier; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.profiles.ProfileManager; @@ -41,6 +44,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabCreatorManager; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.ReturnToChromeUtil; import org.chromium.chrome.browser.tasks.tab_management.TabManagementDelegate.TabSwitcherType; import org.chromium.chrome.browser.tasks.tab_management.TabManagementModuleProvider; import org.chromium.chrome.browser.tasks.tab_management.TabSwitcher; @@ -61,6 +65,8 @@ * Concrete implementation of {@link TasksSurface}. */ public class TasksSurfaceCoordinator implements TasksSurface { + private static final int MAX_TILE_ROWS_FOR_GRID_MVT = 2; + private final TabSwitcher mTabSwitcher; private final TasksView mView; private final PropertyModelChangeProcessor mPropertyModelChangeProcessor; @@ -100,7 +106,9 @@ @NonNull MenuOrKeyboardActionController menuOrKeyboardActionController, @NonNull Supplier<ShareDelegate> shareDelegateSupplier, @NonNull MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, - @NonNull ViewGroup rootView) { + @NonNull ViewGroup rootView, + @Nullable OneshotSupplier<IncognitoReauthController> + incognitoReauthControllerSupplier) { mActivity = activity; mView = (TasksView) LayoutInflater.from(activity).inflate(R.layout.tasks_view_layout, null); mView.initialize(activityLifecycleDispatcher, @@ -123,12 +131,15 @@ multiWindowModeStateDispatcher, scrimCoordinator, rootView, dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager); } else if (tabSwitcherType == TabSwitcherType.GRID) { + assert incognitoReauthControllerSupplier + != null : "Valid Incognito re-auth controller supplier needed to create GTS."; mTabSwitcher = TabManagementModuleProvider.getDelegate().createGridTabSwitcher(activity, activityLifecycleDispatcher, tabModelSelector, tabContentManager, browserControlsStateProvider, tabCreatorManager, menuOrKeyboardActionController, mView.getBodyViewContainer(), shareDelegateSupplier, multiWindowModeStateDispatcher, scrimCoordinator, rootView, - dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager); + dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager, + incognitoReauthControllerSupplier); } else if (tabSwitcherType == TabSwitcherType.SINGLE) { mTabSwitcher = new SingleTabSwitcherCoordinator( activity, mView.getCarouselTabSwitcherContainer(), tabModelSelector); @@ -152,14 +163,21 @@ incognitoCookieControlsManager, tabSwitcherType == TabSwitcherType.CAROUSEL); if (hasMVTiles) { + boolean isScrollableMVTEnabled = + !ReturnToChromeUtil.shouldImproveStartWhenFeedIsDisabled(mActivity); + int maxRowsForGridMVT = getQueryTilesVisibility() + ? QueryTileSection.getMaxRowsForMostVisitedTiles(activity) + : MAX_TILE_ROWS_FOR_GRID_MVT; + View mvTilesContainer = mView.findViewById(R.id.mv_tiles_container); mMostVisitedCoordinator = new MostVisitedTilesCoordinator(activity, - activityLifecycleDispatcher, mView.findViewById(R.id.mv_tiles_container), - windowAndroid, + activityLifecycleDispatcher, mvTilesContainer, windowAndroid, TabUiFeatureUtilities.supportInstantStart( DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity), mActivity), - /*isScrollableMVTEnabled=*/true, Integer.MAX_VALUE, Integer.MAX_VALUE, - /*snapshotTileGridChangedRunnable=*/null, /*tileCountChangedRunnable=*/null); + isScrollableMVTEnabled, + isScrollableMVTEnabled ? Integer.MAX_VALUE : maxRowsForGridMVT, + /*snapshotTileGridChangedRunnable=*/null, + /*tileCountChangedRunnable=*/null); } if (hasQueryTiles) { @@ -169,15 +187,21 @@ mQueryTileProfileSupplier = new OriginalProfileSupplier(); mQueryTileProfileSupplier.onAvailable(this::initializeQueryTileSection); } + } else { + storeQueryTilesVisibility(false); } } private void initializeQueryTileSection(Profile profile) { assert profile != null; - if (!QueryTileUtils.isQueryTilesEnabledOnStartSurface()) return; + if (!QueryTileUtils.isQueryTilesEnabledOnStartSurface()) { + storeQueryTilesVisibility(false); + return; + } mQueryTileSection = new QueryTileSection(mView.findViewById(R.id.query_tiles_layout), profile, query -> mMediator.performSearchQuery(query.queryText, query.searchParams)); + storeQueryTilesVisibility(true); mQueryTileProfileSupplier = null; } @@ -324,4 +348,14 @@ && mView.findViewById(R.id.mv_tiles_layout).getVisibility() == View.VISIBLE; } } + + private void storeQueryTilesVisibility(boolean isShown) { + SharedPreferencesManager.getInstance().writeBoolean( + ChromePreferenceKeys.QUERY_TILES_SHOWN_ON_START_SURFACE, isShown); + } + + private boolean getQueryTilesVisibility() { + return SharedPreferencesManager.getInstance().readBoolean( + ChromePreferenceKeys.QUERY_TILES_SHOWN_ON_START_SURFACE, false); + } }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java index 6acad45..28a872e8 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksSurfaceProperties.java
@@ -78,8 +78,12 @@ new PropertyModel.WritableIntPropertyKey(); public static final PropertyModel.WritableIntPropertyKey MV_TILES_CONTAINER_TOP_MARGIN = new PropertyModel.WritableIntPropertyKey(); + public static final PropertyModel.WritableIntPropertyKey MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN = + new PropertyModel.WritableIntPropertyKey(); public static final PropertyModel.WritableIntPropertyKey TAB_SWITCHER_TITLE_TOP_MARGIN = new PropertyModel.WritableIntPropertyKey(); + public static final PropertyModel.WritableIntPropertyKey SINGLE_TAB_TOP_MARGIN = + new PropertyModel.WritableIntPropertyKey(); public static final PropertyModel.WritableIntPropertyKey TOP_TOOLBAR_PLACEHOLDER_HEIGHT = new PropertyModel.WritableIntPropertyKey(); public static final PropertyModel @@ -96,6 +100,7 @@ FAKE_SEARCH_BOX_TEXT_WATCHER, LENS_BUTTON_CLICK_LISTENER, MORE_TABS_CLICK_LISTENER, MV_TILES_VISIBLE, QUERY_TILES_VISIBLE, VOICE_SEARCH_BUTTON_CLICK_LISTENER, TASKS_SURFACE_BODY_TOP_MARGIN, MV_TILES_CONTAINER_TOP_MARGIN, - TAB_SWITCHER_TITLE_TOP_MARGIN, RESET_TASK_SURFACE_HEADER_SCROLL_POSITION, + MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN, TAB_SWITCHER_TITLE_TOP_MARGIN, + SINGLE_TAB_TOP_MARGIN, RESET_TASK_SURFACE_HEADER_SCROLL_POSITION, TOP_TOOLBAR_PLACEHOLDER_HEIGHT}; }
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java index 58954fb6..1a36b753 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksView.java
@@ -51,6 +51,7 @@ private final Context mContext; private FrameLayout mCarouselTabSwitcherContainer; private AppBarLayout mHeaderView; + private ViewGroup mMvTilesContainerLayout; private SearchBoxCoordinator mSearchBoxCoordinator; private IncognitoDescriptionView mIncognitoDescriptionView; private View.OnClickListener mIncognitoDescriptionLearnMoreListener; @@ -82,6 +83,7 @@ mCarouselTabSwitcherContainer = (FrameLayout) findViewById(R.id.carousel_tab_switcher_container); + mMvTilesContainerLayout = findViewById(R.id.mv_tiles_container); mSearchBoxCoordinator = new SearchBoxCoordinator(getContext(), this); mHeaderView = (AppBarLayout) findViewById(R.id.task_surface_header); @@ -156,7 +158,7 @@ * Set the visibility of the Most Visited Tiles. */ void setMostVisitedVisibility(int visibility) { - findViewById(R.id.mv_tiles_container).setVisibility(visibility); + mMvTilesContainerLayout.setVisibility(visibility); } /** @@ -327,13 +329,21 @@ * @param topMargin The top margin to set. */ void setMVTilesContainerTopMargin(int topMargin) { - MarginLayoutParams params = - (MarginLayoutParams) mHeaderView.findViewById(R.id.mv_tiles_container) - .getLayoutParams(); + MarginLayoutParams params = (MarginLayoutParams) mMvTilesContainerLayout.getLayoutParams(); params.topMargin = topMargin; } /** + * Set the left and right margin for the mv tiles container. + * @param margin The left and right margin to set. + */ + void setMVTilesContainerLeftAndRightMargin(int margin) { + MarginLayoutParams params = (MarginLayoutParams) mMvTilesContainerLayout.getLayoutParams(); + params.leftMargin = margin; + params.rightMargin = margin; + } + + /** * Set the top margin for the tab switcher title. * @param topMargin The top margin to set. */ @@ -345,6 +355,17 @@ } /** + * Set the top margin for the single tab card. + * @param topMargin The top margin to set. + */ + void setSingleTabTopMargin(int topMargin) { + MarginLayoutParams params = + (MarginLayoutParams) mHeaderView.findViewById(R.id.single_tab_view) + .getLayoutParams(); + params.topMargin = topMargin; + } + + /** * Set the height of the top toolbar placeholder layout. */ void setTopToolbarPlaceholderHeight(int height) {
diff --git a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java index 79477b6..85e0b8ee 100644 --- a/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java +++ b/chrome/android/features/start_surface/java/src/org/chromium/chrome/features/tasks/TasksViewBinder.java
@@ -23,10 +23,12 @@ import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.LENS_BUTTON_CLICK_LISTENER; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.QUERY_TILES_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.RESET_TASK_SURFACE_HEADER_SCROLL_POSITION; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.SINGLE_TAB_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TAB_SWITCHER_TITLE_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TASKS_SURFACE_BODY_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TOP_TOOLBAR_PLACEHOLDER_HEIGHT; @@ -105,8 +107,13 @@ view.setTasksSurfaceBodyTopMargin(model.get(TASKS_SURFACE_BODY_TOP_MARGIN)); } else if (propertyKey == MV_TILES_CONTAINER_TOP_MARGIN) { view.setMVTilesContainerTopMargin(model.get(MV_TILES_CONTAINER_TOP_MARGIN)); + } else if (propertyKey == MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN) { + view.setMVTilesContainerLeftAndRightMargin( + model.get(MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN)); } else if (propertyKey == TAB_SWITCHER_TITLE_TOP_MARGIN) { view.setTabSwitcherTitleTopMargin(model.get(TAB_SWITCHER_TITLE_TOP_MARGIN)); + } else if (propertyKey == SINGLE_TAB_TOP_MARGIN) { + view.setSingleTabTopMargin(model.get(SINGLE_TAB_TOP_MARGIN)); } else if (propertyKey == RESET_TASK_SURFACE_HEADER_SCROLL_POSITION) { view.resetScrollPosition(); } else if (propertyKey == TOP_TOOLBAR_PLACEHOLDER_HEIGHT) {
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index 4446cbd..e0ea6afa 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -67,6 +67,8 @@ import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.layouts.LayoutType; +import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; +import org.chromium.chrome.browser.preferences.SharedPreferencesManager; import org.chromium.chrome.browser.suggestions.SiteSuggestion; import org.chromium.chrome.browser.suggestions.mostvisited.MostVisitedSitesMetadataUtils; import org.chromium.chrome.browser.suggestions.tile.Tile; @@ -497,6 +499,29 @@ testShowLastTabAtStartUp(); } + @Test + @MediumTest + @Feature({"RenderTest"}) + // clang-format off + @EnableFeatures({ChromeFeatureList.FEED_ABLATION, + ChromeFeatureList.START_SURFACE_DISABLED_FEED_IMPROVEMENT, + ChromeFeatureList.TAB_SWITCHER_ON_RETURN, + ChromeFeatureList.START_SURFACE_ANDROID}) + public void renderImprovingStartSurfaceWhenFeedDisabled() throws IOException { + // clang-format on + StartSurfaceTestUtils.setMVTiles(mSuggestionsDeps); + SharedPreferencesManager.getInstance().writeBoolean( + ChromePreferenceKeys.FEED_ARTICLES_LIST_VISIBLE, false); + mActivityTestRule.startMainActivityFromLauncher(); + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + Assert.assertTrue(ReturnToChromeUtil.shouldImproveStartWhenFeedIsDisabled(cta)); + StartSurfaceTestUtils.waitForOverviewVisible(cta); + + View surface = cta.findViewById(R.id.primary_tasks_surface_view); + ChromeRenderTestRule.sanitize(surface); + mRenderTestRule.render(surface, "start_surface_no_feed_improvement"); + } + private void testShowLastTabAtStartUp() throws IOException { StartSurfaceTestUtils.createTabStateFile(new int[] {0}); StartSurfaceTestUtils.createThumbnailBitmapAndWriteToFile(0);
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java index 09d1c3b..2a7641a 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/TabSwitcherAndStartSurfaceLayoutTest.java
@@ -1507,29 +1507,6 @@ @Test @MediumTest - // clang-format off - @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID, - ChromeFeatureList.TAB_SELECTION_EDITOR_V2}) - @DisableFeatures(ChromeFeatureList.TAB_TO_GTS_ANIMATION) - // TODO(ckitagawa): Re-enable accessibility checks after UX polish is landed. - @DisabledTest(message = "Accessibility touch target too small for default menu button.") - public void testTabSelectionEditorV2Shown() throws InterruptedException { - // clang-format on - ChromeTabbedActivity cta = mActivityTestRule.getActivity(); - TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); - createTabs(cta, false, 3); - enterTabSwitcher(cta); - onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(3)); - - enterTabSelectionEditorV2(cta); - robot.resultRobot.verifyTabSelectionEditorIsVisible(); - - Espresso.pressBack(); - robot.resultRobot.verifyTabSelectionEditorIsHidden(); - } - - @Test - @MediumTest @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID}) public void testTabGroupManualSelection_DisabledForSingleTab() { ChromeTabbedActivity cta = mActivityTestRule.getActivity(); @@ -1590,6 +1567,26 @@ @Test @MediumTest + // clang-format off + @EnableFeatures({ChromeFeatureList.TAB_SELECTION_EDITOR_V2, + ChromeFeatureList.TAB_TO_GTS_ANIMATION}) + public void testTabSelectionEditorV2_SystemBackDismiss() { + // clang-format on + ChromeTabbedActivity cta = mActivityTestRule.getActivity(); + TabSelectionEditorTestingRobot robot = new TabSelectionEditorTestingRobot(); + createTabs(cta, false, 2); + enterTabSwitcher(cta); + onView(tabSwitcherViewMatcher()).check(TabCountAssertion.havingTabCount(2)); + enterTabSelectionEditorV2(cta); + robot.resultRobot.verifyTabSelectionEditorIsVisible(); + + // Pressing system back should dismiss the selection editor. + Espresso.pressBack(); + robot.resultRobot.verifyTabSelectionEditorIsHidden(); + } + + @Test + @MediumTest @Feature("TabSuggestion") // clang-format off @EnableFeatures({ChromeFeatureList.TAB_GROUPS_ANDROID,
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java index daaa098..abbffd3 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
@@ -44,6 +44,7 @@ import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; import org.chromium.chrome.browser.homepage.HomepageManager; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.init.ActivityLifecycleDispatcherImpl; import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcherImpl; @@ -115,6 +116,9 @@ private Activity mActivity; private StartSurfaceCoordinator mCoordinator; + private final OneshotSupplierImpl<IncognitoReauthController> + mIncognitoReauthControllerSupplier = new OneshotSupplierImpl<>(); + private static class MockTabModelFilterProvider extends TabModelFilterProvider { public MockTabModelFilterProvider(Activity activity) { List<TabModel> tabModels = new ArrayList<>(); @@ -268,6 +272,7 @@ OmniboxStub omniboxStub = Mockito.mock(OmniboxStub.class); when(omniboxStub.getVoiceRecognitionHandler()).thenReturn(voiceRecognitionHandler); when(voiceRecognitionHandler.isVoiceSearchEnabled()).thenReturn(true); + mIncognitoReauthControllerSupplier.set(Mockito.mock(IncognitoReauthController.class)); mCoordinator = new StartSurfaceCoordinator(mActivity, scrimCoordinator, Mockito.mock(BottomSheetController.class), new OneshotSupplierImpl<>(), @@ -282,7 +287,7 @@ Mockito.mock(MenuOrKeyboardActionController.class), new MultiWindowModeStateDispatcherImpl(mActivity), new DummyJankTracker(), new ObservableSupplierImpl<>(), new CrowButtonDelegateImpl(), - new BackPressManager()); + new BackPressManager(), mIncognitoReauthControllerSupplier); Assert.assertFalse(LibraryLoader.getInstance().isLoaded()); when(mLibraryLoader.isInitialized()).thenReturn(true);
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java index 54058f9..2cedbcb 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceMediatorUnitTest.java
@@ -41,11 +41,14 @@ import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL_TITLE_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_TAB_CAROUSEL_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.SINGLE_TAB_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TAB_SWITCHER_TITLE_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TASKS_SURFACE_BODY_TOP_MARGIN; +import android.content.Context; import android.content.res.Resources; import android.view.View; @@ -1208,6 +1211,61 @@ equalTo(mvTilesContainerTopMargin)); assertThat(mPropertyModel.get(TAB_SWITCHER_TITLE_TOP_MARGIN), equalTo(tabSwitcherTitleTopMargin)); + + assertThat(mPropertyModel.get(MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN), equalTo(0)); + assertThat(mPropertyModel.get(SINGLE_TAB_TOP_MARGIN), equalTo(0)); + } + + @Test + @EnableFeatures(ChromeFeatureList.START_SURFACE_DISABLED_FEED_IMPROVEMENT) + public void testStartSurfaceTopMarginsWhenFeedGoneImprovementEnabled() { + SharedPreferencesManager.getInstance().writeBoolean( + ChromePreferenceKeys.FEED_ARTICLES_LIST_VISIBLE, false); + Context context = ContextUtils.getApplicationContext(); + Assert.assertTrue(ReturnToChromeUtil.shouldImproveStartWhenFeedIsDisabled(context)); + doReturn(TabSwitcherType.SINGLE).when(mMainTabGridController).getTabSwitcherType(); + + Resources resources = context.getResources(); + int tasksSurfaceBodyTopMarginWithTab = + resources.getDimensionPixelSize(R.dimen.tasks_surface_body_top_margin); + int tasksSurfaceBodyTopMarginWithoutTab = + resources.getDimensionPixelSize(R.dimen.tile_grid_layout_bottom_margin); + int mvTilesContainerTopMargin = + resources.getDimensionPixelOffset(R.dimen.tile_grid_layout_top_margin) + + resources.getDimensionPixelOffset(R.dimen.ntp_search_box_bottom_margin); + int tabSwitcherTitleTopMargin = + resources.getDimensionPixelSize(R.dimen.tab_switcher_title_top_margin); + int singleTopMargin = resources.getDimensionPixelSize( + R.dimen.single_tab_view_top_margin_for_feed_improvement); + + StartSurfaceMediator mediator = + createStartSurfaceMediatorWithoutInit(/* isStartSurfaceEnabled= */ true, + /* hadWarmStart= */ false); + assertThat(mPropertyModel.get(TASKS_SURFACE_BODY_TOP_MARGIN), + equalTo(tasksSurfaceBodyTopMarginWithTab)); + assertThat(mPropertyModel.get(MV_TILES_CONTAINER_TOP_MARGIN), + equalTo(mvTilesContainerTopMargin)); + assertThat(mPropertyModel.get(TAB_SWITCHER_TITLE_TOP_MARGIN), + equalTo(tabSwitcherTitleTopMargin)); + assertThat(mPropertyModel.get(SINGLE_TAB_TOP_MARGIN), equalTo(singleTopMargin)); + + // Tasks surface body top margin should be updated when tab carousel/single card visibility + // is changed. + doReturn(0).when(mNormalTabModel).getCount(); + doReturn(true).when(mTabModelSelector).isTabStateInitialized(); + mediator.showOverview(false); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); + assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(false)); + assertThat(mPropertyModel.get(TASKS_SURFACE_BODY_TOP_MARGIN), + equalTo(tasksSurfaceBodyTopMarginWithoutTab)); + + doReturn(2).when(mNormalTabModel).getCount(); + mediator.setStartSurfaceState(StartSurfaceState.SHOWING_HOMEPAGE); + mediator.showOverview(false); + mediator.setStartSurfaceState(StartSurfaceState.SHOWN_HOMEPAGE); + assertThat(mPropertyModel.get(IS_TAB_CAROUSEL_VISIBLE), equalTo(true)); + assertThat(mPropertyModel.get(TASKS_SURFACE_BODY_TOP_MARGIN), + equalTo(tasksSurfaceBodyTopMarginWithTab)); } @Test
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksViewBinderUnitTest.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksViewBinderUnitTest.java index c9fe1fba..09ef746 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksViewBinderUnitTest.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/tasks/TasksViewBinderUnitTest.java
@@ -22,8 +22,10 @@ import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.IS_VOICE_RECOGNITION_BUTTON_VISIBLE; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.LENS_BUTTON_CLICK_LISTENER; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MORE_TABS_CLICK_LISTENER; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_CONTAINER_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.MV_TILES_VISIBLE; +import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.SINGLE_TAB_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TAB_SWITCHER_TITLE_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TASKS_SURFACE_BODY_TOP_MARGIN; import static org.chromium.chrome.features.tasks.TasksSurfaceProperties.TOP_TOOLBAR_PLACEHOLDER_HEIGHT; @@ -295,6 +297,40 @@ @Test @SmallTest + public void testSetMVTilesContainerLeftAndRightMargin() { + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) mTasksView.findViewById(R.id.mv_tiles_container) + .getLayoutParams(); + assertEquals(0, params.leftMargin); + assertEquals(0, params.rightMargin); + + mTasksViewPropertyModel.set(MV_TILES_CONTAINER_LEFT_RIGHT_MARGIN, 16); + + assertEquals(16, params.leftMargin); + assertEquals(16, params.rightMargin); + } + + @Test + @SmallTest + public void testSetSingleTabTopMargin() { + SingleTabView singleTabView = (SingleTabView) mActivity.getLayoutInflater().inflate( + R.layout.single_tab_view_layout, mTasksView.getCarouselTabSwitcherContainer(), + false); + mTasksView.getCarouselTabSwitcherContainer().addView(singleTabView); + + ViewGroup.MarginLayoutParams params = + (ViewGroup.MarginLayoutParams) mTasksView.findViewById(R.id.single_tab_view) + .getLayoutParams(); + // The initial top margin of single_tab_view_layout is 24. + assertEquals(24, params.topMargin); + + mTasksViewPropertyModel.set(SINGLE_TAB_TOP_MARGIN, 16); + + assertEquals(16, params.topMargin); + } + + @Test + @SmallTest public void testSetTabSwitcherTitleTopMargin() { ViewGroup.MarginLayoutParams params = (ViewGroup.MarginLayoutParams) mTasksView.findViewById(R.id.tab_switcher_title)
diff --git a/chrome/android/features/tab_ui/BUILD.gn b/chrome/android/features/tab_ui/BUILD.gn index 9e524a5e..ecbdd305 100644 --- a/chrome/android/features/tab_ui/BUILD.gn +++ b/chrome/android/features/tab_ui/BUILD.gn
@@ -32,6 +32,7 @@ "java/res/drawable/chevron_right.xml", "java/res/drawable/fake_search_box_text_box_bg_incognito.xml", "java/res/drawable/ic_check_googblue_20dp_animated.xml", + "java/res/drawable/ic_close_tabs_24dp.xml", "java/res/drawable/ic_group_icon_16dp.xml", "java/res/drawable/ic_price_alert_blue.xml", "java/res/drawable/ic_rating_star_full.xml", @@ -147,6 +148,7 @@ "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProvider.java", + "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionViewLayout.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java", "java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java",
diff --git a/chrome/android/features/tab_ui/java/res/drawable/ic_close_tabs_24dp.xml b/chrome/android/features/tab_ui/java/res/drawable/ic_close_tabs_24dp.xml new file mode 100644 index 0000000..a0642bf --- /dev/null +++ b/chrome/android/features/tab_ui/java/res/drawable/ic_close_tabs_24dp.xml
@@ -0,0 +1,22 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- 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. --> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="24dp" + android:height="24dp" + android:viewportWidth="14" + android:viewportHeight="18" + android:tint="@macro/default_icon_color"> + <group + android:scaleX="0.5833335" + android:scaleY="0.75" + android:pivotX="7" + android:pivotY="9"> + <path android:fillColor="@android:color/white" + android:fillType="evenOdd" + android:pathData="M12.999,4.001H0.999V16.001C0.999,17.105 1.895,18.001 3,18.001H10.999C12.105,18.001 12.999,17.105 12.999,16.001V4.001ZM9.499,0H4.499L3.5,1.001H0.999C0.448,1.001 0,1.449 0,2V3.001H14V2C14,1.449 13.552,1.001 12.999,1.001H10.5L9.499,0Z"/> + </group> +</vector> +
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml index 4e53f41..fb28f3db 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_grid_card_item.xml
@@ -87,12 +87,6 @@ android:layout_width="match_parent" android:layout_height="56dp" android:visibility="gone"/> - <View - android:id="@+id/divider_view" - style="@style/HorizontalDivider" - android:layout_below="@id/tab_title" - android:visibility="gone" - android:background="@macro/divider_line_bg_color"/> <org.chromium.ui.widget.ButtonCompat android:id="@+id/create_group_button" android:layout_width="wrap_content"
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_action_view.xml b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_action_view.xml index eb1304d4..ca03bcfb 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_action_view.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_action_view.xml
@@ -10,8 +10,8 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:drawablePadding="@dimen/tab_selection_editor_action_view_padding" android:id="@+id/tab_selection_editor_action_view" - android:visibility="gone" - android:gravity="center" android:enabled="false" style="@style/TextButton.OnAccent1"/>
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml index 831bc29a..12aed5b2 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_selection_editor_toolbar.xml
@@ -7,14 +7,40 @@ <org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorToolbar xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> - <org.chromium.ui.widget.ButtonCompat - android:id="@+id/action_button" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_gravity="end" - android:enabled="false" - android:text="@string/tab_selection_editor_group" - style="@style/TextButton.OnAccent1" /> -</org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorToolbar> \ No newline at end of file + <org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorActionViewLayout + android:id="@+id/action_view_layout" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="horizontal"> + <Space + android:id="@+id/spacer" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:layout_weight="1"/> + <org.chromium.ui.widget.ButtonCompat + android:id="@+id/action_button" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_weight="0" + android:layout_gravity="center_vertical|end" + android:enabled="false" + android:text="@string/tab_selection_editor_group" + style="@style/TextButton.OnAccent1" /> + <org.chromium.components.browser_ui.widget.listmenu.ListMenuButton + style="@style/ToolbarMenuButton" + android:id="@+id/list_menu_button" + android:src="@drawable/ic_more_vert_24dp" + android:layout_width="@dimen/min_touch_target_size" + android:layout_height="@dimen/min_touch_target_size" + android:layout_gravity="center" + android:visibility="gone" + android:background="@null" + app:menuMaxWidth="@dimen/menu_width" + app:tint="@color/default_icon_color_tint_list" + tools:ignore="ContentDescription" /> + </org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorActionViewLayout> +</org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorToolbar>
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml index ee1cee0d..e8d99be 100644 --- a/chrome/android/features/tab_ui/java/res/values/dimens.xml +++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -82,4 +82,7 @@ <dimen name="search_box_end_padding">10dp</dimen> <dimen name="tasks_surface_location_bar_url_button_size"> 20dp</dimen> <dimen name="tasks_surface_location_bar_url_button_start_margin"> 16dp</dimen> + + <!-- Dimens for TabSelectionEditorV2 --> + <dimen name="tab_selection_editor_action_view_padding">14dp</dimen> </resources>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java index 2e1841d..a18e7cb 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogMediator.java
@@ -504,9 +504,9 @@ ButtonType.ICON_AND_TEXT, IconPosition.END, mTabModelSelector.getCurrentModel().isIncognito())); actions.add(TabSelectionEditorCloseAction.createAction( - ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); + mContext, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); actions.add(TabSelectionEditorUngroupAction.createAction( - ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); + mContext, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); actions.add(TabSelectionEditorShareAction.createAction(mContext, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START, mShareDelegateSupplier)); mTabSelectionEditorControllerSupplier.get().configureToolbarWithMenuItems(
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 06521aa..024d900 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
@@ -12,7 +12,6 @@ import android.content.res.Configuration; import android.graphics.Rect; import android.graphics.RectF; -import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.GradientDrawable; import android.util.AttributeSet; import android.view.View; @@ -720,10 +719,6 @@ ApiCompatibilityUtils.setImageTintList(actionButton, ImageViewCompat.getImageTintList((view.findViewById(R.id.action_button)))); - View dividerView = mAnimationCardView.findViewById(R.id.divider_view); - dividerView.setBackgroundColor( - ((ColorDrawable) view.findViewById(R.id.divider_view).getBackground()).getColor()); - mAnimationCardView.findViewById(R.id.background_view).setBackground(null); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java index cd3e893..222e4c0 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinder.java
@@ -456,7 +456,6 @@ private static void updateColor( ViewLookupCachingFrameLayout rootView, boolean isIncognito, boolean isSelected) { View cardView = rootView.fastFindViewById(R.id.card_view); - View dividerView = rootView.fastFindViewById(R.id.divider_view); TextView titleView = (TextView) rootView.fastFindViewById(R.id.tab_title); TabGridThumbnailView thumbnail = (TabGridThumbnailView) rootView.fastFindViewById(R.id.tab_thumbnail); @@ -468,9 +467,6 @@ cardView.getContext(), isIncognito, isSelected); ViewCompat.setBackgroundTintList(cardView, ColorStateList.valueOf(backgroundColor)); - dividerView.setBackgroundColor( - TabUiThemeProvider.getDividerColor(dividerView.getContext(), isIncognito)); - titleView.setTextColor(TabUiThemeProvider.getTitleTextColor( titleView.getContext(), isIncognito, isSelected));
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java index 0418dc6..ddc645a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegate.java
@@ -20,6 +20,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; @@ -90,6 +91,8 @@ * @param dynamicResourceLoaderSupplier Supplies the current {@link DynamicResourceLoader}. * @param snackbarManager Manages the snackbar. * @param modalDialogManager Manages modal dialogs. + * @param incognitoReauthControllerSupplier {@link OneshotSupplier<IncognitoReauthController>} + * to detect pending re-auth when tab switcher is shown. * @return The {@link TabSwitcher}. */ TabSwitcher createGridTabSwitcher(@NonNull Activity activity, @@ -105,7 +108,8 @@ @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView, @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier, @NonNull SnackbarManager snackbarManager, - @NonNull ModalDialogManager modalDialogManager); + @NonNull ModalDialogManager modalDialogManager, + @NonNull OneshotSupplier<IncognitoReauthController> incognitoReauthControllerSupplier); /** * Create the {@link TabSwitcher} to display Tabs in carousel.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java index cb7b7f67..67dab242 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabManagementDelegateImpl.java
@@ -23,6 +23,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.layouts.LayoutStateProvider; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.metrics.UmaSessionStats; @@ -68,7 +69,8 @@ @NonNull ScrimCoordinator scrimCoordinator, @NonNull ViewGroup rootView, @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier, @NonNull SnackbarManager snackbarManager, - @NonNull ModalDialogManager modalDialogManager) { + @NonNull ModalDialogManager modalDialogManager, + @NonNull OneshotSupplier<IncognitoReauthController> incognitoReauthControllerSupplier) { if (UmaSessionStats.isMetricsServiceAvailable()) { UmaSessionStats.registerSyntheticFieldTrial( ChromeFeatureList.TAB_GRID_LAYOUT_ANDROID + SYNTHETIC_TRIAL_POSTFIX, @@ -83,7 +85,8 @@ && SysUtils.isLowEndDevice() ? TabListCoordinator.TabListMode.LIST : TabListCoordinator.TabListMode.GRID, - rootView, dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager); + rootView, dynamicResourceLoaderSupplier, snackbarManager, modalDialogManager, + incognitoReauthControllerSupplier); } @Override @@ -106,7 +109,7 @@ menuOrKeyboardActionController, containerView, shareDelegateSupplier, multiWindowModeStateDispatcher, scrimCoordinator, TabListCoordinator.TabListMode.CAROUSEL, rootView, dynamicResourceLoaderSupplier, - snackbarManager, modalDialogManager); + snackbarManager, modalDialogManager, null); } @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java index a01e014..9c25f00 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorAction.java
@@ -132,7 +132,7 @@ assert iconPosition >= IconPosition.START && iconPosition < IconPosition.NUM_ENTRIES; mModel = - new PropertyModel.Builder(TabSelectionEditorActionProperties.ALL_KEYS) + new PropertyModel.Builder(TabSelectionEditorActionProperties.ACTION_KEYS) .with(TabSelectionEditorActionProperties.MENU_ITEM_ID, menuItemId) .with(TabSelectionEditorActionProperties.SHOW_MODE, showMode) .with(TabSelectionEditorActionProperties.BUTTON_TYPE, buttonType)
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java index 636ad283..cb6f571 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionProperties.java
@@ -28,15 +28,11 @@ public static final WritableIntPropertyKey TITLE_RESOURCE_ID = new WritableIntPropertyKey(); public static final WritableObjectPropertyKey<Integer> CONTENT_DESCRIPTION_RESOURCE_ID = new WritableObjectPropertyKey(); + public static final WritableObjectPropertyKey<String> CONTENT_DESCRIPTION = + new WritableObjectPropertyKey<>(); public static final WritableObjectPropertyKey<Drawable> ICON = new WritableObjectPropertyKey<>(); - - /** - * Force enabled to update on each selection state change. Otherwise it gets set to enabled by - * by something in the Selection Layout if more than 1 tab is selected. - */ - public static final WritableObjectPropertyKey<Boolean> ENABLED = - new WritableObjectPropertyKey<>(/*skipEquality=*/true); + public static final WritableBooleanPropertyKey ENABLED = new WritableBooleanPropertyKey(); public static final WritableIntPropertyKey ITEM_COUNT = new WritableIntPropertyKey(); public static final WritableObjectPropertyKey<ColorStateList> TEXT_TINT = new WritableObjectPropertyKey<>(); @@ -59,8 +55,17 @@ public static final WritableObjectPropertyKey<Callback<List<Integer>>> ON_SELECTION_STATE_CHANGE = new WritableObjectPropertyKey<>(); - public static final PropertyKey[] ALL_KEYS = {MENU_ITEM_ID, SHOW_MODE, BUTTON_TYPE, + /** + * Keys for the {@link TabSelectionEditorAction}. + */ + public static final PropertyKey[] ACTION_KEYS = {MENU_ITEM_ID, SHOW_MODE, BUTTON_TYPE, ICON_POSITION, TITLE_RESOURCE_ID, CONTENT_DESCRIPTION_RESOURCE_ID, ICON, ENABLED, ITEM_COUNT, TEXT_TINT, ICON_TINT, SKIP_ICON_TINT, ON_CLICK_LISTENER, ON_SELECTION_STATE_CHANGE}; + + /** + * Keys for the {@link TabSelectionEditorMenuItem}. + */ + public static final PropertyKey[] MENU_ITEM_KEYS = { + MENU_ITEM_ID, TITLE_RESOURCE_ID, CONTENT_DESCRIPTION, ICON, ENABLED}; }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionViewLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionViewLayout.java new file mode 100644 index 0000000..bf45813 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorActionViewLayout.java
@@ -0,0 +1,209 @@ +// 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.tasks.tab_management; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.Gravity; +import android.view.View; +import android.widget.LinearLayout; + +import androidx.annotation.VisibleForTesting; +import androidx.collection.ArraySet; + +import org.chromium.chrome.tab_ui.R; +import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton; +import org.chromium.components.browser_ui.widget.listmenu.ListMenuButtonDelegate; + +import java.util.ArrayList; +import java.util.Set; + +/** + * A {@link LinearLayout} that displays only the TabSelectionEditorMenuItem ActionViews that fit in + * the space it contains. Managed by a {@link TabSelectionEditorMenu}. + */ +public class TabSelectionEditorActionViewLayout extends LinearLayout { + /** + * All {@link TabSelectionEditoreMenuItem} action views with menu items. + */ + private final ArrayList<TabSelectionEditorMenuItem> mMenuItemsWithActionView = + new ArrayList<>(); + /** + * The {@link TabSelectionEditoreMenuItem}s with visible action views. + */ + private final Set<TabSelectionEditorMenuItem> mVisibleActions = new ArraySet<>(); + + /** + * Spacer that pushes visible elements to the end of the container. + */ + private View mSpacer; + /** + * {@link ListMenuButton} for showing the {@link TabSelectionEditorMenu}. + */ + private ListMenuButton mMenuButton; + private LinearLayout.LayoutParams mActionViewParams; + + private Context mContext; + private ActionViewLayoutDelegate mDelegate; + private boolean mHasMenuOnlyItems; + + /** + * Delegate updates in response to which action views are visible. + */ + public interface ActionViewLayoutDelegate { + /** + * @param visibleActions the list of {@link TabSelectionEditorMenuItem}s with visible action + * views. + */ + public void setVisibleActionViews(Set<TabSelectionEditorMenuItem> visibleActions); + } + + public TabSelectionEditorActionViewLayout(Context context, AttributeSet attrs) { + super(context, attrs); + mActionViewParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT, 0.0f); + mActionViewParams.gravity = Gravity.CENTER_VERTICAL; + mContext = context; + } + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + mSpacer = findViewById(R.id.spacer); + mMenuButton = findViewById(R.id.list_menu_button); + mMenuButton.tryToFitLargestItem(true); + } + + @VisibleForTesting + ListMenuButton getListMenuButtonForTesting() { + return mMenuButton; + } + + /** + * @param delegate for handling menu button presses. + */ + public void setListMenuButtonDelegate(ListMenuButtonDelegate delegate) { + mMenuButton.setDelegate(delegate); + } + + /** + * @param delegate the delegate to notify of action view changes. + */ + public void setActionViewLayoutDelegate(ActionViewLayoutDelegate delegate) { + mDelegate = delegate; + } + + /** + * @param hasMenuOnlyItems whether the menu has items which are only shown in the menu. + */ + public void setHasMenuOnlyItems(boolean hasMenuOnlyItems) { + mHasMenuOnlyItems = hasMenuOnlyItems; + update(); + } + + /** + * @param menuItem a menu item with an action view to attempt to show prioritized by insertion + * order. + */ + public void add(TabSelectionEditorMenuItem menuItem) { + assert menuItem.getActionView() != null; + + mMenuItemsWithActionView.add(menuItem); + update(); + } + + /** + * Clears the action views from this layout. + */ + public void clear() { + removeAllActionViews(); + mMenuItemsWithActionView.clear(); + mHasMenuOnlyItems = false; + mMenuButton.setVisibility(View.GONE); + update(); + } + + /** + * Dismisses the menu. + */ + public void dismissMenu() { + mMenuButton.dismiss(); + } + + private void removeAllActionViews() { + for (TabSelectionEditorMenuItem menuItem : mMenuItemsWithActionView) { + final View actionView = menuItem.getActionView(); + if (this == actionView.getParent()) { + removeView(menuItem.getActionView()); + } + } + } + + private boolean isUsingTabSelectionEditorV2Features() { + return TabUiFeatureUtilities.isTabSelectionEditorV2Enabled(mContext) && mDelegate != null + && (!mMenuItemsWithActionView.isEmpty() || mHasMenuOnlyItems); + } + + @Override + public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + if (!isUsingTabSelectionEditorV2Features()) { + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + return; + } + + // Get empty size without spacer and action views. + removeAllActionViews(); + mSpacer.setVisibility(View.GONE); + mMenuButton.setVisibility(View.VISIBLE); + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + final int width = getMeasuredWidth(); + + // Calculate the remaining room used by the menu, number roll view, etc. + int usedRoom = getPaddingLeft() + getPaddingRight(); + for (int i = 0; i < getChildCount(); i++) { + // Ignore the spacer as it still may have a width. + if (getChildAt(i) == mSpacer) continue; + + usedRoom += getChildAt(i).getMeasuredWidth(); + } + + mVisibleActions.clear(); + + // Add all action views leaving room using the remaining room. + boolean allActionViewsShown = true; + for (TabSelectionEditorMenuItem menuItem : mMenuItemsWithActionView) { + final View actionView = menuItem.getActionView(); + actionView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED); + final int actionViewWidth = actionView.getMeasuredWidth(); + if (usedRoom + actionViewWidth > width || !allActionViewsShown) { + // The ActionView was removed. Ensure it still has a LayoutParams. + actionView.setLayoutParams(mActionViewParams); + allActionViewsShown = false; + continue; + } + + // Add views in front of the menu button. + addView(actionView, getChildCount() - 1, mActionViewParams); + mVisibleActions.add(menuItem); + usedRoom += actionViewWidth; + } + mDelegate.setVisibleActionViews(mVisibleActions); + if (mHasMenuOnlyItems || !allActionViewsShown) { + mMenuButton.setVisibility(View.VISIBLE); + } else { + mMenuButton.setVisibility(View.GONE); + } + + // Show the spacer for the remaining space. + mSpacer.setVisibility(View.VISIBLE); + + // Get the final measurement. + super.onMeasure(widthMeasureSpec, heightMeasureSpec); + } + + private void update() { + measure(View.MeasureSpec.EXACTLY, View.MeasureSpec.AT_MOST); + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java index 254eccca..382d9a6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseAction.java
@@ -4,6 +4,11 @@ package org.chromium.chrome.browser.tasks.tab_management; +import android.content.Context; +import android.graphics.drawable.Drawable; + +import androidx.appcompat.content.res.AppCompatResources; + import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.tab_ui.R; @@ -15,21 +20,22 @@ public class TabSelectionEditorCloseAction extends TabSelectionEditorAction { /** * Create an action for closing tabs. + * @param context for loading resources. * @param showMode whether to show an action view. * @param buttonType the type of the action view. * @param iconPosition the position of the icon in the action view. */ - public static TabSelectionEditorAction createAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { - // TODO(ckitagawa): Load drawable and pass to constructor. - return new TabSelectionEditorCloseAction(showMode, buttonType, iconPosition); + public static TabSelectionEditorAction createAction(Context context, @ShowMode int showMode, + @ButtonType int buttonType, @IconPosition int iconPosition) { + Drawable drawable = AppCompatResources.getDrawable(context, R.drawable.ic_close_tabs_24dp); + return new TabSelectionEditorCloseAction(showMode, buttonType, iconPosition, drawable); } - private TabSelectionEditorCloseAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + private TabSelectionEditorCloseAction(@ShowMode int showMode, @ButtonType int buttonType, + @IconPosition int iconPosition, Drawable drawable) { super(R.id.tab_selection_editor_close_menu_item, showMode, buttonType, iconPosition, - R.string.tab_suggestion_close_tab_action_button, - R.plurals.accessibility_tab_suggestion_close_tab_action_button, null); + R.string.tab_selection_editor_close_tabs, + R.plurals.accessibility_tab_selection_editor_close_tabs, drawable); } @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java index 235b7da5..a95354e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCoordinator.java
@@ -190,6 +190,9 @@ // initialized. assert LibraryLoader.getInstance().isInitialized(); mTabListCoordinator.initWithNative(null); + if (thumbnailProvider instanceof MultiThumbnailCardProvider) { + ((MultiThumbnailCardProvider) thumbnailProvider).initWithNative(); + } mTabListCoordinator.registerItemType(TabProperties.UiType.DIVIDER, new LayoutViewBuilder(R.layout.divider_preference),
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java index 7bfd3de..922e6f2 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupAction.java
@@ -4,6 +4,11 @@ package org.chromium.chrome.browser.tasks.tab_management; +import android.content.Context; +import android.graphics.drawable.Drawable; + +import androidx.appcompat.content.res.AppCompatResources; + import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; @@ -19,21 +24,22 @@ public class TabSelectionEditorGroupAction extends TabSelectionEditorAction { /** * Create an action for grouping tabs. + * @param context for loading resources. * @param showMode whether to show an action view. * @param buttonType the type of the action view. * @param iconPosition the position of the icon in the action view. */ - public static TabSelectionEditorAction createAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { - // TODO(ckitagawa): Load drawable and pass to constructor. - return new TabSelectionEditorGroupAction(showMode, buttonType, iconPosition); + public static TabSelectionEditorAction createAction(Context context, @ShowMode int showMode, + @ButtonType int buttonType, @IconPosition int iconPosition) { + Drawable drawable = AppCompatResources.getDrawable(context, R.drawable.ic_widgets); + return new TabSelectionEditorGroupAction(showMode, buttonType, iconPosition, drawable); } - private TabSelectionEditorGroupAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + private TabSelectionEditorGroupAction(@ShowMode int showMode, @ButtonType int buttonType, + @IconPosition int iconPosition, Drawable drawable) { super(R.id.tab_selection_editor_group_menu_item, showMode, buttonType, iconPosition, - R.string.tab_selection_editor_group, - R.plurals.accessibility_tab_selection_editor_group_button, null); + R.string.tab_selection_editor_group_tabs, + R.plurals.accessibility_tab_selection_editor_group_tabs, drawable); } @Override
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java index d80e216..59abe54 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMediator.java
@@ -221,6 +221,9 @@ @Nullable TabSelectionEditorActionProvider actionProvider, int actionButtonEnablingThreshold, @Nullable TabSelectionEditorNavigationProvider navigationProvider) { + if (mActionListModel != null) { + mActionListModel.clear(); + } if (actionButtonText != null) { mModel.set(TabSelectionEditorProperties.TOOLBAR_ACTION_BUTTON_TEXT, actionButtonText); } @@ -251,10 +254,8 @@ assert ChromeFeatureList.isEnabled(ChromeFeatureList.TAB_SELECTION_EDITOR_V2); if (mActionListModel == null) { mActionListModel = new PropertyListModel<>(); - mTabSelectionEditorMenu = - new TabSelectionEditorMenu(mContext, mTabSelectionEditorToolbar.getMenu()); - mTabSelectionEditorToolbar.setOnMenuItemClickListener( - mTabSelectionEditorMenu::onMenuItemClick); + mTabSelectionEditorMenu = new TabSelectionEditorMenu( + mContext, mTabSelectionEditorToolbar.getActionViewLayout()); mSelectionDelegate.addObserver(mTabSelectionEditorMenu); mActionChangeProcessor = new ListModelChangeProcessor( mActionListModel, mTabSelectionEditorMenu, new TabSelectionEditorMenuAdapter());
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenu.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenu.java index c33254a..cc751d6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenu.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenu.java
@@ -5,46 +5,116 @@ package org.chromium.chrome.browser.tasks.tab_management; import android.content.Context; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.Toolbar; +import android.view.LayoutInflater; +import android.view.View; +import android.widget.AdapterView; +import android.widget.AdapterView.OnItemClickListener; +import android.widget.ListView; -import androidx.collection.ArrayMap; -import androidx.collection.ArraySet; +import androidx.annotation.IntDef; +import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorActionViewLayout.ActionViewLayoutDelegate; +import org.chromium.chrome.tab_ui.R; +import org.chromium.components.browser_ui.widget.listmenu.ListMenu; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; +import org.chromium.ui.modelutil.LayoutViewBuilder; +import org.chromium.ui.modelutil.MVCListAdapter.ListItem; +import org.chromium.ui.modelutil.MVCListAdapter.ModelList; +import org.chromium.ui.modelutil.ModelListAdapter; +import org.chromium.ui.modelutil.PropertyModel; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; /** - * A view holder for a toolbar {@link Menu}. The {@code mMenu} contains a list of {@link MenuItem}s - * from the {@link TabSelectionEditorMenuItem}s viewholder. + * A {@link ListMenu} for the {@link TabSelectionEditorToolbar} that helps manage a + * {@link TabSelectionEditorActionViewLayout} for Action views. The menu contains a list of + * {@link TabSelectionEditorMenuItem}s which hold optional action views if room is available. */ -public class TabSelectionEditorMenu - implements Toolbar.OnMenuItemClickListener, SelectionDelegate.SelectionObserver<Integer> { +public class TabSelectionEditorMenu implements ListMenu, OnItemClickListener, + SelectionDelegate.SelectionObserver<Integer>, + ActionViewLayoutDelegate { + @Retention(RetentionPolicy.SOURCE) + @IntDef({ListItemType.MENU_ITEM}) + public static @interface ListItemType { + int MENU_ITEM = 0; + } + private Context mContext; - private Menu mMenu; - private Map<Integer, TabSelectionEditorMenuItem> mMenuItems = new ArrayMap<>(); + // Insertion ordering is important and for performance it is ok as size is very small. + private Map<Integer, TabSelectionEditorMenuItem> mMenuItems = new LinkedHashMap<>(); + + private View mContentView; + private ListView mListView; + private TabSelectionEditorActionViewLayout mActionViewLayout; + private ModelList mModelList; + private ModelListAdapter mAdapter; /** * @param context to use for accessing resources. - * @param menu the {@link Menu} to wrap. + * @param actionViewLayout the actionViewLayout to use. + * @param anchorView the {@link View} to anchor on. */ - public TabSelectionEditorMenu(Context context, Menu menu) { + public TabSelectionEditorMenu( + Context context, TabSelectionEditorActionViewLayout actionViewLayout) { mContext = context; - mMenu = menu; + mActionViewLayout = actionViewLayout; + mActionViewLayout.setActionViewLayoutDelegate(this); + + mModelList = new ModelList(); + mAdapter = new ModelListAdapter(mModelList); + registerItemTypes(); + mContentView = LayoutInflater.from(mContext).inflate(R.layout.app_menu_layout, null); + mListView = mContentView.findViewById(R.id.app_menu_list); + mListView.setAdapter(mAdapter); + mListView.setDivider(null); + mListView.setOnItemClickListener(this); + + mActionViewLayout.setListMenuButtonDelegate(() -> this); + } + + private void registerItemTypes() { + // clang-format off + mAdapter.registerType(ListItemType.MENU_ITEM, + new LayoutViewBuilder(R.layout.list_menu_item), + TabSelectionEditorMenuAdapter::bindMenuItem); + // clang-format on + } + + private ListItem buildListItem(int menuItemId) { + // Model values are populated while configuring the TabSelectionEditorMenuItem. + return new ListItem(ListItemType.MENU_ITEM, + new PropertyModel.Builder(TabSelectionEditorActionProperties.MENU_ITEM_KEYS) + .with(TabSelectionEditorActionProperties.MENU_ITEM_ID, menuItemId) + .build()); } /** - * Add a {@link TabSelectionEditorMenuItem} and {@link MenuItem} to this menu. - * @param menuItemId the {@link MenuItem} ID to use for this. - * @param titleResourceId the resource ID to use for the title. + * Create a {@link TabSelectionEditorMenuItem} for this menu. + * @param menuItemId the ID to use for the new TabSelectionEditorMenuItem. */ - public void add(int menuItemId, int titleResourceId) { - MenuItem menuItem = mMenu.add(/*groupId=*/0, menuItemId, Menu.NONE, titleResourceId); - mMenuItems.put(menuItemId, new TabSelectionEditorMenuItem(mContext, menuItem)); + public void add(int menuItemId) { + ListItem listItem = buildListItem(menuItemId); + mMenuItems.put(menuItemId, new TabSelectionEditorMenuItem(mContext, listItem)); + mModelList.add(listItem); + } + + /** + * Signal that the action view and property model for {@link TabSelecetionEditorMenuItem} are + * initialized. + * @param menuItemId the ID of the TabSelectionEditorMenuItem that finished initialization. + */ + public void menuItemInitialized(int menuItemId) { + final TabSelectionEditorMenuItem menuItem = mMenuItems.get(menuItemId); + if (menuItem.getActionView() == null) { + mActionViewLayout.setHasMenuOnlyItems(true); + } else { + mActionViewLayout.add(menuItem); + } } /** @@ -56,23 +126,12 @@ } /** - * @param menuItemIds the menuItemIds of the items to keep; the rest will be removed. - */ - public void keep(Set<Integer> menuItemIds) { - Set<Integer> keysToRemove = new ArraySet<>(mMenuItems.keySet()); - keysToRemove.removeAll(menuItemIds); - mMenuItems.keySet().removeAll(keysToRemove); - for (int key : keysToRemove) { - mMenu.removeItem(key); - } - } - - /** * Clears all items in the menu. */ public void clear() { - mMenu.clear(); mMenuItems.clear(); + mModelList.clear(); + mActionViewLayout.clear(); } /** @@ -86,12 +145,53 @@ } } + /** + * {@link OnItemClickListener} implementation. + */ @Override - public boolean onMenuItemClick(MenuItem menuItem) { - TabSelectionEditorMenuItem item = mMenuItems.get(menuItem.getItemId()); - if (item == null) return false; + public void onItemClick(AdapterView<?> parent, View view, int position, long id) { + TabSelectionEditorMenuItem item = + mMenuItems.get(((ListItem) mAdapter.getItem(position)) + .model.get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); - item.onClick(); - return true; + if (!item.onClick()) return; + + mActionViewLayout.dismissMenu(); + } + + /** + * {@link ActionViewLayoutDelegate} implementation. + */ + @Override + public void setVisibleActionViews(Set<TabSelectionEditorMenuItem> visibleActions) { + // Reset the entire list to maintain the correct ordering. + mModelList.clear(); + for (TabSelectionEditorMenuItem item : mMenuItems.values()) { + if (visibleActions.contains(item)) { + item.setActionViewShowing(true); + continue; + } + + item.setActionViewShowing(false); + mModelList.add(item.getListItem()); + } + // Resize the list which is necessary if elements are removed. + mListView.invalidateViews(); + } + + /** + * {@link ListMenu} implementation. + */ + @Override + public View getContentView() { + return mContentView; + } + + @Override + public void addContentViewClickRunnable(Runnable runnable) {} + + @Override + public int getMaxItemWidth() { + return mContext.getResources().getDimensionPixelSize(R.dimen.menu_width); } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuAdapter.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuAdapter.java index ae17ad9..e39a1a1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuAdapter.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuAdapter.java
@@ -4,18 +4,23 @@ package org.chromium.chrome.browser.tasks.tab_management; -import android.util.ArraySet; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; +import androidx.appcompat.content.res.AppCompatResources; + +import org.chromium.base.ApiCompatibilityUtils; +import org.chromium.chrome.tab_ui.R; import org.chromium.ui.modelutil.ListModelChangeProcessor; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyListModel; import org.chromium.ui.modelutil.PropertyModel; -import java.util.Set; - /** - * Binds an {@link TabSelectionEditorAction}'s {@link PropertyModel} to an - * {@link TabSelectionEditorMenu}. + * Binds {@link TabSelectionEditorAction}'s {@link PropertyModel} to an + * {@link TabSelectionEditorMenu} and {@link TabSelectionEditorMenuItem}'s {@link ListItem} to a + * menu view. */ public class TabSelectionEditorMenuAdapter implements ListModelChangeProcessor.ViewBinder< PropertyListModel<PropertyModel, PropertyKey>, TabSelectionEditorMenu, PropertyKey> { @@ -27,28 +32,24 @@ // consider handling or asserting. for (int i = index; i < index + count; i++) { PropertyModel actionModel = actionModels.get(i); - menu.add(actionModel.get(TabSelectionEditorActionProperties.MENU_ITEM_ID), - actionModel.get(TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); + menu.add(actionModel.get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); } // Bind all properties. onItemsChanged(actionModels, menu, index, count, null); + for (int i = index; i < index + count; i++) { + PropertyModel actionModel = actionModels.get(i); + menu.menuItemInitialized( + actionModel.get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); + } } @Override public void onItemsRemoved(PropertyListModel<PropertyModel, PropertyKey> actionModels, TabSelectionEditorMenu menu, int index, int count) { - if (actionModels.size() == 0) { - menu.clear(); - return; + if (actionModels.size() != 0) { + throw new IllegalArgumentException("Partial removal of items is not supported"); } - - // TODO(ckitagawa): Consider removing this as realisitically 1-by-1 removal should never - // occur. Assert or throw an error instead. - Set<Integer> menuIds = new ArraySet<>(); - for (PropertyModel actionModel : actionModels) { - menuIds.add(actionModel.get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); - } - menu.keep(menuIds); + menu.clear(); } @Override @@ -74,7 +75,7 @@ private void bindAllProperties(PropertyModel actionModel, TabSelectionEditorMenuItem menuItem) { menuItem.initActionView(actionModel.get(TabSelectionEditorActionProperties.SHOW_MODE), actionModel.get(TabSelectionEditorActionProperties.BUTTON_TYPE)); - for (PropertyKey key : TabSelectionEditorActionProperties.ALL_KEYS) { + for (PropertyKey key : TabSelectionEditorActionProperties.ACTION_KEYS) { bindMenuItemProperty(actionModel, menuItem, key); } } @@ -108,4 +109,33 @@ actionModel.get(TabSelectionEditorActionProperties.ON_SELECTION_STATE_CHANGE)); } } + + public static void bindMenuItem(PropertyModel model, View view, PropertyKey propertyKey) { + TextView textView = view.findViewById(R.id.menu_item_text); + ImageView startIcon = view.findViewById(R.id.menu_item_icon); + ImageView endIcon = view.findViewById(R.id.menu_item_end_icon); + if (propertyKey == TabSelectionEditorActionProperties.TITLE_RESOURCE_ID) { + textView.setText(model.get(TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); + } else if (propertyKey == TabSelectionEditorActionProperties.CONTENT_DESCRIPTION) { + textView.setContentDescription( + model.get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION)); + } else if (propertyKey == TabSelectionEditorActionProperties.ICON) { + startIcon.setImageDrawable(model.get(TabSelectionEditorActionProperties.ICON)); + textView.setPaddingRelative( + view.getResources().getDimensionPixelOffset(R.dimen.menu_padding_start), + textView.getPaddingTop(), textView.getPaddingEnd(), + textView.getPaddingBottom()); + // Use default color for menu icon. + ApiCompatibilityUtils.setImageTintList(startIcon, + AppCompatResources.getColorStateList( + view.getContext(), R.color.default_icon_color_secondary_tint_list)); + startIcon.setVisibility(View.VISIBLE); + endIcon.setVisibility(View.GONE); + } else if (propertyKey == TabSelectionEditorActionProperties.ENABLED) { + view.setEnabled(model.get(TabSelectionEditorActionProperties.ENABLED)); + textView.setEnabled(model.get(TabSelectionEditorActionProperties.ENABLED)); + startIcon.setEnabled(model.get(TabSelectionEditorActionProperties.ENABLED)); + endIcon.setEnabled(model.get(TabSelectionEditorActionProperties.ENABLED)); + } + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuItem.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuItem.java index 642ad16c..1dc5e28 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuItem.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuItem.java
@@ -13,7 +13,6 @@ import android.widget.Button; import androidx.annotation.Nullable; -import androidx.core.view.MenuItemCompat; import androidx.core.widget.TextViewCompat; import org.chromium.base.Callback; @@ -21,28 +20,35 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; import org.chromium.chrome.tab_ui.R; +import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import java.util.List; /** - * View holder for a {@link MenuItem} with an optional {@code mActionView} to show in a toolbar. + * Holds the {@code mActionView} and {@link ListItem} for an item in the {@link + * TabSelectionEditorMenu}. */ public class TabSelectionEditorMenuItem { private Context mContext; - private MenuItem mMenuItem; + private int mMenuId; + private ListItem mListItem; private Button mActionView; + private boolean mShowText; + private boolean mShowIcon; + private boolean mEnabled; + private boolean mActionViewShowing; + private ColorStateList mIconTint; private Runnable mOnClickRunnable; private Callback<List<Integer>> mOnSelectionStateChange; /** * @param context for loading resources. - * @param menuItem the {@link MenuItem} this view owns. */ - TabSelectionEditorMenuItem(Context context, MenuItem menuItem) { + TabSelectionEditorMenuItem(Context context, ListItem listItem) { mContext = context; - mMenuItem = menuItem; + mListItem = listItem; } /** @@ -51,32 +57,37 @@ * @param buttonType the button layout of the action view. */ public void initActionView(@ShowMode int showMode, @ButtonType int buttonType) { - final boolean showText = - buttonType == ButtonType.TEXT || buttonType == ButtonType.ICON_AND_TEXT; - final boolean showIcon = - buttonType == ButtonType.ICON || buttonType == ButtonType.ICON_AND_TEXT; + mShowText = buttonType == ButtonType.TEXT || buttonType == ButtonType.ICON_AND_TEXT; + mShowIcon = buttonType == ButtonType.ICON || buttonType == ButtonType.ICON_AND_TEXT; - if (!showText && !showIcon) { - // Force menu mode if the button has no content. - showMode = ShowMode.MENU_ONLY; - } + if ((!mShowText && !mShowIcon) || showMode == ShowMode.MENU_ONLY) return; - mMenuItem.setShowAsAction(getShowAsAction(showMode)); - if (showMode == ShowMode.MENU_ONLY) return; - - // TODO(ckitagawa): Work with UX on padding/margins/style. mActionView = (Button) LayoutInflater.from(mContext).inflate( R.layout.tab_selection_editor_action_view, null); - mActionView.setId(mMenuItem.getItemId()); - // Default visibility is GONE. - mMenuItem.setActionView(mActionView); + mActionView.setId(mListItem.model.get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); + if (mShowIcon && !mShowText) { + mActionView.setCompoundDrawablePadding(0); + } + } + + public View getActionView() { + return mActionView; + } + + public ListItem getListItem() { + return mListItem; } public void setTitleResourceId(int titleResourceId) { - mMenuItem.setTitle(titleResourceId); + mListItem.model.set(TabSelectionEditorActionProperties.TITLE_RESOURCE_ID, titleResourceId); if (mActionView != null) { - mActionView.setText(titleResourceId); - mActionView.setVisibility(View.VISIBLE); + if (mShowText) { + mActionView.setText(titleResourceId); + } else { + mActionView.setText(""); + mActionView.setMinWidth(0); + mActionView.setMinimumWidth(0); + } } } @@ -92,7 +103,8 @@ contentDescription = mContext.getResources().getQuantityString( contentDescriptionResourceId, itemCount, itemCount); } - MenuItemCompat.setContentDescription(mMenuItem, contentDescription); + mListItem.model.set( + TabSelectionEditorActionProperties.CONTENT_DESCRIPTION, contentDescription); if (mActionView != null) { mActionView.setContentDescription(contentDescription); } @@ -104,26 +116,24 @@ * @param icon to display in the menu item or action view. */ public void setIcon(@IconPosition int iconPosition, Drawable icon) { - mMenuItem.setIcon(icon); - if (mActionView != null) { - // TODO(ckitagawa): Determine whether to require actions to define bounds or just use - // the intrinsic ones. + mListItem.model.set(TabSelectionEditorActionProperties.ICON, icon); + if (mActionView != null && mShowIcon) { TextViewCompat.setCompoundDrawablesRelativeWithIntrinsicBounds(mActionView, iconPosition == IconPosition.START ? icon : null, null, iconPosition == IconPosition.END ? icon : null, null); - mActionView.setVisibility(View.VISIBLE); } } public void setEnabled(boolean enabled) { - mMenuItem.setEnabled(enabled); + mEnabled = enabled; + mListItem.model.set(TabSelectionEditorActionProperties.ENABLED, enabled); if (mActionView != null) { mActionView.setEnabled(enabled); } } public void setTextTint(ColorStateList colorStateList) { - // MenuItem text color is handled by the theme. + // mListItem uses the default text tint. if (mActionView != null) { mActionView.setTextColor(colorStateList); } @@ -135,12 +145,22 @@ // not overridden. if (colorStateList == null) return; - MenuItemCompat.setIconTintList(mMenuItem, colorStateList); - if (mActionView != null) { + // mListItem uses the default icon tint whenever shown. Cache the tint to restore it when + // the action view shown state is toggled. + mIconTint = colorStateList; + if (mActionView != null && mActionViewShowing) { TextViewCompat.setCompoundDrawableTintList(mActionView, colorStateList); } } + public void setActionViewShowing(boolean actionViewShowing) { + mActionViewShowing = actionViewShowing; + if (mActionViewShowing) { + // Ensure the drawable has the correct tint. + setIconTint(mIconTint); + } + } + public void setOnClickListener(Runnable runnable) { mOnClickRunnable = runnable; if (mActionView != null) { @@ -155,8 +175,12 @@ /** * Handler for click events on the menu item or action view. */ - public void onClick() { + public boolean onClick() { + if (!mEnabled) return false; + mOnClickRunnable.run(); + + return true; } /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorSelectionAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorSelectionAction.java index 5bbccac1..5dbb2b57 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorSelectionAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorSelectionAction.java
@@ -7,7 +7,6 @@ import android.content.Context; import android.graphics.Color; import android.graphics.drawable.Drawable; -import android.graphics.drawable.InsetDrawable; import android.graphics.drawable.LayerDrawable; import androidx.annotation.IntDef; @@ -101,7 +100,6 @@ if (mActionState == selectionState) return; mActionState = selectionState; - final boolean allTabsSelected = mActionState == ActionState.DESELECT_ALL; LayerDrawable layers = (LayerDrawable) getPropertyModel().get(TabSelectionEditorActionProperties.ICON); @@ -113,7 +111,7 @@ mContext.getResources().getInteger(R.integer.list_item_level_default)); layers.getDrawable(BACKGROUND) .setTint(TabUiThemeProvider.getSelectionActionIconBackgroundColor( - mContext, isIncognito, allTabsSelected)); + mContext, isIncognito)); layers.getDrawable(CHECKMARK).setAlpha(0); layers.getDrawable(CHECKMARK).setTint(Color.TRANSPARENT); @@ -125,7 +123,7 @@ mContext.getResources().getInteger(R.integer.list_item_level_selected)); layers.getDrawable(BACKGROUND) .setTint(TabUiThemeProvider.getSelectionActionIconBackgroundColor( - mContext, isIncognito, allTabsSelected)); + mContext, isIncognito)); layers.getDrawable(CHECKMARK).setAlpha(255); layers.getDrawable(CHECKMARK).setTint( @@ -140,11 +138,8 @@ private static Drawable buildDrawable(Context context) { Drawable[] drawables = new Drawable[2]; - Drawable selectionListIcon = ResourcesCompat.getDrawable(context.getResources(), + drawables[BACKGROUND] = ResourcesCompat.getDrawable(context.getResources(), R.drawable.tab_grid_selection_list_icon, context.getTheme()); - drawables[BACKGROUND] = new InsetDrawable(selectionListIcon, - (int) context.getResources().getDimension( - R.dimen.selection_tab_grid_toggle_button_inset)); drawables[CHECKMARK] = AnimatedVectorDrawableCompat.create( context, R.drawable.ic_check_googblue_20dp_animated);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java index ce074e2..e3f78af 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorToolbar.java
@@ -7,7 +7,10 @@ import android.content.Context; import android.content.res.ColorStateList; import android.util.AttributeSet; +import android.view.Gravity; +import android.view.ViewGroup; import android.widget.Button; +import android.widget.LinearLayout; import androidx.annotation.ColorInt; import androidx.annotation.PluralsRes; @@ -17,6 +20,7 @@ import org.chromium.components.browser_ui.widget.NumberRollView; import org.chromium.components.browser_ui.widget.TintedDrawable; import org.chromium.components.browser_ui.widget.selectable_list.SelectableListToolbar; +import org.chromium.ui.widget.ChromeImageButton; import java.util.Collections; import java.util.List; @@ -26,7 +30,10 @@ */ class TabSelectionEditorToolbar extends SelectableListToolbar<Integer> { private static final List<Integer> sEmptyIntegerList = Collections.emptyList(); + private Context mContext; private Button mActionButton; + private ChromeImageButton mMenuButton; + private TabSelectionEditorActionViewLayout mActionViewLayout; private Integer mActionButtonDescriptionResourceId; @ColorInt private int mBackgroundColor; @@ -43,6 +50,7 @@ public TabSelectionEditorToolbar(Context context, AttributeSet attrs) { super(context, attrs); + mContext = context; } @Override @@ -50,8 +58,23 @@ super.onFinishInflate(); showNavigationButton(); + mActionViewLayout = + (TabSelectionEditorActionViewLayout) findViewById(R.id.action_view_layout); mActionButton = (Button) findViewById(R.id.action_button); + mMenuButton = (ChromeImageButton) findViewById(R.id.list_menu_button); mNumberRollView.setStringForZero(R.string.tab_selection_editor_toolbar_select_tabs); + + if (TabUiFeatureUtilities.isTabSelectionEditorV2Enabled(mContext)) { + mNumberRollView.setString(R.plurals.tab_selection_editor_tabs_count); + } + + // Move the number roll view into a LinearLayout to manage spacing. + LinearLayout.LayoutParams params = + new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, + LinearLayout.LayoutParams.WRAP_CONTENT, 0.0f); + params.gravity = Gravity.CENTER_VERTICAL; + ((ViewGroup) mNumberRollView.getParent()).removeView(mNumberRollView); + mActionViewLayout.addView(mNumberRollView, 0, params); } private void showNavigationButton() { @@ -107,6 +130,13 @@ } /** + * @return the action view layout. + */ + public TabSelectionEditorActionViewLayout getActionViewLayout() { + return mActionViewLayout; + } + + /** * Sets a {@link android.view.View.OnClickListener} to respond to {@code mActionButton} clicking * event. * @param listener The listener to set. @@ -123,6 +153,7 @@ mActionButton.setTextColor(tint); TintedDrawable navigation = (TintedDrawable) getNavigationIcon(); navigation.setTint(tint); + mMenuButton.setImageTintList(tint); } /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java index 9883207..c15c065 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupAction.java
@@ -4,6 +4,11 @@ package org.chromium.chrome.browser.tasks.tab_management; +import android.content.Context; +import android.graphics.drawable.Drawable; + +import androidx.appcompat.content.res.AppCompatResources; + import org.chromium.base.metrics.RecordUserAction; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tasks.tab_groups.TabGroupModelFilter; @@ -17,29 +22,30 @@ public class TabSelectionEditorUngroupAction extends TabSelectionEditorAction { /** * Create an action for ungrouping tabs. + * @param context for loading resources. * @param showMode whether to show an action view. * @param buttonType the type of the action view. * @param iconPosition the position of the icon in the action view. */ - public static TabSelectionEditorAction createAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { - // TODO(ckitagawa): Load drawable and pass to constructor. - return new TabSelectionEditorUngroupAction(showMode, buttonType, iconPosition); + public static TabSelectionEditorAction createAction(Context context, @ShowMode int showMode, + @ButtonType int buttonType, @IconPosition int iconPosition) { + Drawable drawable = AppCompatResources.getDrawable(context, R.drawable.ic_widgets); + return new TabSelectionEditorUngroupAction(showMode, buttonType, iconPosition, drawable); } - private TabSelectionEditorUngroupAction( - @ShowMode int showMode, @ButtonType int buttonType, @IconPosition int iconPosition) { + private TabSelectionEditorUngroupAction(@ShowMode int showMode, @ButtonType int buttonType, + @IconPosition int iconPosition, Drawable drawable) { super(R.id.tab_selection_editor_ungroup_menu_item, showMode, buttonType, iconPosition, - R.string.tab_grid_dialog_selection_mode_remove, - R.plurals.accessibility_tab_selection_dialog_remove_button, null); + R.string.tab_selection_editor_ungroup_tabs, + R.plurals.accessibility_tab_selection_editor_ungroup_tabs, drawable); } @Override public void onSelectionStateChange(List<Integer> tabIds) { assert getTabModelSelector().getTabModelFilterProvider().getCurrentTabModelFilter() instanceof TabGroupModelFilter; - assert !editorSupportsActionOnRelatedTabs() - : "Ungrouping is not supported when actions apply to related tabs."; + // assert !editorSupportsActionOnRelatedTabs() + // : "Ungrouping is not supported when actions apply to related tabs."; setEnabledAndItemCount(!tabIds.isEmpty(), tabIds.size()); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java index 413ecb8..bec3fb3 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherCoordinator.java
@@ -22,10 +22,12 @@ import org.chromium.base.TraceEvent; import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; +import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthManager; import org.chromium.chrome.browser.lifecycle.ActivityLifecycleDispatcher; import org.chromium.chrome.browser.lifecycle.DestroyObserver; @@ -211,7 +213,9 @@ @NonNull ViewGroup rootView, @NonNull Supplier<DynamicResourceLoader> dynamicResourceLoaderSupplier, @NonNull SnackbarManager snackbarManager, - @NonNull ModalDialogManager modalDialogManager) { + @NonNull ModalDialogManager modalDialogManager, + @Nullable OneshotSupplier<IncognitoReauthController> + incognitoReauthControllerSupplier) { try (TraceEvent e = TraceEvent.scoped("TabSwitcherCoordinator.constructor")) { mActivity = activity; mMode = mode; @@ -232,7 +236,7 @@ mMediator = new TabSwitcherMediator(activity, this, containerViewModel, tabModelSelector, browserControls, container, tabContentManager, this, this, - multiWindowModeStateDispatcher, mode); + multiWindowModeStateDispatcher, mode, incognitoReauthControllerSupplier); mTabSwitcherCustomViewManager = new TabSwitcherCustomViewManager(mMediator); @@ -526,9 +530,9 @@ ShowMode.IF_ROOM, ButtonType.ICON_AND_TEXT, IconPosition.END, mTabModelSelector.getCurrentModel().isIncognito())); mTabSelectionEditorActions.add(TabSelectionEditorCloseAction.createAction( - ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); + mActivity, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); mTabSelectionEditorActions.add(TabSelectionEditorGroupAction.createAction( - ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); + mActivity, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START)); mTabSelectionEditorActions.add( TabSelectionEditorShareAction.createAction(mActivity, ShowMode.MENU_ONLY, ButtonType.ICON_AND_TEXT, IconPosition.START, mShareDelegateSupplier));
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java index 4d4ffbb..2523b24b 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediator.java
@@ -26,6 +26,7 @@ import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; +import org.chromium.base.CallbackController; import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.StrictModeContext; @@ -35,11 +36,13 @@ import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.ObservableSupplierImpl; +import org.chromium.base.supplier.OneshotSupplier; import org.chromium.base.task.PostTask; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.layouts.LayoutManagerImpl; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; import org.chromium.chrome.browser.preferences.ChromePreferenceKeys; import org.chromium.chrome.browser.preferences.SharedPreferencesManager; @@ -118,6 +121,7 @@ private final ObservableSupplierImpl<Boolean> mIsDialogVisibleSupplier = new ObservableSupplierImpl<>(); + private CallbackController mCallbackController; private Integer mSoftCleanupDelayMsForTesting; private Integer mCleanupDelayMsForTesting; private TabGridDialogMediator.DialogController mTabGridDialogController; @@ -128,6 +132,12 @@ private boolean mIsOnHomepage; /** + * This allows to check if re-auth is pending when tab switcher is shown in Incognito mode. + * If so, we clear the Incognito tab lists until the re-auth is successful. + */ + private @Nullable IncognitoReauthController mIncognitoReauthController; + + /** * A custom view that can be supplied by clients to be shown inside the tab grid. * Only one client at a time is supported. The custom view is set to null when the client * signals the mediator for removal. @@ -261,13 +271,17 @@ * @param multiWindowModeStateDispatcher The {@link MultiWindowModeStateDispatcher} to observe * for multi-window related changes. * @param mode One of the {@link TabListMode}. + * @param incognitoReauthControllerSupplier {@link OneshotSupplier<IncognitoReauthController>} + * to detect pending re-auth when tab switcher is shown. */ TabSwitcherMediator(Context context, ResetHandler resetHandler, PropertyModel containerViewModel, TabModelSelector tabModelSelector, BrowserControlsStateProvider browserControlsStateProvider, ViewGroup containerView, TabContentManager tabContentManager, MessageItemsController messageItemsController, PriceWelcomeMessageController priceWelcomeMessageController, - MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, @TabListMode int mode) { + MultiWindowModeStateDispatcher multiWindowModeStateDispatcher, @TabListMode int mode, + @Nullable OneshotSupplier<IncognitoReauthController> + incognitoReauthControllerSupplier) { mResetHandler = resetHandler; mContainerViewModel = containerViewModel; mTabModelSelector = tabModelSelector; @@ -276,6 +290,14 @@ mMode = mode; mContext = context; + if (incognitoReauthControllerSupplier != null) { + mCallbackController = new CallbackController(); + incognitoReauthControllerSupplier.onAvailable( + mCallbackController.makeCancelable((incognitoReauthController) -> { + mIncognitoReauthController = incognitoReauthController; + })); + } + mTabModelSelectorObserver = new TabModelSelectorObserver() { @Override public void onTabModelSelected(TabModel newModel, TabModel oldModel) { @@ -988,6 +1010,11 @@ mTabGridDialogController.getHandleBackPressChangedSupplier().removeObserver( this::notifyBackPressStateChanged); } + + if (mCallbackController != null) { + mCallbackController.destroy(); + } + mTabModelSelector.removeObserver(mTabModelSelectorObserver); mBrowserControlsStateProvider.removeObserver(mBrowserControlsObserver); mTabModelSelector.getTabModelFilterProvider().removeTabModelFilterObserver(
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java index 13e1bb57..6a7952e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiThemeProvider.java
@@ -160,21 +160,17 @@ * * @param context {@link Context} used to retrieve color. * @param isIncognito Whether the color is used for incognito mode. - * @param allTabsSelected Whether all tabs are selected. * @return The {@link ColorInt} for select all icon background. */ public static @ColorInt int getSelectionActionIconBackgroundColor( - Context context, boolean isIncognito, boolean allTabsSelected) { + Context context, boolean isIncognito) { if (isIncognito) { return context.getColor( R.color.incognito_tab_selection_editor_selection_action_bg_color); - } else { - @ColorInt - int colorInt = allTabsSelected - ? MaterialColors.getColor(context, org.chromium.chrome.R.attr.colorPrimary, TAG) - : MaterialColors.getColor(context, R.attr.colorOnSurfaceVariant, TAG); - return colorInt; } + @ColorInt + int colorInt = MaterialColors.getColor(context, R.attr.colorOnSurface, TAG); + return colorInt; } /** @@ -190,20 +186,8 @@ if (isIncognito) { return context.getColor(R.color.incognito_tab_selection_editor_selection_action_check); } - return MaterialColors.getColor(context, org.chromium.chrome.R.attr.colorOnPrimary, TAG); - } - - /** - * Returns the divider color for tab grid card based on the incognito mode. - * - * @param context {@link Context} used to retrieve color. - * @param isIncognito Whether the color is used for incognito mode. - * @return The divider color for tab grid card. - */ - @ColorInt - public static int getDividerColor(Context context, boolean isIncognito) { - return isIncognito ? context.getColor(R.color.tab_grid_card_divider_tint_color_incognito) - : SemanticColorUtils.getTabGridCardDividerTintColor(context); + return MaterialColors.getColor( + context, org.chromium.chrome.R.attr.colorOnSurfaceInverse, TAG); } /**
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd index a03a218..ad559d1 100644 --- a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings.grd
@@ -247,10 +247,11 @@ <message name="IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR" desc="Accessibility string for Tab Selection Editor view. This string is announced when the Tab Selection Editor is shown to screen."> Multi-select mode </message> - <message name="IDS_TAB_SELECTION_EDITOR_SELECT_ALL" desc="This text button is shown in the Tab Selection Editor Toolbar. When the user taps the button, Chrome selects all the tabs shown in the editor."> + <!-- Tab Selection Editor V2 strings --> + <message name="IDS_TAB_SELECTION_EDITOR_SELECT_ALL" desc="This text button is shown in the Tab Selection Editor Toolbar. When the user taps the button, Chrome selects all the tabs shown in the editor. [CHAR_LIMIT=27]"> Select all </message> - <message name="IDS_TAB_SELECTION_EDITOR_DESELECT_ALL" desc="This text button is shown in the Tab Selection Editor Toolbar. When the user taps the button, Chrome deselects all the tabs shown in the editor."> + <message name="IDS_TAB_SELECTION_EDITOR_DESELECT_ALL" desc="This text button is shown in the Tab Selection Editor Toolbar. When the user taps the button, Chrome deselects all the tabs shown in the editor. [CHAR_LIMIT=27]"> Deselect all </message> <message name="IDS_TAB_SELECTION_EDITOR_SHARE_TABS_ACTION_BUTTON" desc="This text button is shown in the Tab Selection Editor Toolbar. When the user taps the button, Chrome shares all currently selected tabs shown in the editor. [CHAR_LIMIT=27]"> @@ -262,6 +263,39 @@ other {Share <ph name="TABS_COUNT_MANY">%1$d<ex>8</ex></ph> selected tabs} } </message> + <message name="IDS_TAB_SELECTION_EDITOR_TABS_COUNT" desc="The text for the selection counter shown in the Tab Selection Editor Toolbar. This shows the number of selected tabs including those within selected groups."> + {TABS_COUNT, plural, + =1 {<ph name="TABS_COUNT_ONE">%1$d<ex>1</ex></ph> tab} + other {<ph name="TABS_COUNT_MANY">%1$d<ex>8</ex></ph> tabs} + } + </message> + <message name="IDS_TAB_SELECTION_EDITOR_GROUP_TABS" desc="This text menu item is shown in the Tab Selection Editor menu. 'Group' is a verb. When the user taps the menu item, Chrome creates a new group that contains the selected tabs. [CHAR_LIMIT=27]"> + Group tabs + </message> + <message name="IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_GROUP_TABS" desc="The accessibility text to read when the 'Group tabs' menu item in the selection mode menu is focused. When this menu item is tapped, all the selected tabs will be grouped together."> + {TABS_COUNT, plural, + =1 {Group <ph name="TABS_COUNT_ONE">%1$d<ex>1</ex></ph> selected tab} + other {Group <ph name="TABS_COUNT_MANY">%1$d<ex>8</ex></ph> selected tabs} + } + </message> + <message name="IDS_TAB_SELECTION_EDITOR_UNGROUP_TABS" desc="This text menu item is shown in the Tab Selection Editor menu. 'Ungroup' is a verb. When the user taps the menu item, Chrome removes the selected tabs from the group. [CHAR_LIMIT=27]"> + Ungroup tabs + </message> + <message name="IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_UNGROUP_TABS" desc="The accessibility text to read when the 'Ungroup tabs' menu item in the selection mode menu is focused. When this menu item is tapped, all the selected tabs will be ungroup."> + {TABS_COUNT, plural, + =1 {Ungroup <ph name="TABS_COUNT_ONE">%1$d<ex>1</ex></ph> selected tab} + other {Ungroup <ph name="TABS_COUNT_MANY">%1$d<ex>8</ex></ph> selected tabs} + } + </message> + <message name="IDS_TAB_SELECTION_EDITOR_CLOSE_TABS" desc="This text menu item is shown in the Tab Selection Editor menu. 'Close' is a verb. When the user taps the menu item, Chrome closes the selected tabs. [CHAR_LIMIT=27]"> + Close tabs + </message> + <message name="IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_CLOSE_TABS" desc="The accessibility text to read when the 'Close tabs' menu item in the selection mode menu is focused. When this menu item is tapped, all the selected tabs will be closed."> + {TABS_COUNT, plural, + =1 {Close <ph name="TABS_COUNT_ONE">%1$d<ex>1</ex></ph> selected tab} + other {Close <ph name="TABS_COUNT_MANY">%1$d<ex>8</ex></ph> selected tabs} + } + </message> <!-- Tab Grid Dialog strings --> <message name="IDS_TAB_GRID_DIALOG_REMOVE_FROM_GROUP" desc="This text shows on the ungroup bar in TabGridDialog. When user drags a tab and drops it on the ungroup bar, this tab will be moved out of the group.">
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1 new file mode 100644 index 0000000..a129d1e --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1
@@ -0,0 +1 @@ +d2703170995a50455a593ae63f4fd019699b762a \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1 new file mode 100644 index 0000000..a129d1e --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1
@@ -0,0 +1 @@ +d2703170995a50455a593ae63f4fd019699b762a \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1 new file mode 100644 index 0000000..e20d965 --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_ACCESSIBILITY_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1
@@ -0,0 +1 @@ +5173931c8530be822b56cf7f8d37700f4224a20c \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1 new file mode 100644 index 0000000..a129d1e --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_CLOSE_TABS.png.sha1
@@ -0,0 +1 @@ +d2703170995a50455a593ae63f4fd019699b762a \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1 new file mode 100644 index 0000000..a129d1e --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_GROUP_TABS.png.sha1
@@ -0,0 +1 @@ +d2703170995a50455a593ae63f4fd019699b762a \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_TABS_COUNT.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_TABS_COUNT.png.sha1 new file mode 100644 index 0000000..4a70806 --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_TABS_COUNT.png.sha1
@@ -0,0 +1 @@ +43edd7b303224582111831f3f426320d307572b1 \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1 b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1 new file mode 100644 index 0000000..e20d965 --- /dev/null +++ b/chrome/android/features/tab_ui/java/strings/android_chrome_tab_ui_strings_grd/IDS_TAB_SELECTION_EDITOR_UNGROUP_TABS.png.sha1
@@ -0,0 +1 @@ +5173931c8530be822b56cf7f8d37700f4224a20c \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java index 96f67316..845067b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorMenuTest.java
@@ -4,23 +4,26 @@ package org.chromium.chrome.browser.tasks.tab_management; -import static androidx.test.espresso.Espresso.onView; -import static androidx.test.espresso.assertion.ViewAssertions.matches; +import static androidx.test.espresso.action.ViewActions.click; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.isEnabled; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static androidx.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.CoreMatchers.allOf; +import static org.hamcrest.CoreMatchers.not; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; +import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; + import android.content.Context; +import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import androidx.appcompat.content.res.AppCompatResources; -import androidx.appcompat.widget.Toolbar; import androidx.test.filters.MediumTest; import org.junit.Assert; @@ -35,6 +38,8 @@ import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.flags.CachedFeatureFlags; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; @@ -44,6 +49,7 @@ import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.IconPosition; import org.chromium.chrome.browser.tasks.tab_management.TabSelectionEditorAction.ShowMode; import org.chromium.chrome.tab_ui.R; +import org.chromium.components.browser_ui.widget.listmenu.ListMenuButton; import org.chromium.components.browser_ui.widget.selectable_list.SelectionDelegate; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.ui.UiUtils; @@ -59,6 +65,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.List; +import java.util.Set; +import java.util.concurrent.TimeoutException; /** * On-device Unit tests for the {@link TabSelectionEditorMenu} and its related @@ -77,7 +85,8 @@ public RenderTestRule mRenderTestRule = RenderTestRule.Builder.withPublicCorpus() .setBugComponent(Component.UI_BROWSER_MOBILE_TAB_SWITCHER_GRID) - .setRevision(0) + .setRevision(2) + .setDescription("TabSelectionEditorV2 Menu Refactor") .build(); static class FakeTabSelectionEditorAction extends TabSelectionEditorAction { @@ -88,7 +97,7 @@ @ButtonType int buttonType, @IconPosition int iconPosition, int title, Integer iconResourceId) { super(menuId, showMode, buttonType, iconPosition, title, - R.plurals.accessibility_tab_suggestion_close_tab_action_button, + R.plurals.accessibility_tab_selection_editor_close_tabs, (iconResourceId != null) ? UiUtils.getTintedDrawable( context, iconResourceId, R.color.default_icon_color_tint_list) : null); @@ -121,25 +130,31 @@ } } + // For R8 optimizer message + @Mock + private Tab mTabDoNotUse; + + // Real mocks. @Mock private TabModel mTabModel; @Mock private TabModelSelector mTabModelSelector; - @Mock private SelectionDelegate<Integer> mSelectionDelegate; @Mock private ActionDelegate mDelegate; private List<Tab> mTabs = new ArrayList<>(); - private Toolbar mToolbar; + private TabSelectionEditorToolbar mToolbar; private TabSelectionEditorMenu mTabSelectionEditorMenu; + private ListMenuButton mMenuButton; private PropertyListModel<PropertyModel, PropertyKey> mPropertyListModel; private ListModelChangeProcessor mChangeProcessor; @Override public void setUpTest() throws Exception { super.setUpTest(); + CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_SELECTION_EDITOR_V2, true); MockitoAnnotations.initMocks(this); when(mTabModelSelector.getCurrentModel()).thenReturn(mTabModel); @@ -153,24 +168,29 @@ } TestThreadUtils.runOnUiThreadBlocking(() -> { + mSelectionDelegate = new SelectionDelegate<Integer>(); + mSelectionDelegate.setSelectionModeEnabledForZeroItems(true); LinearLayout layout = new LinearLayout(getActivity()); LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); layout.setLayoutParams(layoutParams); - getActivity().setContentView(layout); - mToolbar = new Toolbar(getActivity()); - layoutParams = new LinearLayout.LayoutParams( - LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); - mToolbar.setLayoutParams(layoutParams); - mToolbar.setTitle("Test!"); - mToolbar.setVisibility(View.VISIBLE); - layout.addView(mToolbar, 0); - getActivity().setSupportActionBar(mToolbar); + LayoutInflater inflater = LayoutInflater.from(getActivity()); + mToolbar = (TabSelectionEditorToolbar) inflater.inflate( + R.layout.tab_selection_editor_toolbar, null); + layoutParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, + getActivity().getResources().getDimensionPixelSize( + R.dimen.toolbar_height_no_shadow)); + layout.addView(mToolbar, layoutParams); + getActivity().setContentView(layout); + mToolbar.initialize(mSelectionDelegate, 0, 0, 0, true); + mToolbar.setActionButtonVisibility(View.GONE); mPropertyListModel = new PropertyListModel<>(); - mTabSelectionEditorMenu = new TabSelectionEditorMenu(getActivity(), mToolbar.getMenu()); - mToolbar.setOnMenuItemClickListener(mTabSelectionEditorMenu::onMenuItemClick); + mTabSelectionEditorMenu = + new TabSelectionEditorMenu(getActivity(), mToolbar.getActionViewLayout()); + mMenuButton = mToolbar.getActionViewLayout().getListMenuButtonForTesting(); + mSelectionDelegate.addObserver(mTabSelectionEditorMenu); mChangeProcessor = new ListModelChangeProcessor(mPropertyListModel, mTabSelectionEditorMenu, new TabSelectionEditorMenuAdapter()); mPropertyListModel.addObserver(mChangeProcessor); @@ -179,10 +199,12 @@ @Override public void tearDownTest() throws Exception { + CachedFeatureFlags.setForTesting(ChromeFeatureList.TAB_SELECTION_EDITOR_V2, false); TestThreadUtils.runOnUiThreadBlocking(() -> { mPropertyListModel.clear(); }); } private void configureMenuWithActions(List<FakeTabSelectionEditorAction> actions) { + mPropertyListModel.clear(); List<PropertyModel> models = new ArrayList<>(); for (FakeTabSelectionEditorAction action : actions) { action.getPropertyModel().set(TabSelectionEditorActionProperties.TEXT_TINT, @@ -198,33 +220,21 @@ mPropertyListModel.addAll(models, 0); } - private void changeSelectionStateAndAssert( - List<Integer> tabIds, List<FakeTabSelectionEditorAction> actions) { - TestThreadUtils.runOnUiThreadBlocking( - () -> { mTabSelectionEditorMenu.onSelectionStateChange(tabIds); }); - for (FakeTabSelectionEditorAction action : actions) { - Assert.assertEquals(tabIds.size(), action.getLastTabIdList().size()); - for (int i = 0; i < tabIds.size(); i++) { - Assert.assertEquals(tabIds.get(i), action.getLastTabIdList().get(i)); - } - } - } - @Test @MediumTest @Feature({"RenderTest"}) - public void testSingleActionView_Enabled() throws Exception { + public void testSingleActionView_TextAndIcon_Enabled() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.ICON_AND_TEXT, IconPosition.END, - R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + R.string.tab_selection_editor_close_tabs, R.drawable.ic_close_tabs_24dp)); configureMenuWithActions(actions); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_2}), actions); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_2}))); + assertActionView(R.id.tab_selection_editor_close_menu_item, true); mRenderTestRule.render(mToolbar, "singleActionToolbarEnabled"); } @@ -232,40 +242,58 @@ @Test @MediumTest @Feature({"RenderTest"}) - public void testSingleActionView_Disabled() throws Exception { + public void testSingleActionView_TextAndIcon_Disabled() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.ICON_AND_TEXT, IconPosition.END, - R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + R.string.tab_selection_editor_close_tabs, R.drawable.ic_close_tabs_24dp)); configureMenuWithActions(actions); }); TestThreadUtils.runOnUiThreadBlocking( () -> { actions.get(0).setShouldEnableAction(false); }); - changeSelectionStateAndAssert(new ArrayList<Integer>(), actions); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_1}))); + assertActionView(R.id.tab_selection_editor_close_menu_item, false); mRenderTestRule.render(mToolbar, "singleActionToolbarDisabled"); } @Test @MediumTest + @Feature({"RenderTest"}) + public void testSingleActionView_IconOnly_Enabled() throws Exception { + List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); + TestThreadUtils.runOnUiThreadBlocking(() -> { + actions.add(new FakeTabSelectionEditorAction(getActivity(), + R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.ICON, + IconPosition.END, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); + configureMenuWithActions(actions); + }); + + setSelectedItems( + new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_1, TAB_ID_2}))); + assertActionView(R.id.tab_selection_editor_close_menu_item, true); + + mRenderTestRule.render(mToolbar, "singleActionToolbarIconOnlyEnabled"); + } + + @Test + @MediumTest @DisabledTest(message = "https://crbug.com/1348710") + @Feature({"RenderTest"}) public void testSingleActionView_Click() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), - R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, - ButtonType.ICON_AND_TEXT, IconPosition.END, - R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.TEXT, + IconPosition.END, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); configureMenuWithActions(actions); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_2}), actions); - final List<Tab> processedTabs = new ArrayList<>(); final CallbackHelper helper = new CallbackHelper(); final ActionObserver observer = new ActionObserver() { @@ -276,83 +304,58 @@ helper.notifyCalled(); } }; + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_2}))); TestThreadUtils.runOnUiThreadBlocking( () -> { actions.get(0).addActionObserver(observer); }); - when(mSelectionDelegate.getSelectedItems()) - .thenReturn(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_1}))); + + mRenderTestRule.render(mToolbar, "singleActionToolbarTextOnlyEnabled"); + assertActionView(R.id.tab_selection_editor_close_menu_item, true); clickActionView(R.id.tab_selection_editor_close_menu_item); helper.waitForCallback(0); - Assert.assertEquals(1, processedTabs.size()); - Assert.assertEquals(mTabs.get(1), processedTabs.get(0)); + Assert.assertEquals(2, processedTabs.size()); + Assert.assertEquals(mTabs.get(0), processedTabs.get(0)); + Assert.assertEquals(mTabs.get(2), processedTabs.get(1)); } @Test @MediumTest @Feature({"RenderTest"}) - public void testSingleMenuItem_Enabled() throws Exception { + public void testSingleMenuItem_Disabled() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.MENU_ONLY, ButtonType.TEXT, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); - configureMenuWithActions(actions); - }); - - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_0}), actions); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mToolbar.showOverflowMenu(); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isVisible()); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isEnabled()); - }); - - mRenderTestRule.render(mToolbar, "singleMenuItemToolbar"); - } - - @Test - @MediumTest - public void testSingleMenuItem_Disabled() { - List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); - TestThreadUtils.runOnUiThreadBlocking(() -> { - actions.add(new FakeTabSelectionEditorAction(getActivity(), - R.id.tab_selection_editor_close_menu_item, ShowMode.MENU_ONLY, ButtonType.TEXT, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.START, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); configureMenuWithActions(actions); }); TestThreadUtils.runOnUiThreadBlocking( () -> { actions.get(0).setShouldEnableAction(false); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {}), actions); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_0}))); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mToolbar.showOverflowMenu(); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isVisible()); - Assert.assertFalse(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isEnabled()); - }); + PopupListener listener = new PopupListener(); + openMenu(listener); + assertMenuItem("Close tabs", false); + + mRenderTestRule.render( + mTabSelectionEditorMenu.getContentView(), "singleMenuItemDisabled_Menu"); + closeMenu(listener); } @Test @MediumTest + @Feature({"RenderTest"}) public void testSingleMenuItem_Click() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.MENU_ONLY, ButtonType.TEXT, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.START, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); configureMenuWithActions(actions); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_0, TAB_ID_2}), actions); final List<Tab> processedTabs = new ArrayList<>(); final CallbackHelper helper = new CallbackHelper(); @@ -364,15 +367,22 @@ helper.notifyCalled(); } }; - when(mSelectionDelegate.getSelectedItems()) - .thenReturn(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_2}))); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mToolbar.showOverflowMenu(); - actions.get(0).addActionObserver(observer); - }); - clickMenuItem(R.id.tab_selection_editor_close_menu_item, "Close"); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_2}))); + TestThreadUtils.runOnUiThreadBlocking( + () -> { actions.get(0).addActionObserver(observer); }); + + PopupListener listener = new PopupListener(); + openMenu(listener); + assertMenuItem("Close tabs", true); + clickMenuItem("Close tabs"); helper.waitForCallback(0); + + mRenderTestRule.render(mToolbar, "singleMenuItemEnabled_Toolbar"); + mRenderTestRule.render( + mTabSelectionEditorMenu.getContentView(), "singleMenuItemEnabled_Menu"); + closeMenu(listener); + Assert.assertEquals(1, processedTabs.size()); Assert.assertEquals(mTabs.get(2), processedTabs.get(0)); } @@ -384,19 +394,22 @@ List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), - R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.TEXT, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, null)); + R.id.tab_selection_editor_close_menu_item, ShowMode.IF_ROOM, ButtonType.ICON, + IconPosition.START, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_group_menu_item, ShowMode.IF_ROOM, ButtonType.ICON, - IconPosition.END, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.END, R.string.tab_selection_editor_group_tabs, + R.drawable.ic_widgets)); configureMenuWithActions(actions); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_1}), actions); TestThreadUtils.runOnUiThreadBlocking( () -> { actions.get(0).setShouldEnableAction(false); }); - changeSelectionStateAndAssert(new ArrayList<Integer>(), actions); + setSelectedItems(new HashSet<Integer>()); + assertActionView(R.id.tab_selection_editor_close_menu_item, false); + assertActionView(R.id.tab_selection_editor_group_menu_item, true); + mRenderTestRule.render(mToolbar, "twoActionToolbarPartlyDisabled"); } @@ -408,79 +421,121 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.MENU_ONLY, ButtonType.TEXT, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, null)); + IconPosition.START, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_group_menu_item, ShowMode.IF_ROOM, ButtonType.ICON, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.START, R.string.tab_selection_editor_group_tabs, + R.drawable.ic_widgets)); configureMenuWithActions(actions); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_2}), actions); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mToolbar.showOverflowMenu(); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isVisible()); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isEnabled()); - mToolbar.hideOverflowMenu(); - }); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_2}))); - mRenderTestRule.render(mToolbar, "oneActionToolbarOneMenuItemEnabled"); + assertActionView(R.id.tab_selection_editor_group_menu_item, true); + + PopupListener listener = new PopupListener(); + openMenu(listener); + assertMenuItem("Close tabs", true); + mRenderTestRule.render(mToolbar, "oneActionToolbarOneMenuItemEnabled_Toobar"); + mRenderTestRule.render(mTabSelectionEditorMenu.getContentView(), + "oneActionToolbarOneMenuItemEnabled_Menu"); + closeMenu(listener); } @Test @MediumTest - public void testTwoMenuItems_OneMenuItemDisabled() { + @Feature({"RenderTest"}) + public void testTwoMenuItems_OneMenuItemDisabled() throws Exception { List<FakeTabSelectionEditorAction> actions = new ArrayList<>(); TestThreadUtils.runOnUiThreadBlocking(() -> { actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_close_menu_item, ShowMode.MENU_ONLY, ButtonType.TEXT, - IconPosition.END, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.END, R.string.tab_selection_editor_close_tabs, + R.drawable.ic_close_tabs_24dp)); actions.add(new FakeTabSelectionEditorAction(getActivity(), R.id.tab_selection_editor_group_menu_item, ShowMode.MENU_ONLY, ButtonType.ICON, - IconPosition.START, R.string.tab_suggestion_close_tab_action_button, - R.drawable.ic_group_icon_16dp)); + IconPosition.START, R.string.tab_selection_editor_group_tabs, + R.drawable.ic_widgets)); configureMenuWithActions(actions); }); TestThreadUtils.runOnUiThreadBlocking( () -> { actions.get(1).setShouldEnableAction(false); }); - changeSelectionStateAndAssert(Arrays.asList(new Integer[] {TAB_ID_1}), actions); + setSelectedItems(new HashSet<Integer>(Arrays.asList(new Integer[] {TAB_ID_1}))); - TestThreadUtils.runOnUiThreadBlocking(() -> { - mToolbar.showOverflowMenu(); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isVisible()); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_close_menu_item) - .isEnabled()); - Assert.assertTrue(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_group_menu_item) - .isVisible()); - Assert.assertFalse(mToolbar.getMenu() - .findItem(R.id.tab_selection_editor_group_menu_item) - .isEnabled()); - mToolbar.hideOverflowMenu(); - }); + PopupListener listener = new PopupListener(); + openMenu(listener); + assertMenuItem("Close tabs", true); + assertMenuItem("Group tabs", false); + mRenderTestRule.render( + mTabSelectionEditorMenu.getContentView(), "twoMenuItemsPartlyDisabled_Menu"); + closeMenu(listener); } - private void clickActionView(int id) { - onView(withId(id)).check(matches(allOf(isDisplayed(), isEnabled()))); - // On Android 12 perform(click()) sometimes fails to trigger the click so force the click on - // the view object instead. - TestThreadUtils.runOnUiThreadBlocking(() -> { mToolbar.findViewById(id).performClick(); }); + /** + * Helper for detecting menu shown popup events. + */ + static class PopupListener implements ListMenuButton.PopupMenuShownListener { + private CallbackHelper mShown = new CallbackHelper(); + private CallbackHelper mHidden = new CallbackHelper(); + + @Override + public void onPopupMenuShown() { + mShown.notifyCalled(); + } + + @Override + public void onPopupMenuDismissed() { + mHidden.notifyCalled(); + } + + public void waitForShown() throws TimeoutException { + mShown.waitForFirst(); + } + + public void waitForHidden() throws TimeoutException { + mHidden.notifyCalled(); + } } - private void clickMenuItem(int id, String text) { - onView(withText(text)).check(matches(allOf(isDisplayed(), isEnabled()))); - // On Android 12 perform(click()) works poorly for this as the menu item is flakily reported - // as < 90% visible. + private void assertActionView(int id, boolean enabled) { + onViewWaiting(allOf(withId(id), isDescendantOfA(withId(R.id.action_view_layout)), + isDisplayed(), enabled ? isEnabled() : not(isEnabled()))); + } + + private void assertMenuItem(String text, boolean enabled) { + onViewWaiting(allOf(withText(text), isDescendantOfA(withId(R.id.app_menu_list)), + isDisplayed(), enabled ? isEnabled() : not(isEnabled()))); + } + + private void openMenu(PopupListener listener) throws TimeoutException { + TestThreadUtils.runOnUiThreadBlocking(() -> { mMenuButton.addPopupListener(listener); }); + onViewWaiting(allOf(withId(R.id.list_menu_button), isDisplayed(), isEnabled())) + .perform(click()); + listener.waitForShown(); + } + + private void closeMenu(PopupListener listener) throws TimeoutException { + TestThreadUtils.runOnUiThreadBlocking(() -> { mMenuButton.dismiss(); }); + listener.waitForHidden(); + TestThreadUtils.runOnUiThreadBlocking(() -> { mMenuButton.removePopupListener(listener); }); + } + + private void clickActionView(int id) throws TimeoutException { + onViewWaiting( + allOf(withId(id), isDescendantOfA(withId(R.id.action_view_layout)), isDisplayed())) + .perform(click()); + } + + private void clickMenuItem(String text) throws TimeoutException { + onViewWaiting( + allOf(withText(text), isDescendantOfA(withId(R.id.app_menu_list)), isDisplayed())) + .perform(click()); + } + + private void setSelectedItems(Set<Integer> tabIds) { TestThreadUtils.runOnUiThreadBlocking( - () -> { mToolbar.getMenu().performIdentifierAction(id, /*flags=*/0); }); + () -> { mSelectionDelegate.setSelectedItems(tabIds); }); } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java index 4c3e2df..7884b4b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTest.java
@@ -36,12 +36,11 @@ import android.content.Intent; import android.support.test.InstrumentationRegistry; -import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import android.widget.Button; -import androidx.core.view.MenuItemCompat; +import androidx.test.espresso.Espresso; import androidx.test.espresso.intent.Intents; import androidx.test.filters.LargeTest; import androidx.test.filters.MediumTest; @@ -65,7 +64,6 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.FlakyTest; import org.chromium.base.test.util.RequiresRestart; @@ -138,7 +136,8 @@ public ChromeRenderTestRule mRenderTestRule = ChromeRenderTestRule.Builder.withPublicCorpus() .setBugComponent(ChromeRenderTestRule.Component.UI_BROWSER_MOBILE_TAB_SWITCHER) - .setRevision(2) + .setRevision(4) + .setDescription("TabSelectionEditorV2 UI Polish") .build(); @Captor @@ -186,6 +185,10 @@ @After public void tearDown() { if (mTabSelectionEditorCoordinator != null) { + if (sActivityTestRule.getActivity().findViewById(R.id.app_menu_list) != null) { + Espresso.pressBack(); + } + TestThreadUtils.runOnUiThreadBlocking(() -> { if (mTabSelectionEditorController.isVisible()) { mTabSelectionEditorController.hide(); @@ -406,16 +409,15 @@ @MediumTest @EnableFeatures({ChromeFeatureList.TAB_SELECTION_EDITOR_V2}) @Restriction({UiRestriction.RESTRICTION_TYPE_PHONE}) - @DisabledTest(message = "https://crbug.com/1352950") public void testConfigureToolbarMenuItems() { prepareBlankTab(2, false); List<Tab> tabs = getTabsInCurrentTabModel(); TestThreadUtils.runOnUiThreadBlocking(() -> { List<TabSelectionEditorAction> actions = new ArrayList<>(); - actions.add(TabSelectionEditorCloseAction.createAction( + actions.add(TabSelectionEditorCloseAction.createAction(sActivityTestRule.getActivity(), ShowMode.IF_ROOM, ButtonType.TEXT, IconPosition.START)); - actions.add(TabSelectionEditorGroupAction.createAction( + actions.add(TabSelectionEditorGroupAction.createAction(sActivityTestRule.getActivity(), ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START)); mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); @@ -425,25 +427,28 @@ final int closeId = R.id.tab_selection_editor_close_menu_item; final int groupId = R.id.tab_selection_editor_group_menu_item; mRobot.resultRobot.verifyToolbarActionViewDisabled(closeId).verifyToolbarActionViewWithText( - closeId, "Close"); - verifyToolbarMenuItemState(groupId, /*enabled=*/false); + closeId, "Close tabs"); + mRobot.actionRobot.clickToolbarMenuButton(); + mRobot.resultRobot.verifyToolbarMenuItemState("Group tabs", /*enabled=*/false); + Espresso.pressBack(); for (int i = 0; i < tabs.size(); i++) { mRobot.actionRobot.clickItemAtAdapterPosition(i); } mRobot.resultRobot.verifyToolbarActionViewEnabled(closeId).verifyToolbarActionViewWithText( - closeId, "Close"); - verifyToolbarMenuItemState(groupId, /*enabled=*/true); + closeId, "Close tabs"); + mRobot.actionRobot.clickToolbarMenuButton(); + mRobot.resultRobot.verifyToolbarMenuItemState("Group tabs", /*enabled=*/true); + Espresso.pressBack(); - // TODO(crbug.com/1352950): This step failed to deselect the first tab. It is likely - // verifyToolbarMenuItemState() left the menu open (race condition?) so the deselect click - // got consumed prior to clicking on the tab. for (int i = 0; i < tabs.size(); i++) { mRobot.actionRobot.clickItemAtAdapterPosition(i); } mRobot.resultRobot.verifyToolbarActionViewDisabled(closeId).verifyToolbarActionViewWithText( - closeId, "Close"); - verifyToolbarMenuItemState(groupId, /*enabled=*/false); + closeId, "Close tabs"); + mRobot.actionRobot.clickToolbarMenuButton(); + mRobot.resultRobot.verifyToolbarMenuItemState("Group tabs", /*enabled=*/false); + Espresso.pressBack(); } @Test @@ -455,7 +460,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { List<TabSelectionEditorAction> actions = new ArrayList<>(); - actions.add(TabSelectionEditorCloseAction.createAction( + actions.add(TabSelectionEditorCloseAction.createAction(sActivityTestRule.getActivity(), ShowMode.IF_ROOM, ButtonType.TEXT, IconPosition.START)); mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); @@ -482,7 +487,7 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { List<TabSelectionEditorAction> actions = new ArrayList<>(); - actions.add(TabSelectionEditorCloseAction.createAction( + actions.add(TabSelectionEditorCloseAction.createAction(sActivityTestRule.getActivity(), ShowMode.IF_ROOM, ButtonType.TEXT, IconPosition.START)); mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); @@ -497,7 +502,7 @@ .clickItemAtAdapterPosition(3); mRobot.resultRobot.verifyToolbarActionViewEnabled(closeId).verifyToolbarSelectionText( - "5 selected"); + "5 tabs"); View close = mTabSelectionEditorLayout.getToolbar().findViewById(closeId); assertEquals("Close 5 selected tabs", close.getContentDescription()); @@ -516,17 +521,20 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { List<TabSelectionEditorAction> actions = new ArrayList<>(); - actions.add(TabSelectionEditorCloseAction.createAction( + actions.add(TabSelectionEditorCloseAction.createAction(sActivityTestRule.getActivity(), ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START)); mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); mTabSelectionEditorController.show(tabs); }); + mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Close tabs"); + Espresso.pressBack(); - mRobot.actionRobot.clickItemAtAdapterPosition(0); - showToolbarMenu(); - mRobot.actionRobot.clickToolbarMenuItem("Close"); - hideToolbarMenu(); + assertEquals(2, getTabsInCurrentTabModel().size()); + + mRobot.actionRobot.clickItemAtAdapterPosition(0) + .clickToolbarMenuButton() + .clickToolbarMenuItem("Close tabs"); assertEquals(1, getTabsInCurrentTabModel().size()); } @@ -557,7 +565,7 @@ mRobot.actionRobot.clickItemAtAdapterPosition(0).clickItemAtAdapterPosition(2); mRobot.resultRobot.verifyToolbarActionViewEnabled(shareId).verifyToolbarSelectionText( - "2 selected"); + "2 tabs"); View share = mTabSelectionEditorLayout.getToolbar().findViewById(shareId); assertEquals("Share 2 selected tabs", share.getContentDescription()); @@ -926,7 +934,7 @@ .verifyItemSelectedAtAdapterPosition(0) .verifyItemSelectedAtAdapterPosition(1) .verifyItemSelectedAtAdapterPosition(2) - .verifyToolbarSelectionText("3 selected"); + .verifyToolbarSelectionText("3 tabs"); ChromeRenderTestRule.sanitize(mTabSelectionEditorLayout); mRenderTestRule.render(mTabSelectionEditorLayout, "selection_action_all_tabs_selected"); @@ -936,7 +944,8 @@ .verifyToolbarActionViewWithText(selectionId, "Select all") .verifyItemNotSelectedAtAdapterPosition(0) .verifyItemNotSelectedAtAdapterPosition(1) - .verifyItemNotSelectedAtAdapterPosition(2); + .verifyItemNotSelectedAtAdapterPosition(2) + .verifyToolbarSelectionText("Select tabs"); ChromeRenderTestRule.sanitize(mTabSelectionEditorLayout); mRenderTestRule.render(mTabSelectionEditorLayout, "selection_action_all_tabs_deselected"); @@ -1067,9 +1076,9 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { List<TabSelectionEditorAction> actions = new ArrayList<>(); - actions.add(TabSelectionEditorCloseAction.createAction( + actions.add(TabSelectionEditorCloseAction.createAction(sActivityTestRule.getActivity(), ShowMode.IF_ROOM, ButtonType.TEXT, IconPosition.START)); - actions.add(TabSelectionEditorGroupAction.createAction( + actions.add(TabSelectionEditorGroupAction.createAction(sActivityTestRule.getActivity(), ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START)); mTabSelectionEditorController.configureToolbarWithMenuItems(actions, null); @@ -1078,17 +1087,21 @@ mRobot.resultRobot.verifyTabSelectionEditorIsVisible(); final int closeId = R.id.tab_selection_editor_close_menu_item; - final int groupId = R.id.tab_selection_editor_group_menu_item; View close = mTabSelectionEditorLayout.getToolbar().findViewById(closeId); - MenuItem group = mTabSelectionEditorLayout.getToolbar().getMenu().findItem(groupId); assertNull(close.getContentDescription()); - assertNull(MenuItemCompat.getContentDescription(group)); + mRobot.actionRobot.clickToolbarMenuButton(); + mRobot.resultRobot.verifyToolbarMenuItemState("Group tabs", /*enabled=*/false) + .verifyToolbarMenuItemWithContentDescription("Group tabs", null); + Espresso.pressBack(); for (int i = 0; i < tabs.size(); i++) { mRobot.actionRobot.clickItemAtAdapterPosition(i); } assertEquals("Close 2 selected tabs", close.getContentDescription()); - assertEquals("Group 2 selected tabs", MenuItemCompat.getContentDescription(group)); + mRobot.actionRobot.clickToolbarMenuButton(); + mRobot.resultRobot.verifyToolbarMenuItemState("Group tabs", /*enabled=*/true) + .verifyToolbarMenuItemWithContentDescription("Group tabs", "Group 2 selected tabs"); + Espresso.pressBack(); } // This is a regression test for crbug.com/1132478. @@ -1222,27 +1235,4 @@ return tabs; } - - private void showToolbarMenu() { - TestThreadUtils.runOnUiThreadBlocking( - () -> { mTabSelectionEditorLayout.getToolbar().showOverflowMenu(); }); - } - - private void hideToolbarMenu() { - TestThreadUtils.runOnUiThreadBlocking( - () -> { mTabSelectionEditorLayout.getToolbar().hideOverflowMenu(); }); - } - - private void verifyToolbarMenuItemState(int id, boolean enabled) { - // Espresso works poorly for MenuItem as the ID of the view != the MenuItem's ID and the - // enabled state is handled outside of the view hierarchy. - showToolbarMenu(); - boolean[] isEnabled = new boolean[1]; - TestThreadUtils.runOnUiThreadBlocking(() -> { - isEnabled[0] = - mTabSelectionEditorLayout.getToolbar().getMenu().findItem(id).isEnabled(); - }); - assertEquals(enabled, isEnabled[0]); - hideToolbarMenu(); - } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java index c4ca25ef..372af5a 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorTestingRobot.java
@@ -122,9 +122,16 @@ return this; } + public TabSelectionEditorTestingRobot.Action clickToolbarMenuButton() { + onView(inTabSelectionEditor(allOf(withId(R.id.list_menu_button), + withParent(withId(R.id.action_view_layout))))) + .perform(click()); + return this; + } + public TabSelectionEditorTestingRobot.Action clickToolbarActionButton() { - onView(inTabSelectionEditor( - allOf(withId(R.id.action_button), withParent(withId(R.id.action_bar))))) + onView(inTabSelectionEditor(allOf(withId(R.id.action_button), + withParent(withId(R.id.action_view_layout))))) .perform(click()); return this; } @@ -211,16 +218,16 @@ public TabSelectionEditorTestingRobot.Result verifyToolbarActionButtonWithResourceId( int resourceId) { - onView(inTabSelectionEditor( - allOf(withId(R.id.action_button), withParent(withId(R.id.action_bar))))) + onView(inTabSelectionEditor(allOf(withId(R.id.action_button), + withParent(withId(R.id.action_view_layout))))) .check(matches(withText(resourceId))); return this; } public TabSelectionEditorTestingRobot.Result verifyToolbarActionButtonWithText( String text) { - onView(inTabSelectionEditor( - allOf(withId(R.id.action_button), withParent(withId(R.id.action_bar))))) + onView(inTabSelectionEditor(allOf(withId(R.id.action_button), + withParent(withId(R.id.action_view_layout))))) .check(matches(withText(text))); return this; } @@ -232,8 +239,8 @@ } public TabSelectionEditorTestingRobot.Result verifyToolbarActionButtonDisabled() { - onView(inTabSelectionEditor( - allOf(withId(R.id.action_button), withParent(withId(R.id.action_bar))))) + onView(inTabSelectionEditor(allOf(withId(R.id.action_button), + withParent(withId(R.id.action_view_layout))))) .check(matches(not(isEnabled()))); return this; } @@ -244,8 +251,8 @@ } public TabSelectionEditorTestingRobot.Result verifyToolbarActionButtonEnabled() { - onView(inTabSelectionEditor( - allOf(withId(R.id.action_button), withParent(withId(R.id.action_bar))))) + onView(inTabSelectionEditor(allOf(withId(R.id.action_button), + withParent(withId(R.id.action_view_layout))))) .check(matches(isEnabled())); return this; } @@ -255,6 +262,19 @@ return this; } + public TabSelectionEditorTestingRobot.Result verifyToolbarMenuItemState( + String text, boolean enabled) { + onView(withText(text)).check(matches(enabled ? isEnabled() : not(isEnabled()))); + return this; + } + + public TabSelectionEditorTestingRobot.Result verifyToolbarMenuItemWithContentDescription( + String text, String contentDescription) { + onView(allOf(withText(text), withContentDescription(contentDescription))) + .check(matches(isDisplayed())); + return this; + } + public TabSelectionEditorTestingRobot.Result verifyHasAtLeastNItemVisible(int count) { onView(inTabSelectionEditor(withId(R.id.tab_list_view))) .check((v, noMatchException) -> {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java index ae861947..9ce88ec 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorCloseActionUnitTest.java
@@ -17,6 +17,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -63,7 +64,7 @@ @Before public void setUp() { MockitoAnnotations.initMocks(this); - mAction = TabSelectionEditorCloseAction.createAction( + mAction = TabSelectionEditorCloseAction.createAction(RuntimeEnvironment.application, ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); mTabModel = spy(new MockTabModel(false, null)); when(mTabModelFilterProvider.getCurrentTabModelFilter()).thenReturn(mGroupFilter); @@ -80,14 +81,15 @@ public void testInherentActionProperties() { Assert.assertEquals(R.id.tab_selection_editor_close_menu_item, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); - Assert.assertEquals(R.string.tab_suggestion_close_tab_action_button, + Assert.assertEquals(R.string.tab_selection_editor_close_tabs, mAction.getPropertyModel().get( TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); - Assert.assertEquals(R.plurals.accessibility_tab_suggestion_close_tab_action_button, + Assert.assertEquals(R.plurals.accessibility_tab_selection_editor_close_tabs, mAction.getPropertyModel() .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) .intValue()); - Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + Assert.assertNotNull( + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); } @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java index e869a03..27144ddc 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorGroupActionUnitTest.java
@@ -17,6 +17,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -63,7 +64,7 @@ @Before public void setUp() { MockitoAnnotations.initMocks(this); - mAction = TabSelectionEditorGroupAction.createAction( + mAction = TabSelectionEditorGroupAction.createAction(RuntimeEnvironment.application, ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); mTabModel = spy(new MockTabModel(false, null)); when(mTabModelFilterProvider.getCurrentTabModelFilter()).thenReturn(mGroupFilter); @@ -80,14 +81,15 @@ public void testInherentActionProperties() { Assert.assertEquals(R.id.tab_selection_editor_group_menu_item, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); - Assert.assertEquals(R.string.tab_selection_editor_group, + Assert.assertEquals(R.string.tab_selection_editor_group_tabs, mAction.getPropertyModel().get( TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); - Assert.assertEquals(R.plurals.accessibility_tab_selection_editor_group_button, + Assert.assertEquals(R.plurals.accessibility_tab_selection_editor_group_tabs, mAction.getPropertyModel() .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) .intValue()); - Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + Assert.assertNotNull( + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); } @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java index 803d775..cdab4af 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSelectionEditorUngroupActionUnitTest.java
@@ -17,6 +17,7 @@ import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; +import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.chromium.base.test.BaseRobolectricTestRunner; @@ -61,7 +62,7 @@ @Before public void setUp() { MockitoAnnotations.initMocks(this); - mAction = TabSelectionEditorUngroupAction.createAction( + mAction = TabSelectionEditorUngroupAction.createAction(RuntimeEnvironment.application, ShowMode.MENU_ONLY, ButtonType.TEXT, IconPosition.START); mTabModel = spy(new MockTabModel(false, null)); when(mTabModelFilterProvider.getCurrentTabModelFilter()).thenReturn(mGroupFilter); @@ -75,14 +76,15 @@ public void testInherentActionProperties() { Assert.assertEquals(R.id.tab_selection_editor_ungroup_menu_item, mAction.getPropertyModel().get(TabSelectionEditorActionProperties.MENU_ITEM_ID)); - Assert.assertEquals(R.string.tab_grid_dialog_selection_mode_remove, + Assert.assertEquals(R.string.tab_selection_editor_ungroup_tabs, mAction.getPropertyModel().get( TabSelectionEditorActionProperties.TITLE_RESOURCE_ID)); - Assert.assertEquals(R.plurals.accessibility_tab_selection_dialog_remove_button, + Assert.assertEquals(R.plurals.accessibility_tab_selection_editor_ungroup_tabs, mAction.getPropertyModel() .get(TabSelectionEditorActionProperties.CONTENT_DESCRIPTION_RESOURCE_ID) .intValue()); - Assert.assertNull(mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); + Assert.assertNotNull( + mAction.getPropertyModel().get(TabSelectionEditorActionProperties.ICON)); } @Test
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java index ebac851..c9cc32a 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMediatorUnitTest.java
@@ -46,12 +46,14 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.UmaRecorderHolder; import org.chromium.base.supplier.ObservableSupplierImpl; +import org.chromium.base.supplier.OneshotSupplierImpl; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.browser.browser_controls.BrowserControlsStateProvider; import org.chromium.chrome.browser.compositor.CompositorViewHolder; import org.chromium.chrome.browser.compositor.layouts.Layout; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.multiwindow.MultiWindowModeStateDispatcher; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabSelectionType; @@ -102,6 +104,9 @@ private static final int TAB3_ID = 123; private static final int TAB4_ID = 357; + private final OneshotSupplierImpl<IncognitoReauthController> + mIncognitoReauthControllerSupplier = new OneshotSupplierImpl<>(); + @Mock TabSwitcherMediator.ResetHandler mResetHandler; @Mock @@ -138,6 +143,8 @@ MultiWindowModeStateDispatcher mMultiWindowModeStateDispatcher; @Mock PriceMessageService mPriceMessageService; + @Mock + IncognitoReauthController mIncognitoReauthController; @Captor ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor; @@ -215,13 +222,13 @@ doReturn(new ObservableSupplierImpl<Boolean>()) .when(mTabGridDialogController) .getHandleBackPressChangedSupplier(); - + mIncognitoReauthControllerSupplier.set(mIncognitoReauthController); mModel = new PropertyModel(TabListContainerProperties.ALL_KEYS); mModel.addObserver(mPropertyObserver); mMediator = new TabSwitcherMediator(mContext, mResetHandler, mModel, mTabModelSelector, mBrowserControlsStateProvider, mCompositorViewHolder, null, mMessageItemsController, mPriceWelcomeMessageController, mMultiWindowModeStateDispatcher, - TabListCoordinator.TabListMode.GRID); + TabListCoordinator.TabListMode.GRID, mIncognitoReauthControllerSupplier); mMediator.initWithNative(controller, null); mMediator.addTabSwitcherViewObserver(mTabSwitcherViewObserver); @@ -890,14 +897,14 @@ new TabSwitcherMediator(mContext, mResetHandler, mModel, mTabModelSelector, mBrowserControlsStateProvider, mCompositorViewHolder, null, mMessageItemsController, mPriceWelcomeMessageController, mMultiWindowModeStateDispatcher, - TabListCoordinator.TabListMode.GRID); + TabListCoordinator.TabListMode.GRID, mIncognitoReauthControllerSupplier); assertEquals(16, mModel.get(TabListContainerProperties.BOTTOM_PADDING)); mModel.set(TabListContainerProperties.BOTTOM_PADDING, 0); new TabSwitcherMediator(mContext, mResetHandler, mModel, mTabModelSelector, mBrowserControlsStateProvider, mCompositorViewHolder, null, mMessageItemsController, mPriceWelcomeMessageController, mMultiWindowModeStateDispatcher, - TabListCoordinator.TabListMode.STRIP); + TabListCoordinator.TabListMode.STRIP, mIncognitoReauthControllerSupplier); assertEquals(0, mModel.get(TabListContainerProperties.BOTTOM_PADDING)); }
diff --git a/chrome/android/java/res/layout/fake_search_box_layout.xml b/chrome/android/java/res/layout/fake_search_box_layout.xml index 1d8d1ba1..b0b52e1 100644 --- a/chrome/android/java/res/layout/fake_search_box_layout.xml +++ b/chrome/android/java/res/layout/fake_search_box_layout.xml
@@ -16,7 +16,7 @@ android:layout_marginStart="10dp" android:layout_marginEnd="10dp" android:layout_marginTop="0dp" - android:layout_marginBottom="1dp" + android:layout_marginBottom="@dimen/ntp_search_box_bottom_margin" android:gravity="center_vertical" android:background="@drawable/ntp_search_box" android:orientation="horizontal"
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index 04868d2..be61898 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -180,6 +180,7 @@ <dimen name="ntp_logo_margin_top">26dp</dimen> <dimen name="ntp_logo_margin_bottom">23dp</dimen> <dimen name="ntp_search_box_height">48dp</dimen> + <dimen name="ntp_search_box_bottom_margin">1dp</dimen> <dimen name="ntp_search_box_transition_length">16dp</dimen> <dimen name="experimental_explore_sites_radius">8dp</dimen> <dimen name="experimental_explore_sites_padding">8dp</dimen>
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 970c319..e75d7f2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -769,7 +769,8 @@ /* chromeActivityNativeDelegate= */ this, getLifecycleDispatcher(), getTabCreatorManagerSupplier().get(), getMenuOrKeyboardActionController(), getMultiWindowModeStateDispatcher(), mJankTracker, getToolbarManager()::getToolbar, - new CrowButtonDelegateImpl(), mBackPressManager); + new CrowButtonDelegateImpl(), mBackPressManager, + mRootUiCoordinator.getIncognitoReauthControllerSupplier()); } private void createGridTabSwitcher( @@ -782,7 +783,8 @@ mRootUiCoordinator.getScrimCoordinator(), /* rootView= */ tabSwitcherContainer, compositorViewHolder::getDynamicResourceLoader, getSnackbarManager(), - getModalDialogManager())); + getModalDialogManager(), + mRootUiCoordinator.getIncognitoReauthControllerSupplier())); } private void setupCompositorContentPostNative() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java index a8c708e..137a9bf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/WarmupManager.java
@@ -171,7 +171,7 @@ // exceptions to monitor any spikes or stacks that point to Chrome code. Throwable throwable = new Throwable( "This is not a crash. See https://crbug.com/1259276 for details.", e); - ChromePureJavaExceptionReporter.postReportJavaException(throwable); + ChromePureJavaExceptionReporter.reportJavaException(throwable); return null; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java index 903a937..6d9e03e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatApplication.java
@@ -227,7 +227,7 @@ } }; PureJavaExceptionHandler.installHandler(factory); - CustomAssertionHandler.installHandler(factory); + CustomAssertionHandler.installPreNativeHandler(factory); } TraceEvent.end(ATTACH_BASE_CONTEXT_EVENT);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index 0366cd0..2b1c1d6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -302,11 +302,21 @@ @Override public void setCurrentTouchEventOffsets(float top) { - if (mTabVisible == null) return; + EventForwarder forwarder = getEventForwarder(); + if (forwarder != null) forwarder.setCurrentTouchEventOffsets(0, top); + } + + @Override + public void setCurrentDragEventOffsets(float dx, float dy) { + EventForwarder forwarder = getEventForwarder(); + if (forwarder != null) forwarder.setDragDispatchingOffset(dx, dy); + } + + private EventForwarder getEventForwarder() { + if (mTabVisible == null) return null; WebContents webContents = mTabVisible.getWebContents(); - if (webContents == null) return; - EventForwarder forwarder = webContents.getEventForwarder(); - forwarder.setCurrentTouchEventOffsets(0, top); + if (webContents == null) return null; + return webContents.getEventForwarder(); } }); @@ -765,7 +775,7 @@ @Override public boolean dispatchDragEvent(DragEvent e) { - mEventOffsetHandler.onPreDispatchDragEvent(e.getAction()); + mEventOffsetHandler.onPreDispatchDragEvent(e.getAction(), 0.f, 0.f); boolean ret = super.dispatchDragEvent(e); mEventOffsetHandler.onPostDispatchDragEvent(e.getAction()); return ret; @@ -1539,9 +1549,11 @@ private void updateViewStateListener(ContentView newContentView) { if (mContentView != null) { mContentView.removeOnHierarchyChangeListener(this); + mContentView.setEventOffsetHandler(null); } if (newContentView != null) { newContentView.addOnHierarchyChangeListener(this); + newContentView.setEventOffsetHandler(mEventOffsetHandler); } mContentView = newContentView; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java index e2f064e..98c4853 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -176,11 +176,16 @@ desiredPopupContentWidth = activity.getResources().getDimensionPixelSize(R.dimen.context_menu_small_width); } - View webContentView = webContents.getViewAndroidDelegate() != null && isDragDropEnabled - ? webContents.getViewAndroidDelegate().getContainerView() - : null; + + // When drag and drop is enabled, context menu will be dismissed by web content when drag + // moves beyond certain threshold. ContentView will need to receive drag events dispatched + // from ContextMenuDialog in order to calculate the movement. + View dragDispatchingTargetView = + isDragDropEnabled ? webContents.getViewAndroidDelegate().getContainerView() : null; + mDialog = createContextMenuDialog(activity, layout, menu, isPopup, dialogTopMarginPx, - dialogBottomMarginPx, popupMargin, desiredPopupContentWidth, webContentView, rect); + dialogBottomMarginPx, popupMargin, desiredPopupContentWidth, + dragDispatchingTargetView, rect); mDialog.setOnShowListener(dialogInterface -> onMenuShown.run()); mDialog.setOnDismissListener(dialogInterface -> mOnMenuClosed.run()); @@ -282,7 +287,7 @@ * * @param activity Used to inflate the dialog. * @param layout The inflated context menu layout that will house the context menu. - * @param view The inflated view that contains the list view. + * @param menuView The inflated view that contains the list view. * @param isPopup Whether the context menu is being shown in a {@link AnchoredPopupWindow}. * @param topMarginPx An explicit top margin for the dialog, or -1 to use default * defined in XML. @@ -290,22 +295,24 @@ * defined in XML. * @param popupMargin The margin for the popup window. * @param desiredPopupContentWidth The desired width for the content of the context menu. - * @param webContentView The web content view presented behind the context menu. + * @param dragDispatchingTargetView The view presented behind the context menu. If provided, + * drag event happened outside of ContextMenu will be dispatched into this View. * @param rect Rect location where context menu is triggered. If this menu is a popup, the * coordinates are expected to be screen coordinates. * @return Returns a final dialog that does not have a background can be displayed using * {@link AlertDialog#show()}. */ @VisibleForTesting - static ContextMenuDialog createContextMenuDialog(Activity activity, View layout, View view, + static ContextMenuDialog createContextMenuDialog(Activity activity, View layout, View menuView, boolean isPopup, int topMarginPx, int bottomMarginPx, @Nullable Integer popupMargin, - @Nullable Integer desiredPopupContentWidth, @Nullable View webContentView, Rect rect) { + @Nullable Integer desiredPopupContentWidth, @Nullable View dragDispatchingTargetView, + Rect rect) { // TODO(sinansahin): Refactor ContextMenuDialog as well. boolean shouldRemoveScrim = isPopup && ContextMenuUtils.forcePopupStyleEnabled(); final ContextMenuDialog dialog = new ContextMenuDialog(activity, R.style.ThemeOverlay_BrowserUI_AlertDialog, topMarginPx, bottomMarginPx, layout, - view, isPopup, shouldRemoveScrim, popupMargin, desiredPopupContentWidth, - webContentView, rect, ChromeAccessibilityUtil.get()); + menuView, isPopup, shouldRemoveScrim, popupMargin, desiredPopupContentWidth, + dragDispatchingTargetView, rect, ChromeAccessibilityUtil.get()); dialog.setContentView(layout); return dialog;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java index ba4a131e..875c645 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromePureJavaExceptionReporter.java
@@ -7,6 +7,7 @@ import org.chromium.base.ContextUtils; import org.chromium.build.annotations.MainDex; import org.chromium.build.annotations.UsedByReflection; +import org.chromium.components.crash.NativeAndJavaSmartExceptionReporter; import org.chromium.components.crash.PureJavaExceptionReporter; import java.io.File; @@ -45,24 +46,18 @@ return FILE_PREFIX; } - /** - * Report and upload the device info and stack trace as if it was a crash. Runs synchronously - * and results in I/O on the main thread. - * - * @param javaException The exception to report. - */ - public static void reportJavaException(Throwable javaException) { + private static void reportPureJavaException(Throwable exception) { ChromePureJavaExceptionReporter reporter = new ChromePureJavaExceptionReporter(); - reporter.createAndUploadReport(javaException); + reporter.createAndUploadReport(exception); } /** - * Posts a task to report and upload the device info and stack trace as if it was a crash. + * Asynchronously report and upload the stack trace as if it was a crash. * - * @param javaException The exception to report. + * @param exception The exception to report. */ - public static void postReportJavaException(Throwable javaException) { - ChromePureJavaExceptionReporter reporter = new ChromePureJavaExceptionReporter(); - reporter.postCreateAndUploadReport(javaException); + public static void reportJavaException(Throwable exception) { + NativeAndJavaSmartExceptionReporter.postUploadReport( + exception, ChromePureJavaExceptionReporter::reportPureJavaException); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java index f05a22a..bffc03c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java
@@ -192,7 +192,7 @@ private static void reportErrorMessage(String message) { Log.e(TAG, message); - ChromePureJavaExceptionReporter.postReportJavaException(new Throwable(message)); + ChromePureJavaExceptionReporter.reportJavaException(new Throwable(message)); } @BrandingDecision
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index 1fd9c269..3ef53b1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -892,7 +892,7 @@ -> {}, this, new NoOpkeyboardVisibilityDelegate(), locationBarDataProvider.isIncognito(), - ChromePureJavaExceptionReporter::postReportJavaException); + ChromePureJavaExceptionReporter::reportJavaException); updateColors(); updateSecurityIcon(); updateProgressBarColors();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java index b6b9aac..c3cb3805 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -78,12 +78,6 @@ // Used to signify the cached resource value is unset. private static final int UNSET_RESOURCE_FLAG = -1; - /** - * The maximum number of tiles to try and fit in a row. On smaller screens, there may not be - * enough space to fit all of them. - */ - private static final int MAX_TILE_COLUMNS = 4; - private final int mTileGridLayoutBleed; private final Context mContext; private int mSearchBoxEndPadding = UNSET_RESOURCE_FLAG; @@ -357,7 +351,7 @@ mMostVisitedTilesCoordinator = new MostVisitedTilesCoordinator(mActivity, activityLifecycleDispatcher, mMvTilesContainerLayout, mWindowAndroid, /*shouldShowSkeletonUIPreNative=*/false, isScrollableMvtEnabled, maxRows, - MAX_TILE_COLUMNS, () -> mSnapshotTileGridChanged = true, () -> { + () -> mSnapshotTileGridChanged = true, () -> { if (mUrlFocusChangePercent == 1f) mTileCountChanged = true; });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java index d255ac9..3bc6339 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivity.java
@@ -213,7 +213,7 @@ /*merchantTrustSignalsCoordinatorSupplier=*/null, new OmniboxPedalDelegateImpl(this, new OneshotSupplierImpl<>(), getModalDialogManagerSupplier()), null, - ChromePureJavaExceptionReporter::postReportJavaException, backPressManager); + ChromePureJavaExceptionReporter::reportJavaException, backPressManager); // clang-format on mLocationBarCoordinator.setUrlBarFocusable(true); mLocationBarCoordinator.setShouldShowMicButtonWhenUnfocused(true);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchBoxDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchBoxDataProvider.java index 4b2b8b5..ce29c24 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchBoxDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchBoxDataProvider.java
@@ -18,11 +18,13 @@ import org.chromium.components.browser_ui.styles.ChromeColors; import org.chromium.components.metrics.OmniboxEventProtos.OmniboxEventProto.PageClassification; import org.chromium.components.security_state.ConnectionSecurityLevel; +import org.chromium.url.GURL; class SearchBoxDataProvider implements LocationBarDataProvider { private final @ColorInt int mPrimaryColor; private boolean mIsFromQuickActionSearchWidget; private Tab mTab; + private GURL mGurl; /** * @param context The {@link Context} for accessing colors. @@ -104,6 +106,16 @@ } @Override + public GURL getCurrentGurl() { + if (mGurl == null) { + assert LibraryLoader.getInstance().isInitialized(); + mGurl = new GURL(getCurrentUrl()); + } + + return mGurl; + } + + @Override public boolean isOfflinePage() { return false; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java index ee346ed..cb5fbf9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesCoordinator.java
@@ -36,6 +36,11 @@ public class MostVisitedTilesCoordinator implements ConfigurationChangedObserver { private static final int TITLE_LINES = 1; public static final String CONTEXT_MENU_USER_ACTION_PREFIX = "Suggestions"; + /** + * The maximum number of tiles to try and fit in a row. On smaller screens, there may not be + * enough space to fit all of them. + */ + private static final int MAX_TILE_COLUMNS_FOR_GRID = 4; private final Activity mActivity; private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; @@ -61,8 +66,6 @@ * MostVisitedTilesGridLayout} is used. * @param maxRows The maximum number of rows to display. This will only be used for {@link * MostVisitedTilesGridLayout}. - * @param maxColumns The maximum number of columns to display. This will only be used for {@link - * MostVisitedTilesGridLayout}. * @param snapshotTileGridChangedRunnable The runnable called when the snapshot tile grid is * changed. * @param tileCountChangedRunnable The runnable called when the tile count is changed. @@ -70,7 +73,7 @@ public MostVisitedTilesCoordinator(Activity activity, ActivityLifecycleDispatcher activityLifecycleDispatcher, View mvTilesContainerLayout, WindowAndroid windowAndroid, boolean shouldShowSkeletonUIPreNative, - boolean isScrollableMVTEnabled, int maxRows, int maxColumns, + boolean isScrollableMVTEnabled, int maxRows, @Nullable Runnable snapshotTileGridChangedRunnable, @Nullable Runnable tileCountChangedRunnable) { mActivity = activity; @@ -81,9 +84,10 @@ isScrollableMVTEnabled ? R.id.mv_tiles_carousel_stub : R.id.mv_tiles_grid_stub)) .inflate(); ViewGroup tilesLayout = mvTilesContainerLayout.findViewById(R.id.mv_tiles_layout); - assert (tilesLayout != null); + if (!isScrollableMVTEnabled) { - ((MostVisitedTilesGridLayout) tilesLayout).setMaxColumns(maxColumns); + assert maxRows != Integer.MAX_VALUE; + ((MostVisitedTilesGridLayout) tilesLayout).setMaxColumns(MAX_TILE_COLUMNS_FOR_GRID); ((MostVisitedTilesGridLayout) tilesLayout).setMaxRows(maxRows); } @@ -97,8 +101,7 @@ mMediator = new MostVisitedTilesMediator(activity.getResources(), mUiConfig, tilesLayout, mvTilesContainerLayout.findViewById(R.id.tile_grid_placeholder_stub), mRenderer, - propertyModel, shouldShowSkeletonUIPreNative && isScrollableMVTEnabled, - isScrollableMVTEnabled, + propertyModel, shouldShowSkeletonUIPreNative, isScrollableMVTEnabled, DeviceFormFactor.isNonMultiDisplayContextOnTablet(mActivity), snapshotTileGridChangedRunnable, tileCountChangedRunnable); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java index 2315a2e..3a38f24 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesGridLayout.java
@@ -16,6 +16,7 @@ import androidx.annotation.VisibleForTesting; import org.chromium.base.MathUtils; +import org.chromium.base.library_loader.LibraryLoader; import org.chromium.chrome.R; import org.chromium.chrome.browser.ntp.FeedPositionUtils; import org.chromium.chrome.browser.suggestions.SiteSuggestion; @@ -190,12 +191,16 @@ // TODO(crbug.com/1329288): Remove this method when the Feed position experiment is cleaned up. private int getGridMVTVerticalSpacingResourcesId() { - if (mSearchProviderHasLogo) { - if (FeedPositionUtils.isFeedPushDownLargeEnabled()) { - return R.dimen.tile_grid_layout_vertical_spacing_push_down_large; - } else if (FeedPositionUtils.isFeedPushDownSmallEnabled()) { - return R.dimen.tile_grid_layout_vertical_spacing_push_down_small; - } + if (!LibraryLoader.getInstance().isInitialized() || !mSearchProviderHasLogo) { + return R.dimen.tile_grid_layout_vertical_spacing; + } + + if (FeedPositionUtils.isFeedPushDownLargeEnabled()) { + return R.dimen.tile_grid_layout_vertical_spacing_push_down_large; + } + + if (FeedPositionUtils.isFeedPushDownSmallEnabled()) { + return R.dimen.tile_grid_layout_vertical_spacing_push_down_small; } return R.dimen.tile_grid_layout_vertical_spacing;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java index eab8476..52d2aca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/survey/ChromeSurveyController.java
@@ -22,8 +22,6 @@ import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.task.AsyncTask; -import org.chromium.base.task.PostTask; -import org.chromium.base.task.TaskTraits; import org.chromium.chrome.R; import org.chromium.chrome.browser.crash.ChromePureJavaExceptionReporter; import org.chromium.chrome.browser.firstrun.FirstRunStatus; @@ -254,10 +252,7 @@ String logMessage = String.format( "The survey prompt for survey with ID %s has already been shown.", siteId); Log.w(TAG, logMessage); - PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, - () - -> ChromePureJavaExceptionReporter.reportJavaException( - new Throwable(logMessage))); + ChromePureJavaExceptionReporter.reportJavaException(new Throwable(logMessage)); return; } @@ -268,10 +263,7 @@ + "with ID %s has expired.", siteId); Log.w(TAG, logMessage); - PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, - () - -> ChromePureJavaExceptionReporter.reportJavaException( - new Throwable(logMessage))); + ChromePureJavaExceptionReporter.reportJavaException(new Throwable(logMessage)); return; } Resources resources = mActivity.getResources(); @@ -339,10 +331,8 @@ + " because the survey with ID %s has expired.", siteId); Log.w(TAG, logMessage); - PostTask.postTask(TaskTraits.BEST_EFFORT_MAY_BLOCK, - () - -> ChromePureJavaExceptionReporter.reportJavaException( - new Throwable(logMessage))); + ChromePureJavaExceptionReporter.reportJavaException( + new Throwable(logMessage)); mMessageDispatcher.dismissMessage( message, DismissReason.DISMISSED_BY_FEATURE); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java index 479026f8..db25f63 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
@@ -926,9 +926,8 @@ * Returns whether to improve Start surface when Feed is not visible. */ public static boolean shouldImproveStartWhenFeedIsDisabled(Context context) { - return isStartSurfaceEnabled(context) - && ChromeFeatureList.sStartSurfaceDisabledFeedImprovement.isEnabled() - && !getFeedArticlesVisibility(); + return ChromeFeatureList.sStartSurfaceDisabledFeedImprovement.isEnabled() + && !getFeedArticlesVisibility() && isStartSurfaceEnabled(context); } /**
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 aeb55bf..73cad483 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
@@ -694,7 +694,7 @@ jankTracker, merchantTrustSignalsCoordinatorSupplier, omniboxPedalDelegate, mControlsVisibilityDelegate, - ChromePureJavaExceptionReporter::postReportJavaException, backPressManager); + ChromePureJavaExceptionReporter::reportJavaException, backPressManager); // clang-format on toolbarLayout.setLocationBarCoordinator(locationBarCoordinator); toolbarLayout.setBrowserControlsVisibilityDelegate(mControlsVisibilityDelegate);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java index cafed01..4a25a73 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoDismissTest.java
@@ -13,11 +13,14 @@ import static org.hamcrest.CoreMatchers.allOf; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; -import static org.chromium.ui.test.util.ViewUtils.onViewWaiting; +import static org.chromium.components.browser_ui.widget.RecyclerViewTestUtils.activeInRecyclerView; import android.support.test.InstrumentationRegistry; +import androidx.annotation.IdRes; +import androidx.test.espresso.ViewInteraction; import androidx.test.filters.MediumTest; import org.junit.After; @@ -28,8 +31,8 @@ import org.junit.rules.RuleChain; import org.junit.runner.RunWith; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisableIf; import org.chromium.base.test.util.MetricsUtils.HistogramDelta; import org.chromium.chrome.R; import org.chromium.chrome.browser.ChromeTabbedActivity; @@ -47,7 +50,6 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.components.signin.metrics.SigninAccessPoint; import org.chromium.content_public.browser.test.util.TestThreadUtils; -import org.chromium.ui.test.util.UiDisableIf; /** * Tests different scenarios when the bookmark personalized signin promo is not shown. @@ -95,34 +97,30 @@ @MediumTest public void testPromoNotShownAfterBeingDismissed() { mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onViewWaiting(allOf(withId(R.id.signin_promo_view_container), isDisplayed())); - onView(withId(R.id.sync_promo_close_button)).perform(click()); - onView(withId(R.id.signin_promo_view_container)).check(doesNotExist()); + onActiveViewId(R.id.signin_promo_view_container).check(matches(isDisplayed())); + onActiveViewId(R.id.sync_promo_close_button).perform(click()); + onActiveViewId(R.id.signin_promo_view_container).check(doesNotExist()); closeBookmarkManager(); mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onView(withId(R.id.signin_promo_view_container)).check(doesNotExist()); + onActiveViewId(R.id.signin_promo_view_container).check(doesNotExist()); } @Test @MediumTest - // BookmarkPromoHeader is created twice per test in tablets. - // So testing histogram count is not possible. - // TODO(https://crbug.com/1266342): Remove DisableIf for tablets. - @DisableIf.Device(type = {UiDisableIf.TABLET}) public void testPromoDismissedHistogramRecordedAfterBeingDismissed() { - HistogramDelta dismissHistogram = - new HistogramDelta("Signin.SyncPromo.Dismissed.Count.Bookmarks", 1); - mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onViewWaiting(allOf(withId(R.id.signin_promo_view_container), isDisplayed())); - onView(withId(R.id.sync_promo_close_button)).perform(click()); - onView(withId(R.id.signin_promo_view_container)).check(doesNotExist()); + onActiveViewId(R.id.signin_promo_view_container).check(matches(isDisplayed())); + onActiveViewId(R.id.sync_promo_close_button).perform(click()); + onActiveViewId(R.id.signin_promo_view_container).check(doesNotExist()); closeBookmarkManager(); mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onView(withId(R.id.signin_promo_view_container)).check(doesNotExist()); - Assert.assertEquals(1, dismissHistogram.getDelta()); + onActiveViewId(R.id.signin_promo_view_container).check(doesNotExist()); + int histogramRecordCount = RecordHistogram.getHistogramTotalCountForTesting( + "Signin.SyncPromo.Dismissed.Count.Bookmarks"); + assertTrue("Expected at least one, but found " + histogramRecordCount, + histogramRecordCount >= 1); } @Test @@ -133,15 +131,11 @@ SigninAccessPoint.BOOKMARK_MANAGER), SyncPromoController.getMaxImpressionsBookmarksForTests()); mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onView(withId(R.id.signin_promo_view_container)).check(doesNotExist()); + onActiveViewId(R.id.signin_promo_view_container).check(doesNotExist()); } @Test @MediumTest - // BookmarkPromoHeader is created twice per test in tablets. - // So testing histogram count is not possible. - // TODO(https://crbug.com/1266342): Remove DisableIf for tablets. - @DisableIf.Device(type = {UiDisableIf.TABLET}) public void testPromoImpressionCountIncrementAfterDisplayingSigninPromo() { Assert.assertEquals(0, SharedPreferencesManager.getInstance().readInt( @@ -154,15 +148,19 @@ new HistogramDelta("Signin.SyncPromo.Shown.Count.Bookmarks", 1); mBookmarkTestRule.showBookmarkManager(mSyncTestRule.getActivity()); - onView(withId(R.id.signin_promo_view_container)).check(matches(isDisplayed())); + onActiveViewId(R.id.signin_promo_view_container).check(matches(isDisplayed())); - assertEquals(1, - SharedPreferencesManager.getInstance().readInt( - SyncPromoController.getPromoShowCountPreferenceName( - SigninAccessPoint.BOOKMARK_MANAGER))); - Assert.assertEquals(1, - SharedPreferencesManager.getInstance().readInt( - ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT)); + // If a profile update happens while the promo in bookmarks is being shown, these will be + // counted multiple times. The RecyclerView recreates the promo view at its current index, + // triggering all metrics again. + int bookmarkShownCount = SharedPreferencesManager.getInstance().readInt( + SyncPromoController.getPromoShowCountPreferenceName( + SigninAccessPoint.BOOKMARK_MANAGER)); + assertTrue( + "Expected at least one, but found " + bookmarkShownCount, bookmarkShownCount >= 1); + int totalShownCount = SharedPreferencesManager.getInstance().readInt( + ChromePreferenceKeys.SYNC_PROMO_TOTAL_SHOW_COUNT); + assertTrue("Expected at least one, but found " + totalShownCount, totalShownCount >= 1); Assert.assertEquals(1, showCountHistogram.getDelta()); } @@ -173,7 +171,12 @@ ChromeTabUtils.closeCurrentTab( InstrumentationRegistry.getInstrumentation(), chromeTabbedActivity); } else { + // This is not within the RecyclerView, don't need to verify active. onView(withId(R.id.close_menu_id)).perform(click()); } } + + private static ViewInteraction onActiveViewId(@IdRes int id) { + return onView(allOf(withId(id), activeInRecyclerView())); + } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java index 149ed8e..b30521f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkPersonalizedSigninPromoTest.java
@@ -7,9 +7,7 @@ import static androidx.test.espresso.Espresso.onView; import static androidx.test.espresso.action.ViewActions.click; import static androidx.test.espresso.assertion.ViewAssertions.matches; -import static androidx.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; -import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; import static androidx.test.espresso.matcher.ViewMatchers.withId; import static org.hamcrest.core.AllOf.allOf; @@ -21,6 +19,8 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; +import static org.chromium.components.browser_ui.widget.RecyclerViewTestUtils.activeInRecyclerView; + import android.app.Activity; import android.content.Context; @@ -37,7 +37,6 @@ import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; -import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.MetricsUtils.HistogramDelta; import org.chromium.chrome.R; import org.chromium.chrome.browser.flags.ChromeSwitches; @@ -99,7 +98,6 @@ @Test @MediumTest - @DisabledTest(message = "crbug.com/1294402") public void testSigninButtonDefaultAccount() { final CoreAccountInfo accountInfo = mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); @@ -110,7 +108,7 @@ .launchActivityForPromoDefaultFlow(any(Context.class), anyInt(), anyString()); showBookmarkManagerAndCheckSigninPromoIsDisplayed(); - onView(allOf(withId(R.id.sync_promo_signin_button), withEffectiveVisibility(VISIBLE))) + onView(allOf(withId(R.id.sync_promo_signin_button), activeInRecyclerView())) .perform(click()); verify(mMockSyncConsentActivityLauncher) @@ -121,7 +119,6 @@ @Test @MediumTest - @DisabledTest(message = "crbug.com/1294402") public void testSigninButtonNotDefaultAccount() { HistogramDelta signinHistogram = new HistogramDelta("Signin.SyncPromo.Continued.Count.Bookmarks", 1); @@ -131,7 +128,8 @@ CoreAccountInfo accountInfo = mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); showBookmarkManagerAndCheckSigninPromoIsDisplayed(); - onView(withId(R.id.sync_promo_choose_account_button)).perform(click()); + onView(allOf(withId(R.id.sync_promo_choose_account_button), activeInRecyclerView())) + .perform(click()); verify(mMockSyncConsentActivityLauncher) .launchActivityForPromoChooseAccountFlow(any(Activity.class), eq(SigninAccessPoint.BOOKMARK_MANAGER), eq(accountInfo.getEmail())); @@ -147,7 +145,8 @@ .when(SyncConsentActivityLauncherImpl.get()) .launchActivityForPromoAddAccountFlow(any(Context.class), anyInt()); showBookmarkManagerAndCheckSigninPromoIsDisplayed(); - onView(withId(R.id.sync_promo_signin_button)).perform(click()); + onView(allOf(withId(R.id.sync_promo_signin_button), activeInRecyclerView())) + .perform(click()); verify(mMockSyncConsentActivityLauncher) .launchActivityForPromoAddAccountFlow( any(Activity.class), eq(SigninAccessPoint.BOOKMARK_MANAGER)); @@ -156,8 +155,11 @@ private void showBookmarkManagerAndCheckSigninPromoIsDisplayed() { mBookmarkTestRule.showBookmarkManager(sActivityTestRule.getActivity()); - // Sync promo sometimes shows up again on tablets after profile data updates. - onView(allOf(withId(R.id.signin_promo_view_container), withEffectiveVisibility(VISIBLE))) + + // Profile data updates cause the signin promo to be recreated at the given index. The + // RecyclerView's ViewGroup children may be stale, use activeInRecyclerView to filter to + // only what is currently valid, otherwise the match will be ambiguous. + onView(allOf(withId(R.id.signin_promo_view_container), activeInRecyclerView())) .check(matches(isDisplayed())); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/RecognitionTestHelper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/RecognitionTestHelper.java index 1847d068..cb7e2fa7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/RecognitionTestHelper.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/voice/RecognitionTestHelper.java
@@ -43,6 +43,7 @@ import org.chromium.ui.modaldialog.ModalDialogManager; import org.chromium.ui.permissions.AndroidPermissionDelegate; import org.chromium.ui.permissions.PermissionCallback; +import org.chromium.url.GURL; import java.lang.ref.WeakReference; import java.util.ArrayList; @@ -506,6 +507,11 @@ } @Override + public GURL getCurrentGurl() { + return GURL.emptyGURL(); + } + + @Override public NewTabPageDelegate getNewTabPageDelegate() { return NewTabPageDelegate.EMPTY; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayoutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayoutTest.java index 6388452..63b3a21 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayoutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesLayoutTest.java
@@ -97,7 +97,6 @@ new ParameterSet().value(false).name("DisableScrollableMVTOnNTP")); public final int TILE_GRID_ROWS = 2; - public final int TILE_GRID_COLUMNS = 4; @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); @@ -376,7 +375,7 @@ MostVisitedTilesCoordinator coordinator = new MostVisitedTilesCoordinator(activity, mActivityLifecycleDispatcher, containerLayout, mWindowAndroid, false, - mEnableScrollableMVT, TILE_GRID_ROWS, TILE_GRID_COLUMNS, null, null); + mEnableScrollableMVT, TILE_GRID_ROWS, null, null); coordinator.initWithNative(uiDelegate, delegate, mTouchEnabledDelegate); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java index 427e4b4c..61a9e4f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/LocationBarModelTest.java
@@ -46,6 +46,8 @@ import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.content_public.browser.test.util.TestThreadUtils; +import org.chromium.url.GURL; +import org.chromium.url.JUnitTestGURLs; import java.util.ArrayList; import java.util.Arrays; @@ -88,26 +90,24 @@ public void testDisplayAndEditText() { TestThreadUtils.runOnUiThreadBlocking(() -> { TestLocationBarModel model = new TestLocationBarModel(mActivityTestRule.getActivity()); - model.mUrl = UrlConstants.NTP_URL; + model.mUrl = UrlConstants.ntpGurl(); assertDisplayAndEditText(model, "", null); - model.mUrl = "chrome://about"; - model.mDisplayUrl = "chrome://about"; - model.mFullUrl = "chrome://about"; + model.mUrl = new GURL(JUnitTestGURLs.CHROME_ABOUT); + model.mDisplayUrl = JUnitTestGURLs.CHROME_ABOUT; + model.mFullUrl = JUnitTestGURLs.CHROME_ABOUT; assertDisplayAndEditText(model, "chrome://about", "chrome://about"); - model.mUrl = "https://www.foo.com"; - model.mDisplayUrl = "https://foo.com"; - model.mFullUrl = "https://foo.com"; - assertDisplayAndEditText(model, "https://foo.com", "https://foo.com"); + model.mUrl = new GURL(JUnitTestGURLs.URL_1); + model.mDisplayUrl = "https://one.com"; + model.mFullUrl = "https://one.com"; + assertDisplayAndEditText(model, "https://one.com", "https://one.com"); - model.mUrl = "https://www.foo.com"; - model.mDisplayUrl = "foo.com"; - model.mFullUrl = "https://foo.com"; - assertDisplayAndEditText(model, "foo.com", "https://foo.com"); + model.mDisplayUrl = "one.com"; + assertDisplayAndEditText(model, "one.com", "https://one.com"); // https://crbug.com/1214481 - model.mUrl = ""; + model.mUrl = GURL.emptyGURL(); model.mDisplayUrl = "about:blank"; model.mFullUrl = "about:blank"; assertDisplayAndEditText(model, "about:blank", "about:blank"); @@ -250,7 +250,7 @@ private class TestLocationBarModel extends LocationBarModel { private String mDisplayUrl; private String mFullUrl; - private String mUrl; + private GURL mUrl; public TestLocationBarModel(Context context) { // clang-format off @@ -277,7 +277,12 @@ @Override public String getCurrentUrl() { - return mUrl == null ? super.getCurrentUrl() : mUrl; + return mUrl == null ? super.getCurrentUrl() : mUrl.getSpec(); + } + + @Override + public GURL getCurrentGurl() { + return mUrl == null ? super.getCurrentGurl() : mUrl; } @Override
diff --git a/chrome/app/chromium_strings.grd b/chrome/app/chromium_strings.grd index ce94d05..267f4be 100644 --- a/chrome/app/chromium_strings.grd +++ b/chrome/app/chromium_strings.grd
@@ -1579,19 +1579,40 @@ </if> <!-- High Efficiency Chip strings --> <if expr="not is_android"> - <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="Title text for a dialog describing that the Memory Saver setting is enabled"> - Memory Saver made Chromium faster - </message> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="In Title Case: Title text for a dialog describing that the Memory Saver setting is enabled"> + Memory Saver Made Chromium Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="Title text for a dialog describing that the Memory Saver setting is enabled"> + Memory Saver made Chromium faster + </message> + </if> </if> <!-- High Efficiency IPH strings --> <if expr="not is_android"> - <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="The title for the high efficiency info mode in-product promo bubble."> - Memory Saver made Chromium faster - </message> - <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble"> - Make Chromium faster - </message> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="In Title Case: The title for the high efficiency info mode in-product promo bubble."> + Memory Saver Made Chromium Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="The title for the high efficiency info mode in-product promo bubble."> + Memory Saver made Chromium faster + </message> + </if> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="In Title Case: The title for the high efficiency mode in-product promo bubble"> + Make Chromium Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble"> + Make Chromium faster + </message> + </if> </if> </messages> </release>
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 8fc07cde..7b57bd43 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -7555,9 +7555,16 @@ <message name="IDS_SHARED_HIGHLIGHTING_PROMO" desc="The title of in-product-help message encouraging users to interact with the highlight"> To create a highlight like this one, select any text and right-click. </message> - <message name="IDS_BATTERY_SAVER_MODE_PROMO_TITLE" desc="The title for the battery saver mode in-product promo bubble."> - Energy Saver turned on - </message> + <if expr="use_titlecase"> + <message name="IDS_BATTERY_SAVER_MODE_PROMO_TITLE" desc="In Title Case: The title for the battery saver mode in-product promo bubble."> + Energy Saver Turned On + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_BATTERY_SAVER_MODE_PROMO_TITLE" desc="The title for the battery saver mode in-product promo bubble."> + Energy Saver turned on + </message> + </if> <message name="IDS_BATTERY_SAVER_MODE_PROMO_TEXT" desc="The text shown for the battery saver mode in-product promo bubble."> This extends battery power by limiting background activity and visual effects like smooth scrolling </message> @@ -7573,9 +7580,16 @@ <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TEXT" desc="The text shown for the high efficiency mode in-product promo bubble"> Memory Saver frees up memory from inactive tabs so it can be used by active tabs and other apps </message> - <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT" desc="The custom action button text for the high efficiency mode in-product promo bubble"> - Turn on - </message> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT" desc="In Title Case: The custom action button text for the high efficiency mode in-product promo bubble"> + Turn On + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_ACTION_TEXT" desc="The custom action button text for the high efficiency mode in-product promo bubble"> + Turn on + </message> + </if> <!-- User Education Tutorial Strings --> <if expr="use_titlecase"> @@ -13767,9 +13781,16 @@ <message name="IDS_BATTERY_SAVER_BUBBLE_DESCRIPTION" desc="The description text of the battery saver bubble dialog"> Background activity and some visual effects, like smooth scrolling, may be limited. </message> - <message name="IDS_BATTERY_SAVER_SESSION_TURN_OFF" desc="The label for the turn off battery saver for current session button in battery saver bubble dialog"> - Turn off now - </message> + <if expr="use_titlecase"> + <message name="IDS_BATTERY_SAVER_SESSION_TURN_OFF" desc="In Title Case: The label for the turn off battery saver for current session button in battery saver bubble dialog"> + Turn Off Now + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_BATTERY_SAVER_SESSION_TURN_OFF" desc="The label for the turn off battery saver for current session button in battery saver bubble dialog"> + Turn off now + </message> + </if> </if> <!-- High Efficiency Chip strings --> <if expr="not is_android">
diff --git a/chrome/app/google_chrome_strings.grd b/chrome/app/google_chrome_strings.grd index 6c16c66..2cb988e4 100644 --- a/chrome/app/google_chrome_strings.grd +++ b/chrome/app/google_chrome_strings.grd
@@ -1681,19 +1681,40 @@ </if> <!-- High Efficiency Chip strings --> <if expr="not is_android"> - <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="Title text for a dialog describing that the Memory Saver setting is enabled"> - Memory Saver made Chrome faster - </message> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="In Title Case: Title text for a dialog describing that the Memory Saver setting is enabled"> + Memory Saver Made Chrome Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_DIALOG_TITLE" desc="Title text for a dialog describing that the Memory Saver setting is enabled"> + Memory Saver made Chrome faster + </message> + </if> </if> <!-- High Efficiency IPH strings --> <if expr="not is_android"> - <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="The title for the high efficiency info mode in-product promo bubble."> - Memory Saver made Chrome faster - </message> - <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble"> - Make Chrome faster - </message> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="In Title Case: The title for the high efficiency info mode in-product promo bubble."> + Memory Saver Made Chrome Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_INFO_MODE_PROMO_TITLE" desc="The title for the high efficiency info mode in-product promo bubble."> + Memory Saver made Chrome faster + </message> + </if> + <if expr="use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="In Title Case: The title for the high efficiency mode in-product promo bubble"> + Make Chrome Faster + </message> + </if> + <if expr="not use_titlecase"> + <message name="IDS_HIGH_EFFICIENCY_MODE_PROMO_TITLE" desc="The title for the high efficiency mode in-product promo bubble"> + Make Chrome faster + </message> + </if> </if> </messages> </release>
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9b91b25..1c5ab84 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -1172,6 +1172,49 @@ {"Action Chips Enabled with Pedals", kJourneysOmniboxActionWithPedalsParams, std::size(kJourneysOmniboxActionWithPedalsParams), nullptr}, }; + +const FeatureEntry::FeatureParam + kJourneysOmniboxHistoryClusterProviderVariationsAggressive[] = { + {"omnibox_history_cluster_provider_score", "1100"}, + {"omnibox_history_cluster_provider_shortcuts", "true"}, + {"omnibox_history_cluster_provider_navigation_intent_score_threshold", + "1400"}, + {"omnibox_history_cluster_provider_on_navigation_intents", "false"}, +}; +const FeatureEntry::FeatureParam + kJourneysOmniboxHistoryClusterProviderVariationsModerate[] = { + {"omnibox_history_cluster_provider_score", "900"}, + {"omnibox_history_cluster_provider_shortcuts", "true"}, + {"omnibox_history_cluster_provider_navigation_intent_score_threshold", + "1300"}, + {"omnibox_history_cluster_provider_on_navigation_intents", "false"}, +}; +const FeatureEntry::FeatureParam + kJourneysOmniboxHistoryClusterProviderVariationsConservative[] = { + {"omnibox_history_cluster_provider_score", "700"}, + {"omnibox_history_cluster_provider_shortcuts", "false"}, + {"omnibox_history_cluster_provider_navigation_intent_score_threshold", + "1100"}, + {"omnibox_history_cluster_provider_on_navigation_intents", "false"}, +}; +const FeatureEntry::FeatureVariation + kJourneysOmniboxHistoryClusterProviderVariations[] = { + {"Aggressive - score 1100, shortcut boosting, nav-intent filtering " + "1400", + kJourneysOmniboxHistoryClusterProviderVariationsAggressive, + std::size(kJourneysOmniboxHistoryClusterProviderVariationsAggressive), + nullptr}, + {"Moderate - Score 900, shortcut boosting, nav-intent filtering 1300", + kJourneysOmniboxHistoryClusterProviderVariationsModerate, + std::size(kJourneysOmniboxHistoryClusterProviderVariationsModerate), + nullptr}, + {"Conservative - score 700, nav-intent filtering 1100", + kJourneysOmniboxHistoryClusterProviderVariationsConservative, + std::size( + kJourneysOmniboxHistoryClusterProviderVariationsConservative), + nullptr}, +}; + const FeatureEntry::FeatureParam kSidePanelJourneysOpensFromOmniboxParams[] = { {"SidePanelJourneysOpensFromOmnibox", "true"}, }; @@ -3709,14 +3752,14 @@ flag_descriptions::kExperimentalWebAssemblyFeaturesName, flag_descriptions::kExperimentalWebAssemblyFeaturesDescription, kOsAll, SINGLE_VALUE_TYPE(switches::kEnableExperimentalWebAssemblyFeatures)}, -#if defined(ARCH_CPU_X86_64) +#if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) {"enable-experimental-webassembly-stack-switching", flag_descriptions::kExperimentalWebAssemblyStackSwitchingName, flag_descriptions::kExperimentalWebAssemblyStackSwitchingDescription, kOsAll, FEATURE_VALUE_TYPE( features::kEnableExperimentalWebAssemblyStackSwitching)}, -#endif // defined(ARCH_CPU_X86_64) +#endif // defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) {"enable-webassembly-baseline", flag_descriptions::kEnableWasmBaselineName, flag_descriptions::kEnableWasmBaselineDescription, kOsAll, FEATURE_VALUE_TYPE(features::kWebAssemblyBaseline)}, @@ -5729,14 +5772,16 @@ kOsDesktop | kOsAndroid, FEATURE_WITH_PARAMS_VALUE_TYPE(history_clusters::internal::kOmniboxAction, kJourneysOmniboxActionVariations, - "HistoryJourneysOmniboxAction")}, + "JourneysOmniboxTriggering")}, {"history-journeys-omnibox-history-cluster-provider", flag_descriptions::kJourneysOmniboxHistoryClusterProviderName, flag_descriptions::kJourneysOmniboxHistoryClusterProviderDescription, kOsDesktop | kOsAndroid, - FEATURE_VALUE_TYPE( - history_clusters::internal::kOmniboxHistoryClusterProvider)}, + FEATURE_WITH_PARAMS_VALUE_TYPE( + history_clusters::internal::kOmniboxHistoryClusterProvider, + kJourneysOmniboxHistoryClusterProviderVariations, + "JourneysOmniboxTriggering")}, {"history-journeys-on-device-clustering", flag_descriptions::kJourneysOnDeviceClusteringBackendName, @@ -9624,6 +9669,12 @@ FEATURE_VALUE_TYPE(chrome::android::kDiscardOccludedBitmaps)}, #endif + {"autofill-enable-cvc-for-vcn-yellow-path", + flag_descriptions::kAutofillEnableCvcForVcnYellowPathName, + flag_descriptions::kAutofillEnableCvcForVcnYellowPathDescription, kOsAll, + FEATURE_VALUE_TYPE( + autofill::features::kAutofillEnableCvcForVcnYellowPath)}, + // 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/apps/guest_view/web_view_browsertest.cc b/chrome/browser/apps/guest_view/web_view_browsertest.cc index f185b29..afaf2ce 100644 --- a/chrome/browser/apps/guest_view/web_view_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_browsertest.cc
@@ -6454,7 +6454,7 @@ bool should_enable_site_isolation_for_guests = std::get<0>(GetParam()); bool should_enable_process_isolation_for_fenced_frames = std::get<1>(GetParam()); - std::vector<base::Feature> enabled_features, disabled_features; + std::vector<base::test::FeatureRef> enabled_features, disabled_features; if (should_enable_site_isolation_for_guests) { enabled_features.push_back(features::kSiteIsolationForGuests);
diff --git a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc index a04d68e2..0e5d281 100644 --- a/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc +++ b/chrome/browser/apps/guest_view/web_view_interactive_browsertest.cc
@@ -1343,11 +1343,9 @@ EXPECT_TRUE(webview_button_not_focused_listener.WaitUntilSatisfied()); } -// Flaky on MacOSX, crbug.com/817066. // Flaky timeouts on Linux. https://crbug.com/709202 // Flaky timeouts on Win. https://crbug.com/846695 -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ - BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) #define MAYBE_KeyboardFocusSimple DISABLED_KeyboardFocusSimple #else #define MAYBE_KeyboardFocusSimple KeyboardFocusSimple @@ -1389,11 +1387,8 @@ // and regains focus. Additionally, the webview does not process keypresses sent // while another window is focused. // http://crbug.com/660044. -// Flaky on MacOSX, crbug.com/817067. // Flaky on linux, crbug.com/706830. -// Flaky on Windows, crbug.com/847201. -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_MAC) || \ - BUILDFLAG(IS_WIN) +#if BUILDFLAG(IS_LINUX) #define MAYBE_KeyboardFocusWindowCycle DISABLED_KeyboardFocusWindowCycle #else #define MAYBE_KeyboardFocusWindowCycle KeyboardFocusWindowCycle
diff --git a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper_unittest.cc b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper_unittest.cc index 70b72de..8048f62 100644 --- a/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper_unittest.cc +++ b/chrome/browser/ash/child_accounts/time_limits/app_service_wrapper_unittest.cc
@@ -158,7 +158,8 @@ if (app_id.app_type() == apps::AppType::kWeb) { DCHECK(url.has_value()); const web_app::AppId installed_app_id = web_app::test::InstallDummyWebApp( - &profile_, app_name, GURL(url.value())); + &profile_, app_name, GURL(url.value()), + webapps::WebappInstallSource::EXTERNAL_DEFAULT); EXPECT_EQ(installed_app_id, app_id.app_id()); task_environment_.RunUntilIdle(); return;
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc index 8cdb0f48..b60af40 100644 --- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc +++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
@@ -871,7 +871,7 @@ const base::Value* krb5_conf_value = account.FindPath(kKrb5Conf); if (krb5_conf_value) { // Note: The config is encoded as a list of lines. - for (const auto& config_line : krb5_conf_value->GetListDeprecated()) { + for (const auto& config_line : krb5_conf_value->GetList()) { krb5_conf += config_line.GetString(); krb5_conf += "\n"; }
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc index 2930e1bd..796f910 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_regular.cc
@@ -275,7 +275,7 @@ ScopedDictPrefUpdate pairing_update(profile()->GetPrefs(), prefs::kEasyUnlockPairing); - if (devices.GetListDeprecated().empty()) + if (devices.GetList().empty()) pairing_update->Remove(kKeyDevices); else pairing_update->Set(kKeyDevices, devices.Clone());
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc index b66d757..3aad2376 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_signin.cc
@@ -133,8 +133,7 @@ return beacon_seeds; } - for (const base::Value& beacon_seed_value : - deserialized_value->GetListDeprecated()) { + for (const base::Value& beacon_seed_value : deserialized_value->GetList()) { if (!beacon_seed_value.is_string()) { PA_LOG(ERROR) << "Expected Base64 BeaconSeed."; continue;
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc index 448ad5b6..49fcdad 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
@@ -382,7 +382,7 @@ } auto barrier_closure = base::BarrierClosure( - network_list->GetListDeprecated().size(), + network_list->GetList().size(), base::BindOnce(&RollbackNetworkConfig::Importer::AllNetworksConfigured, weak_factory_.GetWeakPtr(), std::move(callback))); @@ -392,7 +392,7 @@ bool ownership_taken = IsOwnershipTaken(); - for (base::Value& network : network_list->GetListDeprecated()) { + for (base::Value& network : network_list->GetList()) { if (!ownership_taken) { ManagedOncConfigureActivePartAsDeviceWide(network.Clone(), finished_a_network);
diff --git a/chrome/browser/banners/app_banner_manager_browsertest.cc b/chrome/browser/banners/app_banner_manager_browsertest.cc index f35892a..2d1c57c 100644 --- a/chrome/browser/banners/app_banner_manager_browsertest.cc +++ b/chrome/browser/banners/app_banner_manager_browsertest.cc
@@ -806,7 +806,7 @@ } private: - std::vector<base::Feature> disabled_features_; + std::vector<base::test::FeatureRef> disabled_features_; std::map<base::Feature, std::map<std::string, std::string>, FeatureOperatorOverload>
diff --git a/chrome/browser/extensions/api/preference/preference_api.cc b/chrome/browser/extensions/api/preference/preference_api.cc index 13e7e68..b9e2970 100644 --- a/chrome/browser/extensions/api/preference/preference_api.cc +++ b/chrome/browser/extensions/api/preference/preference_api.cc
@@ -1150,13 +1150,13 @@ return RespondNow(Error(kPermissionErrorMessage, pref_key)); #if BUILDFLAG(IS_CHROMEOS_LACROS) - Profile* profile = Profile::FromBrowserContext(browser_context()); // If the pref is ash-controlled, check that the service is present. // If it isn't, don't allow the pref to be cleared. crosapi::mojom::PrefPath pref_path = PrefMapping::GetInstance()->GetPrefPathForPrefName(browser_pref); chromeos::LacrosService* lacros_service; if (pref_path != crosapi::mojom::PrefPath::kUnknown) { + Profile* profile = Profile::FromBrowserContext(browser_context()); if (!profile->IsMainProfile()) { return RespondNow(Error(kPrimaryProfileOnlyErrorMessage, pref_key)); }
diff --git a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc index 0917937..474229dc 100644 --- a/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc +++ b/chrome/browser/extensions/api/tab_capture/tab_capture_registry.cc
@@ -42,9 +42,6 @@ extension_id_(extension_id), is_anonymous_(is_anonymous), registry_(registry), - capture_state_(tab_capture::TAB_CAPTURE_STATE_NONE), - is_verified_(false), - is_fullscreened_(false), render_process_id_( target_contents->GetPrimaryMainFrame()->GetProcess()->GetID()), render_frame_id_( @@ -108,9 +105,9 @@ const std::string extension_id_; const bool is_anonymous_; const raw_ptr<TabCaptureRegistry> registry_; - TabCaptureState capture_state_; - bool is_verified_; - bool is_fullscreened_; + TabCaptureState capture_state_ = tab_capture::TAB_CAPTURE_STATE_NONE; + bool is_verified_ = false; + bool is_fullscreened_ = false; // These reference the originally targetted RenderFrameHost by its ID. The // RenderFrameHost may have gone away long before a LiveRequest closes, but
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 91db616..518a0900 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -34,6 +34,7 @@ #include "chrome/browser/devtools/url_constants.h" #include "chrome/browser/extensions/active_tab_permission_granter.h" #include "chrome/browser/extensions/api/extension_action/test_extension_action_api_observer.h" +#include "chrome/browser/extensions/error_console/error_console.h" #include "chrome/browser/extensions/extension_action_runner.h" #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/browser/extensions/extension_service.h" @@ -61,6 +62,7 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_switches.h" +#include "chrome/common/pref_names.h" #include "chrome/common/url_constants.h" #include "chrome/test/base/search_test_utils.h" #include "chrome/test/base/ui_test_utils.h" @@ -5948,4 +5950,149 @@ EXPECT_EQ(1, get_page_event_count()); } +// Tests that an MV3 extension can use the `webRequestAuthProvider` permission +// to intercept and handle `onAuthRequired` events. +IN_PROC_BROWSER_TEST_F(ManifestV3WebRequestApiTest, TestOnAuthRequired) { + CancelLoginDialog login_dialog_helper; + ASSERT_TRUE(StartEmbeddedTestServer()); + + static constexpr char kManifest[] = + R"({ + "name": "MV3 WebRequest", + "version": "0.1", + "manifest_version": 3, + "permissions": ["webRequest", "webRequestAuthProvider"], + "host_permissions": [ "http://example.com/*" ], + "background": {"service_worker": "background.js"} + })"; + // The extension will asynchronously provide the user credentials for the + // request. + static constexpr char kBackgroundJs[] = + R"(chrome.webRequest.onAuthRequired.addListener( + (details, callback) => { + chrome.test.assertEq('mv3authprovider', details.realm); + chrome.test.assertEq(401, details.statusCode); + const authCredentials = {username: 'foo', password: 'secret'}; + setTimeout(() => { + callback({authCredentials}); + chrome.test.succeed(); + }, 20); + }, + {urls: ['<all_urls>']}, + ['asyncBlocking']);)"; + + TestExtensionDir test_dir; + test_dir.WriteManifest(kManifest); + test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundJs); + const Extension* extension = LoadExtension(test_dir.UnpackedPath()); + + ASSERT_TRUE(extension); + + // Navigate to a special URL that will prompt the user for credentials. The + // request should succeed (verified by the last navigation status) and the + // extension should have received the event (verified by the ResultCatcher). + static constexpr char kRealm[] = "mv3authprovider"; + std::string auth_url_path = + base::StringPrintf("/auth-basic/%s/subpath?realm=%s", kRealm, kRealm); + GURL auth_url = embedded_test_server()->GetURL("example.com", auth_url_path); + + ResultCatcher result_catcher; + content::TestNavigationObserver navigation_observer( + browser()->tab_strip_model()->GetActiveWebContents()); + content::RenderFrameHost* frame_host = + ui_test_utils::NavigateToURL(browser(), auth_url); + ASSERT_TRUE(result_catcher.GetNextResult()); + EXPECT_EQ(auth_url, frame_host->GetLastCommittedURL()); + EXPECT_TRUE(navigation_observer.last_navigation_succeeded()); +} + +namespace { + +// A helper to wait for an error to be added for an extension. +// TODO(devlin): Pull this into a central test util file. +class ErrorObserver : public ErrorConsole::Observer { + public: + ErrorObserver(size_t errors_expected, ErrorConsole* error_console) + : errors_expected_(errors_expected), error_console_(error_console) { + observation_.Observe(error_console_.get()); + } + + // ErrorConsole::Observer implementation. + void OnErrorAdded(const ExtensionError* error) override { + ++errors_observed_; + if (errors_observed_ >= errors_expected_) { + run_loop_.Quit(); + } + } + + // Spin until the appropriate number of errors have been observed. + void WaitForErrors() { + if (errors_observed_ < errors_expected_) { + run_loop_.Run(); + } + } + + private: + size_t errors_expected_; + raw_ptr<ErrorConsole> error_console_; + size_t errors_observed_ = 0; + base::ScopedObservation<ErrorConsole, ErrorConsole::Observer> observation_{ + this}; + base::RunLoop run_loop_; +}; + +} // namespace + +// Tests that a MV3 extension that doesn't have the `webRequestAuthProvider` +// permission cannot use blocking listeners for `onAuthRequired`. +IN_PROC_BROWSER_TEST_F(ManifestV3WebRequestApiTest, + TestOnAuthRequired_NoPermission) { + CancelLoginDialog login_dialog_helper; + ASSERT_TRUE(StartEmbeddedTestServer()); + + static constexpr char kManifest[] = + R"({ + "name": "MV3 WebRequest", + "version": "0.1", + "manifest_version": 3, + "permissions": ["webRequest"], + "host_permissions": [ "http://example.com/*" ], + "background": {"service_worker": "background.js"} + })"; + // The extension tries to add a listener; this will fail asynchronously + // as a part of the webRequestInternal API trying to add the listener. + // This results in runtime.lastError being set, but since it's an + // internal API, there's no way for the extension to catch the error. + static constexpr char kBackgroundJs[] = + R"(chrome.webRequest.onAuthRequired.addListener( + (details, callback) => {}, + {urls: ['<all_urls>']}, + ['asyncBlocking']);)"; + + // Since we can't catch the error in the extension's JS, we instead listen to + // the error come into the error console. This also requires setting the user + // in developer mode. + ErrorConsole* error_console = ErrorConsole::Get(profile()); + profile()->GetPrefs()->SetBoolean(prefs::kExtensionsUIDeveloperMode, true); + ErrorObserver error_observer(1u, error_console); + + // Load the extension and wait for the error to come. + TestExtensionDir test_dir; + test_dir.WriteManifest(kManifest); + test_dir.WriteFile(FILE_PATH_LITERAL("background.js"), kBackgroundJs); + const Extension* extension = LoadExtension(test_dir.UnpackedPath()); + + ASSERT_TRUE(extension); + error_observer.WaitForErrors(); + + const ErrorList& errors = + error_console->GetErrorsForExtension(extension->id()); + ASSERT_EQ(1u, errors.size()); + EXPECT_TRUE( + base::StartsWith(errors[0]->message(), + u"Unchecked runtime.lastError: You do not have " + u"permission to use blocking webRequest listeners.")) + << errors[0]->message(); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc index 1a885a773..faf103e7 100644 --- a/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc +++ b/chrome/browser/extensions/api/webrtc_logging_private/webrtc_logging_private_apitest.cc
@@ -687,8 +687,8 @@ } void SetUpFeatures() { - std::vector<base::Feature> enabled; - std::vector<base::Feature> disabled; + std::vector<base::test::FeatureRef> enabled; + std::vector<base::test::FeatureRef> disabled; if (WebRtcEventLogCollectionFeature()) { enabled.push_back(features::kWebRtcRemoteEventLog);
diff --git a/chrome/browser/extensions/extension_shared_array_buffer_browsertest.cc b/chrome/browser/extensions/extension_shared_array_buffer_browsertest.cc index 13c8ba88..5dd08cc0 100644 --- a/chrome/browser/extensions/extension_shared_array_buffer_browsertest.cc +++ b/chrome/browser/extensions/extension_shared_array_buffer_browsertest.cc
@@ -87,7 +87,7 @@ public ::testing::WithParamInterface<std::tuple<bool, bool, bool>> { public: SharedArrayBufferTest() { - std::vector<base::Feature> enabled_features, disabled_features; + std::vector<base::test::FeatureRef> enabled_features, disabled_features; const bool is_sab_allowed_unconditionally = std::get<0>(GetParam()); if (is_sab_allowed_unconditionally) { enabled_features.push_back(
diff --git a/chrome/browser/extensions/webstore_installer_test.cc b/chrome/browser/extensions/webstore_installer_test.cc index c58e971..2b66044 100644 --- a/chrome/browser/extensions/webstore_installer_test.cc +++ b/chrome/browser/extensions/webstore_installer_test.cc
@@ -6,38 +6,14 @@ #include <memory> -#include "base/bind.h" -#include "base/callback_helpers.h" #include "base/command_line.h" #include "base/strings/stringprintf.h" -#include "base/strings/utf_string_conversions.h" -#include "chrome/browser/download/download_prefs.h" -#include "chrome/browser/extensions/extension_install_prompt.h" -#include "chrome/browser/extensions/tab_helper.h" -#include "chrome/browser/extensions/webstore_standalone_installer.h" -#include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/common/chrome_switches.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "chrome/test/base/test_switches.h" -#include "content/public/browser/notification_registrar.h" -#include "content/public/browser/notification_service.h" -#include "content/public/browser/notification_types.h" -#include "content/public/browser/render_frame_host.h" -#include "content/public/browser/web_contents.h" -#include "content/public/common/content_switches.h" #include "content/public/test/browser_test_utils.h" #include "net/base/host_port_pair.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "third_party/blink/public/common/switches.h" -#include "url/gurl.h" - -using content::WebContents; -using extensions::Extension; -using extensions::TabHelper; -using extensions::WebstoreStandaloneInstaller; using net::test_server::HttpRequest; @@ -101,48 +77,6 @@ return page_url.ReplaceComponents(replace_host); } -void WebstoreInstallerTest::RunTest(WebContents* web_contents, - const std::string& test_function_name) { - bool result = false; - std::string script = base::StringPrintf( - "%s('%s')", test_function_name.c_str(), - test_gallery_url_.c_str()); - ASSERT_TRUE( - content::ExecuteScriptAndExtractBool(web_contents, script, &result)); - EXPECT_TRUE(result); -} - -void WebstoreInstallerTest::RunTest(const std::string& test_function_name) { - RunTest(browser()->tab_strip_model()->GetActiveWebContents(), - test_function_name); -} - -bool WebstoreInstallerTest::RunIndexedTest( - const std::string& test_function_name, - int i) { - std::string result = "FAILED"; - std::string script = base::StringPrintf("%s('%s', %d)", - test_function_name.c_str(), test_gallery_url_.c_str(), i); - EXPECT_TRUE(content::ExecuteScriptAndExtractString( - browser()->tab_strip_model()->GetActiveWebContents(), - script, - &result)); - EXPECT_TRUE(result != "FAILED"); - return result == "KEEPGOING"; -} - -void WebstoreInstallerTest::RunTestAsync( - const std::string& test_function_name) { - std::string script = base::StringPrintf( - "%s('%s')", test_function_name.c_str(), test_gallery_url_.c_str()); - browser() - ->tab_strip_model() - ->GetActiveWebContents() - ->GetPrimaryMainFrame() - ->ExecuteJavaScriptWithUserGestureForTests(base::UTF8ToUTF16(script), - base::NullCallback()); -} - void WebstoreInstallerTest::ProcessServerRequest(const HttpRequest& request) {} void WebstoreInstallerTest::AutoAcceptInstall() {
diff --git a/chrome/browser/extensions/webstore_installer_test.h b/chrome/browser/extensions/webstore_installer_test.h index e1968885..afffdc2 100644 --- a/chrome/browser/extensions/webstore_installer_test.h +++ b/chrome/browser/extensions/webstore_installer_test.h
@@ -7,7 +7,6 @@ #include <string> -#include "base/files/scoped_temp_dir.h" #include "chrome/browser/extensions/extension_browsertest.h" #include "extensions/browser/extension_dialog_auto_confirm.h" #include "url/gurl.h" @@ -16,15 +15,9 @@ class CommandLine; } -namespace contents { -class WebContents; -} - -namespace net { -namespace test_server { +namespace net::test_server { struct HttpRequest; } -} class WebstoreInstallerTest : public extensions::ExtensionBrowserTest { public: @@ -46,22 +39,6 @@ GURL GenerateTestServerUrl(const std::string& domain, const std::string& page_filename); - void RunTest(const std::string& test_function_name); - - void RunTest(content::WebContents* web_contents, - const std::string& test_function_name); - - // Passes |i| to |test_function_name|, and expects that function to - // return one of "FAILED", "KEEPGOING" or "DONE". KEEPGOING should be - // returned if more tests remain to be run and the current test succeeded, - // FAILED is returned when a test fails, and DONE is returned by the last - // test if it succeeds. - // This methods returns true iff there are more tests that need to be run. - bool RunIndexedTest(const std::string& test_function_name, int i); - - // Runs a test without waiting for any results from the renderer. - void RunTestAsync(const std::string& test_function_name); - // Can be overridden to inspect requests to the embedded test server. virtual void ProcessServerRequest( const net::test_server::HttpRequest& request);
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 47ffb42..b71829db 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -461,6 +461,11 @@ "expiry_milestone": 120 }, { + "name": "autofill-enable-cvc-for-vcn-yellow-path", + "owners": ["vinnypersky@google.com"], + "expiry_milestone": 120 + }, + { "name": "autofill-enable-fido-progress-dialog", "owners": [ "siashah", "yiian" ], "expiry_milestone": 113
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 652205e3..cbe3cb9 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -417,6 +417,14 @@ "When enabled, card product name (instead of issuer network) will be shown " "in Payments Autofill UI."; +const char kAutofillEnableCvcForVcnYellowPathName[] = + "Enable CVC Authentication in the yellow path of the VCN retrieval flow"; +const char kAutofillEnableCvcForVcnYellowPathDescription[] = + "When enabled, if the user encounters the yellow path (challenge path) in " + "the VCN retrieval flow and the server denotes that the card is eligible " + "for CVC authentication, CVC authentication will be offered as one of the " + "challenge options."; + const char kAutofillEnableOfferNotificationForPromoCodesName[] = "Extend Autofill offers and rewards notification to promo code offers"; const char kAutofillEnableOfferNotificationForPromoCodesDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index ec18fa44..6913891c 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -227,6 +227,9 @@ extern const char kAutofillEnableCardProductNameName[]; extern const char kAutofillEnableCardProductNameDescription[]; +extern const char kAutofillEnableCvcForVcnYellowPathName[]; +extern const char kAutofillEnableCvcForVcnYellowPathDescription[]; + extern const char kAutofillEnableOfferNotificationForPromoCodesName[]; extern const char kAutofillEnableOfferNotificationForPromoCodesDescription[];
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 caf02299..6132a6f 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
@@ -611,11 +611,7 @@ private void ensureFooters( @State int buttonState, boolean canLoadMore, HistoryClustersResult result) { - mMoreProgressItem.model.set( - HistoryClustersItemProperties.PROGRESS_BUTTON_STATE, buttonState); boolean showVerticallyCentered = buttonState == State.LOADING && !mIsScrollToLoadDisabled; - mMoreProgressItem.model.set( - HistoryClustersItemProperties.SHOW_VERTICALLY_CENTERED, showVerticallyCentered); boolean shouldShowLoadIndicator = (buttonState == State.BUTTON && canLoadMore && mIsScrollToLoadDisabled) || buttonState == State.LOADING; @@ -627,6 +623,10 @@ if (shouldShowLoadIndicator) { mModelList.add(mMoreProgressItem); + mMoreProgressItem.model.set( + HistoryClustersItemProperties.SHOW_VERTICALLY_CENTERED, showVerticallyCentered); + mMoreProgressItem.model.set( + HistoryClustersItemProperties.PROGRESS_BUTTON_STATE, buttonState); } boolean emptyTextShowing = mModelList.indexOf(mEmptyTextListItem) != -1;
diff --git a/chrome/browser/media/cast_mirroring_performance_browsertest.cc b/chrome/browser/media/cast_mirroring_performance_browsertest.cc index 66ee8580..b7e4fce 100644 --- a/chrome/browser/media/cast_mirroring_performance_browsertest.cc +++ b/chrome/browser/media/cast_mirroring_performance_browsertest.cc
@@ -901,8 +901,8 @@ void LogInfoMessage(const std::string& message) override {} void LogErrorMessage(const std::string& message) override {} - // CastMessageChannel implementation - void Send(mirroring::mojom::CastMessagePtr message) override { + // CastMessageChannel implementation (inbound). + void OnMessage(mirroring::mojom::CastMessagePtr message) override { Json::CharReaderBuilder rb; auto reader = std::unique_ptr<Json::CharReader>(rb.newCharReader()); Json::Value root; @@ -987,7 +987,7 @@ VLOG(1) << "Sending ANSWER"; offer_message->json_format_data = ssb.str(); - channel_to_service_->Send(std::move(offer_message)); + channel_to_service_->OnMessage(std::move(offer_message)); } mojo::Remote<mirroring::mojom::MirroringServiceHost> host_;
diff --git a/chrome/browser/media/cast_mirroring_service_host_browsertest.cc b/chrome/browser/media/cast_mirroring_service_host_browsertest.cc index 71db15c..ff58ec3 100644 --- a/chrome/browser/media/cast_mirroring_service_host_browsertest.cc +++ b/chrome/browser/media/cast_mirroring_service_host_browsertest.cc
@@ -239,8 +239,8 @@ MOCK_METHOD1(LogInfoMessage, void(const std::string&)); MOCK_METHOD1(LogErrorMessage, void(const std::string&)); - // mojom::CastMessageChannel mocks. - MOCK_METHOD1(Send, void(mojom::CastMessagePtr)); + // mojom::CastMessageChannel mock implementation (inbound messages). + MOCK_METHOD1(OnMessage, void(mojom::CastMessagePtr)); // mojom::AudioStreamCreatorClient mocks. MOCK_METHOD0(OnAudioStreamCreated, void());
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.cc b/chrome/browser/media/router/providers/cast/mirroring_activity.cc index ee81b219..94e9521 100644 --- a/chrome/browser/media/router/providers/cast/mirroring_activity.cc +++ b/chrome/browser/media/router/providers/cast/mirroring_activity.cc
@@ -275,7 +275,7 @@ route_.media_source().id(), route_.presentation_id()); } -void MirroringActivity::Send(mirroring::mojom::CastMessagePtr message) { +void MirroringActivity::OnMessage(mirroring::mojom::CastMessagePtr message) { DCHECK(message); DVLOG(2) << "Relaying message to receiver: " << message->json_format_data; @@ -334,7 +334,7 @@ mirroring::mojom::CastMessagePtr ptr = mirroring::mojom::CastMessage::New(); ptr->message_namespace = message.namespace_(); ptr->json_format_data = message.payload_utf8(); - channel_to_service_->Send(std::move(ptr)); + channel_to_service_->OnMessage(std::move(ptr)); } void MirroringActivity::OnInternalMessage( @@ -353,7 +353,7 @@ route().media_sink_id(), route().media_source().id(), route().presentation_id()); } - channel_to_service_->Send(std::move(ptr)); + channel_to_service_->OnMessage(std::move(ptr)); } void MirroringActivity::CreateMediaController(
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity.h b/chrome/browser/media/router/providers/cast/mirroring_activity.h index f314582..9228eea 100644 --- a/chrome/browser/media/router/providers/cast/mirroring_activity.h +++ b/chrome/browser/media/router/providers/cast/mirroring_activity.h
@@ -63,7 +63,7 @@ void LogErrorMessage(const std::string& message) override; // CastMessageChannel implementation - void Send(mirroring::mojom::CastMessagePtr message) override; + void OnMessage(mirroring::mojom::CastMessagePtr message) override; // CastActivity implementation void OnAppMessage(const cast::channel::CastMessage& message) override;
diff --git a/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc b/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc index 748cfb6e..f7da028 100644 --- a/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc +++ b/chrome/browser/media/router/providers/cast/mirroring_activity_unittest.cc
@@ -64,7 +64,7 @@ class MockCastMessageChannel : public mirroring::mojom::CastMessageChannel { public: - MOCK_METHOD1(Send, void(mirroring::mojom::CastMessagePtr message)); + MOCK_METHOD1(OnMessage, void(mirroring::mojom::CastMessagePtr message)); }; } // namespace @@ -270,7 +270,7 @@ return cast_channel::Result::kOk; })); - activity_->Send( + activity_->OnMessage( mirroring::mojom::CastMessage::New("the_namespace", kPayload)); RunUntilIdle(); } @@ -285,14 +285,14 @@ return cast_channel::Result::kOk; })); - activity_->Send( + activity_->OnMessage( mirroring::mojom::CastMessage::New("the_namespace", kPayload)); RunUntilIdle(); } TEST_F(MirroringActivityTest, OnAppMessageWrongNamespace) { MakeActivity(); - EXPECT_CALL(*channel_to_service_, Send).Times(0); + EXPECT_CALL(*channel_to_service_, OnMessage).Times(0); cast::channel::CastMessage message; message.set_namespace_("wrong_namespace"); message.set_destination_id(kDestinationId); @@ -302,7 +302,7 @@ TEST_P(MirroringActivityTest, OnAppMessageWrongDestination) { MakeActivity(); - EXPECT_CALL(*channel_to_service_, Send).Times(0); + EXPECT_CALL(*channel_to_service_, OnMessage).Times(0); cast::channel::CastMessage message; message.set_namespace_(GetParam()); message.set_destination_id("someOtherDestination"); @@ -312,7 +312,7 @@ TEST_P(MirroringActivityTest, OnAppMessageWrongSource) { MakeActivity(); - EXPECT_CALL(*channel_to_service_, Send).Times(0); + EXPECT_CALL(*channel_to_service_, OnMessage).Times(0); cast::channel::CastMessage message; message.set_namespace_(GetParam()); message.set_destination_id(kDestinationId); @@ -336,7 +336,7 @@ static constexpr char kPayload[] = R"({"foo": "bar"})"; - EXPECT_CALL(*channel_to_service_, Send) + EXPECT_CALL(*channel_to_service_, OnMessage) .WillOnce([](mirroring::mojom::CastMessagePtr message) { EXPECT_EQ(GetParam(), message->message_namespace); EXPECT_EQ(kPayload, message->json_format_data); @@ -367,7 +367,7 @@ static constexpr char kPayload[] = R"({"foo": "bar"})"; static constexpr char kNamespace[] = "the_namespace"; - EXPECT_CALL(*channel_to_service_, Send) + EXPECT_CALL(*channel_to_service_, OnMessage) .WillOnce([](mirroring::mojom::CastMessagePtr message) { EXPECT_EQ(kNamespace, message->message_namespace); EXPECT_THAT(message->json_format_data, IsJson(kPayload));
diff --git a/chrome/browser/metrics/chrome_metrics_service_client.cc b/chrome/browser/metrics/chrome_metrics_service_client.cc index 148d35d..ac8ceac0 100644 --- a/chrome/browser/metrics/chrome_metrics_service_client.cc +++ b/chrome/browser/metrics/chrome_metrics_service_client.cc
@@ -848,7 +848,8 @@ std::make_unique<ash::PrinterMetricsProvider>()); metrics_service_->RegisterMetricsProvider( - std::make_unique<metrics::structured::StructuredMetricsProvider>()); + std::make_unique<metrics::structured::StructuredMetricsProvider>( + cros_system_profile_provider_.get())); metrics_service_->RegisterMetricsProvider( std::make_unique<AssistantServiceMetricsProvider>()); @@ -1191,8 +1192,11 @@ void ChromeMetricsServiceClient::AsyncInitSystemProfileProvider() { DCHECK(cros_system_profile_provider_); cros_system_profile_provider_->AsyncInit(base::BindOnce([]() { - // todo: callback to Structured Metrics when system profiles - // load is complete. + // Structured metrics needs to know when the SystemProfile is + // available since events should have SystemProfile populated. + // Notify structured metrics recorder that SystemProfile is available to + // start sending events. + metrics::structured::Recorder::GetInstance()->OnSystemProfileInitialized(); })); } #endif
diff --git a/chrome/browser/metrics/chromeos_system_profile_provider.cc b/chrome/browser/metrics/chromeos_system_profile_provider.cc index 9ab9a17..dbf15c3 100644 --- a/chrome/browser/metrics/chromeos_system_profile_provider.cc +++ b/chrome/browser/metrics/chromeos_system_profile_provider.cc
@@ -218,12 +218,6 @@ base::OnceClosure callback) { chromeos::system::StatisticsProvider::GetInstance()->GetMachineStatistic( "hardware_class", &full_hardware_class_); - - // Structured metrics needs to know when full hardware class is available - // since events should have full hardware class populated. Notify structured - // metrics recorder that HWID is available to start sending events. - metrics::structured::Recorder::GetInstance()->OnHardwareClassInitialized( - full_hardware_class_); std::move(callback).Run(); }
diff --git a/chrome/browser/performance_manager/policies/bfcache_policy_browsertest.cc b/chrome/browser/performance_manager/policies/bfcache_policy_browsertest.cc index fb287ae..2f7107a 100644 --- a/chrome/browser/performance_manager/policies/bfcache_policy_browsertest.cc +++ b/chrome/browser/performance_manager/policies/bfcache_policy_browsertest.cc
@@ -170,7 +170,7 @@ base::test::ScopedFeatureList feature_list_; std::vector<base::test::ScopedFeatureList::FeatureAndParams> enabled_features_; - std::vector<base::Feature> disabled_features_; + std::vector<base::test::FeatureRef> disabled_features_; }; } // namespace
diff --git a/chrome/browser/permissions/permission_manager_factory.cc b/chrome/browser/permissions/permission_manager_factory.cc index ad86b42..6d8d7dc 100644 --- a/chrome/browser/permissions/permission_manager_factory.cc +++ b/chrome/browser/permissions/permission_manager_factory.cc
@@ -134,7 +134,7 @@ // TODO(crbug.com/897300): Still in development for Android so we don't // support it on WebLayer yet. - permission_contexts[ContentSettingsType::WINDOW_PLACEMENT] = + permission_contexts[ContentSettingsType::WINDOW_MANAGEMENT] = std::make_unique<permissions::WindowPlacementPermissionContext>(profile); return permission_contexts;
diff --git a/chrome/browser/policy/test/window_placement_policy_browsertest.cc b/chrome/browser/policy/test/window_placement_policy_browsertest.cc index 7b078a5..c89aa82c 100644 --- a/chrome/browser/policy/test/window_placement_policy_browsertest.cc +++ b/chrome/browser/policy/test/window_placement_policy_browsertest.cc
@@ -61,10 +61,10 @@ HostContentSettingsMapFactory::GetForProfile(browser()->profile()); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetDefaultContentSetting( - ContentSettingsType::WINDOW_PLACEMENT, nullptr)); + ContentSettingsType::WINDOW_MANAGEMENT, nullptr)); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( - url, url, ContentSettingsType::WINDOW_PLACEMENT)); + url, url, ContentSettingsType::WINDOW_MANAGEMENT)); EXPECT_EQ("prompt", EvalJs(tab, kCheckPermission)); PolicyMap policies; @@ -73,10 +73,10 @@ EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetDefaultContentSetting( - ContentSettingsType::WINDOW_PLACEMENT, nullptr)); + ContentSettingsType::WINDOW_MANAGEMENT, nullptr)); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( - url, url, ContentSettingsType::WINDOW_PLACEMENT)); + url, url, ContentSettingsType::WINDOW_MANAGEMENT)); EXPECT_EQ("denied", EvalJs(tab, kCheckPermission)); EXPECT_EQ("error", EvalJs(tab, kGetScreens)); @@ -85,10 +85,10 @@ EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetDefaultContentSetting( - ContentSettingsType::WINDOW_PLACEMENT, nullptr)); + ContentSettingsType::WINDOW_MANAGEMENT, nullptr)); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetContentSetting( - url, url, ContentSettingsType::WINDOW_PLACEMENT)); + url, url, ContentSettingsType::WINDOW_MANAGEMENT)); EXPECT_EQ("prompt", EvalJs(tab, kCheckPermission)); } @@ -108,10 +108,10 @@ HostContentSettingsMapFactory::GetForProfile(browser()->profile()); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetDefaultContentSetting( - ContentSettingsType::WINDOW_PLACEMENT, nullptr)); + ContentSettingsType::WINDOW_MANAGEMENT, nullptr)); EXPECT_EQ(CONTENT_SETTING_ALLOW, host_content_settings_map->GetContentSetting( - url, url, ContentSettingsType::WINDOW_PLACEMENT)); + url, url, ContentSettingsType::WINDOW_MANAGEMENT)); EXPECT_EQ("granted", EvalJs(tab, kCheckPermission)); EXPECT_EQ("granted", EvalJs(tab, kGetScreens)); } @@ -132,10 +132,10 @@ HostContentSettingsMapFactory::GetForProfile(browser()->profile()); EXPECT_EQ(CONTENT_SETTING_ASK, host_content_settings_map->GetDefaultContentSetting( - ContentSettingsType::WINDOW_PLACEMENT, nullptr)); + ContentSettingsType::WINDOW_MANAGEMENT, nullptr)); EXPECT_EQ(CONTENT_SETTING_BLOCK, host_content_settings_map->GetContentSetting( - url, url, ContentSettingsType::WINDOW_PLACEMENT)); + url, url, ContentSettingsType::WINDOW_MANAGEMENT)); EXPECT_EQ("denied", EvalJs(tab, kCheckPermission)); EXPECT_EQ("error", EvalJs(tab, kGetScreens)); }
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index 6a27abb..eacd25f 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -760,6 +760,12 @@ "Chrome.QueryTiles.ShowSegmentationResult"; /** + * Whether query tiles is already shown on Start surface. Default value is false. + */ + public static final String QUERY_TILES_SHOWN_ON_START_SURFACE = + "Chrome.QueryTiles.ShownOnStartSurface"; + + /** * Keys used to store user actions for behavioral targeting of showing Start surface on startup. */ public static final String START_SHOW_ON_STARTUP = "Chrome.StartSurface.ShownOnStartup"; @@ -1154,6 +1160,7 @@ QUERY_TILES_NUM_RECENT_QUERY_TILE_CLICKS, QUERY_TILES_SHOW_ON_NTP, QUERY_TILES_SHOW_SEGMENTATION_RESULT, + QUERY_TILES_SHOWN_ON_START_SURFACE, REGULAR_TAB_COUNT, SETTINGS_SAFETY_CHECK_LAST_RUN_TIMESTAMP, SETTINGS_SAFETY_CHECK_RUN_COUNTER,
diff --git a/chrome/browser/resources/settings/chromeos/combined_search_handler.js b/chrome/browser/resources/settings/chromeos/combined_search_handler.js index 8d950e87..38707f98 100644 --- a/chrome/browser/resources/settings/chromeos/combined_search_handler.js +++ b/chrome/browser/resources/settings/chromeos/combined_search_handler.js
@@ -42,9 +42,7 @@ const [settingsResponse, personalizationResponse] = await Promise.all([ getSettingsSearchHandler().search( query, maxNumResults, parentResultBehavior), - loadTimeData.getBoolean('isPersonalizationHubEnabled') ? - getPersonalizationSearchHandler().search(query, maxNumResults) : - {results: []}, + getPersonalizationSearchHandler().search(query, maxNumResults), ]); return { results: mergeResults(
diff --git a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.ts b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.ts index 9a1e702..4080287 100644 --- a/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.ts +++ b/chrome/browser/resources/settings/chromeos/os_settings_search_box/os_settings_search_box.ts
@@ -17,7 +17,6 @@ import {CrToolbarSearchFieldElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js'; import {I18nMixin, I18nMixinInterface} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; -import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {String16} from 'chrome://resources/mojo/mojo/public/mojom/base/string16.mojom-webui.js'; import {IronListElement} from 'chrome://resources/polymer/v3_0/iron-list/iron-list.js'; import {afterNextRender, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -238,14 +237,12 @@ this.searchRequestCount_); }); - if (loadTimeData.getBoolean('isPersonalizationHubEnabled')) { - // Observe changes to personalization search results. - this.personalizationSearchResultObserverReceiver_ = - new PersonalizationSearchResultsObserverReceiver(this); - getPersonalizationSearchHandler().addObserver( - this.personalizationSearchResultObserverReceiver_.$ - .bindNewPipeAndPassRemote()); - } + // Observe changes to personalization search results. + this.personalizationSearchResultObserverReceiver_ = + new PersonalizationSearchResultsObserverReceiver(this); + getPersonalizationSearchHandler().addObserver( + this.personalizationSearchResultObserverReceiver_.$ + .bindNewPipeAndPassRemote()); // Observe for availability changes of settings results. this.settingsSearchResultObserverReceiver_ = @@ -258,12 +255,10 @@ override disconnectedCallback() { super.disconnectedCallback(); - if (loadTimeData.getBoolean('isPersonalizationHubEnabled')) { - assert( - this.personalizationSearchResultObserverReceiver_, - 'Personalization search observer should be initialized'); - this.personalizationSearchResultObserverReceiver_.$.close(); - } + assert( + this.personalizationSearchResultObserverReceiver_, + 'Personalization search observer should be initialized'); + this.personalizationSearchResultObserverReceiver_.$.close(); assert( this.settingsSearchResultObserverReceiver_,
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html index 2152aa0..015c706 100644 --- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html +++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.html
@@ -1,13 +1,11 @@ <style include="settings-shared"></style> <settings-animated-pages id="pages" section="personalization"> <div route-path="default"> - <template is="dom-if" if="[[isPersonalizationHubEnabled_]]"> - <cr-link-row class="hr" id="personalizationHubButton" - label="$i18n{personalizationHubTitle}" - sub-label="$i18n{personalizationHubSubtitle}" external - on-click="openPersonalizationHub_"> - </cr-link-row> - </template> + <cr-link-row class="hr" id="personalizationHubButton" + label="$i18n{personalizationHubTitle}" + sub-label="$i18n{personalizationHubSubtitle}" external + on-click="openPersonalizationHub_"> + </cr-link-row> </div> </settings-animated-pages>
diff --git a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts index bdc98f8..9138f8c 100644 --- a/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts +++ b/chrome/browser/resources/settings/chromeos/personalization_page/personalization_page.ts
@@ -15,8 +15,6 @@ import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {loadTimeData} from '../../i18n_setup.js'; - import {PersonalizationHubBrowserProxy, PersonalizationHubBrowserProxyImpl} from './personalization_hub_browser_proxy.js'; import {getTemplate} from './personalization_page.html.js'; @@ -32,19 +30,6 @@ return getTemplate(); } - static get properties() { - return { - isPersonalizationHubEnabled_: { - type: Boolean, - value() { - return loadTimeData.getBoolean('isPersonalizationHubEnabled'); - }, - readOnly: true, - }, - }; - } - - private isPersonalizationHubEnabled_: boolean; private personalizationHubBrowserProxy_: PersonalizationHubBrowserProxy; constructor() {
diff --git a/chrome/browser/resources/settings/chromeos/personalization_search_handler.js b/chrome/browser/resources/settings/chromeos/personalization_search_handler.js index 3191160..bd35b00 100644 --- a/chrome/browser/resources/settings/chromeos/personalization_search_handler.js +++ b/chrome/browser/resources/settings/chromeos/personalization_search_handler.js
@@ -31,9 +31,6 @@ */ export function getPersonalizationSearchHandler() { assert( - loadTimeData.getBoolean('isPersonalizationHubEnabled'), - 'personalization hub feature is required'); - assert( !loadTimeData.getBoolean('isGuest'), 'guest must not request personalization search handler'); if (!personalizationSearchHandler) {
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html index 085870e..43aaa53 100644 --- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html +++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.html
@@ -48,7 +48,6 @@ </cr-lazy-render> <template is="dom-if" if="[[showDialog_]]" restamp> <tab-discard-exception-dialog rule="[[selectedRule_]]" - on-cancel="onDialogCancel_" on-close="onDialogClose_" - on-submit="onDialogSubmit_"> + on-close="onDialogClose_" on-submit="onDialogSubmit_"> </tab-discard-exception-dialog> </template>
diff --git a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts index d9fb381..dd35e12 100644 --- a/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts +++ b/chrome/browser/resources/settings/performance_page/tab_discard_exception_list.ts
@@ -94,6 +94,7 @@ } private onAddClick_() { + this.selectedRule_ = ''; this.showDialog_ = true; } @@ -108,10 +109,6 @@ this.$.menu.get().close(); } - private onDialogCancel_() { - this.selectedRule_ = ''; - } - private onDialogClose_() { this.showDialog_ = false; } @@ -130,7 +127,6 @@ TAB_DISCARD_EXCEPTIONS_PREF, this.selectedRule_, newRule); } } - this.selectedRule_ = ''; return; } // add dialog @@ -139,7 +135,6 @@ private onDeleteClick_() { this.deletePrefListItem(TAB_DISCARD_EXCEPTIONS_PREF, this.selectedRule_); - this.selectedRule_ = ''; this.$.menu.get().close(); }
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc index 3dd26cd..0f7a3cf3 100644 --- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc +++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.cc
@@ -54,17 +54,22 @@ PreferenceValidationDelegate::PreferenceValidationDelegate( Profile* profile, std::unique_ptr<IncidentReceiver> incident_receiver) - : profile_(profile), incident_receiver_(std::move(incident_receiver)) {} - -PreferenceValidationDelegate::~PreferenceValidationDelegate() { + : profile_(profile), incident_receiver_(std::move(incident_receiver)) { + profile_observation_.Observe(profile); } +PreferenceValidationDelegate::~PreferenceValidationDelegate() = default; + void PreferenceValidationDelegate::OnAtomicPreferenceValidation( const std::string& pref_path, absl::optional<base::Value> value, ValueState value_state, ValueState external_validation_value_state, bool is_personal) { + // profile_ can be null if it is already destroyed during shutdown. + if (!profile_) { + return; + } TPIncident_ValueState proto_value_state = MapValueState(value_state, external_validation_value_state); if (proto_value_state != TPIncident::UNKNOWN) { @@ -119,4 +124,9 @@ } } +void PreferenceValidationDelegate::OnProfileWillBeDestroyed(Profile* profile) { + profile_ = nullptr; + profile_observation_.Reset(); +} + } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.h b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.h index f0e315ff..0aef802a 100644 --- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.h +++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate.h
@@ -8,12 +8,13 @@ #include <memory> #include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" #include "base/values.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_observer.h" #include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" -class Profile; - namespace safe_browsing { class IncidentReceiver; @@ -22,7 +23,8 @@ // for preference validation failures. The profile for which the delegate // operates must outlive the delegate itself. class PreferenceValidationDelegate - : public prefs::mojom::TrackedPreferenceValidationDelegate { + : public prefs::mojom::TrackedPreferenceValidationDelegate, + public ProfileObserver { public: PreferenceValidationDelegate( Profile* profile, @@ -52,8 +54,13 @@ external_validation_value_state, bool is_personal) override; + // ProfileManagerObserver methods: + void OnProfileWillBeDestroyed(Profile* profile) override; + raw_ptr<Profile> profile_; std::unique_ptr<IncidentReceiver> incident_receiver_; + + base::ScopedObservation<Profile, ProfileObserver> profile_observation_{this}; }; } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc index 3fac0cf3..8d3c5e4 100644 --- a/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc +++ b/chrome/browser/safe_browsing/incident_reporting/preference_validation_delegate_unittest.cc
@@ -17,7 +17,11 @@ #include "base/values.h" #include "chrome/browser/safe_browsing/incident_reporting/incident.h" #include "chrome/browser/safe_browsing/incident_reporting/mock_incident_receiver.h" +#include "chrome/test/base/testing_browser_process.h" +#include "chrome/test/base/testing_profile.h" +#include "chrome/test/base/testing_profile_manager.h" #include "components/safe_browsing/core/common/proto/csd.pb.h" +#include "content/public/test/browser_task_environment.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -37,20 +41,27 @@ // incidents. Tests can push data to the delegate and verify that the test // instance was provided with the expected data. class PreferenceValidationDelegateTest : public testing::Test { + public: + PreferenceValidationDelegateTest() + : testing_profile_manager_(TestingBrowserProcess::GetGlobal()) {} + protected: typedef std::vector<std::unique_ptr<safe_browsing::Incident>> IncidentVector; void SetUp() override { testing::Test::SetUp(); + ASSERT_TRUE(testing_profile_manager_.SetUp()); + Profile* profile = + testing_profile_manager_.CreateTestingProfile("profile 1"); invalid_keys_.push_back(std::string("one")); invalid_keys_.push_back(std::string("two")); external_validation_invalid_keys_.push_back(std::string("three")); std::unique_ptr<safe_browsing::MockIncidentReceiver> receiver( new NiceMock<safe_browsing::MockIncidentReceiver>()); - ON_CALL(*receiver, DoAddIncidentForProfile(IsNull(), _)) + ON_CALL(*receiver, DoAddIncidentForProfile(_, _)) .WillByDefault(WithArg<1>(TakeIncidentToVector(&incidents_))); instance_ = std::make_unique<safe_browsing::PreferenceValidationDelegate>( - nullptr, std::move(receiver)); + profile, std::move(receiver)); } static void ExpectValueStatesEquate( @@ -92,10 +103,12 @@ } } + content::BrowserTaskEnvironment task_environment_; IncidentVector incidents_; std::vector<std::string> invalid_keys_; std::vector<std::string> external_validation_invalid_keys_; std::unique_ptr<prefs::mojom::TrackedPreferenceValidationDelegate> instance_; + TestingProfileManager testing_profile_manager_; }; // Tests that a NULL value results in an incident with no value. @@ -172,6 +185,14 @@ incident->tracked_preference().atomic_value()); } +TEST_P(PreferenceValidationDelegateValues, OnProfileDestroyed) { + testing_profile_manager_.DeleteTestingProfile("profile 1"); + instance_->OnAtomicPreferenceValidation( + kPrefPath, MakeValue(value_type_), ValueState::CLEARED, + ValueState::UNSUPPORTED, false /* is_personal */); + ASSERT_EQ(0U, incidents_.size()); +} + INSTANTIATE_TEST_SUITE_P( Values, PreferenceValidationDelegateValues,
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarDataProvider.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarDataProvider.java index c1de35f..7e28cdf7 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarDataProvider.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarDataProvider.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.components.security_state.ConnectionSecurityLevel; +import org.chromium.url.GURL; /** * Interface defining a provider for data needed by the {@link LocationBar}. @@ -56,6 +57,13 @@ @NonNull String getCurrentUrl(); + /** + * Returns the url of the current tab, represented as a GURL. Returns an empty GURL when there + * is no tab. + */ + @NonNull + GURL getCurrentGurl(); + /** Returns the delegate for the NewTabPage shown for the current tab. */ @NonNull NewTabPageDelegate getNewTabPageDelegate();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/ShadowUrlBarData.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/ShadowUrlBarData.java index ce65f701..94ade4d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/ShadowUrlBarData.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/ShadowUrlBarData.java
@@ -7,6 +7,8 @@ import org.robolectric.annotation.Implementation; import org.robolectric.annotation.Implements; +import org.chromium.url.GURL; + /** * Shadow of the UrlBarData, that permits stubbing/mocking static methods for testing. */ @@ -15,7 +17,7 @@ public static boolean sShouldShowNextUrl = true; @Implementation - public static boolean shouldShowUrl(String url, boolean isIncognito) { + public static boolean shouldShowUrl(GURL gurl, boolean isIncognito) { boolean res = sShouldShowNextUrl; sShouldShowNextUrl = true; return res;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java index dda6dcb7..72e64a3 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarData.java
@@ -15,6 +15,7 @@ import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.content_public.common.ContentUrlConstants; +import org.chromium.url.GURL; import java.util.HashSet; @@ -62,8 +63,8 @@ } /** Returns whether supplied URL should be shown in the Omnibox/Suggestions list. */ - public static boolean shouldShowUrl(String url, boolean isIncognito) { - return !(NativePage.isNativePageUrl(url, isIncognito) || UrlUtilities.isNTPUrl(url)); + public static boolean shouldShowUrl(GURL gurl, boolean isIncognito) { + return !(NativePage.isNativePageUrl(gurl, isIncognito) || UrlUtilities.isNTPUrl(gurl)); } public static UrlBarData forUrlAndText(
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java index 5b99e29c..29a4cbc 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/basic/BasicSuggestionProcessor.java
@@ -115,7 +115,7 @@ if (!isSearchSuggestion) { if (!suggestion.getUrl().isEmpty() - && UrlBarData.shouldShowUrl(suggestion.getUrl().getSpec(), false)) { + && UrlBarData.shouldShowUrl(suggestion.getUrl(), false)) { SuggestionSpannable str = new SuggestionSpannable(suggestion.getDisplayText()); urlHighlighted = applyHighlightToMatchRegions( str, suggestion.getDisplayTextClassifications());
diff --git a/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager.java b/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager.java index 18aa190..a31dd90 100644 --- a/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager.java +++ b/chrome/browser/ui/android/searchactivityutils/java/src/org/chromium/chrome/browser/ui/searchactivityutils/SearchActivityPreferencesManager.java
@@ -48,7 +48,10 @@ public static final class SearchActivityPreferences { /** Name of the Default Search Engine. */ public final @Nullable String searchEngineName; - /** URL of the Default Search Engine. */ + /** + * URL of the Default Search Engine. + * TODO(https://crbug.com/1370563): migrate this to GURL. + */ public final @Nullable String searchEngineUrl; /** Whether Voice Search functionality is available. */ public final boolean voiceSearchAvailable;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java index f18027521..f7f8946d 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -283,17 +283,19 @@ @Override // TODO(https://crbug.com/1305374): migrate to GURL. + @Deprecated public String getCurrentUrl() { - // Provide NTP url instead of most recent tab url for searches in overview mode (when Start - // Surface is enabled). - String url = getTab() != null && getTab().isInitialized() - ? getTab().getUrl().getSpec().trim() - : ""; + return getCurrentGurl().getSpec().trim(); + } + + @Override + public GURL getCurrentGurl() { if (isInOverviewAndShowingOmnibox()) { - return UrlConstants.NTP_URL; + return UrlConstants.ntpGurl(); } - return url; + Tab tab = getTab(); + return tab != null && tab.isInitialized() ? tab.getUrl() : GURL.emptyGURL(); } public void notifyUrlChanged() { @@ -324,15 +326,16 @@ // Part of scroll jank investigation http://crbug.com/905461. Will remove TraceEvent after // the investigation is complete. try (TraceEvent te = TraceEvent.scoped("LocationBarModel.getUrlBarData")) { - String url = getCurrentUrl(); if (!hasTab()) { return UrlBarData.EMPTY; } - if (!UrlBarData.shouldShowUrl(url, isIncognito())) { + GURL gurl = getCurrentGurl(); + if (!UrlBarData.shouldShowUrl(gurl, isIncognito())) { return UrlBarData.EMPTY; } + String url = gurl.getSpec().trim(); String formattedUrl = getFormattedFullUrl(); if (mTab.isFrozen()) return buildUrlBarData(url, formattedUrl);
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java index fdc8a20..427776f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarDataProvider.java
@@ -12,6 +12,7 @@ import org.chromium.chrome.browser.omnibox.UrlBarData; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.url.GURL; /** * Defines the data that is exposed to properly render the Toolbar. @@ -24,11 +25,18 @@ Tab getTab(); /** - * @return The current url for the current tab. Returns empty string when there is no tab. + * Returns The url of the current tab. Returns empty string when there is no tab. */ @NonNull String getCurrentUrl(); + /** + * Returns The url of the current tab, represented as a GURL. Returns an empty GURL when there + * is no tab. + */ + @NonNull + GURL getCurrentGurl(); + /** Returns the delegate for the NewTabPage shown for the current tab. */ @NonNull NewTabPageDelegate getNewTabPageDelegate();
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java index 6a3cca8..4648652 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/StartSurfaceToolbarCoordinator.java
@@ -15,7 +15,6 @@ import org.chromium.base.Callback; import org.chromium.base.CallbackController; -import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.supplier.BooleanSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.chrome.browser.device.DeviceClassManager; @@ -61,6 +60,7 @@ private OnLongClickListener mTabSwitcherLongClickListener; private MenuButtonCoordinator mMenuButtonCoordinator; private CallbackController mCallbackController = new CallbackController(); + private boolean mIsNativeInitialized; StartSurfaceToolbarCoordinator(ViewStub startSurfaceToolbarStub, UserEducationHelper userEducationHelper, ButtonDataProvider identityDiscController, @@ -214,6 +214,7 @@ } void initLogoWithNative() { + mIsNativeInitialized = true; mToolbarMediator.initLogoWithNative(); } @@ -229,8 +230,7 @@ * @return Whether or not toolbar phone layout view should be shown. */ boolean shouldShowRealSearchBox() { - boolean isBigLogoShownInContent = !mShouldCreateLogoInToolbar - && LibraryLoader.getInstance().isInitialized() + boolean isBigLogoShownInContent = !mShouldCreateLogoInToolbar && mIsNativeInitialized && TemplateUrlServiceFactory.get().doesDefaultSearchEngineHaveLogo(); // This value should be equal to // |fakeSearchBoxToRealSearchBoxTop + realVerticalMargin| in
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java index 07f6ad87..3650780 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarLayout.java
@@ -60,6 +60,7 @@ import org.chromium.chrome.browser.ui.theme.BrandedColorScheme; import org.chromium.ui.UiUtils; import org.chromium.ui.base.ViewUtils; +import org.chromium.url.GURL; /** * Layout class that contains the base shared logic for manipulating the toolbar component. For @@ -279,6 +280,11 @@ } @Override + public GURL getCurrentGurl() { + return GURL.emptyGURL(); + } + + @Override public UrlBarData getUrlBarData() { return UrlBarData.EMPTY; }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 4176e7a2..2c461d81 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -1068,9 +1068,9 @@ // LocationBarMediator#getUrlBarTranslationXForToolbarAnimation() for implementation // details. if (SearchEngineLogoUtils.getInstance().shouldShowSearchEngineLogo(isIncognito)) { - mUrlBar.setTranslationX(mLocationBar.getUrlBarTranslationXForToolbarAnimation( - mUrlExpansionFraction, - UrlUtilities.isCanonicalizedNTPUrl(getToolbarDataProvider().getCurrentUrl()))); + mUrlBar.setTranslationX( + mLocationBar.getUrlBarTranslationXForToolbarAnimation(mUrlExpansionFraction, + UrlUtilities.isNTPUrl(getToolbarDataProvider().getCurrentGurl()))); } else { mUrlBar.setTranslationX(0); } @@ -1705,7 +1705,7 @@ } private boolean hideShadowForRegularNtpTextureCapture() { - return !isIncognito() && UrlUtilities.isNTPUrl(getToolbarDataProvider().getCurrentUrl()) + return !isIncognito() && UrlUtilities.isNTPUrl(getToolbarDataProvider().getCurrentGurl()) && mNtpSearchBoxScrollFraction < 1.f; } @@ -2224,7 +2224,7 @@ } private boolean hideShadowForIncognitoNtp() { - return isIncognito() && UrlUtilities.isNTPUrl(getToolbarDataProvider().getCurrentUrl()); + return isIncognito() && UrlUtilities.isNTPUrl(getToolbarDataProvider().getCurrentGurl()); } private boolean hideShadowForInterstitial() {
diff --git a/chrome/browser/ui/ash/network/network_portal_notification_controller.cc b/chrome/browser/ui/ash/network/network_portal_notification_controller.cc index ed855dd..602c78a 100644 --- a/chrome/browser/ui/ash/network/network_portal_notification_controller.cc +++ b/chrome/browser/ui/ash/network/network_portal_notification_controller.cc
@@ -96,20 +96,23 @@ scoped_refptr<message_center::NotificationDelegate> delegate, message_center::NotifierId notifier_id, bool is_wifi) { - return CreateSystemNotification( - message_center::NOTIFICATION_TYPE_SIMPLE, - NetworkPortalNotificationController::kNotificationId, - l10n_util::GetStringUTF16( - is_wifi ? IDS_PORTAL_DETECTION_NOTIFICATION_TITLE_WIFI - : IDS_PORTAL_DETECTION_NOTIFICATION_TITLE_WIRED), - l10n_util::GetStringFUTF16( - is_wifi ? IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIFI - : IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIRED, - base::UTF8ToUTF16(network->name())), - /*display_source=*/std::u16string(), /*origin_url=*/GURL(), notifier_id, - message_center::RichNotificationData(), std::move(delegate), - kNotificationCaptivePortalIcon, - message_center::SystemNotificationWarningLevel::WARNING); + std::unique_ptr<message_center::Notification> notification = + CreateSystemNotification( + message_center::NOTIFICATION_TYPE_SIMPLE, + NetworkPortalNotificationController::kNotificationId, + l10n_util::GetStringUTF16( + is_wifi ? IDS_PORTAL_DETECTION_NOTIFICATION_TITLE_WIFI + : IDS_PORTAL_DETECTION_NOTIFICATION_TITLE_WIRED), + l10n_util::GetStringFUTF16( + is_wifi ? IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIFI + : IDS_PORTAL_DETECTION_NOTIFICATION_MESSAGE_WIRED, + base::UTF8ToUTF16(network->name())), + /*display_source=*/std::u16string(), /*origin_url=*/GURL(), + notifier_id, message_center::RichNotificationData(), + std::move(delegate), kNotificationCaptivePortalIcon, + message_center::SystemNotificationWarningLevel::WARNING); + notification->set_never_timeout(true); + return notification; } void CloseNotification() {
diff --git a/chrome/browser/ui/browser_browsertest.cc b/chrome/browser/ui/browser_browsertest.cc index 71c9bc3..abad0db 100644 --- a/chrome/browser/ui/browser_browsertest.cc +++ b/chrome/browser/ui/browser_browsertest.cc
@@ -1192,13 +1192,7 @@ // Open with --app-id=<id>, and see that an application window opens by default. #if !BUILDFLAG(IS_CHROMEOS_ASH) -// TODO(crbug.com/1358181): Flaky on MacOS. -#if BUILDFLAG(IS_MAC) -#define MAYBE_AppIdSwitch DISABLED_AppIdSwitch -#else -#define MAYBE_AppIdSwitch AppIdSwitch -#endif -IN_PROC_BROWSER_TEST_F(BrowserTest, MAYBE_AppIdSwitch) { +IN_PROC_BROWSER_TEST_F(BrowserTest, AppIdSwitch) { base::HistogramTester tester; ASSERT_TRUE(embedded_test_server()->Start());
diff --git a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm index 251a0cf..5f175fb 100644 --- a/chrome/browser/ui/cocoa/applescript/apple_event_util.mm +++ b/chrome/browser/ui/cocoa/applescript/apple_event_util.mm
@@ -107,7 +107,7 @@ case base::Value::Type::LIST: { descriptor = [NSAppleEventDescriptor listDescriptor]; - for (const auto& item : value->GetListDeprecated()) { + for (const auto& item : value->GetList()) { AppendValueToListDescriptor(descriptor, item); } break;
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm index 4a7e3c16..891a8dd 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm
@@ -203,6 +203,16 @@ browser_frame_observation_.Observe(browser_view_->GetWidget()); overlay_widget_observation_.Observe(browser_view_->overlay_widget()); + // Capture the overlay content view before enablement. Once enabled the view + // is moved to an AppKit window leaving us otherwise without a reference. + NSView* content_view = browser_view_->overlay_widget() + ->GetNativeWindow() + .GetNativeNSWindow() + .contentView; + browser_view_->overlay_widget()->SetNativeWindowProperty( + views::NativeWidgetMacNSWindowHost::kImmersiveContentNSView, + content_view); + views::NativeWidgetMacNSWindowHost* overlay_host = views::NativeWidgetMacNSWindowHost::GetFromNativeWindow( browser_view_->overlay_widget()->GetNativeWindow()); @@ -237,6 +247,8 @@ // Rollback the view shuffling from enablement. browser_view_->overlay_widget()->Hide(); ns_window_mojo_->DisableImmersiveFullscreen(); + browser_view_->overlay_widget()->SetNativeWindowProperty( + views::NativeWidgetMacNSWindowHost::kImmersiveContentNSView, nullptr); menu_lock_.reset(); focus_lock_.reset(); @@ -281,13 +293,6 @@ void ImmersiveModeControllerMac::FullScreenOverlayViewWillAppear() { SetMenuRevealed(true); - NSView* content_view = browser_view_->overlay_widget() - ->GetNativeWindow() - .GetNativeNSWindow() - .contentView; - browser_view_->overlay_widget()->SetNativeWindowProperty( - views::NativeWidgetMacNSWindowHost::kImmersiveContentNSView, - content_view); } void ImmersiveModeControllerMac::OnWillChangeFocus(views::View* focused_before,
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc index a8e83ed8..2f66664 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_unittest.cc
@@ -593,11 +593,11 @@ // Verify labels match the settings on the PermissionInfoList. EXPECT_EQ(u"Notifications", api_->GetPermissionLabelTextAt(0)); - PageInfo::PermissionInfo window_placement_permission; - window_placement_permission.type = ContentSettingsType::WINDOW_PLACEMENT; - window_placement_permission.setting = CONTENT_SETTING_ALLOW; - window_placement_permission.default_setting = CONTENT_SETTING_ASK; - list.push_back(window_placement_permission); + PageInfo::PermissionInfo window_management_permission; + window_management_permission.type = ContentSettingsType::WINDOW_MANAGEMENT; + window_management_permission.setting = CONTENT_SETTING_ALLOW; + window_management_permission.default_setting = CONTENT_SETTING_ASK; + list.push_back(window_management_permission); num_expected_children = list.size(); api_->SetPermissionInfo(list);
diff --git a/chrome/browser/ui/views/page_info/page_info_view_factory.cc b/chrome/browser/ui/views/page_info/page_info_view_factory.cc index a80e0d3..83cb845 100644 --- a/chrome/browser/ui/views/page_info/page_info_view_factory.cc +++ b/chrome/browser/ui/views/page_info/page_info_view_factory.cc
@@ -320,7 +320,7 @@ case ContentSettingsType::AR: icon = &vector_icons::kVrHeadsetIcon; break; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: icon = &vector_icons::kSelectWindowIcon; break; case ContentSettingsType::LOCAL_FONTS:
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc index f004762..9ffc173 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.cc +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.cc
@@ -834,12 +834,6 @@ return; } - // Check `fetched_icons_` to avoid fetching the same icon more than once. - if (fetched_icons_.count(idp_metadata.brand_icon_url)) - return; - - fetched_icons_.insert(idp_metadata.brand_icon_url); - image_view->FetchImage(idp_metadata.brand_icon_url, *image_fetcher_); }
diff --git a/chrome/browser/ui/views/webid/account_selection_bubble_view.h b/chrome/browser/ui/views/webid/account_selection_bubble_view.h index 0573f3c..21ea7e60 100644 --- a/chrome/browser/ui/views/webid/account_selection_bubble_view.h +++ b/chrome/browser/ui/views/webid/account_selection_bubble_view.h
@@ -168,9 +168,6 @@ // View containing the continue button. raw_ptr<views::MdTextButton> continue_button_ = nullptr; - // The icon URLs which have been fetched. - std::set<GURL> fetched_icons_; - // Observes events on AccountSelectionBubbleView. raw_ptr<Observer> observer_{nullptr};
diff --git a/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc b/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc index cebd770..77e55a4b 100644 --- a/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc +++ b/chrome/browser/ui/webui/certificate_provisioning_ui_handler_unittest.cc
@@ -94,7 +94,7 @@ return; } if (value->is_list()) { - for (base::Value& child : value->GetListDeprecated()) + for (base::Value& child : value->GetList()) FormatDictRecurse(&child, messages); return; } @@ -122,7 +122,7 @@ // |profile_id|. base::Value GetByProfileId(const base::Value& all_processes, const std::string& profile_id) { - for (const base::Value& process : all_processes.GetListDeprecated()) { + for (const base::Value& process : all_processes.GetList()) { if (profile_id == *process.GetDict().FindString("certProfileId")) return process.Clone(); } @@ -183,7 +183,7 @@ if (!out_profile_ids) return; out_profile_ids->clear(); - for (const base::Value& process : out_all_processes->GetListDeprecated()) { + for (const base::Value& process : out_all_processes->GetList()) { const std::string* profile_id = process.GetDict().FindString("certProfileId"); ASSERT_TRUE(profile_id); @@ -227,7 +227,7 @@ base::Value all_processes; ASSERT_NO_FATAL_FAILURE(RefreshCertProvisioningProcesses( &all_processes, /*out_profile_ids=*/nullptr)); - EXPECT_TRUE(all_processes.GetListDeprecated().empty()); + EXPECT_TRUE(all_processes.GetList().empty()); } TEST_F(CertificateProvisioningUiHandlerTest, HasOneProcess) {
diff --git a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.cc b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.cc index 27fc11b..d5526899 100644 --- a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.cc +++ b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.cc
@@ -80,6 +80,11 @@ return; } +const kids::platform::parentaccess::client::proto::ParentAccessToken* +ParentAccessUIHandlerImpl::GetParentAccessTokenForTest() { + return parent_access_token_.get(); +} + void ParentAccessUIHandlerImpl::OnParentAccessCallbackReceived( const std::string& encoded_parent_access_callback_proto, OnParentAccessCallbackReceivedCallback callback) { @@ -113,10 +118,19 @@ switch (parent_access_callback.callback_case()) { case kids::platform::parentaccess::client::proto::ParentAccessCallback:: CallbackCase::kOnParentVerified: - message->type = parent_access_ui::mojom::ParentAccessServerMessageType:: kParentVerified; + if (parent_access_callback.on_parent_verified() + .verification_proof_case() == + kids::platform::parentaccess::client::proto::OnParentVerified:: + VerificationProofCase::kParentAccessToken) { + DCHECK(!parent_access_token_); + parent_access_token_ = std::make_unique< + kids::platform::parentaccess::client::proto::ParentAccessToken>(); + parent_access_token_->CopyFrom( + parent_access_callback.on_parent_verified().parent_access_token()); + } std::move(callback).Run(std::move(message)); break; default:
diff --git a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.h b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.h index f287f54..751ba6f 100644 --- a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.h +++ b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.h
@@ -8,6 +8,7 @@ #include <memory> #include "base/memory/weak_ptr.h" +#include "chrome/browser/ui/webui/chromeos/parent_access/parent_access_callback.pb.h" #include "chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui.mojom.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -50,6 +51,10 @@ OnParentAccessCallbackReceivedCallback callback) override; void GetParentAccessParams(GetParentAccessParamsCallback callback) override; + // Returns nullptr if the parent was not verified. + const kids::platform::parentaccess::client::proto::ParentAccessToken* + GetParentAccessTokenForTest(); + private: void OnAccessTokenFetchComplete(GetOAuthTokenCallback callback, GoogleServiceAuthError error, @@ -61,6 +66,11 @@ mojo::Receiver<parent_access_ui::mojom::ParentAccessUIHandler> receiver_; + // The Parent Access Token. Only set if the parent was verified. + std::unique_ptr< + kids::platform::parentaccess::client::proto::ParentAccessToken> + parent_access_token_; + base::WeakPtrFactory<ParentAccessUIHandlerImpl> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl_browsertest.cc b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl_browsertest.cc index d0906c7..0987997 100644 --- a/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl_browsertest.cc +++ b/chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl_browsertest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include <string> + #include "chrome/browser/ui/webui/chromeos/parent_access/parent_access_ui_handler_impl.h" #include "base/base64.h" @@ -118,6 +120,14 @@ })); } +MATCHER_P(EqualsProto, + message, + "Match a proto Message equal to the matcher's argument.") { + std::string expected_serialized = message.SerializeAsString(); + std::string actual_serialized = arg.SerializeAsString(); + return expected_serialized == actual_serialized; +} + // Verifies that the ParentVerified status is handled correctly. IN_PROC_BROWSER_TEST_F(ParentAccessUIHandlerImplBrowserTest, ParentVerifiedParsed) { @@ -154,17 +164,25 @@ base::Base64Encode(parent_access_callback.SerializeAsString(), &encoded_parent_access_callback); + base::RunLoop run_loop; handler->OnParentAccessCallbackReceived( encoded_parent_access_callback, base::BindOnce( - [](parent_access_ui::mojom::ParentAccessServerMessagePtr message) + [](base::OnceClosure quit_closure, + parent_access_ui::mojom::ParentAccessServerMessagePtr message) -> void { // Verify the Parent Verified callback is parsed. - // TODO(b/241166361): Verify token value and expire time. EXPECT_EQ(parent_access_ui::mojom::ParentAccessServerMessageType:: kParentVerified, message->type); - })); + std::move(quit_closure).Run(); + }, + run_loop.QuitClosure())); + + run_loop.Run(); + + // Verify the Parent Access Token was stored. + EXPECT_THAT(*pat, EqualsProto(*(handler->GetParentAccessTokenForTest()))); } // Verifies that the ConsentDeclined status is ignored.
diff --git a/chrome/browser/ui/webui/cr_components/history_clusters/OWNERS b/chrome/browser/ui/webui/cr_components/history_clusters/OWNERS new file mode 100644 index 0000000..d03b432 --- /dev/null +++ b/chrome/browser/ui/webui/cr_components/history_clusters/OWNERS
@@ -0,0 +1 @@ +file://components/history_clusters/OWNERS
diff --git a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc index 75e77fb..8f9d2db 100644 --- a/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc +++ b/chrome/browser/ui/webui/cr_components/history_clusters/history_clusters_util.cc
@@ -38,7 +38,11 @@ static constexpr webui::LocalizedString kHistoryClustersStrings[] = { {"actionMenuDescription", IDS_HISTORY_CLUSTERS_ACTION_MENU_DESCRIPTION}, + {"cancel", IDS_CANCEL}, {"clearSearch", IDS_CLEAR_SEARCH}, + {"deleteConfirm", + IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_CONFIRM_BUTTON}, + {"deleteWarning", IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_WARNING}, {"disableHistoryClusters", IDS_HISTORY_CLUSTERS_DISABLE_MENU_ITEM_LABEL}, {"enableHistoryClusters", IDS_HISTORY_CLUSTERS_ENABLE_MENU_ITEM_LABEL}, {"historyClustersTabLabel", IDS_HISTORY_CLUSTERS_JOURNEYS_TAB_LABEL}, @@ -51,6 +55,7 @@ {"removeAllFromHistory", IDS_HISTORY_CLUSTERS_REMOVE_ALL_ITEMS}, {"removeFromHistory", IDS_HISTORY_CLUSTERS_REMOVE_PAGE}, {"removeFromHistoryToast", IDS_HISTORY_CLUSTERS_REMOVE_ITEM_TOAST}, + {"removeSelected", IDS_HISTORY_CLUSTERS_REMOVE_SELECTED_ITEMS}, {"savedInTabGroup", IDS_HISTORY_CLUSTERS_SAVED_IN_TABGROUP_LABEL}, {"searchPrompt", IDS_HISTORY_CLUSTERS_SEARCH_PROMPT}, {"toggleButtonLabelLess", IDS_HISTORY_CLUSTERS_SHOW_LESS_BUTTON_LABEL},
diff --git a/chrome/browser/ui/webui/help/help_utils_chromeos.cc b/chrome/browser/ui/webui/help/help_utils_chromeos.cc index 34aab85..2cccfb2 100644 --- a/chrome/browser/ui/webui/help/help_utils_chromeos.cc +++ b/chrome/browser/ui/webui/help/help_utils_chromeos.cc
@@ -32,7 +32,7 @@ if (!types_value) return default_update_over_cellular_allowed; CHECK(types_value->is_list()); - const auto& list = types_value->GetListDeprecated(); + const auto& list = types_value->GetList(); for (size_t i = 0; i < list.size(); ++i) { if (!list[i].is_int()) { LOG(WARNING) << "Can't parse connection type #" << i;
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 c160b21..583cbc4 100644 --- a/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc +++ b/chrome/browser/ui/webui/history_clusters/history_clusters_handler.cc
@@ -435,7 +435,7 @@ void HistoryClustersHandler::OpenVisitUrlsInTabGroup( std::vector<mojom::URLVisitPtr> visits) { - const auto* browser = chrome::FindTabbedBrowser(profile_, false); + auto* browser = chrome::FindTabbedBrowser(profile_, false); if (!browser) { return; } @@ -451,19 +451,12 @@ auto* model = browser->tab_strip_model(); std::vector<int> tab_indices; tab_indices.reserve(visits.size()); - auto* opener = web_contents_.get(); for (const auto& visit_ptr : visits) { - auto* opened_web_contents = opener->OpenURL( + auto* opened_web_contents = browser->OpenURL( content::OpenURLParams(visit_ptr->normalized_url, content::Referrer(), WindowOpenDisposition::NEW_BACKGROUND_TAB, ui::PAGE_TRANSITION_AUTO_BOOKMARK, false)); - // The url may have opened a new window or clobbered the current one. - // Replace `opener` to be sure. `opened_web_contents` may be null in tests. - if (opened_web_contents) { - opener = opened_web_contents; - } - // Only add those tabs to a new group that actually opened in this browser. const int tab_index = model->GetIndexOfWebContents(opened_web_contents); if (tab_index != TabStripModel::kNoTab) {
diff --git a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc index 820cc3e..bda0425f 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_browsertest.cc
@@ -345,15 +345,14 @@ absl::optional<base::Value> value_ptr = base::JSONReader::Read(json); ASSERT_TRUE(value_ptr); ASSERT_TRUE(value_ptr->is_list()); - base::Value::ConstListView actual_policies = value_ptr->GetListDeprecated(); + const base::Value::List& actual_policies = value_ptr->GetList(); // Verify that the cells contain the expected strings for all policies. ASSERT_EQ(expected_policies.size(), actual_policies.size()); for (size_t i = 0; i < expected_policies.size(); ++i) { const std::vector<std::string> expected_policy = expected_policies[i]; ASSERT_TRUE(actual_policies[i].is_list()); - base::Value::ConstListView actual_policy = - actual_policies[i].GetListDeprecated(); + const base::Value::List& actual_policy = actual_policies[i].GetList(); ASSERT_EQ(expected_policy.size(), actual_policy.size()); for (size_t j = 0; j < expected_policy.size(); ++j) { const std::string* value = actual_policy[j].GetIfString();
diff --git a/chrome/browser/ui/webui/settings/ash/main_section.cc b/chrome/browser/ui/webui/settings/ash/main_section.cc index 44031bc..0466155 100644 --- a/chrome/browser/ui/webui/settings/ash/main_section.cc +++ b/chrome/browser/ui/webui/settings/ash/main_section.cc
@@ -171,13 +171,6 @@ user_manager::UserManager::Get()->IsLoggedInAsAnyKioskApp()); html_source->AddBoolean("isChildAccount", profile()->IsChild()); - // Personalization hub is only enabled for regular (non-guest) users. - // b/238455906 also call |!features::IsGuestModeActive()| since this - // additionally checks for enterprise managed guest users. - html_source->AddBoolean( - "isPersonalizationHubEnabled", - profile()->IsRegularProfile() && !features::IsGuestModeActive()); - // Add the System Web App resources for Settings. html_source->AddResourcePath("icon-192.png", IDR_SETTINGS_LOGO_192);
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index 354d014..815e205 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -109,7 +109,7 @@ {ContentSettingsType::BLUETOOTH_GUARD, "bluetooth-devices"}, {ContentSettingsType::BLUETOOTH_CHOOSER_DATA, kBluetoothChooserDataGroupType}, - {ContentSettingsType::WINDOW_PLACEMENT, "window-placement"}, + {ContentSettingsType::WINDOW_MANAGEMENT, "window-placement"}, {ContentSettingsType::LOCAL_FONTS, "local-fonts"}, {ContentSettingsType::FILE_SYSTEM_ACCESS_CHOOSER_DATA, "file-system-access-handles-data"}, @@ -406,7 +406,7 @@ ContentSettingsType::SOUND, ContentSettingsType::USB_GUARD, ContentSettingsType::VR, - ContentSettingsType::WINDOW_PLACEMENT, + ContentSettingsType::WINDOW_MANAGEMENT, }}; static bool initialized = false; if (!initialized) {
diff --git a/chrome/browser/web_applications/test/web_app_install_test_utils.h b/chrome/browser/web_applications/test/web_app_install_test_utils.h index 30bc00d9..9dba9c1 100644 --- a/chrome/browser/web_applications/test/web_app_install_test_utils.h +++ b/chrome/browser/web_applications/test/web_app_install_test_utils.h
@@ -38,11 +38,12 @@ // Wait until the provided WebAppProvider is ready. void WaitUntilReady(WebAppProvider* provider); -AppId InstallDummyWebApp(Profile* profile, - const std::string& app_name, - const GURL& app_url, - const webapps::WebappInstallSource install_source = - webapps::WebappInstallSource::EXTERNAL_DEFAULT); +AppId InstallDummyWebApp( + Profile* profile, + const std::string& app_name, + const GURL& app_url, + const webapps::WebappInstallSource install_source = + webapps::WebappInstallSource::OMNIBOX_INSTALL_ICON); // Synchronous version of WebAppInstallManager::InstallWebAppFromInfo. May be // used in unit tests and browser tests.
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 083e0df..eb5b263 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -219,10 +219,6 @@ for (auto& observer : observers_) observer.OnStartOver(); - if (use_conditional_mediation_) { - StartConditionalMediationRequest(); - return; - } current_mechanism_.reset(); current_step_ = Step::kNotStarted; SetCurrentStep(Step::kMechanismSelection); @@ -460,7 +456,10 @@ void AuthenticatorRequestDialogModel::Cancel() { if (use_conditional_mediation_) { // Conditional UI requests are never cancelled, they restart silently. - StartOver(); + ResetEphemeralState(); + for (auto& observer : observers_) + observer.OnStartOver(); + StartConditionalMediationRequest(); return; } @@ -550,7 +549,7 @@ // Do not show a page-modal retry error sheet if the user cancelled out of // their platform authenticator during a conditional UI request. // Instead, retry silently. - StartOver(); + Cancel(); return; } SetCurrentStep(Step::kErrorInternalUnrecognized); @@ -562,7 +561,7 @@ // Do not show a page-modal retry error sheet if the user cancelled out of // their platform authenticator during a conditional UI request. // Instead, retry silently. - StartOver(); + Cancel(); return true; } @@ -1096,15 +1095,20 @@ (transport_availability_.has_platform_authenticator_credential == device::FidoRequestHandlerBase::RecognizedCredential:: kHasRecognizedCredential || - show_create_passkey_step)) { + show_create_passkey_step) && + !use_conditional_mediation_) { priority_transport = AuthenticatorTransport::kInternal; } std::vector<AuthenticatorTransport> transports_to_list_if_active = { AuthenticatorTransport::kUsbHumanInterfaceDevice, - AuthenticatorTransport::kInternal, }; + if (!use_conditional_mediation_) { + // Conditional requests offer platform credentials through the autofill UI. + transports_to_list_if_active.push_back(AuthenticatorTransport::kInternal); + } + const auto kCable = AuthenticatorTransport::kHybrid; bool include_add_phone_option = false;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc index e30441d..816f7a2 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -8,7 +8,6 @@ #include <utility> #include "base/bind.h" -#include "base/callback_helpers.h" #include "base/containers/contains.h" #include "base/containers/flat_set.h" #include "base/strings/string_util.h" @@ -19,8 +18,6 @@ #include "chrome/browser/webauthn/authenticator_reference.h" #include "chrome/browser/webauthn/authenticator_transport.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" -#include "device/fido/authenticator_data.h" -#include "device/fido/authenticator_get_assertion_response.h" #include "device/fido/discoverable_credential_metadata.h" #include "device/fido/features.h" #include "device/fido/fido_constants.h" @@ -178,6 +175,7 @@ std::vector<AuthenticatorRequestDialogModel::Mechanism::Type> expected_mechanisms; Step expected_first_step; + bool conditional_ui = false; } kTests[] = { // If there's only a single mechanism, it should activate. {mc, {usb}, {}, {}, {t(usb)}, usb_ui}, @@ -240,6 +238,11 @@ // the "Add phone" option. {mc, {cable}, {has_winapi}, {}, {winapi}, plat_ui}, {ga, {cable}, {has_winapi}, {}, {winapi}, plat_ui}, + + // If this is a Conditional UI request, don't offer the platform + // authenticator. + {ga, {usb, internal}, {}, {}, {t(usb)}, usb_ui, true}, + {ga, {usb, internal, cable}, {}, {"a"}, {p("a"), t(usb), add}, mss, true}, }; unsigned test_num = 0; @@ -273,7 +276,7 @@ transports_info.win_native_api_authenticator_id = "some_authenticator_id"; } - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); absl::optional<bool> has_v2_cable_extension; if (base::Contains(test.params, @@ -299,11 +302,14 @@ } model.StartFlow( - std::move(transports_info), - /*is_conditional_mediation=*/false, + std::move(transports_info), test.conditional_ui, /*prefer_native_api=*/ base::Contains(test.params, TransportAvailabilityParam::kPreferNativeAPI)); + if (test.conditional_ui) { + EXPECT_EQ(model.current_step(), Step::kConditionalMediation); + model.TransitionToModalWebAuthnRequest(); + } EXPECT_EQ(test.expected_first_step, model.current_step()); std::vector<AuthenticatorRequestDialogModel::Mechanism::Type> @@ -360,7 +366,7 @@ TEST_F(AuthenticatorRequestDialogModelTest, NoAvailableTransports) { testing::StrictMock<MockDialogModelObserver> mock_observer; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.AddObserver(&mock_observer); EXPECT_CALL(mock_observer, OnStepTransition()); @@ -432,7 +438,7 @@ transports_info.is_off_the_record_context = test.profile == Profile::INCOGNITO; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); std::array<uint8_t, device::kP256X962Length> public_key = {0}; std::vector<AuthenticatorRequestDialogModel::PairedPhone> phones( @@ -496,7 +502,7 @@ for (const auto& test_case : kTestCases) { testing::StrictMock<MockDialogModelObserver> mock_observer; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.AddObserver(&mock_observer); TransportAvailabilityInfo transports_info; @@ -540,7 +546,7 @@ transports_info.is_ble_powered = true; BluetoothAdapterPowerOnCallbackReceiver power_receiver; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.SetBluetoothAdapterPowerOnCallback(power_receiver.GetCallback()); model.set_cable_transport_info(true, {}, base::DoNothing(), absl::nullopt); model.StartFlow(std::move(transports_info), @@ -569,7 +575,7 @@ testing::NiceMock<MockDialogModelObserver> mock_observer; BluetoothAdapterPowerOnCallbackReceiver power_receiver; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.AddObserver(&mock_observer); model.SetBluetoothAdapterPowerOnCallback(power_receiver.GetCallback()); model.set_cable_transport_info(true, {}, base::DoNothing(), absl::nullopt); @@ -611,7 +617,7 @@ transports_info.is_ble_powered = false; BluetoothAdapterPowerOnCallbackReceiver power_receiver; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.SetBluetoothAdapterPowerOnCallback(power_receiver.GetCallback()); model.set_cable_transport_info(true, {}, base::DoNothing(), absl::nullopt); model.StartFlow(std::move(transports_info), @@ -642,7 +648,7 @@ AuthenticatorTransport::kUsbHumanInterfaceDevice}; int num_called = 0; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.SetRequestCallback(base::BindRepeating( [](int* i, const std::string& authenticator_id) { ++(*i); }, &num_called)); @@ -686,7 +692,7 @@ transports_info.win_native_api_authenticator_id = kWinAuthenticatorId; std::vector<std::string> dispatched_authenticator_ids; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.SetRequestCallback(base::BindRepeating( [](std::vector<std::string>* ids, const std::string& authenticator_id) { ids->push_back(authenticator_id); @@ -704,7 +710,7 @@ TEST_F(AuthenticatorRequestDialogModelTest, ConditionalUINoRecognizedCredential) { - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); int preselect_num_called = 0; model.SetAccountPreselectedCallback(base::BindRepeating( @@ -738,7 +744,7 @@ } TEST_F(AuthenticatorRequestDialogModelTest, ConditionalUIRecognizedCredential) { - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); int preselect_num_called = 0; model.SetAccountPreselectedCallback(base::BindRepeating( [](int* i, std::vector<uint8_t> credential_id) { @@ -787,7 +793,7 @@ // it. TEST_F(AuthenticatorRequestDialogModelTest, ConditionalUICancelRequest) { testing::StrictMock<MockDialogModelObserver> mock_observer; - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); model.AddObserver(&mock_observer); model.saved_authenticators().AddAuthenticator(AuthenticatorReference( /*device_id=*/"internal", AuthenticatorTransport::kInternal)); @@ -846,7 +852,7 @@ TEST_F(AuthenticatorRequestDialogModelPreselectCredentialTest, PreSelectWithEmptyAllowList) { - AuthenticatorRequestDialogModel model(/*web_contents=*/nullptr); + AuthenticatorRequestDialogModel model(/*render_frame_host=*/nullptr); int preselect_num_called = 0; model.SetAccountPreselectedCallback(base::BindLambdaForTesting( [&preselect_num_called](std::vector<uint8_t> credential_id) {
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 640393b..3abd7c2 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1664881835-5d7cd6055354b19eef48e95dfac92b65af747ae1.profdata +chrome-linux-main-1664906369-5113a193b218aae8c3cfc08269a1b6a6de27d8ab.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 4ac6888..6b92042 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1664881835-26fbe526d29c4915912ef57f4b52d0aa37d6d1de.profdata +chrome-mac-main-1664906369-75f7785a9a859bed76e71dd6bcaf6fce15268aed.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 0683768..bcec83b 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1664873682-2d231487a12ad157bdcb87a9248de81f2986924b.profdata +chrome-win32-main-1664894716-ff9212fcd54d091048442dc9f08f877f7f057c20.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index f224e7d..1bb67bc 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1664873682-ff93c23539fc682a00025ea2625761b5f5faea8a.profdata +chrome-win64-main-1664906369-fdd08a964b099a689132d92eb69eff81f0d82fcc.profdata
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 1bdc8c88..8a1f68c 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -796,6 +796,7 @@ skip.insert(APIPermissionID::kTabCapture); skip.insert(APIPermissionID::kWebRequest); skip.insert(APIPermissionID::kWebRequestBlocking); + skip.insert(APIPermissionID::kWebRequestAuthProvider); skip.insert(APIPermissionID::kDeclarativeNetRequestWithHostAccess); // This permission requires explicit user action (context menu handler)
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 56e914a..88eebba 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -5140,11 +5140,6 @@ ] } - group("performance_weblayer_test_suite") { - testonly = true - data_deps = [ "//chrome/test:performance_test_suite_android_weblayer" ] - } - # Difference between this and telemetry_perf_tests is that this runs a devil # script before the build, to remove the system webview. See # //testing/buildbot/gn_isolate_map.pyl
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_breadcrumb_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_breadcrumb_element_test.ts index 8470f63..82e590a1 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_breadcrumb_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_breadcrumb_element_test.ts
@@ -66,7 +66,6 @@ }); test('show label when wallpaper subpage is loaded', async () => { - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); breadcrumbElement = initElement(PersonalizationBreadcrumb, {'path': Paths.COLLECTIONS}); @@ -92,8 +91,6 @@ }); test('click home button goes back to root page', async () => { - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); - breadcrumbElement = initElement(PersonalizationBreadcrumb, {'path': Paths.COLLECTIONS}); await waitAfterNextRender(breadcrumbElement); @@ -120,19 +117,6 @@ }); test('back button hidden if personalization hub feature is on', async () => { - loadTimeData.overrideValues({isPersonalizationHubEnabled: false}); - - breadcrumbElement = initElement( - PersonalizationBreadcrumb, {'path': Paths.COLLECTION_IMAGES}); - await waitAfterNextRender(breadcrumbElement); - - assertTrue( - !!breadcrumbElement!.shadowRoot!.getElementById('backButton'), - 'back button should be visible'); - - // Recreate the element with the hub feature on. - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); - breadcrumbElement.remove(); breadcrumbElement = initElement(PersonalizationBreadcrumb, {'path': Paths.COLLECTIONS}); await waitAfterNextRender(breadcrumbElement); @@ -420,19 +404,4 @@ assertEquals(Paths.AMBIENT, path); assertDeepEquals({}, queryParams); }); - - test('back button aria label is set', async () => { - // Back button is hidden when personalization hub is enabled. - loadTimeData.overrideValues({isPersonalizationHubEnabled: false}); - - breadcrumbElement = initElement( - PersonalizationBreadcrumb, {'path': Paths.COLLECTION_IMAGES}); - await waitAfterNextRender(breadcrumbElement); - - assertEquals( - 'Back to Wallpaper', - breadcrumbElement.shadowRoot?.getElementById('backButton') - ?.getAttribute('aria-label'), - 'back button aria label is set'); - }); });
diff --git a/chrome/test/data/webui/chromeos/personalization_app/personalization_router_element_test.ts b/chrome/test/data/webui/chromeos/personalization_app/personalization_router_element_test.ts index abddee4..3c8a92c 100644 --- a/chrome/test/data/webui/chromeos/personalization_app/personalization_router_element_test.ts +++ b/chrome/test/data/webui/chromeos/personalization_app/personalization_router_element_test.ts
@@ -17,17 +17,7 @@ baseSetup(); }); - test('redirects if hub feature off on root page', async () => { - loadTimeData.overrideValues({'isPersonalizationHubEnabled': false}); - const reloadCalledPromise = new Promise<void>((resolve) => { - PersonalizationRouter.reloadAtWallpaper = resolve; - }); - initElement(PersonalizationRouter); - await reloadCalledPromise; - }); - test('will show ambient subpage if allowed', async () => { - loadTimeData.overrideValues({'isPersonalizationHubEnabled': true}); loadTimeData.overrideValues({'isAmbientModeAllowed': true}); const routerElement = initElement(PersonalizationRouter); PersonalizationRouter.instance().goToRoute(Paths.AMBIENT); @@ -45,7 +35,6 @@ }); test('will not show ambient subpage if disallowed', async () => { - loadTimeData.overrideValues({'isPersonalizationHubEnabled': true}); loadTimeData.overrideValues({'isAmbientModeAllowed': false}); const routerElement = initElement(PersonalizationRouter); PersonalizationRouter.instance().goToRoute(Paths.AMBIENT); @@ -62,7 +51,6 @@ }); test('returns to root page when wrong path is keyed in', async () => { - loadTimeData.overrideValues({'isPersonalizationHubEnabled': true}); loadTimeData.overrideValues({'isAmbientModeAllowed': true}); const routerElement = initElement( PersonalizationRouter, {path: '/wrongpath', queryParams: {}});
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js index 5195ef9..bd5a41e 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_search_box_test.js
@@ -201,7 +201,6 @@ } setup(function() { - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); setupSearchBox(); Router.getInstance().navigateTo(routes.BASIC); @@ -440,10 +439,6 @@ test( 'Keypress Enter on personalization result opens personalization hub', async () => { - // Enable personalization hub feature. - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); - assertTrue(loadTimeData.getBoolean('isPersonalizationHubEnabled')); - personalizationSearchHandler.setFakeResults( [fakePersonalizationResult('result', 'test')]); settingsSearchHandler.setFakeResults([]); @@ -468,11 +463,6 @@ test( 'Clicking on personalization result opens personalization hub', async () => { - // Enable personalization hub feature. - loadTimeData.overrideValues({isPersonalizationHubEnabled: true}); - assertTrue(loadTimeData.getBoolean('isPersonalizationHubEnabled')); - - personalizationSearchHandler.setFakeResults( [fakePersonalizationResult('Wallpaper', 'test')]); await simulateSearch('fake query 1'); @@ -490,36 +480,6 @@ await openWindowProxy.whenCalled('openURL')); }); - test( - 'Clicking on settings personalization result causes route change' + - ' if personalization hub feature is disabled', - async () => { - // Disable personalization hub feature. - loadTimeData.overrideValues({isPersonalizationHubEnabled: false}); - assertFalse(loadTimeData.getBoolean('isPersonalizationHubEnabled')); - - const result = - fakeSettingsResult('Wallpaper', 'personalization?settingId=500'); - result.id.setting = settingMojomWebui.Setting.kOpenWallpaper; - - settingsSearchHandler.setFakeResults([result]); - await simulateSearch('fake query 2'); - await waitForListUpdate(); - - const selectedOsRow = searchBox.getSelectedOsSearchResultRow_(); - assertTrue(!!selectedOsRow); - - // Clicking on the searchResultContainer of the row correctly changes - // the route and dropdown to close. - selectedOsRow.$.searchResultContainer.click(); - assertFalse(dropDown.opened); - assertEquals(0, openWindowProxy.getCallCount('openURL')); - const router = Router.getInstance(); - assertEquals(router.getQueryParameters().get('search'), 'fake query 2'); - assertEquals(router.getCurrentRoute().path, '/personalization'); - assertEquals(router.getQueryParameters().get('settingId'), '500'); - }); - test('Keypress Enter on row causes route change', async () => { settingsSearchHandler.setFakeResults( [fakeSettingsResult('WiFi Settings', 'networks?type=WiFi')]); @@ -744,31 +704,6 @@ assertEquals(field.root.activeElement, null); }); - test('No personalization search results when feature off', async () => { - loadTimeData.overrideValues({isPersonalizationHubEnabled: false}); - - personalizationSearchHandler.setFakeResults( - [fakePersonalizationResult('bad')]); - settingsSearchHandler.setFakeResults([]); - await simulateSearch('query'); - await waitForListUpdate(); - - assertEquals(0, resultList.items.length, 'no personalization result shown'); - - // Clear the search box. - await simulateSearch(''); - - settingsSearchHandler.setFakeResults([fakeSettingsResult('good')]); - await simulateSearch('query'); - await waitForListUpdate(); - - assertEquals(1, resultList.items.length, 'one setting result shown'); - assertEquals( - 'good', - searchBox.getSelectedOsSearchResultRow_().$.resultText.innerHTML, - 'text matches expected result'); - }); - test('search results sorted descending', async () => { personalizationSearchHandler.setFakeResults([ fakePersonalizationResult(
diff --git a/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js b/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js index 6560278..8e7e8f5 100644 --- a/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js +++ b/chrome/test/data/webui/settings/chromeos/personalization_page_with_personalization_hub_test.js
@@ -25,9 +25,6 @@ suite('PersonalizationHandler', function() { suiteSetup(function() { - assertTrue( - loadTimeData.getBoolean('isPersonalizationHubEnabled'), - 'this test only runs with PersonalizationHub enabled'); testing.Test.disableAnimationsAndTransitions(); });
diff --git a/chrome/test/data/webui/settings/performance_page_test.ts b/chrome/test/data/webui/settings/performance_page_test.ts index d231303..83efd20b 100644 --- a/chrome/test/data/webui/settings/performance_page_test.ts +++ b/chrome/test/data/webui/settings/performance_page_test.ts
@@ -196,18 +196,29 @@ const dialog = openAddDialog(); dialog.fire(SUBMIT_EVENT, 'bar'); - // tabDiscardExceptionsList.$.list._render(); assertDeepEquals( ['foo', 'bar'], tabDiscardExceptionsList.$.list.items, 'expected valid rule to be added to the end of the list'); }); + test('testTabDiscardExceptionsListAddAfterMenuClick', function() { + setupExceptionListEntries(['foo']); + getExceptionListEntries()[0]!.$.button.click(); + tabDiscardExceptionsList.$.addButton.click(); + flush(); + + const dialog = getDialog(); + assertTrue(!!dialog); + assertEquals( + '', dialog.$.input.value, + 'add dialog should be opened instead of edit dialog'); + }); + test('testTabDiscardExceptionsListEdit', function() { setupExceptionListEntries(['foo', 'bar']); const dialog = openEditDialog(getExceptionListEntries()[1]!); dialog.fire(SUBMIT_EVENT, 'baz'); - // tabDiscardExceptionsList.$.list._render(); assertDeepEquals( ['foo', 'baz'], tabDiscardExceptionsList.$.list.items, 'expected valid rule to be added to the end of the list');
diff --git a/chrome/test/mini_installer/ZIP_README.txt b/chrome/test/mini_installer/ZIP_README.txt index 5b79938..1c383ca 100644 --- a/chrome/test/mini_installer/ZIP_README.txt +++ b/chrome/test/mini_installer/ZIP_README.txt
@@ -11,7 +11,7 @@ run the tests. This method creates a batch file that will automatically set the paths. -python chrome\test\mini_installer\create_zip.py ^ +vpython3 chrome\test\mini_installer\create_zip.py ^ --output-path <ZIP_FILE_OUTPUT_PATH> ^ --installer-path <CURRENT_INSTALLER_PATH> ^ --previous-version-installer-path <PREVIOUS_INSTALLER_PATH> ^ @@ -34,7 +34,7 @@ To run: -1) Ensure the latest python 2.7 is installed and in your path +1) Ensure the latest python 3 is installed and in your path 2) Unzip zip file 3) Open a command window in administrator mode 4) Navigate to the unzip folder @@ -49,4 +49,3 @@ The batch script will use Python's pip module to install pywin32 and psutil to reduce the amount of setup time is needed. -
diff --git a/chrome/test/mini_installer/create_zip.py b/chrome/test/mini_installer/create_zip.py old mode 100644 new mode 100755 index 1957425..d9175a7 --- a/chrome/test/mini_installer/create_zip.py +++ b/chrome/test/mini_installer/create_zip.py
@@ -1,3 +1,4 @@ +#!/usr/bin/env vpython3 # Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/chrome/test/mini_installer/zip_test_runner.bat b/chrome/test/mini_installer/zip_test_runner.bat index 513a7a1..add3e6e 100755 --- a/chrome/test/mini_installer/zip_test_runner.bat +++ b/chrome/test/mini_installer/zip_test_runner.bat
@@ -6,8 +6,9 @@ rem chrome\test\mini_installer\run_mini_installer_tests.py for the args that rem can be passed. -c:\Python27\python -m pip install --upgrade pip -c:\Python27\Scripts\pip install psutil -c:\Python27\Scripts\pip install pywin32 -c:\Python27\python chrome\test\mini_installer\run_mini_installer_tests.py {run_args} %* +python3 -m pip install --upgrade pip +python3 -m pip install psutil +python3 -m pip install requests +python3 -m pip install pypiwin32 +python3 chrome\test\mini_installer\run_mini_installer_tests.py {run_args} %* pause
diff --git a/chrome/updater/app/app_install.cc b/chrome/updater/app/app_install.cc index c51c24b..3db6852 100644 --- a/chrome/updater/app/app_install.cc +++ b/chrome/updater/app/app_install.cc
@@ -15,6 +15,7 @@ #include "base/files/file_path.h" #include "base/i18n/icu_util.h" #include "base/logging.h" +#include "base/memory/scoped_refptr.h" #include "base/notreached.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -251,21 +252,17 @@ request.app_id = kUpdaterAppId; request.version = base::Version(kUpdaterVersion); update_service_->RegisterApp( - request, - base::BindOnce( - [](scoped_refptr<AppInstall> app_install, - const RegistrationResponse& registration_response) { - if (registration_response.status_code != kRegistrationSuccess && - registration_response.status_code != - kRegistrationAlreadyRegistered) { - VLOG(2) << "Updater registration failed: " - << registration_response.status_code; - app_install->Shutdown(kErrorRegistrationFailed); - return; - } - app_install->MaybeInstallApp(); - }, - base::WrapRefCounted(this))); + request, base::BindOnce( + [](scoped_refptr<AppInstall> app_install, int result) { + if (result != kRegistrationSuccess && + result != kRegistrationAlreadyRegistered) { + VLOG(2) << "Updater registration failed: " << result; + app_install->Shutdown(kErrorRegistrationFailed); + return; + } + app_install->MaybeInstallApp(); + }, + base::WrapRefCounted(this))); } void AppInstall::MaybeInstallApp() {
diff --git a/chrome/updater/app/app_recover.cc b/chrome/updater/app/app_recover.cc index 8314f26..65b1de4 100644 --- a/chrome/updater/app/app_recover.cc +++ b/chrome/updater/app/app_recover.cc
@@ -170,16 +170,15 @@ base::OnceClosure shutdown) { std::move(shutdown).Run(); }, service, base::BindOnce(&AppRecover::Shutdown, this, kErrorOk))); for (const RegistrationRequest& registration : registrations) { - service->RegisterApp( - registration, - base::BindOnce( - [](const std::string& app, base::RepeatingClosure barrier, - const RegistrationResponse& response) { - VLOG(0) << "Registration for " << app - << " result: " << response.status_code << "."; - barrier.Run(); - }, - registration.app_id, barrier)); + service->RegisterApp(registration, + base::BindOnce( + [](const std::string& app, + base::RepeatingClosure barrier, int result) { + VLOG(0) << "Registration for " << app + << " result: " << result << "."; + barrier.Run(); + }, + registration.app_id, barrier)); } }
diff --git a/chrome/updater/app/server/mac/service_delegate.mm b/chrome/updater/app/server/mac/service_delegate.mm index 066f3d1..29da2de 100644 --- a/chrome/updater/app/server/mac/service_delegate.mm +++ b/chrome/updater/app/server/mac/service_delegate.mm
@@ -228,15 +228,13 @@ request.existence_checker_path = base::mac::NSStringToFilePath(existenceCheckerPath); - auto cb = base::BindOnce( - base::RetainBlock(^(const updater::RegistrationResponse& response) { - VLOG(0) << "Registration complete: status code = " - << response.status_code; - if (reply) - reply(response.status_code); + auto cb = base::BindOnce(base::RetainBlock(^(int result) { + VLOG(0) << "Registration complete: status code = " << result; + if (reply) + reply(result); - _appServer->TaskCompleted(); - })); + _appServer->TaskCompleted(); + })); _appServer->TaskStarted(); _callbackRunner->PostTask(
diff --git a/chrome/updater/app/server/win/com_classes.cc b/chrome/updater/app/server/win/com_classes.cc index 59184b2..4f57b010 100644 --- a/chrome/updater/app/server/win/com_classes.cc +++ b/chrome/updater/app/server/win/com_classes.cc
@@ -251,12 +251,11 @@ request, base::BindOnce( [](scoped_refptr<base::SequencedTaskRunner> task_runner, - IUpdaterRegisterAppCallbackPtr callback, - const RegistrationResponse& response) { + IUpdaterRegisterAppCallbackPtr callback, int result) { task_runner->PostTaskAndReplyWithResult( FROM_HERE, base::BindOnce(&IUpdaterRegisterAppCallback::Run, - callback, response.status_code), + callback, result), base::BindOnce([](HRESULT hr) { VLOG(2) << "UpdaterImpl::RegisterApp " << "callback returned " << std::hex << hr;
diff --git a/chrome/updater/constants.h b/chrome/updater/constants.h index 793fe3d6..87ecc9fb 100644 --- a/chrome/updater/constants.h +++ b/chrome/updater/constants.h
@@ -185,6 +185,12 @@ // to install on a standard user account with UAC disabled. extern const char kCmdLineExpectElevated[]; +// The "expect-de-elevated" switch indicates that updater setup should be +// running de-elevated (at medium integrity). This switch is needed to avoid +// running into a loop trying (but failing repeatedly) to de-elevate updater +// setup when attempting to install as a standard user account with UAC enabled. +constexpr char kCmdLineExpectDeElevated[] = "expect-de-elevated"; + // The "prefers-user" switch indicates that updater setup could not elevate, and // is now trying to install the app per-user. extern const char kCmdLinePrefersUser[];
diff --git a/chrome/updater/mac/keystone/ksadmin.mm b/chrome/updater/mac/keystone/ksadmin.mm index b135baa..a685b6f 100644 --- a/chrome/updater/mac/keystone/ksadmin.mm +++ b/chrome/updater/mac/keystone/ksadmin.mm
@@ -382,13 +382,12 @@ MaybeInstallUpdater(scope); ServiceProxy(scope)->RegisterApp( registration, base::BindOnce( - [](base::OnceCallback<void(int)> cb, - const RegistrationResponse& response) { - if (response.status_code == kRegistrationSuccess) { + [](base::OnceCallback<void(int)> cb, int result) { + if (result == kRegistrationSuccess) { std::move(cb).Run(0); } else { - LOG(ERROR) << "Updater registration error: " - << response.status_code; + LOG(ERROR) + << "Updater registration error: " << result; std::move(cb).Run(1); } },
diff --git a/chrome/updater/mac/update_service_proxy.h b/chrome/updater/mac/update_service_proxy.h index f6bb055..3c0e449 100644 --- a/chrome/updater/mac/update_service_proxy.h +++ b/chrome/updater/mac/update_service_proxy.h
@@ -42,9 +42,8 @@ void GetVersion( base::OnceCallback<void(const base::Version&)> callback) override; void FetchPolicies(base::OnceCallback<void(int)> callback) override; - void RegisterApp( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) override; + void RegisterApp(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) override; void GetAppStates( base::OnceCallback<void(const std::vector<UpdateService::AppState>&)>) override;
diff --git a/chrome/updater/mac/update_service_proxy.mm b/chrome/updater/mac/update_service_proxy.mm index d10b1f1..7f53b2df 100644 --- a/chrome/updater/mac/update_service_proxy.mm +++ b/chrome/updater/mac/update_service_proxy.mm
@@ -302,18 +302,15 @@ [client_ fetchPoliciesWithReply:reply]; } -void UpdateServiceProxy::RegisterApp( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) { +void UpdateServiceProxy::RegisterApp(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); VLOG(1) << __func__; - __block base::OnceCallback<void(const RegistrationResponse&)> block_callback = - std::move(callback); + __block base::OnceCallback<void(int)> block_callback = std::move(callback); auto reply = ^(int error) { - RegistrationResponse response(error); callback_runner_->PostTask( - FROM_HERE, base::BindOnce(std::move(block_callback), response)); + FROM_HERE, base::BindOnce(std::move(block_callback), error)); }; [client_
diff --git a/chrome/updater/registration_data.h b/chrome/updater/registration_data.h index 3bd1a2738..49ac4bb8 100644 --- a/chrome/updater/registration_data.h +++ b/chrome/updater/registration_data.h
@@ -50,13 +50,6 @@ base::FilePath existence_checker_path; }; -struct RegistrationResponse { - explicit RegistrationResponse(int status_code) : status_code(status_code) {} - - // Status code of the registration. - int status_code = kRegistrationSuccess; -}; - } // namespace updater #endif // CHROME_UPDATER_REGISTRATION_DATA_H_
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc index d94a14e3..e509852 100644 --- a/chrome/updater/test/integration_tests_impl.cc +++ b/chrome/updater/test/integration_tests_impl.cc
@@ -191,12 +191,11 @@ registration.app_id = app_id; registration.version = base::Version("0.1"); base::RunLoop loop; - update_service->RegisterApp( - registration, - base::BindLambdaForTesting([&loop](const RegistrationResponse& response) { - EXPECT_EQ(response.status_code, 0); - loop.Quit(); - })); + update_service->RegisterApp(registration, + base::BindLambdaForTesting([&loop](int result) { + EXPECT_EQ(result, 0); + loop.Quit(); + })); loop.Run(); }
diff --git a/chrome/updater/update_service.h b/chrome/updater/update_service.h index 6a02aaa2..80403bf2 100644 --- a/chrome/updater/update_service.h +++ b/chrome/updater/update_service.h
@@ -19,7 +19,6 @@ namespace updater { struct RegistrationRequest; -struct RegistrationResponse; enum class UpdaterScope; @@ -203,8 +202,7 @@ using Callback = base::OnceCallback<void(Result)>; using StateChangeCallback = base::RepeatingCallback<void(const UpdateState&)>; - using RegisterAppCallback = - base::OnceCallback<void(const RegistrationResponse&)>; + using RegisterAppCallback = base::OnceCallback<void(int)>; using InstallerResult = update_client::CrxInstaller::Result; // Returns the version of the active updater. The version object is invalid
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc index 9c3d888..466e9a77 100644 --- a/chrome/updater/update_service_impl.cc +++ b/chrome/updater/update_service_impl.cc
@@ -248,9 +248,8 @@ config_->GetPolicyService()->FetchPolicies(std::move(callback)); } -void UpdateServiceImpl::RegisterApp( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) { +void UpdateServiceImpl::RegisterApp(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) { VLOG(1) << __func__; DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (request.app_id != kUpdaterAppId) { @@ -262,12 +261,11 @@ current_version.CompareTo(request.version) == 1) { main_task_runner_->PostTask( FROM_HERE, - base::BindOnce(std::move(callback), - RegistrationResponse(kRegistrationAlreadyRegistered))); + base::BindOnce(std::move(callback), kRegistrationAlreadyRegistered)); return; } persisted_data_->RegisterApp(request); - std::move(callback).Run(RegistrationResponse(kRegistrationSuccess)); + std::move(callback).Run(kRegistrationSuccess); } void UpdateServiceImpl::GetAppStates(
diff --git a/chrome/updater/update_service_impl.h b/chrome/updater/update_service_impl.h index a5aa91f..6a39416 100644 --- a/chrome/updater/update_service_impl.h +++ b/chrome/updater/update_service_impl.h
@@ -32,7 +32,6 @@ class Configurator; class PersistedData; struct RegistrationRequest; -struct RegistrationResponse; using AppClientInstallData = base::flat_map<std::string, std::string>; using AppInstallDataIndex = base::flat_map<std::string, std::string>; @@ -46,9 +45,8 @@ void GetVersion( base::OnceCallback<void(const base::Version&)> callback) override; void FetchPolicies(base::OnceCallback<void(int)> callback) override; - void RegisterApp( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) override; + void RegisterApp(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) override; void GetAppStates( base::OnceCallback<void(const std::vector<AppState>&)>) override; void RunPeriodicTasks(base::OnceClosure callback) override;
diff --git a/chrome/updater/update_service_impl_inactive.cc b/chrome/updater/update_service_impl_inactive.cc index e41c2c88..ef0167a2 100644 --- a/chrome/updater/update_service_impl_inactive.cc +++ b/chrome/updater/update_service_impl_inactive.cc
@@ -37,13 +37,11 @@ std::move(callback).Run(-1); } - void RegisterApp( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) override { + void RegisterApp(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) override { VLOG(1) << __func__ << " (Inactive)"; base::SequencedTaskRunnerHandle::Get()->PostTask( - FROM_HERE, - base::BindOnce(std::move(callback), RegistrationResponse(-1))); + FROM_HERE, base::BindOnce(std::move(callback), -1)); } void GetAppStates(base::OnceCallback<void(const std::vector<AppState>&)>
diff --git a/chrome/updater/update_service_internal_impl_qualifying.cc b/chrome/updater/update_service_internal_impl_qualifying.cc index 51a11f56..347f43e 100644 --- a/chrome/updater/update_service_internal_impl_qualifying.cc +++ b/chrome/updater/update_service_internal_impl_qualifying.cc
@@ -69,11 +69,10 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } - void RegisterQualificationAppDone(base::OnceClosure callback, - const RegistrationResponse& response) { + void RegisterQualificationAppDone(base::OnceClosure callback, int result) { // Create a `CheckForUpdatesTask` with the local prefs' config and perform // an `Update` task for `kQualificationAppId`. - VLOG(2) << "RegistrationResponse: " << response.status_code; + VLOG(2) << "Registration response: " << result; base::MakeRefCounted<CheckForUpdatesTask>( config_, base::BindOnce(&UpdateServiceImpl::Update,
diff --git a/chrome/updater/win/app_install_controller.cc b/chrome/updater/win/app_install_controller.cc index 6fe5ab7..5922116 100644 --- a/chrome/updater/win/app_install_controller.cc +++ b/chrome/updater/win/app_install_controller.cc
@@ -809,11 +809,10 @@ const base::FilePath& installer_path, const std::string& install_args, const std::string& install_data, - const std::string& install_settings, - const RegistrationResponse& response) { - if (response.status_code != kRegistrationSuccess && - response.status_code != kRegistrationAlreadyRegistered) { - VLOG(1) << "Registration failed: " << response.status_code; + const std::string& install_settings, int result) { + if (result != kRegistrationSuccess && + result != kRegistrationAlreadyRegistered) { + VLOG(1) << "Registration failed: " << result; self->InstallComplete(UpdateService::Result::kServiceFailed); return; }
diff --git a/chrome/updater/win/installer/exit_code.h b/chrome/updater/win/installer/exit_code.h index f17bb19..2034fea6 100644 --- a/chrome/updater/win/installer/exit_code.h +++ b/chrome/updater/win/installer/exit_code.h
@@ -17,6 +17,7 @@ UNABLE_TO_GET_WORK_DIRECTORY = 109, UNABLE_TO_EXTRACT_ARCHIVE = 112, UNABLE_TO_ELEVATE_METAINSTALLER = 113, + UNABLE_TO_DE_ELEVATE_METAINSTALLER = 114, UNABLE_TO_SET_DIRECTORY_ACL = 117, INVALID_OPTION = 118, RUN_SETUP_FAILED_FILE_NOT_FOUND = 122, // ERROR_FILE_NOT_FOUND.
diff --git a/chrome/updater/win/installer/installer.cc b/chrome/updater/win/installer/installer.cc index 3d8d0bc1..f144b35 100644 --- a/chrome/updater/win/installer/installer.cc +++ b/chrome/updater/win/installer/installer.cc
@@ -284,6 +284,30 @@ result.error()); } +ProcessExitResult HandleRunDeElevated(const base::CommandLine& command_line) { + DCHECK(::IsUserAnAdmin()); + + if (command_line.HasSwitch(kCmdLineExpectDeElevated)) { + VLOG(1) << __func__ << "Unexpected de-elevation loop! " + << command_line.GetCommandLineString(); + return ProcessExitResult(UNABLE_TO_DE_ELEVATE_METAINSTALLER); + } + + // Deelevate the metainstaller. + DWORD exit_code = 0; + HRESULT hr = RunDeElevated( + command_line.GetProgram(), + [&command_line]() { + base::CommandLine de_elevate_command_line = command_line; + de_elevate_command_line.AppendSwitch(kCmdLineExpectDeElevated); + return de_elevate_command_line.GetArgumentsString(); + }(), + &exit_code); + return SUCCEEDED(hr) + ? ProcessExitResult(exit_code) + : ProcessExitResult(RUN_SETUP_FAILED_COULD_NOT_CREATE_PROCESS, hr); +} + ProcessExitResult WMain(HMODULE module) { CHECK(EnableSecureDllLoading()); EnableProcessHeapMetadataProtection(); @@ -298,27 +322,30 @@ if (args_result.exit_code != SUCCESS_EXIT_CODE) return args_result; - if (!::IsUserAnAdmin()) { - const base::CommandLine command_line = - base::CommandLine::FromString(::GetCommandLineW()); - if (GetUpdaterScopeForCommandLine(command_line) == UpdaterScope::kSystem) { - ProcessExitResult run_elevated_result = HandleRunElevated(command_line); - if (run_elevated_result.exit_code != - RUN_SETUP_FAILED_COULD_NOT_CREATE_PROCESS || - !IsPrefersForCommandLine(command_line)) { - return run_elevated_result; - } + const base::CommandLine command_line = + base::CommandLine::FromString(::GetCommandLineW()); + const UpdaterScope scope = GetUpdaterScopeForCommandLine(command_line); - // "needsadmin=prefers" case: Could not elevate. So fall through to - // install as a per-user app. - if (!cmd_line_args.append(L" --") || - !cmd_line_args.append( - base::SysUTF8ToWide(kCmdLinePrefersUser).c_str())) { - return ProcessExitResult(COMMAND_STRING_OVERFLOW); - } + if (!::IsUserAnAdmin() && scope == UpdaterScope::kSystem) { + ProcessExitResult run_elevated_result = HandleRunElevated(command_line); + if (run_elevated_result.exit_code != + RUN_SETUP_FAILED_COULD_NOT_CREATE_PROCESS || + !IsPrefersForCommandLine(command_line)) { + return run_elevated_result; + } + + // "needsadmin=prefers" case: Could not elevate. So fall through to + // install as a per-user app. + if (!cmd_line_args.append(L" --") || + !cmd_line_args.append( + base::SysUTF8ToWide(kCmdLinePrefersUser).c_str())) { + return ProcessExitResult(COMMAND_STRING_OVERFLOW); } } + if (::IsUserAnAdmin() && scope == UpdaterScope::kUser && IsUACOn()) + return HandleRunDeElevated(command_line); + ProcessExitResult exit_code = ProcessExitResult(SUCCESS_EXIT_CODE); // Parse configuration from the command line and resources.
diff --git a/chrome/updater/win/update_service_proxy.cc b/chrome/updater/win/update_service_proxy.cc index 9a7c0b2..f6df62a 100644 --- a/chrome/updater/win/update_service_proxy.cc +++ b/chrome/updater/win/update_service_proxy.cc
@@ -247,7 +247,7 @@ ~UpdaterRegisterAppCallback() override { CHECK_EQ(base::PlatformThreadRef(), com_thread_ref_); if (callback_) - std::move(callback_).Run(RegistrationResponse(status_code_)); + std::move(callback_).Run(status_code_); } // The reference of the thread this object is bound to. @@ -435,12 +435,11 @@ } } - void RegisterAppOnSTA( - const RegistrationRequest& request, - base::OnceCallback<void(const RegistrationResponse&)> callback) { + void RegisterAppOnSTA(const RegistrationRequest& request, + base::OnceCallback<void(int)> callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!ConnectToServer()) { - std::move(callback).Run(RegistrationResponse(hresult())); + std::move(callback).Run(hresult()); return; } std::wstring app_id_w; @@ -470,7 +469,7 @@ existence_checker_path_w = request.existence_checker_path.value(); return true; }()) { - std::move(callback).Run(RegistrationResponse(E_INVALIDARG)); + std::move(callback).Run(E_INVALIDARG); return; } @@ -482,7 +481,7 @@ callback_wrapper.Get()); FAILED(hr)) { VLOG(2) << "Failed to call IUpdater::RegisterApp" << std::hex << hr; - callback_wrapper->Disconnect().Run(RegistrationResponse(hr)); + callback_wrapper->Disconnect().Run(hr); return; } }
diff --git a/chrome/updater/win/win_util.cc b/chrome/updater/win/win_util.cc index 120f7a4..7ee5a71 100644 --- a/chrome/updater/win/win_util.cc +++ b/chrome/updater/win/win_util.cc
@@ -42,6 +42,8 @@ #include "base/win/atl.h" #include "base/win/registry.h" #include "base/win/scoped_handle.h" +#include "base/win/scoped_process_information.h" +#include "base/win/startup_information.h" #include "chrome/updater/constants.h" #include "chrome/updater/updater_branding.h" #include "chrome/updater/updater_scope.h" @@ -675,6 +677,60 @@ return ShellExecuteAndWait(file_path, parameters, L"runas"); } +HRESULT RunDeElevated(const base::FilePath& file_path, + const std::wstring& parameters, + DWORD* exit_code) { + HWND hwnd = ::GetShellWindow(); + if (!hwnd) + return HRESULTFromLastError(); + + DWORD explorer_pid = 0; + ::GetWindowThreadProcessId(hwnd, &explorer_pid); + if (!explorer_pid) + return HRESULTFromLastError(); + + HANDLE explorer_process( + ::OpenProcess(PROCESS_CREATE_PROCESS, FALSE, explorer_pid)); + if (!explorer_process) + return HRESULTFromLastError(); + ScopedKernelHANDLE explorer_process_closure(explorer_process); + + base::win::StartupInformation startup_info; + if (!startup_info.InitializeProcThreadAttributeList(1)) + return HRESULTFromLastError(); + + if (!startup_info.UpdateProcThreadAttribute( + PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &explorer_process, + sizeof(explorer_process))) { + return HRESULTFromLastError(); + } + + PROCESS_INFORMATION process_info = {}; + if (!::CreateProcess(file_path.value().c_str(), + std::wstring(parameters).data(), nullptr, nullptr, TRUE, + EXTENDED_STARTUPINFO_PRESENT, nullptr, nullptr, + startup_info.startup_info(), &process_info)) { + HRESULT hr = HRESULTFromLastError(); + LOG(ERROR) << "::CreateProcess() failed, " << std::hex << hr; + return hr; + } + base::win::ScopedProcessInformation process_information(process_info); + + const base::Process process(process_information.TakeProcessHandle()); + const DWORD pid = process.Pid(); + VLOG(1) << __func__ << ": Started process, PID: " << pid; + + // Allow the spawned process to show windows in the foreground. + ::AllowSetForegroundWindow(pid); + + int ret_val = 0; + if (!process.WaitForExit(&ret_val)) + return HRESULTFromLastError(); + + *exit_code = ret_val; + return S_OK; +} + absl::optional<base::FilePath> GetGoogleUpdateExePath(UpdaterScope scope) { base::FilePath goopdate_base_dir; if (!base::PathService::Get(scope == UpdaterScope::kSystem
diff --git a/chrome/updater/win/win_util.h b/chrome/updater/win/win_util.h index 6d5b10b..bcbbdff 100644 --- a/chrome/updater/win/win_util.h +++ b/chrome/updater/win/win_util.h
@@ -241,6 +241,14 @@ HResultOr<DWORD> RunElevated(const base::FilePath& file_path, const std::wstring& parameters); +// Starts a new de-elevated process. `file_path` specifies the program to be +// run. `parameters` can be an empty string. The function waits until the +// spawned process has completed. The exit code of the process is returned in +// `exit_code`. +HRESULT RunDeElevated(const base::FilePath& file_path, + const std::wstring& parameters, + DWORD* exit_code); + absl::optional<base::FilePath> GetGoogleUpdateExePath(UpdaterScope scope); // Causes the COM runtime not to handle exceptions. Failing to set this
diff --git a/chrome/updater/win/win_util_unittest.cc b/chrome/updater/win/win_util_unittest.cc index 0c20dae6..2dfd68c 100644 --- a/chrome/updater/win/win_util_unittest.cc +++ b/chrome/updater/win/win_util_unittest.cc
@@ -131,6 +131,18 @@ EXPECT_EQ(result.value(), DWORD{0}); } +TEST(WinUtil, RunDeElevated) { + if (!::IsUserAnAdmin() || !IsUACOn()) + return; + + DWORD exit_code = 0; + const base::CommandLine test_process_cmd_line = + GetTestProcessCommandLine(GetTestScope()); + EXPECT_HRESULT_SUCCEEDED( + RunDeElevated(test_process_cmd_line.GetProgram(), + test_process_cmd_line.GetArgumentsString(), &exit_code)); +} + TEST(WinUtil, GetOSVersion) { absl::optional<OSVERSIONINFOEX> rtl_os_version = GetOSVersion(); ASSERT_NE(rtl_os_version, absl::nullopt);
diff --git a/components/autofill/core/common/autofill_payments_features.cc b/components/autofill/core/common/autofill_payments_features.cc index 7712258..3944aa05 100644 --- a/components/autofill/core/common/autofill_payments_features.cc +++ b/components/autofill/core/common/autofill_payments_features.cc
@@ -59,6 +59,14 @@ "AutofillEnableCardProductName", base::FEATURE_DISABLED_BY_DEFAULT); +// When enabled, if the user encounters the yellow path (challenge path) in the +// VCN retrieval flow and the server denotes that the card is eligible for CVC +// authentication, CVC authentication will be offered as one of the challenge +// options. +BASE_FEATURE(kAutofillEnableCvcForVcnYellowPath, + "AutofillEnableCvcForVcnYellowPath", + base::FEATURE_DISABLED_BY_DEFAULT); + // When enabled, the GetDetailsForEnrollResponseDetails in the // UploadCardResponseDetails will be parsed, which will allow the Virtual Card // Enrollment flow to skip making a new GetDetailsForEnroll request. This is an
diff --git a/components/autofill/core/common/autofill_payments_features.h b/components/autofill/core/common/autofill_payments_features.h index 8c44dea..dc87b77 100644 --- a/components/autofill/core/common/autofill_payments_features.h +++ b/components/autofill/core/common/autofill_payments_features.h
@@ -18,6 +18,7 @@ BASE_DECLARE_FEATURE(kAutofillCreditCardAuthentication); BASE_DECLARE_FEATURE(kAutofillEnableCardArtImage); BASE_DECLARE_FEATURE(kAutofillEnableCardProductName); +BASE_DECLARE_FEATURE(kAutofillEnableCvcForVcnYellowPath); BASE_DECLARE_FEATURE( kAutofillEnableGetDetailsForEnrollParsingInUploadCardResponse); BASE_DECLARE_FEATURE(kAutofillEnableFIDOProgressDialog);
diff --git a/components/autofill_assistant/browser/android/client_android.cc b/components/autofill_assistant/browser/android/client_android.cc index d6431db2..cb7091ee 100644 --- a/components/autofill_assistant/browser/android/client_android.cc +++ b/components/autofill_assistant/browser/android/client_android.cc
@@ -559,7 +559,7 @@ } std::string ClientAndroid::GetLocale() const { - // TODO(b/201964911): use dependencies instead. + // TODO(b/249978747): use dependencies instead. return base::android::GetDefaultLocaleString(); }
diff --git a/components/autofill_assistant/browser/desktop/starter_delegate_desktop.cc b/components/autofill_assistant/browser/desktop/starter_delegate_desktop.cc index 594cdc4..f1435c7 100644 --- a/components/autofill_assistant/browser/desktop/starter_delegate_desktop.cc +++ b/components/autofill_assistant/browser/desktop/starter_delegate_desktop.cc
@@ -130,7 +130,7 @@ } bool StarterDelegateDesktop::IsRegularScriptRunning() const { - // TODO(b/201964911): rework how we check for running scripts. + // TODO(b/249979875): rework how we check for running scripts. return false; }
diff --git a/components/autofill_assistant/browser/headless/client_headless.cc b/components/autofill_assistant/browser/headless/client_headless.cc index 681ae55..1335b2f8 100644 --- a/components/autofill_assistant/browser/headless/client_headless.cc +++ b/components/autofill_assistant/browser/headless/client_headless.cc
@@ -90,7 +90,7 @@ } bool ClientHeadless::IsRunning() const { - // TODO(b/201964911): Use the runtime manager to check whether a controller is + // TODO(b/249979875): Use the runtime manager to check whether a controller is // running across all clients. return controller_ != nullptr; } @@ -124,7 +124,7 @@ void ClientHeadless::FetchPaymentsClientToken( base::OnceCallback<void(const std::string&)> callback) { - // TODO(b/201964911): support payments client. + NOTIMPLEMENTED() << "Payments client is not implemented for headless."; std::move(callback).Run(""); }
diff --git a/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc index 65d9f1e6..1f8496b 100644 --- a/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc +++ b/components/autofill_assistant/browser/headless/headless_script_controller_impl.cc
@@ -122,7 +122,7 @@ std::move(onboarding_successful_callback_).Run(); - // TODO(b/201964911): At this point we should be sure no other Controller + // TODO(b/249979875): At this point we should be sure no other Controller // exists on this tab. Add logic to the starter to check that's the case. client_->Start( *url, std::move(trigger_context), std::move(service),
diff --git a/components/autofill_assistant/browser/headless/headless_ui_controller.cc b/components/autofill_assistant/browser/headless/headless_ui_controller.cc index 5b91bdca..142364d5 100644 --- a/components/autofill_assistant/browser/headless/headless_ui_controller.cc +++ b/components/autofill_assistant/browser/headless/headless_ui_controller.cc
@@ -39,7 +39,7 @@ } } -// TODO(b/201964911): fail execution instead of just logging a warning if a +// TODO(b/249983799): fail execution instead of just logging a warning if a // method is unexpectedly called. void HeadlessUiController::SetStatusMessage(const std::string& message) {}
diff --git a/components/autofill_assistant/browser/public/autofill_assistant_factory.h b/components/autofill_assistant/browser/public/autofill_assistant_factory.h index 8272737..8694331 100644 --- a/components/autofill_assistant/browser/public/autofill_assistant_factory.h +++ b/components/autofill_assistant/browser/public/autofill_assistant_factory.h
@@ -21,10 +21,6 @@ // Factory class for creating |AutofillAssistant|. class AutofillAssistantFactory { public: - // TODO(b/201964911) The |AutofillAssistant::CreateHeadlessScriptController| - // method ignores the |channel|, |country_code| and |locale| passed here and - // instead fetches them directly. Make the treatment between - // |HeadlessScriptController| and |GetCapabilitiesByHashPrefix| consistent. static std::unique_ptr<AutofillAssistant> CreateForBrowserContext( content::BrowserContext* browser_context, std::unique_ptr<CommonDependencies> dependencies);
diff --git a/components/browser_ui/widget/android/BUILD.gn b/components/browser_ui/widget/android/BUILD.gn index c1bbefd..9bc7f19 100644 --- a/components/browser_ui/widget/android/BUILD.gn +++ b/components/browser_ui/widget/android/BUILD.gn
@@ -304,6 +304,7 @@ "//base:base_java_test_support", "//content/public/test/android:content_java_test_support", "//third_party/androidx:androidx_recyclerview_recyclerview_java", + "//third_party/hamcrest:hamcrest_core_java", "//third_party/hamcrest:hamcrest_library_java", ] }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java index 9ffbf96..76fd344 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java
@@ -10,7 +10,6 @@ import android.graphics.drawable.ColorDrawable; import android.os.Build; import android.provider.Settings; -import android.view.DragEvent; import android.view.MotionEvent; import android.view.View; import android.view.View.OnDragListener; @@ -30,6 +29,8 @@ import org.chromium.base.ContextUtils; import org.chromium.components.browser_ui.widget.animation.Interpolators; import org.chromium.ui.UiUtils; +import org.chromium.ui.dragdrop.DragEventDispatchHelper; +import org.chromium.ui.dragdrop.DragEventDispatchHelper.DragEventDispatchDestination; import org.chromium.ui.util.AccessibilityUtil; import org.chromium.ui.util.ColorUtils; import org.chromium.ui.widget.AnchoredPopupWindow; @@ -56,7 +57,7 @@ private @Nullable AnchoredPopupWindow mPopupWindow; private View mLayout; private OnLayoutChangeListener mOnLayoutChangeListener; - private OnDragListener mOnDragListener; + private DragEventDispatchHelper mDragEventDispatchHelper; private Rect mRect; private int mTopMarginPx; @@ -211,19 +212,13 @@ }; (mIsPopup ? mLayout : mContentView).addOnLayoutChangeListener(mOnLayoutChangeListener); - // Forward the drag events to delegate view if drag happens on top of container. + // Forward the drag events to delegate view if it is an DragEventDispatchDestination. if (isDialogNonModal()) { - mOnDragListener = new OnDragListener() { - @Override - public boolean onDrag(View view, DragEvent dragEvent) { - if (mTouchEventDelegateView != null - && mTouchEventDelegateView.isAttachedToWindow()) { - return mTouchEventDelegateView.dispatchDragEvent(dragEvent); - } - return false; - } - }; - mLayout.setOnDragListener(mOnDragListener); + DragEventDispatchDestination dest = + DragEventDispatchDestination.from(mTouchEventDelegateView); + if (dest != null) { + mDragEventDispatchHelper = new DragEventDispatchHelper(mLayout, dest); + } } } @@ -265,9 +260,9 @@ mLayout.removeOnLayoutChangeListener(mOnLayoutChangeListener); mOnLayoutChangeListener = null; } - if (mOnDragListener != null) { - mLayout.setOnDragListener(null); - mOnDragListener = null; + if (mDragEventDispatchHelper != null) { + mDragEventDispatchHelper.stop(); + mDragEventDispatchHelper = null; } super.dismiss(); @@ -348,6 +343,6 @@ @VisibleForTesting OnDragListener getOnDragListenerForTesting() { - return mOnDragListener; + return mDragEventDispatchHelper; } }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java index e91c442..9ba0ec2 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialogUnitTest.java
@@ -10,6 +10,7 @@ import android.app.ActionBar.LayoutParams; import android.app.Activity; +import android.content.Context; import android.graphics.Rect; import android.view.DragEvent; import android.view.Gravity; @@ -38,6 +39,7 @@ import org.robolectric.shadows.ShadowPhoneWindow; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.ui.dragdrop.DragEventDispatchHelper.DragEventDispatchDestination; import org.chromium.ui.util.AccessibilityUtil; import org.chromium.ui.widget.UiWidgetFactory; @@ -54,14 +56,13 @@ Activity mActivity; FrameLayout mMenuContentView; View mRootView; + TestDragDispatchingDestinationView mSpyDragDispatchingDestinationView; @Mock UiWidgetFactory mMockUiWidgetFactory; @Spy PopupWindow mSpyPopupWindow; @Mock - View mMockTouchEventDelegateView; - @Mock AccessibilityUtil mMockAccessibilityUtil; @Before @@ -76,6 +77,8 @@ mRootView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT)); mSpyPopupWindow = Mockito.spy(UiWidgetFactory.getInstance().createPopupWindow(mActivity)); + mSpyDragDispatchingDestinationView = + Mockito.spy(new TestDragDispatchingDestinationView(mActivity)); UiWidgetFactory.setInstance(mMockUiWidgetFactory); Mockito.when(mMockUiWidgetFactory.createPopupWindow(any())).thenReturn(mSpyPopupWindow); Mockito.doNothing() @@ -187,7 +190,7 @@ requestLayoutForRootView(); Mockito.verify(mSpyPopupWindow) .showAtLocation(eq(mRootView.getRootView()), anyInt(), anyInt(), anyInt()); - Mockito.doReturn(true).when(mMockTouchEventDelegateView).isAttachedToWindow(); + Mockito.doReturn(true).when(mSpyDragDispatchingDestinationView).isAttachedToWindow(); // common motion events other than ACTION_DOWN should be forwarded to touch event delegate. int[] motionEvenActions = new int[] {MotionEvent.ACTION_CANCEL, @@ -198,14 +201,15 @@ for (int actionType : motionEvenActions) { MotionEvent event = createMockMotionEventWithActionType(actionType); mDialog.onTouchEvent(event); - Mockito.verify(mMockTouchEventDelegateView, Mockito.description("Action" + actionType)) + Mockito.verify(mSpyDragDispatchingDestinationView, + Mockito.description("Action" + actionType)) .dispatchTouchEvent(eq(event)); } // ACTION_DOWN should dismiss the dialog and the popup window. MotionEvent downEvent = createMockMotionEventWithActionType(MotionEvent.ACTION_DOWN); mDialog.onTouchEvent(downEvent); - Mockito.verify(mMockTouchEventDelegateView, Mockito.times(0)) + Mockito.verify(mSpyDragDispatchingDestinationView, Mockito.times(0)) .dispatchTouchEvent(eq(downEvent)); Mockito.verify(mSpyPopupWindow).dismiss(); } @@ -222,22 +226,22 @@ final DragEvent mockDragEvent = Mockito.mock(DragEvent.class); Mockito.doReturn(DragEvent.ACTION_DRAG_LOCATION).when(mockDragEvent).getAction(); - Mockito.doReturn(true).when(mMockTouchEventDelegateView).isAttachedToWindow(); + Mockito.doReturn(true).when(mSpyDragDispatchingDestinationView).isAttachedToWindow(); mDialog.getOnDragListenerForTesting().onDrag(mRootView, mockDragEvent); - Mockito.verify(mMockTouchEventDelegateView, Mockito.times(1)) - .dispatchDragEvent(eq(mockDragEvent)); + Mockito.verify(mSpyDragDispatchingDestinationView, Mockito.times(1)) + .onDragEventWithOffset(eq(mockDragEvent), anyInt(), anyInt()); final DragEvent mockDragEvent2 = Mockito.mock(DragEvent.class); - Mockito.doReturn(false).when(mMockTouchEventDelegateView).isAttachedToWindow(); + Mockito.doReturn(false).when(mSpyDragDispatchingDestinationView).isAttachedToWindow(); mDialog.getOnDragListenerForTesting().onDrag(mRootView, mockDragEvent2); - Mockito.verify(mMockTouchEventDelegateView, Mockito.times(0)) - .dispatchDragEvent(eq(mockDragEvent2)); + Mockito.verify(mSpyDragDispatchingDestinationView, Mockito.times(0)) + .onDragEventWithOffset(eq(mockDragEvent2), anyInt(), anyInt()); } private ContextMenuDialog createContextMenuDialog(boolean isPopup, boolean shouldRemoveScrim) { return new ContextMenuDialog(mActivity, 0, ContextMenuDialog.NO_CUSTOM_MARGIN, ContextMenuDialog.NO_CUSTOM_MARGIN, mRootView, mMenuContentView, isPopup, - shouldRemoveScrim, 0, 0, mMockTouchEventDelegateView, new Rect(0, 0, 0, 0), + shouldRemoveScrim, 0, 0, mSpyDragDispatchingDestinationView, new Rect(0, 0, 0, 0), mMockAccessibilityUtil); } @@ -253,4 +257,21 @@ return motionEvent; } + + static class TestDragDispatchingDestinationView + extends View implements DragEventDispatchDestination { + public TestDragDispatchingDestinationView(Context context) { + super(context); + } + + @Override + public View view() { + return this; + } + + @Override + public boolean onDragEventWithOffset(DragEvent event, int dx, int dy) { + return false; + } + } }
diff --git a/components/browser_ui/widget/android/test/java/src/org/chromium/components/browser_ui/widget/RecyclerViewTestUtils.java b/components/browser_ui/widget/android/test/java/src/org/chromium/components/browser_ui/widget/RecyclerViewTestUtils.java index 671b54c..6aeb7f1 100644 --- a/components/browser_ui/widget/android/test/java/src/org/chromium/components/browser_ui/widget/RecyclerViewTestUtils.java +++ b/components/browser_ui/widget/android/test/java/src/org/chromium/components/browser_ui/widget/RecyclerViewTestUtils.java
@@ -5,10 +5,16 @@ package org.chromium.components.browser_ui.widget; import android.view.View; +import android.view.ViewParent; import androidx.recyclerview.widget.RecyclerView; +import androidx.recyclerview.widget.RecyclerView.LayoutManager; +import androidx.recyclerview.widget.RecyclerView.ViewHolder; +import org.hamcrest.Description; +import org.hamcrest.Matcher; import org.hamcrest.Matchers; +import org.hamcrest.TypeSafeMatcher; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.Criteria; @@ -105,4 +111,62 @@ // A positive parameter checks scrolling down, a negative one scrolling up. CriteriaHelper.pollUiThread(() -> !recyclerView.canScrollVertically(1)); } + + /** + * The {@link RecyclerView} will respond to changes, particularly things like + * {@link androidx.recyclerview.widget.RecyclerView.Adapter#notifyItemChanged(int)} by + * immediately creating a new {@link View}, but asynchronously removing the old Views. The + * generic {@link ViewParent} interface methods that Espresso is using to access children + * may return stale information. This often results in + * {@link androidx.test.espresso.AmbiguousViewMatcherException}. This matcher utilizes our + * knowledge that the view must be rooted somewhere within a RecycleView, to use RecyclerView + * specific methods to verify if the View is still active or not. + */ + public static Matcher<View> activeInRecyclerView() { + return new ActiveInRecyclerViewMatcher(); + } + + private static class ActiveInRecyclerViewMatcher extends TypeSafeMatcher<View> { + @Override + protected boolean matchesSafely(View view) { + View topChild = getTopChild(view); + if (topChild == null) { + return false; + } + + RecyclerView recyclerView = (RecyclerView) topChild.getParent(); + LayoutManager layoutManager = recyclerView.getLayoutManager(); + ViewHolder viewHolder = recyclerView.getChildViewHolder(topChild); + + // The ViewHolder's index maybe be stale for Views that have been removed. Instead + // believe what the RecyclerView/LayoutManager claims is the top child view at the give + // index. + View activeChild = layoutManager.getChildAt(viewHolder.getLayoutPosition()); + return topChild == activeChild; + } + + /** + * Returns the top most child under the RecyclerView. This is the View with the ViewHolder. + * Often this matcher is called on view that's much farther down. + */ + private static View getTopChild(View view) { + View previous = view; + while (true) { + if (previous == null || !(previous.getParent() instanceof View)) { + return null; + } + View current = (View) previous.getParent(); + if (current instanceof RecyclerView) { + return previous; + } + + previous = current; + } + } + + @Override + public void describeTo(Description description) { + description.appendText("Not the active view in RecyclerView"); + } + } }
diff --git a/components/cast_streaming/browser/test/cast_streaming_test_sender.cc b/components/cast_streaming/browser/test/cast_streaming_test_sender.cc index 157cf3af..42434b1d 100644 --- a/components/cast_streaming/browser/test/cast_streaming_test_sender.cc +++ b/components/cast_streaming/browser/test/cast_streaming_test_sender.cc
@@ -61,8 +61,8 @@ class CastStreamingTestSender::SenderObserver final : public openscreen::cast::Sender::Observer { public: - explicit SenderObserver(raw_ptr<openscreen::cast::Sender> sender) - : sender_(sender) { + explicit SenderObserver(std::unique_ptr<openscreen::cast::Sender> sender) + : sender_(std::move(sender)) { CHECK(sender_); sender_->SetObserver(this); } @@ -97,7 +97,7 @@ void OnPictureLost() final {} openscreen::cast::FrameId last_reference_frame_id_; - raw_ptr<openscreen::cast::Sender> sender_ = nullptr; + std::unique_ptr<openscreen::cast::Sender> sender_; base::flat_map<openscreen::cast::FrameId, scoped_refptr<media::DecoderBuffer>> buffer_map_; }; @@ -234,13 +234,13 @@ if (senders.audio_sender) { audio_sender_observer_ = - std::make_unique<SenderObserver>(senders.audio_sender); + std::make_unique<SenderObserver>(std::move(senders.audio_sender)); audio_decoder_config_ = ToAudioDecoderConfig(senders.audio_config); } if (senders.video_sender) { video_sender_observer_ = - std::make_unique<SenderObserver>(senders.video_sender); + std::make_unique<SenderObserver>(std::move(senders.video_sender)); video_decoder_config_ = ToVideoDecoderConfig(senders.video_config); }
diff --git a/components/content_settings/core/browser/content_settings_policy_provider.cc b/components/content_settings/core/browser/content_settings_policy_provider.cc index e587f48..e2daa79 100644 --- a/components/content_settings/core/browser/content_settings_policy_provider.cc +++ b/components/content_settings/core/browser/content_settings_policy_provider.cc
@@ -100,9 +100,9 @@ {prefs::kManagedWebHidBlockedForUrls, ContentSettingsType::HID_GUARD, CONTENT_SETTING_BLOCK}, {prefs::kManagedWindowPlacementAllowedForUrls, - ContentSettingsType::WINDOW_PLACEMENT, CONTENT_SETTING_ALLOW}, + ContentSettingsType::WINDOW_MANAGEMENT, CONTENT_SETTING_ALLOW}, {prefs::kManagedWindowPlacementBlockedForUrls, - ContentSettingsType::WINDOW_PLACEMENT, CONTENT_SETTING_BLOCK}, + ContentSettingsType::WINDOW_MANAGEMENT, CONTENT_SETTING_BLOCK}, {prefs::kManagedLocalFontsAllowedForUrls, ContentSettingsType::LOCAL_FONTS, CONTENT_SETTING_ALLOW}, {prefs::kManagedLocalFontsBlockedForUrls, @@ -229,7 +229,7 @@ prefs::kManagedDefaultJavaScriptJitSetting}, {ContentSettingsType::HID_GUARD, prefs::kManagedDefaultWebHidGuardSetting}, - {ContentSettingsType::WINDOW_PLACEMENT, + {ContentSettingsType::WINDOW_MANAGEMENT, prefs::kManagedDefaultWindowPlacementSetting}, {ContentSettingsType::LOCAL_FONTS, prefs::kManagedDefaultLocalFontsSetting},
diff --git a/components/content_settings/core/browser/content_settings_registry.cc b/components/content_settings/core/browser/content_settings_registry.cc index 2d914a54..f0fa16de 100644 --- a/components/content_settings/core/browser/content_settings_registry.cc +++ b/components/content_settings/core/browser/content_settings_registry.cc
@@ -561,7 +561,7 @@ ContentSettingsInfo::PERSISTENT, ContentSettingsInfo::EXCEPTIONS_ON_SECURE_ORIGINS_ONLY); - Register(ContentSettingsType::WINDOW_PLACEMENT, "window-placement", + Register(ContentSettingsType::WINDOW_MANAGEMENT, "window-placement", CONTENT_SETTING_ASK, WebsiteSettingsInfo::SYNCABLE, AllowlistedSchemes(), ValidSettings(CONTENT_SETTING_ALLOW, CONTENT_SETTING_ASK,
diff --git a/components/content_settings/core/common/content_settings.cc b/components/content_settings/core/common/content_settings.cc index 9d7be22637..3818f91 100644 --- a/components/content_settings/core/common/content_settings.cc +++ b/components/content_settings/core/common/content_settings.cc
@@ -87,7 +87,7 @@ {ContentSettingsType::FILE_SYSTEM_READ_GUARD, 66}, {ContentSettingsType::STORAGE_ACCESS, 67}, {ContentSettingsType::CAMERA_PAN_TILT_ZOOM, 68}, - {ContentSettingsType::WINDOW_PLACEMENT, 69}, + {ContentSettingsType::WINDOW_MANAGEMENT, 69}, {ContentSettingsType::INSECURE_PRIVATE_NETWORK, 70}, {ContentSettingsType::LOCAL_FONTS, 71}, {ContentSettingsType::PERMISSION_AUTOREVOCATION_DATA, 72},
diff --git a/components/content_settings/core/common/content_settings_types.h b/components/content_settings/core/common/content_settings_types.h index 2ab55f19..40c60a0f 100644 --- a/components/content_settings/core/common/content_settings_types.h +++ b/components/content_settings/core/common/content_settings_types.h
@@ -203,10 +203,11 @@ // movements. It does not give access to camera. CAMERA_PAN_TILT_ZOOM, - // Content setting for Screen Enumeration and Window Placement functionality. - // Permits access to information about the screens, like size and position. - // Permits creating and placing windows across the set of connected screens. - WINDOW_PLACEMENT, + // Content setting for Screen Enumeration and Screen Detail functionality. + // Permits access to detailed multi-screen information, like size and + // position. Permits placing fullscreen and windowed content on specific + // screens. See also: https://w3c.github.io/window-placement + WINDOW_MANAGEMENT, // Stores whether to allow insecure websites to make private network requests. // See also: https://wicg.github.io/cors-rfc1918
diff --git a/components/content_settings/renderer/content_settings_agent_impl.cc b/components/content_settings/renderer/content_settings_agent_impl.cc index 9b9f377..41947c7d 100644 --- a/components/content_settings/renderer/content_settings_agent_impl.cc +++ b/components/content_settings/renderer/content_settings_agent_impl.cc
@@ -409,7 +409,7 @@ content_setting_rules_->mixed_content_rules, GURL()); return setting != CONTENT_SETTING_ALLOW; } - return false; + return true; } RendererContentSettingRules*
diff --git a/components/content_settings/renderer/content_settings_agent_impl_browsertest.cc b/components/content_settings/renderer/content_settings_agent_impl_browsertest.cc index 77eefa00..c1f2b06 100644 --- a/components/content_settings/renderer/content_settings_agent_impl_browsertest.cc +++ b/components/content_settings/renderer/content_settings_agent_impl_browsertest.cc
@@ -591,6 +591,14 @@ EXPECT_FALSE(agent->ShouldAutoupgradeMixedContent()); } +TEST_F(ContentSettingsAgentImplBrowserTest, MixedAutoupgradesNoSettingsSet) { + MockContentSettingsAgentImpl mock_agent(GetMainRenderFrame()); + + ContentSettingsAgentImpl* agent = + ContentSettingsAgentImpl::Get(GetMainRenderFrame()); + EXPECT_TRUE(agent->ShouldAutoupgradeMixedContent()); +} + TEST_F(ContentSettingsAgentImplBrowserTest, ContentSettingsAllowedAutoDark) { MockContentSettingsAgentImpl mock_agent(GetMainRenderFrame());
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn index f6f90ae1..795c9bf 100644 --- a/components/crash/android/BUILD.gn +++ b/components/crash/android/BUILD.gn
@@ -27,6 +27,7 @@ "//build/android:build_java", "//components/minidump_uploader:minidump_uploader_java", "//components/version_info/android:version_constants_java", + "//content/public/android:content_main_dex_java", "//third_party/androidx:androidx_annotation_annotation_java", ] annotation_processor_deps = [ "//base/android/jni_generator:jni_processor" ] @@ -35,6 +36,7 @@ "java/src/org/chromium/components/crash/CustomAssertionHandler.java", "java/src/org/chromium/components/crash/LogcatCrashExtractor.java", "java/src/org/chromium/components/crash/MinidumpLogcatPrepender.java", + "java/src/org/chromium/components/crash/NativeAndJavaSmartExceptionReporter.java", "java/src/org/chromium/components/crash/PureJavaExceptionReporter.java", ] sources += _jni_sources
diff --git a/components/crash/android/DEPS b/components/crash/android/DEPS index 1023fa8..f706753 100644 --- a/components/crash/android/DEPS +++ b/components/crash/android/DEPS
@@ -3,4 +3,5 @@ "+components/minidump_uploader/android", "+components/version_info/android", "+third_party/crashpad", + "+content/public/android/java/src/org/chromium/content_public/browser/UiThreadTaskTraits.java", ]
diff --git a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java index 5d51723..b4406f0f 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java +++ b/components/crash/android/java/src/org/chromium/components/crash/CrashKeys.java
@@ -60,11 +60,7 @@ * @see #flushToNative */ public AtomicReferenceArray<String> getValues() { - // TODO(smaier) this was causing infinite uploads of assertions. This caught a legitimate - // bug (uploading with Java-only crash keys when native is ready), but we need a bit of time - // to fix this, so doing a temporary workaround. Uncomment this as soon as possible. See - // crbug.com/1360834 for more details. - // assert !mFlushed; + assert !mFlushed : "Getting Java CrashKeys after the keys were flushed to native"; return mValues; } @@ -93,11 +89,7 @@ public void flushToNative() { ThreadUtils.assertOnUiThread(); - // TODO(smaier) this was causing infinite uploads of assertions. This caught a legitimate - // bug (uploading with Java-only crash keys when native is ready), but we need a bit of time - // to fix this, so doing a temporary workaround. Uncomment this as soon as possible. See - // crbug.com/1360834 for more details. - // assert !mFlushed; + assert !mFlushed : "Tried to flush to native twice"; for (@CrashKeyIndex int i = 0; i < mValues.length(); i++) { CrashKeysJni.get().set(CrashKeys.this, i, mValues.getAndSet(i, null)); }
diff --git a/components/crash/android/java/src/org/chromium/components/crash/CustomAssertionHandler.java b/components/crash/android/java/src/org/chromium/components/crash/CustomAssertionHandler.java index a6204f4..4acf8de5 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/CustomAssertionHandler.java +++ b/components/crash/android/java/src/org/chromium/components/crash/CustomAssertionHandler.java
@@ -25,13 +25,15 @@ // We've gotten an assertion report before we were ready to report. We drop these assertions // until we are ready to report them. if (sReporterFactory != null) { - PureJavaExceptionHandler.JavaExceptionReporter reporter = - sReporterFactory.createJavaExceptionReporter(); - reporter.postCreateAndUploadReport(exception); + NativeAndJavaSmartExceptionReporter.postUploadReport(exception, (e) -> { + PureJavaExceptionHandler.JavaExceptionReporter reporter = + sReporterFactory.createJavaExceptionReporter(); + reporter.createAndUploadReport(e); + }); } } - public static void installHandler( + public static void installPreNativeHandler( PureJavaExceptionHandler.JavaExceptionReporterFactory factory) { sReporterFactory = factory; }
diff --git a/components/crash/android/java/src/org/chromium/components/crash/NativeAndJavaSmartExceptionReporter.java b/components/crash/android/java/src/org/chromium/components/crash/NativeAndJavaSmartExceptionReporter.java new file mode 100644 index 0000000..4eb0159 --- /dev/null +++ b/components/crash/android/java/src/org/chromium/components/crash/NativeAndJavaSmartExceptionReporter.java
@@ -0,0 +1,37 @@ +// 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.components.crash; + +import org.chromium.base.Callback; +import org.chromium.base.JavaExceptionReporter; +import org.chromium.base.task.PostTask; +import org.chromium.base.task.TaskTraits; +import org.chromium.content_public.browser.UiThreadTaskTraits; + +/** + * This is an exception reporter which will delegate to a pure Java reporter until native is loaded. + * + * We will use the given PureJava implementation to report crashes, until we see that native is + * ready, at which point we will use base's {@link JavaExceptionReporter}. + * + * @see ChromePureJavaExceptionReporter for Chrome's pure Java implementation. + * @see AwPureJavaExceptionReporter for Webview's pure Java implementation. + */ +public class NativeAndJavaSmartExceptionReporter { + private static void uploadReport(Throwable exception, Callback<Throwable> pureJavaReport) { + if (PureJavaExceptionHandler.isEnabled()) { + pureJavaReport.onResult(exception); + } else { + // The native exception reporter requires to be called on the UI thread. + PostTask.postTask(UiThreadTaskTraits.BEST_EFFORT, + () -> JavaExceptionReporter.reportException(exception)); + } + } + + public static void postUploadReport(Throwable exception, Callback<Throwable> pureJavaReport) { + PostTask.postTask( + TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> uploadReport(exception, pureJavaReport)); + } +}
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java index 4270c46..61a2262 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java +++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java
@@ -17,13 +17,12 @@ public class PureJavaExceptionHandler implements Thread.UncaughtExceptionHandler { private final Thread.UncaughtExceptionHandler mParent; private boolean mHandlingException; - private static boolean sIsDisabled; + private static boolean sIsEnabled = true; private JavaExceptionReporterFactory mReporterFactory; /** Interface to allow uploading reports. */ public interface JavaExceptionReporter { void createAndUploadReport(Throwable e); - void postCreateAndUploadReport(Throwable e); } /** A factory interface to allow creating custom reporters. */ @@ -39,7 +38,7 @@ @Override public void uncaughtException(Thread t, Throwable e) { - if (!mHandlingException && !sIsDisabled) { + if (!mHandlingException && sIsEnabled) { mHandlingException = true; reportJavaException(e); } @@ -49,7 +48,7 @@ } public static void installHandler(JavaExceptionReporterFactory reporterFactory) { - if (!sIsDisabled) { + if (sIsEnabled) { Thread.setDefaultUncaughtExceptionHandler(new PureJavaExceptionHandler( Thread.getDefaultUncaughtExceptionHandler(), reporterFactory)); } @@ -61,7 +60,7 @@ // about handlers before it. If resetting the uncaught exception handler to mParent, we lost // all the handlers before mParent. In order to disable this handler, globally setting a // flag to ignore it seems to be the easiest way. - sIsDisabled = true; + sIsEnabled = false; CrashKeys.getInstance().flushToNative(); } @@ -69,4 +68,8 @@ JavaExceptionReporter reporter = mReporterFactory.createJavaExceptionReporter(); reporter.createAndUploadReport(e); } + + static boolean isEnabled() { + return sIsEnabled; + } }
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java index b5ffbd41..dab6c85 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java +++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
@@ -14,8 +14,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.PiiElider; import org.chromium.base.StrictModeContext; -import org.chromium.base.task.PostTask; -import org.chromium.base.task.TaskTraits; import org.chromium.build.annotations.MainDex; import org.chromium.components.minidump_uploader.CrashFileManager; import org.chromium.components.version_info.VersionInfo; @@ -83,17 +81,6 @@ } } - /** - * Report an exception on a background thread. - * - * This is used for silent exception reporting. - */ - @Override - public void postCreateAndUploadReport(Throwable javaException) { - PostTask.postTask( - TaskTraits.BEST_EFFORT_MAY_BLOCK, () -> createAndUploadReport(javaException)); - } - private void addPairedString(String messageType, String messageData) { addString(mBoundary); addString(FORM_DATA_MESSAGE + messageType + "\"");
diff --git a/components/embedder_support/android/BUILD.gn b/components/embedder_support/android/BUILD.gn index 4aec339..c5a5768 100644 --- a/components/embedder_support/android/BUILD.gn +++ b/components/embedder_support/android/BUILD.gn
@@ -312,12 +312,14 @@ sources = [ "javatests/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogRenderTest.java", + "javatests/src/org/chromium/components/embedder_support/util/UrlConstantsTest.java", "javatests/src/org/chromium/components/embedder_support/util/UrlUtilitiesUnitTest.java", ] deps = [ ":util_java", ":web_contents_delegate_java", ":web_contents_delegate_java_resources", + "//base:base_java", "//base:base_java_test_support", "//content/public/test/android:content_java_test_support", "//third_party/android_support_test_runner:rules_java",
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java index de4580e1..b561576 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java
@@ -4,6 +4,8 @@ package org.chromium.components.embedder_support.util; +import org.chromium.url.GURL; + /** * Java side version of chrome/common/url_constants.cc */ @@ -101,4 +103,20 @@ public static final String MANAGEMENT_HOST = "management"; public static final String MANAGEMENT_URL = "chrome://management/"; + + private static class Holder { + private static final String SERIALIZED_NTP_URL = + "73,1,true,0,6,0,-1,0,-1,9,6,0,-1,15,1,0,-1,0,-1,false,false,chrome://newtab/"; + private static GURL sNtpGurl = + GURL.deserializeLatestVersionOnly(SERIALIZED_NTP_URL.replace(',', '\0')); + } + + /** + * Returns a cached GURL representation of {@link UrlConstants.NTP_NON_NATIVE_URL}. It is safe + * to call this method before native is loaded and doing so will not block on native loading + * completion since a hardcoded, serialized string is used. + */ + public static GURL ntpGurl() { + return Holder.sNtpGurl; + } }
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentView.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentView.java index f418b330..2b8bced 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentView.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/view/ContentView.java
@@ -36,6 +36,7 @@ import org.chromium.content_public.browser.WebContentsAccessibility; import org.chromium.ui.base.EventForwarder; import org.chromium.ui.base.EventOffsetHandler; +import org.chromium.ui.dragdrop.DragEventDispatchHelper.DragEventDispatchDestination; /** * The containing view for {@link WebContents} that exists in the Android UI hierarchy and exposes @@ -48,7 +49,8 @@ */ public class ContentView extends FrameLayout implements ViewEventSink.InternalAccessDelegate, SmartClipProvider, - OnHierarchyChangeListener, OnSystemUiVisibilityChangeListener, OnDragListener { + OnHierarchyChangeListener, OnSystemUiVisibilityChangeListener, OnDragListener, + DragEventDispatchDestination { private static final String TAG = "ContentView"; // Default value to signal that the ContentView's size need not be overridden. @@ -73,7 +75,7 @@ private int mDesiredHeightMeasureSpec = DEFAULT_MEASURE_SPEC; @Nullable - private final EventOffsetHandler mEventOffsetHandler; + private EventOffsetHandler mEventOffsetHandler; /** * Constructs a new ContentView for the appropriate Android version. @@ -154,6 +156,16 @@ wcax.setObscuredByAnotherView(mIsObscuredForAccessibility); } + /** + * Set {@link EventOffsetHandler} used to handle touch / drag event offsets. Offsets are + * provided if the content view is has a different coordinate base than the physical screen + * (e.g. top browser control). + * @param handler Handler used to adjust touch / drag event offsets. + */ + public void setEventOffsetHandler(EventOffsetHandler handler) { + mEventOffsetHandler = handler; + } + @Override public boolean performAccessibilityAction(int action, Bundle arguments) { WebContentsAccessibility wcax = getWebContentsAccessibility(); @@ -382,7 +394,7 @@ @Override public boolean dispatchDragEvent(DragEvent e) { if (mEventOffsetHandler != null) { - mEventOffsetHandler.onPreDispatchDragEvent(e.getAction()); + mEventOffsetHandler.onPreDispatchDragEvent(e.getAction(), 0.f, 0.f); } boolean ret = super.dispatchDragEvent(e); if (mEventOffsetHandler != null) { @@ -573,4 +585,22 @@ private boolean webContentsAttached() { return hasValidWebContents() && mWebContents.getTopLevelNativeWindow() != null; } + + /////////////////////////////////////////////////////////////////////////////////////////////// + // Start Implementation of DragEventDispatchDestination // + /////////////////////////////////////////////////////////////////////////////////////////////// + @Override + public View view() { + return this; + } + + @Override + public boolean onDragEventWithOffset(DragEvent event, int dx, int dy) { + if (mEventOffsetHandler == null) return super.dispatchDragEvent(event); + + mEventOffsetHandler.onPreDispatchDragEvent(event.getAction(), dx, dy); + boolean ret = onDragEvent(event); + mEventOffsetHandler.onPostDispatchDragEvent(event.getAction()); + return ret; + } }
diff --git a/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/util/UrlConstantsTest.java b/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/util/UrlConstantsTest.java new file mode 100644 index 0000000..ee516d8 --- /dev/null +++ b/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/util/UrlConstantsTest.java
@@ -0,0 +1,44 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.components.embedder_support.util; + +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.library_loader.LibraryLoader; +import org.chromium.base.test.BaseJUnit4ClassRunner; +import org.chromium.base.test.util.DoNotBatch; +import org.chromium.url.GURL; +import org.chromium.url.GURL.BadSerializerVersionException; + +/** + * Unit tests for {@link UrlConstants}. + */ +@RunWith(BaseJUnit4ClassRunner.class) +@DoNotBatch(reason = "Tests pre-native startup behaviour and thus can't be batched.") +public class UrlConstantsTest { + @Test + @SmallTest + public void testNtpUrl() { + GURL ntpGurl; + try { + ntpGurl = UrlConstants.ntpGurl(); + } catch (BadSerializerVersionException be) { + Assert.assertFalse( + "Serialized value for ntpGurl in UrlConstants has a stale serializer version", + true); + return; + } + + Assert.assertFalse(LibraryLoader.getInstance().isInitialized()); + Assert.assertTrue(ntpGurl.isValid()); + Assert.assertEquals(ntpGurl.getHost(), UrlConstants.NTP_HOST); + Assert.assertEquals(ntpGurl.getScheme(), UrlConstants.CHROME_SCHEME); + Assert.assertTrue(UrlUtilities.isNTPUrl(UrlConstants.ntpGurl())); + } +}
diff --git a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc index 37d4cc7..1430cf5f 100644 --- a/components/feed/core/v2/api_test/feed_api_stream_unittest.cc +++ b/components/feed/core/v2/api_test/feed_api_stream_unittest.cc
@@ -3649,7 +3649,26 @@ network_.query_request_sent->feed_request().feed_query().reason()); EXPECT_TRUE(response_translator_.InjectedResponseConsumed()); } +TEST_F(FeedApiTest, ChannelFeed_AttachMultiple) { + response_translator_.InjectResponse(MakeTypicalInitialModelState()); + TestChannelSurface channel_surface_a(stream_.get(), "A"); + TestChannelSurface channel_surface_b(stream_.get(), "B"); + + WaitForIdleTaskQueue(); + + channel_surface_b.Detach(); + + WaitForModelToAutoUnload(); + WaitForIdleTaskQueue(); + + EXPECT_TRUE(stream_->GetModel(StreamType(StreamKind::kChannel, "A"))); + EXPECT_FALSE(stream_->GetModel(StreamType(StreamKind::kChannel, "B"))); + EXPECT_TRUE( + stream_->GetStreamPresentForTest(StreamType(StreamKind::kChannel, "A"))); + EXPECT_FALSE( + stream_->GetStreamPresentForTest(StreamType(StreamKind::kChannel, "B"))); +} // Keep instantiations at the bottom. INSTANTIATE_TEST_SUITE_P(FeedApiTest, FeedStreamTestForAllStreamTypes,
diff --git a/components/feed/core/v2/api_test/feed_api_test.cc b/components/feed/core/v2/api_test/feed_api_test.cc index 6cf6b67..17920b64 100644 --- a/components/feed/core/v2/api_test/feed_api_test.cc +++ b/components/feed/core/v2/api_test/feed_api_test.cc
@@ -332,8 +332,8 @@ : TestSurfaceBase(StreamType(StreamKind::kForYou), stream) {} TestWebFeedSurface::TestWebFeedSurface(FeedStream* stream) : TestSurfaceBase(StreamType(StreamKind::kFollowing), stream) {} -TestChannelSurface::TestChannelSurface(FeedStream* stream) - : TestSurfaceBase(StreamType(StreamKind::kChannel), stream) {} +TestChannelSurface::TestChannelSurface(FeedStream* stream, std::string channel) + : TestSurfaceBase(StreamType(StreamKind::kChannel, channel), stream) {} TestReliabilityLoggingBridge::TestReliabilityLoggingBridge() = default; TestReliabilityLoggingBridge::~TestReliabilityLoggingBridge() = default;
diff --git a/components/feed/core/v2/api_test/feed_api_test.h b/components/feed/core/v2/api_test/feed_api_test.h index f078057..855c6a40 100644 --- a/components/feed/core/v2/api_test/feed_api_test.h +++ b/components/feed/core/v2/api_test/feed_api_test.h
@@ -181,7 +181,7 @@ }; class TestChannelSurface : public TestSurfaceBase { public: - explicit TestChannelSurface(FeedStream* stream = nullptr); + explicit TestChannelSurface(FeedStream* stream = nullptr, std::string = ""); }; class TestImageFetcher : public ImageFetcher {
diff --git a/components/feed/core/v2/feed_stream.cc b/components/feed/core/v2/feed_stream.cc index 11698ece..ea2b878df 100644 --- a/components/feed/core/v2/feed_stream.cc +++ b/components/feed/core/v2/feed_stream.cc
@@ -1229,10 +1229,17 @@ // Note: This should only be called from a running Task, as some tasks assume // the model remains loaded. Stream* stream = FindStream(stream_type); - if (!stream || !stream->model) + if (!stream) return; - stream->surface_updater->SetModel(nullptr); - stream->model.reset(); + + if (stream->model) { + stream->surface_updater->SetModel(nullptr); + stream->model.reset(); + } + // If this is a channel stream remove it from streams_ as well + if (stream_type.IsChannelFeed()) { + streams_.erase(stream_type); + } } void FeedStream::UnloadModels() {
diff --git a/components/feed/core/v2/feed_stream.h b/components/feed/core/v2/feed_stream.h index cea6888f..6c4cbcb 100644 --- a/components/feed/core/v2/feed_stream.h +++ b/components/feed/core/v2/feed_stream.h
@@ -333,6 +333,10 @@ return weak_ptr_factory_.GetWeakPtr(); } + bool GetStreamPresentForTest(StreamType stream_type) { + return FindStream(stream_type) != nullptr; + } + private: using UnreadContentNotifier = feed_stream::UnreadContentNotifier;
diff --git a/components/history_clusters_strings.grdp b/components/history_clusters_strings.grdp index ac9907d..c6df2cc 100644 --- a/components/history_clusters_strings.grdp +++ b/components/history_clusters_strings.grdp
@@ -6,6 +6,12 @@ <message name="IDS_HISTORY_CLUSTERS_ACTION_MENU_DESCRIPTION" desc="Text used to identify the history clusters drop-down menu for screen readers"> Actions </message> + <message name="IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_CONFIRM_BUTTON" desc="Text for the button used to confirm the dialog asking if they would like to proceed with deletion."> + Remove + </message> + <message name="IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_WARNING" desc="Warning shown before deleting from the history clusters page"> + Are you sure you want to delete these pages from your history? + </message> <message name="IDS_HISTORY_CLUSTERS_DISABLE_MENU_ITEM_LABEL" desc="A label for the menu item to turn off the Journeys feature, which collects different search and browsing activities related to a single topic into a single place, and organizes them by topic. See glossary entry for meaning of 'Journeys'." formatter_data="android_java"> Turn off Journeys @@ -61,11 +67,14 @@ <message name="IDS_HISTORY_CLUSTERS_REMOVE_ITEM_TOAST" desc="Confirmation message shown after user successfully removes one history item from the item's drop-down menu."> Item removed </message> + <message name="IDS_HISTORY_CLUSTERS_REMOVE_SELECTED_ITEMS" desc="Title of the button that allows the user to remove the selected history cluster items"> + Remove selected items + </message> <message name="IDS_HISTORY_CLUSTERS_SAVED_IN_TABGROUP_LABEL" desc="A label indicating whether a history item was added to a tab group."> Saved in tab group </message> <message name="IDS_HISTORY_CLUSTERS_SEARCH_PROMPT" desc="A placeholder for the search bar in the side panel."> - Search History + Search Journeys </message> <message name="IDS_HISTORY_CLUSTERS_COPY_LINK" desc="Label of the item in drop-down menu that allows the user to copy a link."> Copy Link Address
diff --git a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_CONFIRM_BUTTON.png.sha1 b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_CONFIRM_BUTTON.png.sha1 new file mode 100644 index 0000000..1412bc5 --- /dev/null +++ b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_CONFIRM_BUTTON.png.sha1
@@ -0,0 +1 @@ +7f13bea6a834166a201f6f23e72981bb847991b7 \ No newline at end of file
diff --git a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_WARNING.png.sha1 b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_WARNING.png.sha1 new file mode 100644 index 0000000..1412bc5 --- /dev/null +++ b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_DELETE_PRIOR_VISITS_WARNING.png.sha1
@@ -0,0 +1 @@ +7f13bea6a834166a201f6f23e72981bb847991b7 \ No newline at end of file
diff --git a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_REMOVE_SELECTED_ITEMS.png.sha1 b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_REMOVE_SELECTED_ITEMS.png.sha1 new file mode 100644 index 0000000..1412bc5 --- /dev/null +++ b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_REMOVE_SELECTED_ITEMS.png.sha1
@@ -0,0 +1 @@ +7f13bea6a834166a201f6f23e72981bb847991b7 \ No newline at end of file
diff --git a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_SEARCH_PROMPT.png.sha1 b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_SEARCH_PROMPT.png.sha1 index ec0bb93..bac3bdd43 100644 --- a/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_SEARCH_PROMPT.png.sha1 +++ b/components/history_clusters_strings_grdp/IDS_HISTORY_CLUSTERS_SEARCH_PROMPT.png.sha1
@@ -1 +1 @@ -89bdf39ddf2d3323cc0f5f8ec8cabc35515c545b \ No newline at end of file +c2dc220bd037b4b79fab5420efbf436ce9d75d22 \ No newline at end of file
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerCoordinator.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerCoordinator.java index ee8024c..cf1dc68 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerCoordinator.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerCoordinator.java
@@ -95,6 +95,7 @@ * @return The animator which shows the message view. */ Animator show(@Position int fromIndex, @Position int toIndex) { + mView.dismissSecondaryMenuIfShown(); return mMediator.show(fromIndex, toIndex, () -> { if (toIndex != Position.FRONT) { setOnTouchRunnable(null); @@ -119,6 +120,7 @@ * @return The animator which hides the message view. */ Animator hide(boolean animate, Runnable messageHidden) { + mView.dismissSecondaryMenuIfShown(); mTimer.cancelTimer(); // Skip animation if animation has been globally disabled. // Otherwise, child animator's listener's onEnd will be called immediately after onStart,
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java index 669677e..43c86ca 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerView.java
@@ -217,6 +217,10 @@ mOnTitleChanged = runnable; } + void dismissSecondaryMenuIfShown() { + mSecondaryButton.dismiss(); + } + void enableLargeIcon(boolean enabled) { int smallSize = getResources().getDimensionPixelSize(R.dimen.message_icon_size); int largeSize = getResources().getDimensionPixelSize(R.dimen.message_icon_size_large);
diff --git a/components/metrics/structured/recorder.cc b/components/metrics/structured/recorder.cc index ef67ac2..b16170b 100644 --- a/components/metrics/structured/recorder.cc +++ b/components/metrics/structured/recorder.cc
@@ -78,10 +78,9 @@ } } -void Recorder::OnHardwareClassInitialized( - const std::string& full_hardware_class) { +void Recorder::OnSystemProfileInitialized() { for (auto& observer : observers_) { - observer.OnHardwareClassInitialized(full_hardware_class); + observer.OnSystemProfileInitialized(); } }
diff --git a/components/metrics/structured/recorder.h b/components/metrics/structured/recorder.h index 108e92a6..c65581b 100644 --- a/components/metrics/structured/recorder.h +++ b/components/metrics/structured/recorder.h
@@ -48,9 +48,8 @@ virtual void OnProfileAdded(const base::FilePath& profile_path) = 0; // Called on a call to OnReportingStateChanged. virtual void OnReportingStateChanged(bool enabled) = 0; - // Called when full hardware class has been loaded. - virtual void OnHardwareClassInitialized( - const std::string& full_hardware_class) {} + // Called when SystemProfile has finished loading + virtual void OnSystemProfileInitialized() {} // Called on a call to LastKeyRotation. virtual absl::optional<int> LastKeyRotation(uint64_t project_name_hash) = 0; }; @@ -80,8 +79,8 @@ // Notifies observers that metrics reporting has been enabled or disabled. void OnReportingStateChanged(bool enabled); - // Notifies observers that full hardware class has been loaded. - void OnHardwareClassInitialized(const std::string& full_hardware_class); + // Notifies observers that system profile has been loaded. + void OnSystemProfileInitialized(); void SetUiTaskRunner( const scoped_refptr<base::SequencedTaskRunner> ui_task_runner);
diff --git a/components/metrics/structured/structured_metrics_provider.cc b/components/metrics/structured/structured_metrics_provider.cc index d7bb994..04a66770 100644 --- a/components/metrics/structured/structured_metrics_provider.cc +++ b/components/metrics/structured/structured_metrics_provider.cc
@@ -51,7 +51,10 @@ char StructuredMetricsProvider::kUnsentLogsPath[] = "structured_metrics/events"; -StructuredMetricsProvider::StructuredMetricsProvider() { +StructuredMetricsProvider::StructuredMetricsProvider( + base::raw_ptr<metrics::MetricsProvider> system_profile_provider) + : system_profile_provider_(system_profile_provider) { + DCHECK(system_profile_provider_); Recorder::GetInstance()->AddObserver(this); } @@ -263,9 +266,8 @@ } } -void StructuredMetricsProvider::OnHardwareClassInitialized( - const std::string& full_hardware_class) { - full_hardware_class_ = full_hardware_class; +void StructuredMetricsProvider::OnSystemProfileInitialized() { + system_profile_initialized_ = true; } void StructuredMetricsProvider::ProvideCurrentSessionData( @@ -275,7 +277,7 @@ return; if (base::FeatureList::IsEnabled(kDelayUploadUntilHwid) && - !full_hardware_class_.has_value()) { + !system_profile_initialized_) { return; } @@ -303,7 +305,7 @@ } if (base::FeatureList::IsEnabled(kDelayUploadUntilHwid) && - !full_hardware_class_.has_value()) { + !system_profile_initialized_) { return false; } @@ -321,7 +323,7 @@ } if (base::FeatureList::IsEnabled(kDelayUploadUntilHwid) && - !full_hardware_class_.has_value()) { + !system_profile_initialized_) { std::move(done_callback).Run(false); return; } @@ -333,7 +335,7 @@ // Independent metrics need to manually populate Chrome OS fields such as // full_hardware_class as ChromeOSMetricsProvider will not be called for // IndependentMetrics. - ProvideFullHardwareClass(uma_proto->mutable_system_profile()); + ProvideSystemProfile(uma_proto->mutable_system_profile()); auto* structured_data = uma_proto->mutable_structured_data(); structured_data->mutable_events()->Swap( @@ -347,15 +349,13 @@ std::move(done_callback).Run(true); } -void StructuredMetricsProvider::ProvideFullHardwareClass( +void StructuredMetricsProvider::ProvideSystemProfile( SystemProfileProto* system_profile) { - SystemProfileProto::Hardware* hardware = system_profile->mutable_hardware(); - - // Populate proto with full_hardware_class if it does not contain the value - // yet. The field may be populated if ChromeOSMetricsProvider has already run. - if (full_hardware_class_.has_value() && - !hardware->has_full_hardware_class()) { - hardware->set_full_hardware_class(full_hardware_class_.value()); + // Populate the proto if the system profile has been intiailzed and + // have a system profile provider. + // The field may be populated if ChromeOSMetricsProvider has already run. + if (system_profile_initialized_) { + system_profile_provider_->ProvideSystemProfileMetrics(system_profile); } }
diff --git a/components/metrics/structured/structured_metrics_provider.h b/components/metrics/structured/structured_metrics_provider.h index 0aac773..3bcdbcc6 100644 --- a/components/metrics/structured/structured_metrics_provider.h +++ b/components/metrics/structured/structured_metrics_provider.h
@@ -57,7 +57,8 @@ class StructuredMetricsProvider : public metrics::MetricsProvider, public Recorder::RecorderImpl { public: - StructuredMetricsProvider(); + explicit StructuredMetricsProvider( + base::raw_ptr<metrics::MetricsProvider> system_profile_provider); ~StructuredMetricsProvider() override; StructuredMetricsProvider(const StructuredMetricsProvider&) = delete; StructuredMetricsProvider& operator=(const StructuredMetricsProvider&) = @@ -89,8 +90,7 @@ void OnProfileAdded(const base::FilePath& profile_path) override; void OnRecord(const EventBase& event) override; void OnReportingStateChanged(bool enabled) override; - void OnHardwareClassInitialized( - const std::string& full_hardware_class) override; + void OnSystemProfileInitialized() override; absl::optional<int> LastKeyRotation(uint64_t project_name_hash) override; // metrics::MetricsProvider: @@ -117,10 +117,11 @@ // has been initialized. void HashUnhashedEventsAndPersist(); - // Populates full hardware class needed for Structured Metrics. - // Independent metric uploads must populate hardware_class as the normal - // ChromeOSMetricsProvider will not be called to populate the SystemProfile. - void ProvideFullHardwareClass(SystemProfileProto* system_profile); + // Populates system profile needed for Structured Metrics. + // Independent metric uploads will rely on a SystemProfileProvider + // to supply the system profile since ChromeOSMetricsProvider will + // not be called to populate the SystemProfile. + void ProvideSystemProfile(SystemProfileProto* system_profile); // Beyond this number of logging events between successive calls to // ProvideCurrentSessionData, we stop recording events. @@ -194,8 +195,14 @@ // only. absl::optional<base::FilePath> device_key_data_path_for_test_; - // Hardware class used to populate independent metric uploads. - absl::optional<std::string> full_hardware_class_; + // todo(andrewbreggr): investigate removing this field, it is used + // when feature kDelayUploadUntilHwid is enabled + // SystemProfile is loaded to populate independent metric uploads. + bool system_profile_initialized_ = false; + + // Interface for providing the SystemProfile to metrics. + // See chrome/browser/metrics/chrome_metrics_service_client.h + base::raw_ptr<metrics::MetricsProvider> system_profile_provider_; base::WeakPtrFactory<StructuredMetricsProvider> weak_factory_{this}; };
diff --git a/components/metrics/structured/structured_metrics_provider_unittest.cc b/components/metrics/structured/structured_metrics_provider_unittest.cc index fb388e3..134b2077 100644 --- a/components/metrics/structured/structured_metrics_provider_unittest.cc +++ b/components/metrics/structured/structured_metrics_provider_unittest.cc
@@ -84,6 +84,7 @@ constexpr char kValueTwo[] = "value two"; constexpr char kHwid[] = "hwid"; +constexpr size_t kUserCount = 3; std::string HashToHex(const uint64_t hash) { return base::HexEncode(&hash, sizeof(uint64_t)); @@ -118,6 +119,21 @@ bool IsReadyToRecord() const override { return true; } }; +class TestSystemProfileProvider : public metrics::MetricsProvider { + public: + TestSystemProfileProvider() = default; + TestSystemProfileProvider(const TestSystemProfileProvider& recorder) = delete; + TestSystemProfileProvider& operator=( + const TestSystemProfileProvider& recorder) = delete; + ~TestSystemProfileProvider() override = default; + + void ProvideSystemProfileMetrics( + metrics::SystemProfileProto* proto) override { + proto->set_multi_profile_user_count(kUserCount); + proto->mutable_hardware()->set_full_hardware_class(kHwid); + } +}; + } // namespace class StructuredMetricsProviderTest : public testing::Test { @@ -204,8 +220,11 @@ // about: the metrics service initializing and enabling its providers, and a // user logging in. void Init() { + // Create a system profile, normally done by ChromeMetricsServiceClient. + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); // Create the provider, normally done by the ChromeMetricsServiceClient. - provider_ = std::make_unique<StructuredMetricsProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); // Set the device key data to be within the temp dir, rather than to // /var/lib/metrics/structured as is default. provider_->SetDeviceKeyDataPathForTest(DeviceKeyFilePath()); @@ -268,6 +287,25 @@ return p; } + ChromeUserMetricsExtension GetUmaProto() { + // Independent metrics are only reported at intervals. So advance time to + // ensure HasIndependentMetrics will return true if there are recorded + // metrics. + task_environment_.AdvanceClock(base::Hours(1)); + + ChromeUserMetricsExtension uma_proto; + if (provider_->HasIndependentMetrics()) { + provider_->ProvideIndependentMetrics( + base::BindOnce([](bool success) { CHECK(success); }), &uma_proto, + nullptr); + Wait(); + return uma_proto; + } + + auto p = ChromeUserMetricsExtension(); + return p; + } + void ExpectNoErrors() { histogram_tester_.ExpectTotalCount("UMA.StructuredMetrics.InternalError", 0); @@ -277,7 +315,10 @@ provider_->SetExternalMetricsDirForTest(dir); } + void InitializeSystemProfile() { provider_->OnSystemProfileInitialized(); } + protected: + std::unique_ptr<MetricsProvider> system_profile_provider_; std::unique_ptr<StructuredMetricsProvider> provider_; // Feature list should be constructed before task environment. base::test::ScopedFeatureList scoped_feature_list_; @@ -302,8 +343,6 @@ StructuredMetricsProviderTest::SetUp(); } - void InitializeHwid() { provider_->OnHardwareClassInitialized(kHwid); } - bool events_retrieved() { return events_retrieved_; } std::unique_ptr<ChromeUserMetricsExtension> GetUmaProto() { @@ -418,7 +457,9 @@ // initialization still completes correctly, but recording is correctly set to // disabled. TEST_F(StructuredMetricsProviderTest, RecordingDisabledDuringInitialization) { - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); OnProfileAdded(TempDirPath()); OnRecordingDisabled(); @@ -435,7 +476,9 @@ // Ensure that recording is disabled until explicitly enabled with a call to // OnRecordingEnabled. TEST_F(StructuredMetricsProviderTest, RecordingDisabledByDefault) { - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); OnProfileAdded(TempDirPath()); Wait(); @@ -571,6 +614,73 @@ histogram_tester_.ExpectTotalCount("UMA.StructuredMetrics.InternalError", 0); } +TEST_F(StructuredMetricsProviderTest, IndependentMetricsProvideSystemProfile) { + WriteTestingProfileKeys(); + Init(); + InitializeSystemProfile(); + + events::v2::test_project_one::TestEventOne() + .SetTestMetricOne(kValueOne) + .SetTestMetricTwo(12345) + .Record(); + events::v2::test_project_two::TestEventTwo() + .SetTestMetricThree(kValueTwo) + .Record(); + + const auto uma_proto = GetUmaProto(); + CHECK(uma_proto.has_system_profile()); + + { + const auto structured_profile = uma_proto.system_profile(); + EXPECT_EQ(structured_profile.multi_profile_user_count(), kUserCount); + EXPECT_EQ(structured_profile.hardware().full_hardware_class(), kHwid); + } + + const auto data = uma_proto.structured_data(); + ASSERT_EQ(data.events_size(), 2); + + { // First event + const auto& event = data.events(0); + EXPECT_EQ(event.event_name_hash(), kEventOneHash); + EXPECT_EQ(HashToHex(event.profile_event_id()), kProjectOneId); + ASSERT_EQ(event.metrics_size(), 2); + {} + + { // First metric + const auto& metric = event.metrics(0); + EXPECT_EQ(metric.name_hash(), kMetricOneHash); + EXPECT_EQ(HashToHex(metric.value_hmac()), + // Value of HMAC_256("aaa...a", concat(hex(kMetricOneHash), + // kValueOne)) + "8C2469269D142715"); + } + + { // Second metric + const auto& metric = event.metrics(1); + EXPECT_EQ(metric.name_hash(), kMetricTwoHash); + EXPECT_EQ(metric.value_int64(), 12345); + } + } + + { // Second event + const auto& event = data.events(1); + EXPECT_EQ(event.event_name_hash(), kEventTwoHash); + EXPECT_EQ(HashToHex(event.profile_event_id()), kProjectTwoId); + ASSERT_EQ(event.metrics_size(), 1); + + { // First metric + const auto& metric = event.metrics(0); + EXPECT_EQ(metric.name_hash(), kMetricThreeHash); + EXPECT_EQ(HashToHex(metric.value_hmac()), + // Value of HMAC_256("bbb...b", concat(hex(kProjectTwoHash), + // kValueTwo)) + "86F0169868588DC7"); + } + } + + histogram_tester_.ExpectTotalCount("UMA.StructuredMetrics.InternalError", 0); +} + // Ensure that events containing raw string metrics are reported correctly. TEST_F(StructuredMetricsProviderTest, RawStringMetricsReportedCorrectly) { Init(); @@ -732,7 +842,9 @@ ASSERT_TRUE( base::WriteFile(events_dir.Append("event"), proto.SerializeAsString())); - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); OnProfileAdded(TempDirPath()); OnRecordingEnabled(); SetExternalMetricsDirForTest(events_dir); @@ -750,7 +862,9 @@ ASSERT_TRUE( base::WriteFile(events_dir.Append("event"), proto.SerializeAsString())); - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); OnProfileAdded(TempDirPath()); OnRecordingDisabled(); SetExternalMetricsDirForTest(events_dir); @@ -764,7 +878,9 @@ // Manually create and initialize the provider, adding recording calls between // each step. All of these events should be ignored. events::v2::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); events::v2::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); OnRecordingEnabled(); Wait(); @@ -778,7 +894,9 @@ // Test that events reported after recording is enabled but before the keys are // loaded are hashed and stored after keys are loaded. TEST_F(StructuredMetricsProviderTest, EventsRecordedBeforeKeysInitialized) { - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); OnRecordingEnabled(); // Emulate metric before login. events::v2::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); @@ -837,7 +955,9 @@ // completes returns no events. TEST_F(StructuredMetricsProviderTest, ReportsNothingBeforeInitializationComplete) { - provider_ = std::make_unique<StructuredMetricsProvider>(); + system_profile_provider_ = std::make_unique<TestSystemProfileProvider>(); + provider_ = std::make_unique<StructuredMetricsProvider>( + system_profile_provider_.get()); EXPECT_EQ(GetSessionData().events_size(), 0); EXPECT_EQ(GetIndependentMetrics().events_size(), 0); OnRecordingEnabled(); @@ -868,7 +988,8 @@ EXPECT_GE(last_rotation, today - 90); } -TEST_F(StructuredMetricsProviderHwidTest, EventsNotSentIfHwidNotInitialized) { +TEST_F(StructuredMetricsProviderHwidTest, + EventsNotSentIfSystemProfileNotInitialized) { Init(); events::v2::test_project_one::TestEventOne().SetTestMetricTwo(1).Record(); @@ -879,7 +1000,7 @@ // HWID has not been set. Events should still persist in files. EXPECT_EQ(uma_proto->structured_data().events_size(), 0); - InitializeHwid(); + InitializeSystemProfile(); // Call again to fetch the new proto with new events. uma_proto = GetUmaProto();
diff --git a/components/mirroring/mojom/cast_message_channel.mojom b/components/mirroring/mojom/cast_message_channel.mojom index 4a0530b5..723ec48 100644 --- a/components/mirroring/mojom/cast_message_channel.mojom +++ b/components/mirroring/mojom/cast_message_channel.mojom
@@ -4,16 +4,29 @@ module mirroring.mojom; +// Used for remoting-specific cast messages, currently only RPC. const string kRemotingNamespace = "urn:x-cast:com.google.cast.remoting"; + +// Used for the majority of cast messages, including OFFER, ANSWER, +// GET_CAPABILITIES, CAPABILITIES_RESPONSE, and PRESENTATION (limited support). const string kWebRtcNamespace = "urn:x-cast:com.google.cast.webrtc"; +// Represents a control message for negotiating both mirroring and remoting cast +// sessions. struct CastMessage { + // The message namespace, restricted to either `kRemotingNamespace` or + // `kWebRtcNamespace`. string message_namespace; - string json_format_data; // The content of the message. + + // The message contents, formatted as a valid JSON string. + string json_format_data; }; -// This interface is used to send a CastMessage. +// This interface is used for sending and receiving cast messages. interface CastMessageChannel { - Send(CastMessage message); + // For outbound channels, this method may be called to send a cast message to + // the Cast receiver. For inbound channels, this method is called whenever a + // message is received from the Cast receiver. + OnMessage(CastMessage message); };
diff --git a/components/mirroring/service/media_remoter.cc b/components/mirroring/service/media_remoter.cc index c52f6a5b..975fe78 100644 --- a/components/mirroring/service/media_remoter.cc +++ b/components/mirroring/service/media_remoter.cc
@@ -44,8 +44,8 @@ void MediaRemoter::StartRpcMessaging( scoped_refptr<media::cast::CastEnvironment> cast_environment, - openscreen::cast::Sender* audio_sender, - openscreen::cast::Sender* video_sender, + std::unique_ptr<openscreen::cast::Sender> audio_sender, + std::unique_ptr<openscreen::cast::Sender> video_sender, absl::optional<FrameSenderConfig> audio_config, absl::optional<FrameSenderConfig> video_config) { DCHECK(audio_sender || video_sender); @@ -54,8 +54,8 @@ DCHECK(!transport_); DCHECK(base::FeatureList::IsEnabled(media::kOpenscreenCastStreamingSession)); - openscreen_audio_sender_ = audio_sender; - openscreen_video_sender_ = video_sender; + openscreen_audio_sender_ = std::move(audio_sender); + openscreen_video_sender_ = std::move(video_sender); StartRpcMessagingInternal(std::move(cast_environment), std::move(audio_config), std::move(video_config)); } @@ -188,7 +188,7 @@ openscreen_audio_sender_) { // NOTE: use of base::Unretained is safe because we own the sender. audio_sender_ = std::make_unique<RemotingSender>( - cast_environment_, openscreen_audio_sender_, *audio_config_, + cast_environment_, std::move(openscreen_audio_sender_), *audio_config_, std::move(audio_pipe), std::move(audio_sender_receiver), base::BindOnce(&MediaRemoter::OnRemotingDataStreamError, base::Unretained(this))); @@ -199,7 +199,7 @@ openscreen_video_sender_) { // NOTE: use of base::Unretained is safe because we own the sender. video_sender_ = std::make_unique<RemotingSender>( - cast_environment_, openscreen_video_sender_, *video_config_, + cast_environment_, std::move(openscreen_video_sender_), *video_config_, std::move(video_pipe), std::move(video_sender_receiver), base::BindOnce(&MediaRemoter::OnRemotingDataStreamError, base::Unretained(this)));
diff --git a/components/mirroring/service/media_remoter.h b/components/mirroring/service/media_remoter.h index db32a5b..c8e5a7e 100644 --- a/components/mirroring/service/media_remoter.h +++ b/components/mirroring/service/media_remoter.h
@@ -14,10 +14,7 @@ #include "mojo/public/cpp/bindings/remote.h" #include "mojo/public/cpp/system/data_pipe.h" #include "third_party/abseil-cpp/absl/types/optional.h" - -namespace openscreen::cast { -class Sender; -} // namespace openscreen::cast +#include "third_party/openscreen/src/cast/streaming/sender.h" namespace media::cast { class CastEnvironment; @@ -84,8 +81,8 @@ // it is ignored. void StartRpcMessaging( scoped_refptr<media::cast::CastEnvironment> cast_environment, - openscreen::cast::Sender* audio_sender, - openscreen::cast::Sender* video_sender, + std::unique_ptr<openscreen::cast::Sender> audio_sender, + std::unique_ptr<openscreen::cast::Sender> video_sender, absl::optional<media::cast::FrameSenderConfig> audio_config, absl::optional<media::cast::FrameSenderConfig> video_config); @@ -163,8 +160,8 @@ // Used only if StartRpcMessaging is called with openscreen::cast::Sender // objects. - raw_ptr<openscreen::cast::Sender> openscreen_audio_sender_ = nullptr; - raw_ptr<openscreen::cast::Sender> openscreen_video_sender_ = nullptr; + std::unique_ptr<openscreen::cast::Sender> openscreen_audio_sender_; + std::unique_ptr<openscreen::cast::Sender> openscreen_video_sender_; absl::optional<media::cast::FrameSenderConfig> audio_config_; absl::optional<media::cast::FrameSenderConfig> video_config_;
diff --git a/components/mirroring/service/media_remoter_unittest.cc b/components/mirroring/service/media_remoter_unittest.cc index d75e2d28..97435b4d 100644 --- a/components/mirroring/service/media_remoter_unittest.cc +++ b/components/mirroring/service/media_remoter_unittest.cc
@@ -62,27 +62,28 @@ &task_runner, openscreen::IPEndpoint::kAnyV4()), sender_packet_router(&environment, 20, std::chrono::milliseconds(10)), - - audio_sender(&environment, - &sender_packet_router, - openscreen::cast::SessionConfig{ - kFirstSsrc, kFirstSsrc + 1, kRtpTimebase, - 2 /* channels */, kDefaultPlayoutDelay, kAesSecretKey, - kAesIvMask, true /* is_pli_enabled */}, - openscreen::cast::RtpPayloadType::kAudioVarious), - video_sender(&environment, - &sender_packet_router, - openscreen::cast::SessionConfig{ - kFirstSsrc + 2, kFirstSsrc + 3, kRtpTimebase, - 1 /* channels */, kDefaultPlayoutDelay, kAesSecretKey, - kAesIvMask, true /* is_pli_enabled */}, - openscreen::cast::RtpPayloadType::kVideoVarious) {} + audio_sender(std::make_unique<openscreen::cast::Sender>( + &environment, + &sender_packet_router, + openscreen::cast::SessionConfig{ + kFirstSsrc, kFirstSsrc + 1, kRtpTimebase, 2 /* channels */, + kDefaultPlayoutDelay, kAesSecretKey, kAesIvMask, + true /* is_pli_enabled */}, + openscreen::cast::RtpPayloadType::kAudioVarious)), + video_sender(std::make_unique<openscreen::cast::Sender>( + &environment, + &sender_packet_router, + openscreen::cast::SessionConfig{ + kFirstSsrc + 2, kFirstSsrc + 3, kRtpTimebase, 1 /* channels */, + kDefaultPlayoutDelay, kAesSecretKey, kAesIvMask, + true /* is_pli_enabled */}, + openscreen::cast::RtpPayloadType::kVideoVarious)) {} openscreen_platform::TaskRunner task_runner; openscreen::cast::Environment environment; openscreen::cast::SenderPacketRouter sender_packet_router; - openscreen::cast::Sender audio_sender; - openscreen::cast::Sender video_sender; + std::unique_ptr<openscreen::cast::Sender> audio_sender; + std::unique_ptr<openscreen::cast::Sender> video_sender; }; // Mojo handles used for managing the remoting data streams. @@ -148,7 +149,8 @@ ~MediaRemoterTest() override { task_environment_.RunUntilIdle(); } protected: - MOCK_METHOD1(Send, void(mojom::CastMessagePtr)); + // mojom::CastMessageChannel mock implementation (inbound messages). + MOCK_METHOD1(OnMessage, void(mojom::CastMessagePtr)); MOCK_METHOD0(OnConnectToRemotingSource, void()); MOCK_METHOD0(RequestRemotingStreaming, void()); MOCK_METHOD0(RestartMirroringStreaming, void()); @@ -213,8 +215,8 @@ if (should_use_openscreen_senders) { openscreen_test_senders_ = std::make_unique<OpenscreenTestSenders>(); media_remoter_->StartRpcMessaging( - cast_environment, &openscreen_test_senders_->audio_sender, - &openscreen_test_senders_->video_sender, + cast_environment, std::move(openscreen_test_senders_->audio_sender), + std::move(openscreen_test_senders_->video_sender), MirrorSettings::GetDefaultAudioConfig(RtpPayloadType::REMOTE_AUDIO, Codec::CODEC_AUDIO_REMOTE), MirrorSettings::GetDefaultVideoConfig(RtpPayloadType::REMOTE_VIDEO,
diff --git a/components/mirroring/service/message_dispatcher.cc b/components/mirroring/service/message_dispatcher.cc index 2150c55..97e1f8fa 100644 --- a/components/mirroring/service/message_dispatcher.cc +++ b/components/mirroring/service/message_dispatcher.cc
@@ -69,7 +69,7 @@ subscriptions.clear(); } -void MessageDispatcher::Send(mojom::CastMessagePtr message) { +void MessageDispatcher::OnMessage(mojom::CastMessagePtr message) { // TODO(crbug.com/1117673): Add MR-internals logging: // VLOG(2) << "Inbound message received: ns=" << message->message_namespace // << ", data=" << message->json_format_data; @@ -134,7 +134,7 @@ // TODO(crbug.com/1117673): Add MR-internals logging: // VLOG(2) << "Sending outbound message: ns=" << message->message_namespace // << ", data=" << message->json_format_data; - outbound_channel_->Send(std::move(message)); + outbound_channel_->OnMessage(std::move(message)); } void MessageDispatcher::RequestReply(mojom::CastMessagePtr message,
diff --git a/components/mirroring/service/message_dispatcher.h b/components/mirroring/service/message_dispatcher.h index 994b548..f2883ef 100644 --- a/components/mirroring/service/message_dispatcher.h +++ b/components/mirroring/service/message_dispatcher.h
@@ -64,8 +64,8 @@ private: class RequestHolder; - // mojom::CastMessageChannel implementation. Handles inbound messages. - void Send(mojom::CastMessagePtr message) override; + // mojom::CastMessageChannel implementation (inbound messages). + void OnMessage(mojom::CastMessagePtr message) override; // Takes care of sending outbound messages. const mojo::Remote<mojom::CastMessageChannel> outbound_channel_;
diff --git a/components/mirroring/service/message_dispatcher_unittest.cc b/components/mirroring/service/message_dispatcher_unittest.cc index efbea4d..4043a05 100644 --- a/components/mirroring/service/message_dispatcher_unittest.cc +++ b/components/mirroring/service/message_dispatcher_unittest.cc
@@ -93,15 +93,15 @@ } protected: - // mojom::CastMessageChannel implementation. Handles outbound message. - void Send(mojom::CastMessagePtr message) override { + // mojom::CastMessageChannel implementation (outbound messages). + void OnMessage(mojom::CastMessagePtr message) override { last_outbound_message_.message_namespace = message->message_namespace; last_outbound_message_.json_format_data = message->json_format_data; } // Simulates receiving an inbound message from receiver. - void SendInboundMessage(const mojom::CastMessage& message) { - inbound_channel_->Send(message.Clone()); + void OnInboundMessage(const mojom::CastMessage& message) { + inbound_channel_->OnMessage(message.Clone()); } base::test::TaskEnvironment task_environment_; @@ -137,7 +137,7 @@ // subscriber processes the message. const CastMessage answer_message = CastMessage{mojom::kWebRtcNamespace, kValidAnswerResponse}; - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); ASSERT_TRUE(last_answer_response_); EXPECT_FALSE(last_rpc_); @@ -162,7 +162,7 @@ rpc_base64 + R"("})"; const CastMessage rpc_message = CastMessage{mojom::kRemotingNamespace, rpc}; - SendInboundMessage(rpc_message); + OnInboundMessage(rpc_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); ASSERT_TRUE(last_rpc_); @@ -175,7 +175,7 @@ // Unsubscribe from ANSWER messages, and when feeding-in an ANSWER message, // nothing should happen. message_dispatcher_->Unsubscribe(ResponseType::ANSWER); - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); // The answer should be ignored now that we are unsubscribed. EXPECT_FALSE(last_answer_response_); @@ -185,7 +185,7 @@ // However, RPC messages should still be dispatched to the // remaining subscriber. - SendInboundMessage(rpc_message); + OnInboundMessage(rpc_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); EXPECT_TRUE(last_rpc_); @@ -195,14 +195,14 @@ // Finally, unsubscribe from RPC messages, and when feeding-in // either an ANSWER or a RPC message, nothing should happen. message_dispatcher_->Unsubscribe(ResponseType::RPC); - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); EXPECT_FALSE(last_rpc_); EXPECT_TRUE(last_error_message_.empty()); last_error_message_.clear(); - SendInboundMessage(rpc_message); + OnInboundMessage(rpc_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); @@ -213,7 +213,7 @@ TEST_F(MessageDispatcherTest, IgnoreMalformedMessage) { const CastMessage message = CastMessage{mojom::kWebRtcNamespace, "MUAHAHAHAHAHAHAHA!"}; - SendInboundMessage(message); + OnInboundMessage(message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); EXPECT_FALSE(last_rpc_); @@ -223,7 +223,7 @@ TEST_F(MessageDispatcherTest, IgnoreMessageWithWrongNamespace) { const CastMessage answer_message = CastMessage{"Wrong_namespace", kValidAnswerResponse}; - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); EXPECT_FALSE(last_rpc_); @@ -233,7 +233,7 @@ TEST_F(MessageDispatcherTest, IgnoreMessageWithNoSubscribers) { const CastMessage unexpected_message{mojom::kWebRtcNamespace, kValidCapabilitiesResponse}; - SendInboundMessage(unexpected_message); + OnInboundMessage(unexpected_message); task_environment_.RunUntilIdle(); // Messages with no subscribers are ignored with no error reported. EXPECT_FALSE(last_answer_response_); @@ -260,7 +260,7 @@ const CastMessage wrong_answer_message{mojom::kWebRtcNamespace, kValidAnswerResponse}; - SendInboundMessage(wrong_answer_message); + OnInboundMessage(wrong_answer_message); task_environment_.RunUntilIdle(); // The answer message with mismatched sequence number is ignored. EXPECT_FALSE(last_answer_response_); @@ -280,7 +280,7 @@ const CastMessage answer_message{mojom::kWebRtcNamespace, kAnswerWithCorrectSeqNum}; - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); ASSERT_TRUE(last_answer_response_); EXPECT_FALSE(last_rpc_); @@ -292,7 +292,7 @@ last_answer_response_.reset(); // Expect that the callback for ANSWER message was already unsubscribed. - SendInboundMessage(answer_message); + OnInboundMessage(answer_message); task_environment_.RunUntilIdle(); EXPECT_FALSE(last_answer_response_); EXPECT_FALSE(last_rpc_);
diff --git a/components/mirroring/service/openscreen_message_port.cc b/components/mirroring/service/openscreen_message_port.cc index 5eb8786..e58878c 100644 --- a/components/mirroring/service/openscreen_message_port.cc +++ b/components/mirroring/service/openscreen_message_port.cc
@@ -40,10 +40,10 @@ auto message_mojom = mojom::CastMessage::New(); message_mojom->message_namespace = message_namespace; message_mojom->json_format_data = message; - outbound_channel_->Send(std::move(message_mojom)); + outbound_channel_->OnMessage(std::move(message_mojom)); } -void OpenscreenMessagePort::Send(mojom::CastMessagePtr message) { +void OpenscreenMessagePort::OnMessage(mojom::CastMessagePtr message) { if (client_) { client_->OnMessage(destination_id_, message->message_namespace, message->json_format_data);
diff --git a/components/mirroring/service/openscreen_message_port.h b/components/mirroring/service/openscreen_message_port.h index 71b0aa3..6226a12 100644 --- a/components/mirroring/service/openscreen_message_port.h +++ b/components/mirroring/service/openscreen_message_port.h
@@ -39,11 +39,8 @@ const std::string& message) override; private: - // mojom::CastMessageChannel overrides. - // Receive a message from the Cast receiver over the Cast V2 channel. - // TODO(https://crbug.com/1359456): rename mojo method to something more - // intuitive, like "OnMessage." - void Send(mojom::CastMessagePtr message) override; + // mojom::CastMessageChannel implementation (inbound messages). + void OnMessage(mojom::CastMessagePtr message) override; const base::StringPiece source_id_; const std::string destination_id_;
diff --git a/components/mirroring/service/openscreen_message_port_unittest.cc b/components/mirroring/service/openscreen_message_port_unittest.cc index 6103422..8edd38d 100644 --- a/components/mirroring/service/openscreen_message_port_unittest.cc +++ b/components/mirroring/service/openscreen_message_port_unittest.cc
@@ -63,8 +63,8 @@ ~OpenscreenMessagePortTest() override { task_environment_.RunUntilIdle(); } protected: - // mojom::CastMessageHandler implementation. For outbound messages. - void Send(mojom::CastMessagePtr message) override { + // mojom::CastMessageChannel implementation (outbound messages). + void OnMessage(mojom::CastMessagePtr message) override { EXPECT_EQ(message->message_namespace, kNamespace); absl::optional<base::Value> value = base::JSONReader::Read(message->json_format_data); @@ -75,11 +75,11 @@ } MOCK_METHOD1(OnOutboundMessage, void(const std::string& message_type)); - void SendMessage(const std::string& message_namespace, - const std::string& json_format_data) { + void OnInboundMessage(const std::string& message_namespace, + const std::string& json_format_data) { mojom::CastMessagePtr message = mojom::CastMessage::New(message_namespace, json_format_data); - inbound_channel_->Send(std::move(message)); + inbound_channel_->OnMessage(std::move(message)); task_environment_.RunUntilIdle(); } @@ -107,7 +107,7 @@ constexpr char kMessage[] = R"({"type": "ANSWER"})"; EXPECT_CALL(client(), OnMessage(kDestinationId, kNamespace, kMessage)); - SendMessage(kNamespace, std::string(kMessage)); + OnInboundMessage(kNamespace, std::string(kMessage)); task_environment().RunUntilIdle(); }
diff --git a/components/mirroring/service/openscreen_session_host.cc b/components/mirroring/service/openscreen_session_host.cc index 2d056e3..2f8ddbe 100644 --- a/components/mirroring/service/openscreen_session_host.cc +++ b/components/mirroring/service/openscreen_session_host.cc
@@ -428,8 +428,9 @@ } media_remoter_->StartRpcMessaging( - cast_environment_, senders.audio_sender, senders.video_sender, - std::move(audio_config), std::move(video_config)); + cast_environment_, std::move(senders.audio_sender), + std::move(senders.video_sender), std::move(audio_config), + std::move(video_config)); return; } @@ -441,7 +442,7 @@ base::BindOnce(&OpenscreenSessionHost::OnEncoderStatusChange, // Safe because we own `audio_stream`. weak_factory_.GetWeakPtr()), - senders.audio_sender); + std::move(senders.audio_sender)); audio_stream_ = std::make_unique<AudioRtpStream>( std::move(audio_sender), weak_factory_.GetWeakPtr()); DCHECK(!audio_capturing_callback_); @@ -472,7 +473,7 @@ base::BindRepeating( &OpenscreenSessionHost::CreateVideoEncodeAccelerator, weak_factory_.GetWeakPtr()), - senders.video_sender, + std::move(senders.video_sender), base::BindRepeating(&OpenscreenSessionHost::SetTargetPlayoutDelay, weak_factory_.GetWeakPtr()), base::BindRepeating(&OpenscreenSessionHost::ProcessFeedback,
diff --git a/components/mirroring/service/openscreen_session_host_unittest.cc b/components/mirroring/service/openscreen_session_host_unittest.cc index 1f1db13..42153396 100644 --- a/components/mirroring/service/openscreen_session_host_unittest.cc +++ b/components/mirroring/service/openscreen_session_host_unittest.cc
@@ -168,8 +168,8 @@ MOCK_METHOD0(OnInitialized, void()); - // mojom::CastMessageHandler overrides. - void Send(mojom::CastMessagePtr message) override { + // mojom::CastMessageChannel implementation (outbound messages). + void OnMessage(mojom::CastMessagePtr message) override { EXPECT_TRUE(message->message_namespace == mojom::kWebRtcNamespace || message->message_namespace == mojom::kRemotingNamespace); @@ -260,7 +260,7 @@ mojom::CastMessagePtr message = mojom::CastMessage::New( openscreen::cast::kCastWebrtcNamespace, message_string.value()); - inbound_channel_->Send(std::move(message)); + inbound_channel_->OnMessage(std::move(message)); } OpenscreenSessionHost::AsyncInitializedCallback MakeOnInitializedCallback() {
diff --git a/components/mirroring/service/remoting_sender.cc b/components/mirroring/service/remoting_sender.cc index 56ca9cc7..6c8e32d 100644 --- a/components/mirroring/service/remoting_sender.cc +++ b/components/mirroring/service/remoting_sender.cc
@@ -44,7 +44,7 @@ RemotingSender::RemotingSender( scoped_refptr<media::cast::CastEnvironment> cast_environment, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, const media::cast::FrameSenderConfig& config, mojo::ScopedDataPipeConsumerHandle pipe, mojo::PendingReceiver<media::mojom::RemotingDataStreamSender> stream_sender, @@ -52,7 +52,7 @@ : RemotingSender(cast_environment, media::cast::FrameSender::Create(cast_environment, config, - sender, + std::move(sender), *this), config, std::move(pipe),
diff --git a/components/mirroring/service/remoting_sender.h b/components/mirroring/service/remoting_sender.h index 6abadbd..aed8324 100644 --- a/components/mirroring/service/remoting_sender.h +++ b/components/mirroring/service/remoting_sender.h
@@ -55,7 +55,7 @@ // |Sender| instance is destroyed when renegotiation is complete, |this| // is also invalid and should be immediately torn down. RemotingSender(scoped_refptr<media::cast::CastEnvironment> cast_environment, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, const media::cast::FrameSenderConfig& config, mojo::ScopedDataPipeConsumerHandle pipe, mojo::PendingReceiver<media::mojom::RemotingDataStreamSender>
diff --git a/components/mirroring/service/session_unittest.cc b/components/mirroring/service/session_unittest.cc index a9dc495..409c3c90 100644 --- a/components/mirroring/service/session_unittest.cc +++ b/components/mirroring/service/session_unittest.cc
@@ -127,8 +127,8 @@ MOCK_METHOD0(OnInitDone, void()); - // mojom::CastMessageHandler implementation. For outbound messages. - void Send(mojom::CastMessagePtr message) override { + // mojom::CastMessageChannel implementation (outbound messages). + void OnMessage(mojom::CastMessagePtr message) override { EXPECT_TRUE(message->message_namespace == mojom::kWebRtcNamespace || message->message_namespace == mojom::kRemotingNamespace); absl::optional<base::Value> value =
diff --git a/components/ntp_tiles/most_visited_sites_unittest.cc b/components/ntp_tiles/most_visited_sites_unittest.cc index 971e0144..84f47da 100644 --- a/components/ntp_tiles/most_visited_sites_unittest.cc +++ b/components/ntp_tiles/most_visited_sites_unittest.cc
@@ -372,9 +372,9 @@ MostVisitedSitesTest() { MostVisitedSites::RegisterProfilePrefs(pref_service_.registry()); - std::vector<base::Feature> enabled_features; + std::vector<base::test::FeatureRef> enabled_features; // Disable FaviconServer in most tests and override in specific tests. - std::vector<base::Feature> disabled_features = { + std::vector<base::test::FeatureRef> disabled_features = { kNtpMostLikelyFaviconsFromServerFeature}; if (IsPopularSitesFeatureEnabled()) { enabled_features.push_back(kUsePopularSitesSuggestions);
diff --git a/components/page_info/page_info.cc b/components/page_info/page_info.cc index 378bc115..b6f6a99 100644 --- a/components/page_info/page_info.cc +++ b/components/page_info/page_info.cc
@@ -95,7 +95,7 @@ ContentSettingsType::IMAGES, #endif ContentSettingsType::POPUPS, - ContentSettingsType::WINDOW_PLACEMENT, + ContentSettingsType::WINDOW_MANAGEMENT, ContentSettingsType::ADS, ContentSettingsType::BACKGROUND_SYNC, ContentSettingsType::SOUND,
diff --git a/components/page_info/page_info_ui.cc b/components/page_info/page_info_ui.cc index ed0a1d5..e9c0c5f 100644 --- a/components/page_info/page_info_ui.cc +++ b/components/page_info/page_info_ui.cc
@@ -210,7 +210,7 @@ IDS_SITE_SETTINGS_TYPE_IMAGES_MID_SENTENCE}, {ContentSettingsType::SERIAL_GUARD, IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS, IDS_SITE_SETTINGS_TYPE_SERIAL_PORTS_MID_SENTENCE}, - {ContentSettingsType::WINDOW_PLACEMENT, + {ContentSettingsType::WINDOW_MANAGEMENT, IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT, IDS_SITE_SETTINGS_TYPE_WINDOW_MANAGEMENT_MID_SENTENCE}, #endif @@ -330,7 +330,7 @@ case ContentSettingsType::AR: message_id = IDS_PAGE_INFO_STATE_TEXT_AR_ASK; break; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: message_id = IDS_PAGE_INFO_STATE_TEXT_WINDOW_MANAGEMENT_ASK; break; case ContentSettingsType::LOCAL_FONTS:
diff --git a/components/permissions/contexts/window_placement_permission_context.cc b/components/permissions/contexts/window_placement_permission_context.cc index cf61aa7..0ef2ac5 100644 --- a/components/permissions/contexts/window_placement_permission_context.cc +++ b/components/permissions/contexts/window_placement_permission_context.cc
@@ -16,7 +16,7 @@ content::BrowserContext* browser_context) : PermissionContextBase( browser_context, - ContentSettingsType::WINDOW_PLACEMENT, + ContentSettingsType::WINDOW_MANAGEMENT, blink::mojom::PermissionsPolicyFeature::kWindowPlacement) {} WindowPlacementPermissionContext::~WindowPlacementPermissionContext() = default;
diff --git a/components/permissions/permission_uma_util.cc b/components/permissions/permission_uma_util.cc index f5ab648..84b36f9d 100644 --- a/components/permissions/permission_uma_util.cc +++ b/components/permissions/permission_uma_util.cc
@@ -893,7 +893,7 @@ base::UmaHistogramEnumeration("Permissions.Action.CameraPanTiltZoom", action, PermissionAction::NUM); break; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: base::UmaHistogramEnumeration("Permissions.Action.WindowPlacement", action, PermissionAction::NUM); break;
diff --git a/components/permissions/permission_util.cc b/components/permissions/permission_util.cc index 9543b82..45376a4 100644 --- a/components/permissions/permission_util.cc +++ b/components/permissions/permission_util.cc
@@ -111,7 +111,7 @@ return "StorageAccess"; case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: return "CameraPanTiltZoom"; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: return "WindowPlacement"; case ContentSettingsType::LOCAL_FONTS: return "LocalFonts"; @@ -201,7 +201,7 @@ case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: *out = PermissionType::CAMERA_PAN_TILT_ZOOM; break; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: *out = PermissionType::WINDOW_PLACEMENT; break; case ContentSettingsType::LOCAL_FONTS: @@ -246,7 +246,7 @@ case ContentSettingsType::AR: case ContentSettingsType::STORAGE_ACCESS: case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: case ContentSettingsType::LOCAL_FONTS: case ContentSettingsType::IDLE_DETECTION: case ContentSettingsType::DISPLAY_CAPTURE: @@ -360,7 +360,7 @@ case PermissionType::CAMERA_PAN_TILT_ZOOM: return ContentSettingsType::CAMERA_PAN_TILT_ZOOM; case PermissionType::WINDOW_PLACEMENT: - return ContentSettingsType::WINDOW_PLACEMENT; + return ContentSettingsType::WINDOW_MANAGEMENT; case PermissionType::LOCAL_FONTS: return ContentSettingsType::LOCAL_FONTS; case PermissionType::DISPLAY_CAPTURE: @@ -432,7 +432,7 @@ return PermissionType::STORAGE_ACCESS_GRANT; case ContentSettingsType::CAMERA_PAN_TILT_ZOOM: return PermissionType::CAMERA_PAN_TILT_ZOOM; - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: return PermissionType::WINDOW_PLACEMENT; case ContentSettingsType::LOCAL_FONTS: return PermissionType::LOCAL_FONTS;
diff --git a/components/permissions/request_type.cc b/components/permissions/request_type.cc index d0e3fc5..6a229aa 100644 --- a/components/permissions/request_type.cc +++ b/components/permissions/request_type.cc
@@ -180,7 +180,7 @@ case ContentSettingsType::VR: return RequestType::kVrSession; #if !BUILDFLAG(IS_ANDROID) - case ContentSettingsType::WINDOW_PLACEMENT: + case ContentSettingsType::WINDOW_MANAGEMENT: return RequestType::kWindowPlacement; #endif default: @@ -245,7 +245,7 @@ return ContentSettingsType::VR; #if !BUILDFLAG(IS_ANDROID) case RequestType::kWindowPlacement: - return ContentSettingsType::WINDOW_PLACEMENT; + return ContentSettingsType::WINDOW_MANAGEMENT; #endif default: // Not associated with a ContentSettingsType.
diff --git a/components/permissions/test/permission_test_util.cc b/components/permissions/test/permission_test_util.cc index 4f5c514c..32a8cf0 100644 --- a/components/permissions/test/permission_test_util.cc +++ b/components/permissions/test/permission_test_util.cc
@@ -75,7 +75,7 @@ browser_context, ContentSettingsType::PROTECTED_MEDIA_IDENTIFIER, blink::mojom::PermissionsPolicyFeature::kEncryptedMedia); #endif - permission_contexts[ContentSettingsType::WINDOW_PLACEMENT] = + permission_contexts[ContentSettingsType::WINDOW_MANAGEMENT] = std::make_unique<WindowPlacementPermissionContext>(browser_context); return permission_contexts; }
diff --git a/components/policy/resources/new_policy_templates/.group.details.yaml b/components/policy/resources/new_policy_templates/.group.details.yaml new file mode 100644 index 0000000..59f8d31 --- /dev/null +++ b/components/policy/resources/new_policy_templates/.group.details.yaml
@@ -0,0 +1,10 @@ +# This file will be used to set the caption and description of a policy group. +# A policy group is a list of policies that are apply to the same realm. This is +# used mostly for documentation and every policy should be in a group. +# To craete a new policy group, simply create a directory under +# `components/policy/resources/templates/policy_definitions` with the name of +# the policy group, then copy this file there and update the caption and +# description. +# Note: Nested policy groups are not supported. +caption: A caption +desc: A description
diff --git a/components/policy/resources/new_policy_templates/policy.yaml b/components/policy/resources/new_policy_templates/policy.yaml new file mode 100644 index 0000000..6a7feee --- /dev/null +++ b/components/policy/resources/new_policy_templates/policy.yaml
@@ -0,0 +1,375 @@ +# This file is used as input to generate the following policy templates: +# ADM, ADMX+ADML, MCX/plist and html documentation. + +# Policy templates are user interface definitions or documents about the +# policies that can be used to configure Chrome. Each policy is a name-value +# pair where the value has a given type. Chrome looks up the values using the +# names of the policies. In the user interface where the values can be set, +# related policies might appear together in policy groups. The grouping is not +# visible to Chrome. + +# As a reference for translators, non-translatable strings must be tagged using +# <ph name="..."></ph> as described in [1]. As these tags are pruned before +# generating the comments for .proto files, paragraphs containing such tags +# should not be line-wrapped (use one long line per paragraph instead) to allow +# for correct re-flowing of the text. +# [1] https://www.chromium.org/developers/tools-we-use-in-chromium/grit/grit-users-guide. +# +# See documentation in docs/enterprise/components/policy/resources/description_guidelines.md +# for how product names should appear in <ph> tags to ensure consistency. +# +# +# Generated grd names: +# Each name has two parts: the second part is either CAPTION, DESC or LABEL, +# and the first part identifies the item the text applies to: +# -For policies and groups: +# IDS_POLICY_<NAME OF THE POLICY OR GROUP> +# e.g. the name of the caption of policy HomepageLocation: +# IDS_POLICY_HOMEPAGELOCATION_CAPTION +# or other messages of the policy HomepageLocation: +# IDS_POLICY_HOMEPAGELOCATION_LABEL +# IDS_POLICY_HOMEPAGELOCATION_DESC +# -For enum items: +# IDS_POLICY_ENUM_<NAME OF THE ITEM> +# e.g. the name of the caption of ProxyServerDisabled: +# IDS_POLICY_ENUM_PROXYSERVERDISABLED_CAPTION + +# This field is a list of strings which describe the group of people responsible +# for maintaining the policy and can help answer questions or solve issues with +# the policy. The entries can be either emails of committers or +# file:// references to OWNERS files in the Chromium repository. +# There should be at least 2 owners per policies, and ideally a file:// +# references to an OWNERS files +owners: +- your-ldap@chromium.org +- file://components/policy/resources/OWNERS + +# Optional field that defaults to `caption` if not set. +# A short, one-line summary of the item it applies to. The difference from +# caption is that label always appears next to the entry field where the value +# of the policy can be entered. 'main' policies on Windows ignore this. Policies +# on Mac are using this instead of caption. +# Note: This should not end with a punctuation mark. +label: A short one line summary that may + wrap to the next line + +# A short, one-line summary of the item it applies to. This can appear +# both in policy or group listings or on title bars of policy-setting +# windows. +# Note: This should not end with a punctuation mark. +caption: A short one line summary that may + wrap to the next line + +# See docs/enterprise/components/policy/resources/description_guidelines.md +# for how product names should appear in <ph> tags to ensure consistency. +# Placeholders: +# The following placeholder strings are automatically substituted: +# $1 -> Google Chrome / Chromium +# $2 -> Google ChromeOS / ChromiumOS +# $3 -> Google Chrome Frame / Chromium Frame +# $6 is reserved for doc_writer +desc: |- + A multiline description for your policy. + This is the second line. + This is a <ph name="PLACEHOLDER">placeholder</ph> + +# List of platforms where the policy is planned to be released. +# The policy has to be listed in the EnableExperimentalPolicies policy to be +# available in the Dev and Canary channel. +# Currently supported platforms: +# `chrome.win`, `chrome.win7`, `chrome.mac`, `chrome.linux`, `chrome.*` +# `chrome_os`, `android`, `webview_android`, `ios`, `fuchsia`, `chrome_frame` +# Note that `chrome_frame` has been deprecated. +future_on: +- ios + +# List of platforms where the policy is officially released. +# The format of `supported_on` is `<platform>:<since_version>-<until_version>`. +# It means the policy is officially released on the |platform| from +# |since_version| and is removed after |until_version|. |until_version| +# is optional. +# Currently supported platforms: +# `chrome.win`, `chrome.win7`, `chrome.mac`, `chrome.linux`, `chrome.*` +# `chrome_os`, `android`, `webview_android`, `ios`, `fuchsia`, `chrome_frame` +# Note that `chrome_frame` has been deprecated. +supported_on: +- android:106- +- chrome.*:105- +- chrome_os:100-1001 + + +# Optional field that is `false` by default. +# Set to true if the policy has been deprecated. +deprecated: false + +# Optional field that is `false` by default. +# Indicates that this policy is only supported as a device-level Cloud Policy. +# In that case no entry in the UserPolicy Protobuf is generated and it is +# assumed that it will be added to the DevicePolicy Protobuf manually. Device +# policy only exists on ChromeOS. +device_only: false + +# ChromeOS devices can either be managed through the Google cloud or through +# Active Directory. Most policies are supported for both management types, but +# some are not. The supported values are 'google_cloud', 'active_directory'. +supported_chrome_os_management: ['google_cloud', 'active_directory'] + +features: + # Optional field that is `true` by default. + # Set to False to suppress the policy in the generated + # mandatory policy templates. The generated documentation for the policy + # will contain a suitable hint for administrators. + can_be_mandatory: true + + # Optional field that is `false` by default. + # recommended policy templates. The generated documentation for the policy + # will contain a suitable hint for administrators. + can_be_recommended: false + + # Whether Chrome respects the changes to the policy immediately without having + # to restart the browser. + dynamic_refresh: true + + # Optional field that is `false` by default. + # Set to True if the policy is used for internal development or testing + # purposes and will never be used by any external administrator. + internal_only: false + + # Whether a user policy applies to every user logging into the browser or only + # one profile. + per_profile: true + + # Optional field that is `false` by default. + # Set to True if the policy can only be set from platform policy but do not + # support Admin console. + platform_only: false + + # Set to True if the policy is controlled by Admin Console without any user + # interface for administrator. It can only be used for policies with the + # 'cloud_only' tag. Policy that are 'unlisted' will be hidden from all + # documentations, policy templates and Admin Console UI. + unlisted: false + + # Optional field. + # A metapolicy is a policy which affects how other policies are applied. + # Precedence metapolicies affect how policies are prioritized depending on + # their scope, source, and other factors. Merging metapolicies determine which + # list or dictionary policies can have their values combined into a single + # policy. If the setting is missing, it is assumed that the policy is not a + # metapolicy. The supported types are 'merge' (example policy is + # PolicyListMultipleSourceMergeList) and 'precedence' (example policy is + # CloudPolicyOverridesPlatformPolicy). + metapolicy_type: '' + +# Policy types: +# string: a string value +# int: an integer value +# int-enum: the user can select an integer value from a collection of items +# string-enum: the user can select a string value from a collection of items +# string-enum-list: the user can select a set of string values from a +# collection of items +# main: a boolean value +# list: a list of string values. Using this for a list of JSON strings is now +# discouraged, because the dict is better for JSON. +# dict: perhaps should be named JSON. An arbitrarily complex object or array, +# nested objects/arrays, etc. The user defines the value with JSON. +# external: a policy that references external data. (Supported on ChromeOS only). +type: main + +# This schema supports a subset of the JSON Schema standard +# (https://json-schema.org/understanding-json-schema/index.html). For more +# information see //components/policy/tools/schema_validator.py. This +# validator is also used during presubmit to validate all schemas, +# validation_schemas and the example_values. On the client-side we use +# //components/policy/core/common/schema.h to validate policy values against +# the provided schemas in this file. This validator supports the same subset +# of features supported by the python schema validator used during presubmit. + +# For many policies this is simply a type eg 'boolean' or 'string', but for +# 'dict' policies this describes the types of not only the root object, but +# also all of its descendants. This schema data is used to validate 'dict' +# policies, if a SchemaValidatingPolicyHandler is configured appropriately in +# configuration_policy_handler_list_factory.cc + +# Some policies at first seem to have simple schema e.g. a string or a list of +# strings, but those strings are actually JSON strings, and this JSON has +# another schema. This type of policy is deprecated. When adding new policies, +# make sure the entire schema is described by the 'schema' field and that +# there are no strings which contain JSON. +# The legacy policies which contain JSON strings have an extra field, the +# 'validation_schema' which is used to validate not only the schema of the +# policy itself, but also the content of the JSON strings inside the policy. +# Do not use this field when adding new policies. + +# In order to hide sensitive policy values from the user, you can use +# 'sensitiveValue': True (default 'False') in the associated schema. Those +# values will be masked with '********' in the chrome://policy UI and policy +# exports. 'sensitiveValue' can be applied to all schema types. + +# For some policies which have complicated schema we add either +# 'description_schema' which describes some but not necessarily all properties +# of the policy or 'url_schema' which contains the link to the expanded +# documentation. +# Note that 'description_schema' is used for documentation purposes only, but +# not for schema validation. It can be used in cases where validation is not +# desired, e.g. if the schema does not describe all properties (see +# ArcPolicy). +schema: + type: boolean +# main policy example: +# schema: +# type: boolean +# +# int policy example: +# schema: +# type: integer +# +# int-enum policy example +# schema: +# type: integer +# enum: +# - 0 +# - 1 +# - 2 +# +# string policy example: +# schema: +# type: string +# +# string-enum policy example: +# schema: +# type: string +# enum: +# - enum-value-1 +# - enum-value-2 +# - enum-value-3 +# +# list policy example +# schema: +# items: +# type: string +# type: array +# +# string-enum-list policy example: +# schema: +# type: array +# items: +# type: string +# enum: +# - enum-value-1 +# - enum-value-2 +# - enum-value-3 +# +# dict policy example +# schema: +# type: object +# id: nestableObjectId +# properties: +# name: +# type: string +# description: +# type: string +# children: +# type: array +# items: +# $ref: nestableObjectId + +# Used to outline the behavior of each state the policy can take. +# This field is only used for policies of type 'main', 'int-enum', or +# 'string-enum'. For 'main' policies, it describes how the policy behaves when +# set to True or False, and whether the unset state is different from the +# enabled/disabled states. For 'enum' policies, it lists all possible values +# the policy can be set to along with a brief description. +items: +- caption: Use the Chrome Root Store. + value: true +- caption: Do not use the Chrome Root Store. + value: false +- caption: Chrome Root Store may be used depending on feature launch process. + value: null + +# Indicates the behavior of the controlled setting/feature when the policy is no +# set. If this is set to `true`, when the poolicy is not set, the feature +# controlled by the policy behaves as if the policy was set to `true`. +# If the default value cannot be expressed with the given type and is equivalent +# to unset, it should be represent with `null`. +# For example, this would be used for a boolean policy where unset means the +# user can turn the feature on and off, while a set policy will force the +# feature to always be on or off. +# This field is only used for policies of type `int`, `main`, `string-enum` or +# `int-enum`. Other policy types are assumed to have a default equal to an empty +# string or empty list. +default: null + +# Optional value which defaults to `default` if not set. +# For managed users on ChromeOS (i.e. users receiving user policy from the +# cloud), if the optional key 'default_for_enterprise_users' is set, its value +# is applied as mandatory policy unless a different setting is received from +# the cloud or `default_policy_level` is set. This default value handling is +# automatically enforced by the policy stack when filling the PolicyMap +# (specifically, by the generated function SetEnterpriseUsersDefaults). +default_for_enterprise_users: false + +# Optional value which defaults to `mandatory` if not set. +# This controls the policy level of `default_for_enterprise_users`. The +# accepted values are 'recommended' and 'mandatory'. +default_policy_level: 'recommended' + +# Optional key can be used to document a differing default value for devices +# enrolled into enterprise management. This is for documentation only, the +# enrollment-dependent handling must be manually implemented. +default_for_managed_devices_doc_only: null + +# `example_value` is used in the generated documentation and example policy +# configuration files. Examples must cover the entire schema, i.e. use every +# defined property at least once. +example_value: false +# main policy example: +# example_value: false +# +# int policy example: +# example_value: 2 +# +# int-enum policy example +# example_value: 0 +# +# string policy example: +# example_value: stringvalue +# +# string-enum policy example: +# example_value: enum-value-1 +# +# list policy example +# example_value: +# - item1 +# - item2 +# +# string-enum-list policy example: +# example_value: +# - enum-value-1 +# - enum-value-2 +# +# dict policy example +# example_value: +# name: some-name +# description: some-description +# children: +# - name: child-name1 +# description: child-description1 +# - name: child-name2 +# description: child-description2 + +# The maximal size of the external data that a policy can reference, in bytes. +# This is mandatory for policies of type 'external' and is ignored for other +# policy types. +max_size: 123456 + +# Each policy is tagged with risk tags that indicate potential privacy or +# security risks. They are defined in `components/policy/templates/risk_tag_definitions.yaml`. +# Each risk tag contains the following information: +# - name: The name of the risk tag. May not contain spaces. +# - description: Description for developers so they know which tags apply to +# newly added policies. +# - user-description: A text that helps users understand what a policy with +# this tag means for their privacy and/or security. +tags: []
diff --git a/components/policy/resources/new_policy_templates/policy_atomic_groups.yaml b/components/policy/resources/new_policy_templates/policy_atomic_groups.yaml new file mode 100644 index 0000000..9966a490 --- /dev/null +++ b/components/policy/resources/new_policy_templates/policy_atomic_groups.yaml
@@ -0,0 +1,22 @@ +# Policies from an atomic group need to have their values coming from the same +# source. If policies from an atomic gorup come from multiple sources, only the +# policies coming from the same source will be applied. The source with the +# higher priority will be the one from which policies are applied. +# i.e. Policy1 and Policy2 come from GPO and policy 3 comes from the cloud. +# If GPO has priority over the cloud, only Policy1 and Policy2 will be applied. +# For this to take effect, PolicyAtomicGroupsEnabled must he set to true. +AtomicGroup1: + caption: A caption + # List of policies in the group + policies: + - Policy1 + - Policy2 + - Policy3 + +AtomicGroup2: + caption: A caption + # List of policies in the group + policies: + - Policy4 + - Policy5 + - Policy6 \ No newline at end of file
diff --git a/components/printing/renderer/print_render_frame_helper.cc b/components/printing/renderer/print_render_frame_helper.cc index d8b08c6..96c1116ec 100644 --- a/components/printing/renderer/print_render_frame_helper.cc +++ b/components/printing/renderer/print_render_frame_helper.cc
@@ -2060,10 +2060,6 @@ } #endif // BUILDFLAG(ENABLE_PRINT_PREVIEW) -bool PrintRenderFrameHelper::IsPrintingEnabled() const { - return is_printing_enabled_; -} - void PrintRenderFrameHelper::PrintNode(const blink::WebNode& node) { if (node.IsNull() || !node.GetDocument().GetFrame()) { // This can occur when the context menu refers to an invalid WebNode.
diff --git a/components/printing/renderer/print_render_frame_helper.h b/components/printing/renderer/print_render_frame_helper.h index 0f291a40..51a5497 100644 --- a/components/printing/renderer/print_render_frame_helper.h +++ b/components/printing/renderer/print_render_frame_helper.h
@@ -150,8 +150,6 @@ // printing is build-in. This method is used by CEF. static void DisablePreview(); - bool IsPrintingEnabled() const; - void PrintNode(const blink::WebNode& node); // Get the scale factor. Returns |input_scale_factor| if it is valid and
diff --git a/components/remote_cocoa/app_shim/immersive_mode_controller.mm b/components/remote_cocoa/app_shim/immersive_mode_controller.mm index effc27d..b4d59c7 100644 --- a/components/remote_cocoa/app_shim/immersive_mode_controller.mm +++ b/components/remote_cocoa/app_shim/immersive_mode_controller.mm
@@ -199,12 +199,18 @@ // Remove the content view from the overlay view widget's NSWindow. This // view will be re-parented into the AppKit created NSWindow. NSView* overlay_content_view = overlay_widget_.contentView; + [overlay_content_view retain]; [overlay_content_view removeFromSuperview]; - // Add the overlay view to the accessory view controller and hand everything - // over to AppKit. + // Removing a view from its superview under macOS 13 nils out the reference in + // the tree. Match this behavior under previous macOS releases. + overlay_widget_.contentView = nil; + + // Add the overlay view to the accessory view controller and hand + // everything over to AppKit. [immersive_mode_titlebar_view_controller_.get().view addSubview:overlay_content_view]; + [overlay_content_view release]; immersive_mode_titlebar_view_controller_.get().layoutAttribute = NSLayoutAttributeBottom;
diff --git a/components/viz/common/quads/render_pass_io_unittest.cc b/components/viz/common/quads/render_pass_io_unittest.cc index 6d3bcf5..a9bf571 100644 --- a/components/viz/common/quads/render_pass_io_unittest.cc +++ b/components/viz/common/quads/render_pass_io_unittest.cc
@@ -126,7 +126,7 @@ gfx::Transform transform; transform.MakeIdentity(); gfx::LinearGradient gradient_mask(40); - gradient_mask.AddStep(/*fraction=*/0, /*alpha=*/0); + gradient_mask.AddStep(/*percent=*/0, /*alpha=*/0); gradient_mask.AddStep(1, 255); sqs1->SetAll( transform, gfx::Rect(0, 0, 640, 480), gfx::Rect(10, 10, 600, 400),
diff --git a/components/viz/common/resources/resource_format_utils.cc b/components/viz/common/resources/resource_format_utils.cc index ae21374..64bc5d81 100644 --- a/components/viz/common/resources/resource_format_utils.cc +++ b/components/viz/common/resources/resource_format_utils.cc
@@ -82,13 +82,6 @@ return kN32_SkColorType; } -// TODO (hitawala): Add support for multiplanar formats. -SkColorType ResourceFormatToClosestSkColorType(bool gpu_compositing, - SharedImageFormat format) { - return ResourceFormatToClosestSkColorType(gpu_compositing, - format.resource_format()); -} - ResourceFormat SkColorTypeToResourceFormat(SkColorType color_type) { switch (color_type) { case kARGB_4444_SkColorType: @@ -659,4 +652,74 @@ return static_cast<WGPUTextureFormat>(ToDawnFormat(format)); } +// TODO (hitawala): Add support for multiplanar formats. +SkColorType ResourceFormatToClosestSkColorType(bool gpu_compositing, + SharedImageFormat format) { + return ResourceFormatToClosestSkColorType(gpu_compositing, + format.resource_format()); +} + +int BitsPerPixel(SharedImageFormat format) { + return BitsPerPixel(format.resource_format()); +} + +bool HasAlpha(SharedImageFormat format) { + return HasAlpha(format.resource_format()); +} + +const char* ResourceFormatToString(SharedImageFormat format) { + return ResourceFormatToString(format.resource_format()); +} + +unsigned int GLDataType(SharedImageFormat format) { + return GLDataType(format.resource_format()); +} + +unsigned int GLDataFormat(SharedImageFormat format) { + return GLDataFormat(format.resource_format()); +} + +unsigned int GLInternalFormat(SharedImageFormat format) { + return GLInternalFormat(format.resource_format()); +} + +gfx::BufferFormat BufferFormat(SharedImageFormat format) { + return BufferFormat(format.resource_format()); +} + +bool IsResourceFormatCompressed(SharedImageFormat format) { + return IsResourceFormatCompressed(format.resource_format()); +} + +unsigned int TextureStorageFormat(SharedImageFormat format, + bool use_angle_rgbx_format) { + return TextureStorageFormat(format.resource_format(), use_angle_rgbx_format); +} + +bool IsGpuMemoryBufferFormatSupported(SharedImageFormat format) { + return IsGpuMemoryBufferFormatSupported(format.resource_format()); +} + +bool GLSupportsFormat(SharedImageFormat format) { + return GLSupportsFormat(format.resource_format()); +} + +#if BUILDFLAG(ENABLE_VULKAN) +bool HasVkFormat(SharedImageFormat format) { + return HasVkFormat(format.resource_format()); +} + +VkFormat ToVkFormat(SharedImageFormat format) { + return ToVkFormat(format.resource_format()); +} +#endif + +wgpu::TextureFormat ToDawnFormat(SharedImageFormat format) { + return ToDawnFormat(format.resource_format()); +} + +WGPUTextureFormat ToWGPUFormat(SharedImageFormat format) { + return ToWGPUFormat(format.resource_format()); +} + } // namespace viz
diff --git a/components/viz/common/resources/resource_format_utils.h b/components/viz/common/resources/resource_format_utils.h index e4f2ae3..21f844d8 100644 --- a/components/viz/common/resources/resource_format_utils.h +++ b/components/viz/common/resources/resource_format_utils.h
@@ -25,9 +25,6 @@ VIZ_RESOURCE_FORMAT_EXPORT SkColorType ResourceFormatToClosestSkColorType(bool gpu_compositing, ResourceFormat format); -VIZ_RESOURCE_FORMAT_EXPORT SkColorType -ResourceFormatToClosestSkColorType(bool gpu_compositing, - SharedImageFormat format); VIZ_RESOURCE_FORMAT_EXPORT int BitsPerPixel(ResourceFormat format); VIZ_RESOURCE_FORMAT_EXPORT bool HasAlpha(ResourceFormat format); @@ -88,6 +85,56 @@ VIZ_RESOURCE_FORMAT_EXPORT unsigned int ToMTLPixelFormat(ResourceFormat format); #endif +// Overload all above functions with SharedImageFormat in place of +// ResourceFormat. +// WARNING: The `format` must be single planar. +// TODO(hitawala): Add multiplanar format support. Also, move util functions +// that are not needed by clients to SharedImageFormat. + +VIZ_RESOURCE_FORMAT_EXPORT SkColorType +ResourceFormatToClosestSkColorType(bool gpu_compositing, + SharedImageFormat format); + +VIZ_RESOURCE_FORMAT_EXPORT int BitsPerPixel(SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT bool HasAlpha(SharedImageFormat format); + +VIZ_RESOURCE_FORMAT_EXPORT const char* ResourceFormatToString( + SharedImageFormat); + +VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLDataType(SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLDataFormat(SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT unsigned int GLInternalFormat( + SharedImageFormat format); + +VIZ_RESOURCE_FORMAT_EXPORT gfx::BufferFormat BufferFormat( + SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT bool IsResourceFormatCompressed( + SharedImageFormat format); + +VIZ_RESOURCE_FORMAT_EXPORT unsigned int TextureStorageFormat( + SharedImageFormat format, + bool use_angle_rgbx_format); + +VIZ_RESOURCE_FORMAT_EXPORT bool IsGpuMemoryBufferFormatSupported( + SharedImageFormat format); + +VIZ_RESOURCE_FORMAT_EXPORT bool GLSupportsFormat(SharedImageFormat format); + +#if BUILDFLAG(ENABLE_VULKAN) +VIZ_RESOURCE_FORMAT_EXPORT bool HasVkFormat(SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT VkFormat ToVkFormat(SharedImageFormat format); +#endif + +VIZ_RESOURCE_FORMAT_EXPORT wgpu::TextureFormat ToDawnFormat( + SharedImageFormat format); +VIZ_RESOURCE_FORMAT_EXPORT WGPUTextureFormat +ToWGPUFormat(SharedImageFormat format); + +#if BUILDFLAG(IS_APPLE) +VIZ_RESOURCE_FORMAT_EXPORT unsigned int ToMTLPixelFormat( + SharedImageFormat format); +#endif + } // namespace viz #endif // COMPONENTS_VIZ_COMMON_RESOURCES_RESOURCE_FORMAT_UTILS_H_
diff --git a/components/viz/common/resources/resource_format_utils_mac.mm b/components/viz/common/resources/resource_format_utils_mac.mm index bac768e..4b5503a 100644 --- a/components/viz/common/resources/resource_format_utils_mac.mm +++ b/components/viz/common/resources/resource_format_utils_mac.mm
@@ -34,4 +34,8 @@ return static_cast<unsigned int>(mtl_pixel_format); } +unsigned int ToMTLPixelFormat(SharedImageFormat format) { + return ToMTLPixelFormat(format.resource_format()); +} + } // namespace viz
diff --git a/components/viz/service/display/renderer_pixeltest.cc b/components/viz/service/display/renderer_pixeltest.cc index 1778ee1a..3ed6599 100644 --- a/components/viz/service/display/renderer_pixeltest.cc +++ b/components/viz/service/display/renderer_pixeltest.cc
@@ -4575,7 +4575,7 @@ gfx::RRectF rounded_corner_bounds(gfx::RectF(pass_rect), kCornerRadius); gfx::LinearGradient gradient_mask(330); - gradient_mask.AddStep(/*fraction=*/0, /*alpha=*/0); + gradient_mask.AddStep(/*percent=*/0, /*alpha=*/0); gradient_mask.AddStep(.5, 255); gradient_mask.AddStep(1, 255); SharedQuadState* pass_shared_state = CreateTestSharedQuadState( @@ -4622,7 +4622,7 @@ gfx::RRectF blue_rrect(gfx::RectF(blue_rect), kBlueCornerRadius); blue_rrect.Offset(blue_offset_from_target); gfx::LinearGradient blue_gradient(0); - blue_gradient.AddStep(/*fraction=*/0, /*alpha=*/255); + blue_gradient.AddStep(/*percent=*/0, /*alpha=*/255); blue_gradient.AddStep(1, 0); gfx::Transform quad_to_target_transform; @@ -4644,7 +4644,7 @@ gfx::RRectF rounded_corner_bounds(gfx::RectF(pass_rect), kCornerRadius); gfx::LinearGradient gradient_mask(-30); - gradient_mask.AddStep(/*fraction=*/0, /*alpha=*/0); + gradient_mask.AddStep(/*percent=*/0, /*alpha=*/0); gradient_mask.AddStep(.5, 255); gradient_mask.AddStep(1, 255); SharedQuadState* pass_shared_state = CreateTestSharedQuadState(
diff --git a/components/viz/service/display/skia_readback_pixeltest.cc b/components/viz/service/display/skia_readback_pixeltest.cc index 346a1ae..2bc78db0 100644 --- a/components/viz/service/display/skia_readback_pixeltest.cc +++ b/components/viz/service/display/skia_readback_pixeltest.cc
@@ -156,14 +156,17 @@ SkBitmap& out_chroma_planes) { base::WaitableEvent wait; - gpu_service_holder->ScheduleGpuTask(base::BindLambdaForTesting( + // Some shared image implementations don't allow concurrent read/write to + // a same image. At this point, compositor GPU thread might be reading the + // image so it's better we issue the readback on the compositor GPU thread to + // avoid contention. + gpu_service_holder->ScheduleCompositorGpuTask(base::BindLambdaForTesting( [&out_luma_plane, &out_chroma_planes, &result, &wait, &texture_size]() { auto* shared_image_manager = TestGpuServiceHolder::GetInstance() ->gpu_service() ->shared_image_manager(); auto* context_state = TestGpuServiceHolder::GetInstance() - ->gpu_service() - ->GetContextState() + ->GetCompositorGpuThreadSharedContextState() .get(); ReadbackTextureOnGpuThread(shared_image_manager, context_state,
diff --git a/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc b/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc index 3e3c408..2677590 100644 --- a/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc +++ b/components/viz/service/display_embedder/skia_output_device_buffer_queue_unittest.cc
@@ -123,7 +123,7 @@ void ScheduleGpuTask(base::OnceClosure callback) { auto wrap = base::BindOnce(&TestOnGpu::CallOnGpuAndUnblockMain, base::Unretained(this), std::move(callback)); - gpu_service_holder_->ScheduleGpuTask(std::move(wrap)); + gpu_service_holder_->ScheduleCompositorGpuTask(std::move(wrap)); wait_.Wait(); }
diff --git a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc index d3b7e6c..21dc8205 100644 --- a/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc +++ b/components/viz/service/display_embedder/skia_output_surface_dependency_impl.cc
@@ -34,7 +34,7 @@ SkiaOutputSurfaceDependencyImpl::CreateSequence() { return std::make_unique<gpu::SchedulerSequence>( gpu_service_impl_->GetGpuScheduler(), - gpu_service_impl_->gpu_task_runner()); + gpu_service_impl_->compositor_gpu_task_runner()); } gpu::SharedImageManager* @@ -117,12 +117,12 @@ base::ScopedClosureRunner SkiaOutputSurfaceDependencyImpl::CacheGLSurface( gl::GLSurface* surface) { - gpu_service_impl_->gpu_task_runner()->PostTask( + gpu_service_impl_->compositor_gpu_task_runner()->PostTask( FROM_HERE, base::BindOnce(&gl::GLSurface::AddRef, base::Unretained(surface))); auto release_callback = base::BindPostTask( - gpu_service_impl_->gpu_task_runner(), + gpu_service_impl_->compositor_gpu_task_runner(), base::BindOnce(&gl::GLSurface::Release, base::Unretained(surface))); return base::ScopedClosureRunner(std::move(release_callback)); @@ -140,7 +140,7 @@ void SkiaOutputSurfaceDependencyImpl::ScheduleDelayedGPUTaskFromGPUThread( base::OnceClosure task) { constexpr base::TimeDelta kDelayForDelayedWork = base::Milliseconds(2); - gpu_service_impl_->gpu_task_runner()->PostDelayedTask( + gpu_service_impl_->compositor_gpu_task_runner()->PostDelayedTask( FROM_HERE, std::move(task), kDelayForDelayedWork); }
diff --git a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc index 904ccff8..71c8510 100644 --- a/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc +++ b/components/viz/service/display_embedder/skia_output_surface_impl_unittest.cc
@@ -166,7 +166,7 @@ base::BindOnce(&SkiaOutputSurfaceImplTest::CopyRequestCallbackOnGpuThread, base::Unretained(this), output_rect, color_space)); request->set_result_task_runner( - TestGpuServiceHolder::GetInstance()->gpu_thread_task_runner()); + TestGpuServiceHolder::GetInstance()->gpu_main_thread_task_runner()); copy_output::RenderPassGeometry geometry; geometry.result_bounds = output_rect; geometry.result_selection = output_rect; @@ -240,7 +240,7 @@ }, &result, run_loop.QuitClosure())); request->set_result_task_runner( - TestGpuServiceHolder::GetInstance()->gpu_thread_task_runner()); + TestGpuServiceHolder::GetInstance()->gpu_main_thread_task_runner()); copy_output::RenderPassGeometry geometry; geometry.result_bounds = output_rect; geometry.result_selection = output_rect; @@ -281,7 +281,7 @@ }, &result, run_loop.QuitClosure())); request->set_result_task_runner( - TestGpuServiceHolder::GetInstance()->gpu_thread_task_runner()); + TestGpuServiceHolder::GetInstance()->gpu_main_thread_task_runner()); copy_output::RenderPassGeometry geometry; geometry.result_bounds = output_rect; geometry.result_selection = output_rect;
diff --git a/components/viz/service/gl/gpu_service_impl.h b/components/viz/service/gl/gpu_service_impl.h index 0d30f21..0fdaf1d 100644 --- a/components/viz/service/gl/gpu_service_impl.h +++ b/components/viz/service/gl/gpu_service_impl.h
@@ -320,7 +320,7 @@ return main_runner_; } - scoped_refptr<base::SingleThreadTaskRunner> gpu_task_runner() { + scoped_refptr<base::SingleThreadTaskRunner> compositor_gpu_task_runner() { return compositor_gpu_thread() ? compositor_gpu_thread()->task_runner() : main_runner_; }
diff --git a/components/viz/test/DEPS b/components/viz/test/DEPS index 0f11cb8..7087ae69 100644 --- a/components/viz/test/DEPS +++ b/components/viz/test/DEPS
@@ -61,6 +61,7 @@ ], "test_gpu_service_holder\.cc": [ + "+gpu/command_buffer/service/scheduler_sequence.h", "+gpu/command_buffer/service/service_utils.h", "+gpu/config", "+gpu/ipc/service/gpu_watchdog_thread.h",
diff --git a/components/viz/test/test_gpu_service_holder.cc b/components/viz/test/test_gpu_service_holder.cc index 3e85e79..bcf1b63 100644 --- a/components/viz/test/test_gpu_service_holder.cc +++ b/components/viz/test/test_gpu_service_holder.cc
@@ -18,6 +18,7 @@ #include "base/threading/thread_task_runner_handle.h" #include "build/build_config.h" #include "components/viz/service/gl/gpu_service_impl.h" +#include "gpu/command_buffer/service/scheduler_sequence.h" #include "gpu/command_buffer/service/service_utils.h" #include "gpu/config/gpu_feature_info.h" #include "gpu/config/gpu_info.h" @@ -172,7 +173,7 @@ TestGpuServiceHolder::TestGpuServiceHolder( const gpu::GpuPreferences& gpu_preferences) - : gpu_thread_("GPUMainThread"), io_thread_("GPUIOThread") { + : gpu_main_thread_("GPUMainThread"), io_thread_("GPUIOThread") { if (g_disallow_feature_list_overrides) { disallow_feature_overrides_.emplace( "FeatureList overrides must happen before the GPU service thread has " @@ -186,15 +187,15 @@ .message_pump_type_for_gpu; #endif - CHECK(gpu_thread_.StartWithOptions(std::move(gpu_thread_options))); - CHECK(io_thread_.Start()); + CHECK(gpu_main_thread_.StartWithOptions(std::move(gpu_thread_options))); + CHECK(io_thread_.Start()); - base::WaitableEvent completion; - gpu_thread_.task_runner()->PostTask( - FROM_HERE, - base::BindOnce(&TestGpuServiceHolder::InitializeOnGpuThread, - base::Unretained(this), gpu_preferences, &completion)); - completion.Wait(); + base::WaitableEvent completion; + gpu_main_thread_.task_runner()->PostTask( + FROM_HERE, + base::BindOnce(&TestGpuServiceHolder::InitializeOnGpuThread, + base::Unretained(this), gpu_preferences, &completion)); + completion.Wait(); #if defined(USE_OZONE) && !BUILDFLAG(IS_FUCHSIA) if (auto* gpu_platform_support_host = @@ -216,14 +217,23 @@ #endif // Ensure members created on GPU thread are destroyed there too. - gpu_thread_.task_runner()->PostTask( + gpu_main_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&TestGpuServiceHolder::DeleteOnGpuThread, base::Unretained(this))); - gpu_thread_.Stop(); + gpu_main_thread_.Stop(); io_thread_.Stop(); } scoped_refptr<gpu::SharedContextState> +TestGpuServiceHolder::GetCompositorGpuThreadSharedContextState() { + if (gpu_service_->compositor_gpu_thread()) { + return gpu_service_->compositor_gpu_thread()->GetSharedContextState(); + } + + return GetSharedContextState(); +} + +scoped_refptr<gpu::SharedContextState> TestGpuServiceHolder::GetSharedContextState() { return gpu_service_->GetContextState(); } @@ -232,15 +242,23 @@ return gpu_service_->share_group(); } -void TestGpuServiceHolder::ScheduleGpuTask(base::OnceClosure callback) { - DCHECK(gpu_task_sequence_); - gpu_task_sequence_->ScheduleTask(std::move(callback), {}); +void TestGpuServiceHolder::ScheduleGpuMainTask(base::OnceClosure callback) { + DCHECK(gpu_main_task_sequence_); + gpu_main_task_sequence_->ScheduleTask(std::move(callback), {}); +} + +void TestGpuServiceHolder::ScheduleCompositorGpuTask( + base::OnceClosure callback) { + if (compositor_gpu_task_sequence_) + compositor_gpu_task_sequence_->ScheduleTask(std::move(callback), {}); + else + ScheduleGpuMainTask(std::move(callback)); } void TestGpuServiceHolder::InitializeOnGpuThread( const gpu::GpuPreferences& gpu_preferences, base::WaitableEvent* completion) { - DCHECK(gpu_thread_.task_runner()->BelongsToCurrentThread()); + DCHECK(gpu_main_thread_.task_runner()->BelongsToCurrentThread()); #if defined(USE_OZONE) && !BUILDFLAG(IS_FUCHSIA) ui::OzonePlatform::GetInstance()->AddInterfaces(&binders_); @@ -271,9 +289,6 @@ gpu_feature_info.status_values[gpu::GPU_FEATURE_TYPE_GPU_RASTERIZATION] = gpu::kGpuFeatureStatusEnabled; - // Disable DrDC in viz unittests. https://crbug.com/1367780 - gpu_feature_info.enabled_gpu_driver_bug_workarounds.push_back(DISABLE_DRDC); - // On MacOS, the default texture target for native GpuMemoryBuffers is // GL_TEXTURE_RECTANGLE_ARB. This is due to CGL's requirements for creating // a GL surface. However, when ANGLE is used on top of SwiftShader or Metal, @@ -314,8 +329,8 @@ /*sync_point_manager=*/nullptr, /*shared_image_manager=*/nullptr, /*scheduler=*/nullptr, /*shutdown_event=*/nullptr); - task_executor_ = std::make_unique<gpu::GpuInProcessThreadService>( - this, gpu_thread_.task_runner(), gpu_service_->GetGpuScheduler(), + main_task_executor_ = std::make_unique<gpu::GpuInProcessThreadService>( + this, gpu_main_thread_.task_runner(), gpu_service_->GetGpuScheduler(), gpu_service_->sync_point_manager(), gpu_service_->mailbox_manager(), gpu_service_->gpu_channel_manager() ->default_offscreen_surface() @@ -326,18 +341,25 @@ gpu_service_->gpu_channel_manager()->program_cache()); // TODO(weiliangc): Since SkiaOutputSurface should not depend on command - // buffer, the |gpu_task_sequence_| should be coming from + // buffer, the |gpu_main_task_sequence_| should be coming from // SkiaOutputSurfaceDependency. SkiaOutputSurfaceDependency cannot be // initialized here because the it will not have correct client thread set up // when unit tests are running in parallel. - gpu_task_sequence_ = task_executor_->CreateSequence(); + gpu_main_task_sequence_ = main_task_executor_->CreateSequence(); + + if (gpu_service_->compositor_gpu_thread()) { + compositor_gpu_task_sequence_ = std::make_unique<gpu::SchedulerSequence>( + gpu_service_->GetGpuScheduler(), + gpu_service_->compositor_gpu_task_runner()); + } completion->Signal(); } void TestGpuServiceHolder::DeleteOnGpuThread() { - task_executor_.reset(); - gpu_task_sequence_.reset(); + main_task_executor_.reset(); + gpu_main_task_sequence_.reset(); + compositor_gpu_task_sequence_.reset(); gpu_service_.reset(); } @@ -348,7 +370,7 @@ // The interfaces must be bound on the gpu to ensure the mojo calls happen // on the correct sequence (same happens when the browser runs with a real // gpu service). - gpu_thread_.task_runner()->PostTask( + gpu_main_thread_.task_runner()->PostTask( FROM_HERE, base::BindOnce(&TestGpuServiceHolder::BindInterfaceOnGpuThread, base::Unretained(this), interface_name, std::move(interface_pipe)));
diff --git a/components/viz/test/test_gpu_service_holder.h b/components/viz/test/test_gpu_service_holder.h index b27641d8..c00612f5 100644 --- a/components/viz/test/test_gpu_service_holder.h +++ b/components/viz/test/test_gpu_service_holder.h
@@ -99,8 +99,8 @@ ~TestGpuServiceHolder() override; - scoped_refptr<base::SingleThreadTaskRunner> gpu_thread_task_runner() { - return gpu_thread_.task_runner(); + scoped_refptr<base::SingleThreadTaskRunner> gpu_main_thread_task_runner() { + return gpu_main_thread_.task_runner(); } // Most of |gpu_service_| is not safe to use off of the GPU thread, be careful @@ -108,10 +108,11 @@ GpuServiceImpl* gpu_service() { return gpu_service_.get(); } gpu::CommandBufferTaskExecutor* task_executor() { - return task_executor_.get(); + return main_task_executor_.get(); } - void ScheduleGpuTask(base::OnceClosure callback); + void ScheduleGpuMainTask(base::OnceClosure callback); + void ScheduleCompositorGpuTask(base::OnceClosure callback); bool is_vulkan_enabled() { #if BUILDFLAG(ENABLE_VULKAN) @@ -121,6 +122,9 @@ #endif } + scoped_refptr<gpu::SharedContextState> + GetCompositorGpuThreadSharedContextState(); + // gpu::GpuInProcessThreadServiceDelegate implementation: scoped_refptr<gpu::SharedContextState> GetSharedContextState() override; scoped_refptr<gl::GLShareGroup> GetShareGroup() override; @@ -141,14 +145,15 @@ absl::optional<base::FeatureList::ScopedDisallowOverrides> disallow_feature_overrides_; - base::Thread gpu_thread_; + base::Thread gpu_main_thread_; base::Thread io_thread_; // These should only be created and deleted on the gpu thread. std::unique_ptr<GpuServiceImpl> gpu_service_; - std::unique_ptr<gpu::CommandBufferTaskExecutor> task_executor_; + std::unique_ptr<gpu::CommandBufferTaskExecutor> main_task_executor_; // This is used to schedule gpu tasks in sequence. - std::unique_ptr<gpu::SingleTaskSequence> gpu_task_sequence_; + std::unique_ptr<gpu::SingleTaskSequence> gpu_main_task_sequence_; + std::unique_ptr<gpu::SingleTaskSequence> compositor_gpu_task_sequence_; #if BUILDFLAG(ENABLE_VULKAN) std::unique_ptr<gpu::VulkanImplementation> vulkan_implementation_; #endif
diff --git a/content/browser/accessibility/browser_accessibility_win_unittest.cc b/content/browser/accessibility/browser_accessibility_win_unittest.cc index ffc8b535..ddfd74c6 100644 --- a/content/browser/accessibility/browser_accessibility_win_unittest.cc +++ b/content/browser/accessibility/browser_accessibility_win_unittest.cc
@@ -2361,13 +2361,13 @@ hyperlink.Reset(); EXPECT_HRESULT_SUCCEEDED(root_accessible->GetCOM()->nActions(&n_actions)); - EXPECT_EQ(1, n_actions); + EXPECT_EQ(2, n_actions); EXPECT_HRESULT_SUCCEEDED(div_accessible->GetCOM()->nActions(&n_actions)); - EXPECT_EQ(1, n_actions); + EXPECT_EQ(2, n_actions); EXPECT_HRESULT_SUCCEEDED(text_accessible->GetCOM()->nActions(&n_actions)); - EXPECT_EQ(1, n_actions); + EXPECT_EQ(2, n_actions); EXPECT_HRESULT_SUCCEEDED(link_accessible->GetCOM()->nActions(&n_actions)); - EXPECT_EQ(1, n_actions); + EXPECT_EQ(2, n_actions); EXPECT_HRESULT_FAILED( root_accessible->GetCOM()->get_anchor(0, anchor.Receive()));
diff --git a/content/browser/devtools/devtools_url_loader_interceptor.cc b/content/browser/devtools/devtools_url_loader_interceptor.cc index 4f83dcd..120842aa 100644 --- a/content/browser/devtools/devtools_url_loader_interceptor.cc +++ b/content/browser/devtools/devtools_url_loader_interceptor.cc
@@ -1027,8 +1027,12 @@ // Note this redirect is not visible to the page by design. If they want a // visible redirect they can mock a response with a 302. - if (modifications->modified_url.isJust()) - request->url = GURL(modifications->modified_url.fromJust()); + if (modifications->modified_url.isJust()) { + DCHECK_EQ(url_chain_.back(), request->url); + const GURL new_url(modifications->modified_url.fromJust()); + request->url = new_url; + url_chain_.back() = new_url; + } if (modifications->modified_method.isJust()) request->method = modifications->modified_method.fromJust();
diff --git a/content/browser/gpu/gpu_process_host.cc b/content/browser/gpu/gpu_process_host.cc index af72005a..e5099bc9 100644 --- a/content/browser/gpu/gpu_process_host.cc +++ b/content/browser/gpu/gpu_process_host.cc
@@ -402,14 +402,21 @@ if (UseOpenGLRenderer()) { // Open GL path. - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_LIMITED); - sandbox::policy::SandboxWin::SetJobLevel(sandbox::mojom::Sandbox::kGpu, - sandbox::JobLevel::kUnprotected, - 0, config); + sandbox::ResultCode result = config->SetTokenLevel( + sandbox::USER_RESTRICTED_SAME_ACCESS, sandbox::USER_LIMITED); + if (result != sandbox::SBOX_ALL_OK) + return false; + + result = sandbox::policy::SandboxWin::SetJobLevel( + sandbox::mojom::Sandbox::kGpu, sandbox::JobLevel::kUnprotected, 0, + config); + if (result != sandbox::SBOX_ALL_OK) + return false; } else { - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_LIMITED); + sandbox::ResultCode result = config->SetTokenLevel( + sandbox::USER_RESTRICTED_SAME_ACCESS, sandbox::USER_LIMITED); + if (result != sandbox::SBOX_ALL_OK) + return false; // UI restrictions break when we access Windows from outside our job. // However, we don't want a proxy window in this process because it can @@ -417,12 +424,14 @@ // turn blocks on the browser UI thread. So, instead we forgo a window // message pump entirely and just add job restrictions to prevent child // processes. - sandbox::policy::SandboxWin::SetJobLevel( + result = sandbox::policy::SandboxWin::SetJobLevel( sandbox::mojom::Sandbox::kGpu, sandbox::JobLevel::kLimitedUser, JOB_OBJECT_UILIMIT_SYSTEMPARAMETERS | JOB_OBJECT_UILIMIT_DESKTOP | JOB_OBJECT_UILIMIT_EXITWINDOWS | JOB_OBJECT_UILIMIT_DISPLAYSETTINGS, config); + if (result != sandbox::SBOX_ALL_OK) + return false; } // Check if we are running on the winlogon desktop and set a delayed @@ -432,10 +441,14 @@ // winlogon desktop normally). So instead, let the gpu process start with // the normal integrity and delay the switch to low integrity until after // the gpu process has started and has access to the desktop. - if (ShouldSetDelayedIntegrity()) + if (ShouldSetDelayedIntegrity()) { config->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); - else - config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + } else { + sandbox::ResultCode result = + config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + if (result != sandbox::SBOX_ALL_OK) + return false; + } // Block this DLL even if it is not loaded by the browser process. config->AddDllToUnload(L"cmsetac.dll");
diff --git a/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc b/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc index c9e0234..403ff12d 100644 --- a/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc +++ b/content/browser/renderer_host/blocked_scheme_navigation_browsertest.cc
@@ -120,39 +120,35 @@ }; #if BUILDFLAG(ENABLE_PLUGINS) -// This class registers a fake PDF plugin handler so that navigations with a PDF +// Registers a fake PDF plugin handler so that navigations with a PDF // mime type end up with a navigation and don't simply download the file. -class ScopedPluginRegister { - public: - ScopedPluginRegister(content::PluginService* plugin_service) - : plugin_service_(plugin_service) { - const char16_t kPluginName[] = u"PDF"; - const char kPdfMimeType[] = "application/pdf"; - const char kPdfFileType[] = "pdf"; - WebPluginInfo plugin_info; - plugin_info.type = WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; - plugin_info.name = kPluginName; - plugin_info.mime_types.push_back( - WebPluginMimeType(kPdfMimeType, kPdfFileType, std::string())); - plugin_service_->RegisterInternalPlugin(plugin_info, false); - plugin_service_->RefreshPlugins(); - } +void RegisterFakePlugin() { + const char16_t kPluginName[] = u"PDF"; + const char kPdfMimeType[] = "application/pdf"; + const char kPdfFileType[] = "pdf"; + WebPluginInfo plugin_info; + plugin_info.type = WebPluginInfo::PLUGIN_TYPE_PEPPER_OUT_OF_PROCESS; + plugin_info.name = kPluginName; + plugin_info.mime_types.emplace_back(kPdfMimeType, kPdfFileType, + std::string()); + auto* plugin_service = PluginService::GetInstance(); + plugin_service->RegisterInternalPlugin(plugin_info, false); + plugin_service->RefreshPlugins(); +} - ~ScopedPluginRegister() { - std::vector<WebPluginInfo> plugins; - plugin_service_->GetInternalPlugins(&plugins); - EXPECT_EQ(1u, plugins.size()); - plugin_service_->UnregisterInternalPlugin(plugins[0].path); - plugin_service_->RefreshPlugins(); +void UnregisterFakePlugin() { + auto* plugin_service = PluginService::GetInstance(); + std::vector<WebPluginInfo> plugins; + plugin_service->GetInternalPlugins(&plugins); + EXPECT_EQ(1u, plugins.size()); - plugins.clear(); - plugin_service_->GetInternalPlugins(&plugins); - EXPECT_TRUE(plugins.empty()); - } + plugin_service->UnregisterInternalPlugin(plugins[0].path); + plugin_service->RefreshPlugins(); - private: - raw_ptr<content::PluginService> plugin_service_; -}; + plugins.clear(); + plugin_service->GetInternalPlugins(&plugins); + EXPECT_TRUE(plugins.empty()); +} #endif // BUILDFLAG(ENABLE_PLUGINS) } // namespace @@ -161,12 +157,7 @@ : public ContentBrowserTest, public testing::WithParamInterface<const char*> { public: -#if BUILDFLAG(ENABLE_PLUGINS) - BlockedSchemeNavigationBrowserTest() - : scoped_plugin_register_(PluginService::GetInstance()) {} -#else - BlockedSchemeNavigationBrowserTest() {} -#endif // BUILDFLAG(ENABLE_PLUGINS) + BlockedSchemeNavigationBrowserTest() = default; BlockedSchemeNavigationBrowserTest( const BlockedSchemeNavigationBrowserTest&) = delete; @@ -175,6 +166,10 @@ protected: void SetUpOnMainThread() override { +#if BUILDFLAG(ENABLE_PLUGINS) + RegisterFakePlugin(); +#endif + host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(embedded_test_server()->Start()); @@ -197,6 +192,10 @@ delegate->SetDownloadBehaviorForTesting(downloads_directory_.GetPath()); } +#if BUILDFLAG(ENABLE_PLUGINS) + void TearDownOnMainThread() override { UnregisterFakePlugin(); } +#endif + void Navigate(const GURL& url) { content::DOMMessageQueue message_queue(shell()->web_contents()); EXPECT_TRUE(NavigateToURL(shell(), url)); @@ -561,10 +560,6 @@ base::ScopedTempDir downloads_directory_; -#if BUILDFLAG(ENABLE_PLUGINS) - ScopedPluginRegister scoped_plugin_register_; -#endif // BUILDFLAG(ENABLE_PLUGINS) - GURL data_url_; };
diff --git a/content/browser/utility_sandbox_delegate_win.cc b/content/browser/utility_sandbox_delegate_win.cc index 54a95197..aa59ef2e 100644 --- a/content/browser/utility_sandbox_delegate_win.cc +++ b/content/browser/utility_sandbox_delegate_win.cc
@@ -52,11 +52,15 @@ // Custom default policy allowing audio drivers to read device properties // (https://crbug.com/883326). - config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + auto result = config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetLockdownDefaultDacl(); config->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_RESTRICTED_NON_ADMIN); + result = config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, + sandbox::USER_RESTRICTED_NON_ADMIN); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetDesktop(sandbox::Desktop::kAlternateWinstation); return true; @@ -66,11 +70,10 @@ bool NetworkPreSpawnTarget(sandbox::TargetConfig* config) { DCHECK(!config->IsConfigured()); // LPAC sandbox is enabled, so do not use a restricted token. - if (sandbox::SBOX_ALL_OK != - config->SetTokenLevel(sandbox::USER_UNPROTECTED, - sandbox::USER_UNPROTECTED)) { + auto result = config->SetTokenLevel(sandbox::USER_UNPROTECTED, + sandbox::USER_UNPROTECTED); + if (result != sandbox::SBOX_ALL_OK) return false; - } // Network Sandbox in LPAC sandbox needs access to its data files. These // files are marked on disk with an ACE that permits this access. auto lpac_capability = @@ -97,14 +100,17 @@ } // Sets the sandbox policy for the print backend service process. -void PrintBackendPreSpawnTarget(sandbox::TargetConfig* config) { +bool PrintBackendPreSpawnTarget(sandbox::TargetConfig* config) { DCHECK(!config->IsConfigured()); // Print Backend policy lockdown level must be at least USER_LIMITED and // delayed integrity level INTEGRITY_LEVEL_LOW, otherwise ::OpenPrinter() // will fail with error code ERROR_ACCESS_DENIED (0x5). - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_LIMITED); + auto result = config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, + sandbox::USER_LIMITED); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + return true; } std::string UtilityAppContainerId(base::CommandLine& cmd_line) { @@ -114,25 +120,39 @@ bool IconReaderPreSpawnTarget(sandbox::TargetConfig* config) { DCHECK(!config->IsConfigured()); - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_LOCKDOWN); + auto result = config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, + sandbox::USER_LOCKDOWN); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_UNTRUSTED); - config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + result = config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetLockdownDefaultDacl(); config->SetDesktop(sandbox::Desktop::kAlternateWinstation); sandbox::MitigationFlags flags = config->GetDelayedProcessMitigations(); flags |= sandbox::MITIGATION_DYNAMIC_CODE_DISABLE; - if (config->SetDelayedProcessMitigations(flags) != sandbox::SBOX_ALL_OK) + result = config->SetDelayedProcessMitigations(flags); + if (result != sandbox::SBOX_ALL_OK) return false; // Allow file read. These should match IconLoader::GroupForFilepath(). - config->AddRule(sandbox::SubSystem::kFiles, - sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.exe"); - config->AddRule(sandbox::SubSystem::kFiles, - sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.dll"); - config->AddRule(sandbox::SubSystem::kFiles, - sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.ico"); + result = + config->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.exe"); + if (result != sandbox::SBOX_ALL_OK) + return false; + result = + config->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.dll"); + if (result != sandbox::SBOX_ALL_OK) + return false; + result = + config->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowReadonly, L"\\??\\*.ico"); + if (result != sandbox::SBOX_ALL_OK) + return false; return true; } @@ -144,17 +164,28 @@ // sandbox to use mitigations and restrict the token. // Unprotected token/job. - config->SetTokenLevel(sandbox::USER_UNPROTECTED, sandbox::USER_UNPROTECTED); - sandbox::policy::SandboxWin::SetJobLevel( + auto result = config->SetTokenLevel(sandbox::USER_UNPROTECTED, + sandbox::USER_UNPROTECTED); + if (result != sandbox::SBOX_ALL_OK) + return false; + + result = sandbox::policy::SandboxWin::SetJobLevel( sandbox_type, sandbox::JobLevel::kUnprotected, 0, config); + if (result != sandbox::SBOX_ALL_OK) + return false; // There were issues with some mitigations, causing an inability // to load OpenVR and Oculus APIs. - config->SetProcessMitigations(0); - config->SetDelayedProcessMitigations(0); + result = config->SetProcessMitigations(0); + if (result != sandbox::SBOX_ALL_OK) + return false; + + result = config->SetDelayedProcessMitigations(0); + if (result != sandbox::SBOX_ALL_OK) + return false; std::string appcontainer_id = UtilityAppContainerId(cmd_line); - auto result = sandbox::policy::SandboxWin::AddAppContainerProfileToConfig( + result = sandbox::policy::SandboxWin::AddAppContainerProfileToConfig( cmd_line, sandbox_type, appcontainer_id, config); if (result != sandbox::SBOX_ALL_OK) return false; @@ -234,16 +265,22 @@ } if (sandbox_type_ == sandbox::mojom::Sandbox::kSpeechRecognition) { + auto result = config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); + if (result != sandbox::SBOX_ALL_OK) + return false; config->SetDelayedIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); - config->SetIntegrityLevel(sandbox::INTEGRITY_LEVEL_LOW); - config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, - sandbox::USER_LIMITED); + result = config->SetTokenLevel(sandbox::USER_RESTRICTED_SAME_ACCESS, + sandbox::USER_LIMITED); + if (result != sandbox::SBOX_ALL_OK) + return false; } if (sandbox_type_ == sandbox::mojom::Sandbox::kMediaFoundationCdm || sandbox_type_ == sandbox::mojom::Sandbox::kWindowsSystemProxyResolver) { - config->SetTokenLevel(sandbox::USER_UNPROTECTED, - sandbox::USER_UNPROTECTED); + auto result = config->SetTokenLevel(sandbox::USER_UNPROTECTED, + sandbox::USER_UNPROTECTED); + if (result != sandbox::SBOX_ALL_OK) + return false; } if (sandbox_type_ == sandbox::mojom::Sandbox::kService || @@ -263,7 +300,8 @@ } #if BUILDFLAG(ENABLE_PRINTING) if (sandbox_type_ == sandbox::mojom::Sandbox::kPrintBackend) { - PrintBackendPreSpawnTarget(config); + if (!PrintBackendPreSpawnTarget(config)) + return false; } #endif }
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc index ce4ecc92..bf011bb 100644 --- a/content/browser/webid/idp_network_request_manager.cc +++ b/content/browser/webid/idp_network_request_manager.cc
@@ -768,6 +768,8 @@ resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; resource_request->headers.SetHeader(net::HttpRequestHeaders::kAccept, kResponseBodyContentType); + resource_request->destination = + network::mojom::RequestDestination::kWebIdentity; AddCsrfHeader(resource_request.get()); if (send_referrer) { resource_request->referrer = relying_party_origin_.GetURL(); @@ -810,6 +812,8 @@ // We use nullopt instead of target_origin because we want to send a // `Sec-Fetch-Site: none` header instead of `Sec-Fetch-Site: same-origin`. resource_request->request_initiator = absl::nullopt; + resource_request->destination = + network::mojom::RequestDestination::kWebIdentity; resource_request->url = target_url; resource_request->site_for_cookies = site_for_cookies; if (send_referrer) {
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index 2a8cd75..3dcec3ba 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -1238,11 +1238,11 @@ // defined(ARCH_CPU_X86_64) // Enable WebAssembly stack switching. -#if defined(ARCH_CPU_X86_64) +#if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) BASE_FEATURE(kEnableExperimentalWebAssemblyStackSwitching, "WebAssemblyExperimentalStackSwitching", base::FEATURE_DISABLED_BY_DEFAULT); -#endif // defined(ARCH_CPU_X86_64) +#endif // defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) // Enable WebAssembly dynamic tiering (only tier up hot functions). BASE_FEATURE(kWebAssemblyDynamicTiering,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index d4aa4ff..40fc920e 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -274,7 +274,7 @@ #endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && // defined(ARCH_CPU_X86_64) CONTENT_EXPORT BASE_DECLARE_FEATURE(kWebAssemblyDynamicTiering); -#if defined(ARCH_CPU_X86_64) +#if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) CONTENT_EXPORT BASE_DECLARE_FEATURE( kEnableExperimentalWebAssemblyStackSwitching); #endif // defined(ARCH_CPU_X86_64)
diff --git a/content/renderer/render_process_impl.cc b/content/renderer/render_process_impl.cc index 69f5528..ff83822 100644 --- a/content/renderer/render_process_impl.cc +++ b/content/renderer/render_process_impl.cc
@@ -164,12 +164,12 @@ #endif // (BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS)) && // defined(ARCH_CPU_X86_64) -#if defined(ARCH_CPU_X86_64) +#if defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) SetV8FlagIfFeature(features::kEnableExperimentalWebAssemblyStackSwitching, "--experimental-wasm-type-reflection"); SetV8FlagIfFeature(features::kEnableExperimentalWebAssemblyStackSwitching, "--experimental-wasm-stack-switching"); -#endif // defined(ARCH_CPU_X86_64) +#endif // defined(ARCH_CPU_X86_64) || defined(ARCH_CPU_ARM64) SetV8FlagIfFeature(features::kWebAssemblyLazyCompilation, "--wasm-lazy-compilation");
diff --git a/content/test/data/accessibility/html/a-onclick-expected-win.txt b/content/test/data/accessibility/html/a-onclick-expected-win.txt index 950fde8..ca05411 100644 --- a/content/test/data/accessibility/html/a-onclick-expected-win.txt +++ b/content/test/data/accessibility/html/a-onclick-expected-win.txt
@@ -1,5 +1,5 @@ -ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE action_name='showContextMenu' +ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE action_name='doDefault' ++ROLE_SYSTEM_LINK name='link with no href but onclick' LINKED default_action='jump' action_name='jump' -++++ROLE_SYSTEM_STATICTEXT name='link with no href but onclick' action_name='showContextMenu' +++++ROLE_SYSTEM_STATICTEXT name='link with no href but onclick' action_name='doDefault' ++ROLE_SYSTEM_LINK name='link with no href and click handler added via script' LINKED default_action='jump' action_name='jump' -++++ROLE_SYSTEM_STATICTEXT name='link with no href and click handler added via script' action_name='showContextMenu' +++++ROLE_SYSTEM_STATICTEXT name='link with no href and click handler added via script' action_name='doDefault'
diff --git a/content/test/data/accessibility/html/action-verbs-expected-auralinux.txt b/content/test/data/accessibility/html/action-verbs-expected-auralinux.txt index 2901be7..103546a 100644 --- a/content/test/data/accessibility/html/action-verbs-expected-auralinux.txt +++ b/content/test/data/accessibility/html/action-verbs-expected-auralinux.txt
@@ -1,11 +1,11 @@ -[document web] name='Action verbs' actions=(showContextMenu, scrollBackward, scrollDown, scrollForward, scrollLeft, scrollRight, scrollUp) -++[section] actions=(showContextMenu) -++++[static] name='Generic div' actions=(showContextMenu) -++[heading] name='Heading' actions=(showContextMenu) -++++[static] name='Heading' actions=(showContextMenu) +[document web] name='Action verbs' actions=(doDefault, showContextMenu, scrollBackward, scrollDown, scrollForward, scrollLeft, scrollRight, scrollUp) +++[section] actions=(doDefault, showContextMenu) +++++[static] name='Generic div' actions=(doDefault, showContextMenu) +++[heading] name='Heading' actions=(doDefault, showContextMenu) +++++[static] name='Heading' actions=(doDefault, showContextMenu) ++[push button] name='Button' actions=(press, showContextMenu) ++[link] name='Link' actions=(jump, showContextMenu) -++++[static] name='Link' actions=(showContextMenu) +++++[static] name='Link' actions=(doDefault, showContextMenu) ++[entry] selectable-text actions=(activate, showContextMenu) ++[entry] selectable-text actions=(activate, showContextMenu) ++[entry] selectable-text actions=(activate, showContextMenu) @@ -14,18 +14,18 @@ ++[check box] checked actions=(uncheck, showContextMenu) checkable:true ++[radio button] actions=(check, showContextMenu) checkable:true ++[toggle button] name='ARIA Switch' actions=(check, showContextMenu) checkable:true -++[panel] actions=(showContextMenu) +++[panel] actions=(doDefault, showContextMenu) ++++[toggle button] name='Summary' actions=(press, showContextMenu) -++++++[static] name='Summary' actions=(showContextMenu) +++++++[static] name='Summary' actions=(doDefault, showContextMenu) ++[combo box] actions=(open, showContextMenu) -++++[menu] actions=(showContextMenu) +++++[menu] actions=(doDefault, showContextMenu) ++++++[menu item] name='Pop-up button' selectable selected actions=(select, showContextMenu) ++[section] actions=(click, showContextMenu) -++++[static] name='Div with click handler' actions=(showContextMenu) +++++[static] name='Div with click handler' actions=(doDefault, showContextMenu) ++[panel] actions=(click, showContextMenu) ++++[paragraph] actions=(clickAncestor, showContextMenu) -++++++[static] name='Paragraph with click handler on parent' actions=(showContextMenu) -++[menu] actions=(showContextMenu) +++++++[static] name='Paragraph with click handler on parent' actions=(doDefault, showContextMenu) +++[menu] actions=(doDefault, showContextMenu) ++++[menu item] name='Menu item 1' actions=(select, showContextMenu) ++++[check menu item] name='Menu item 2' checked actions=(uncheck, showContextMenu) checkable:true ++++[radio menu item] name='Menu item 3' actions=(check, showContextMenu) checkable:true @@ -37,4 +37,4 @@ ++[section] actions=(click, showContextMenu) ++++[toggle button] name='ARIA switch in clickable container' actions=(check, showContextMenu) checkable:true ++++[section] actions=(clickAncestor, showContextMenu) -++++++[static] name='Generic in clickable container' actions=(showContextMenu) +++++++[static] name='Generic in clickable container' actions=(doDefault, showContextMenu)
diff --git a/content/test/data/accessibility/html/action-verbs-expected-win.txt b/content/test/data/accessibility/html/action-verbs-expected-win.txt index b23fb4c..217eaa5 100644 --- a/content/test/data/accessibility/html/action-verbs-expected-win.txt +++ b/content/test/data/accessibility/html/action-verbs-expected-win.txt
@@ -1,11 +1,11 @@ -ROLE_SYSTEM_DOCUMENT name='Action verbs' READONLY FOCUSABLE action_name='showContextMenu' -++IA2_ROLE_SECTION action_name='showContextMenu' -++++ROLE_SYSTEM_STATICTEXT name='Generic div' action_name='showContextMenu' -++IA2_ROLE_HEADING name='Heading' action_name='showContextMenu' -++++ROLE_SYSTEM_STATICTEXT name='Heading' action_name='showContextMenu' +ROLE_SYSTEM_DOCUMENT name='Action verbs' READONLY FOCUSABLE action_name='doDefault' +++IA2_ROLE_SECTION action_name='doDefault' +++++ROLE_SYSTEM_STATICTEXT name='Generic div' action_name='doDefault' +++IA2_ROLE_HEADING name='Heading' action_name='doDefault' +++++ROLE_SYSTEM_STATICTEXT name='Heading' action_name='doDefault' ++ROLE_SYSTEM_PUSHBUTTON name='Button' FOCUSABLE default_action='press' action_name='press' ++ROLE_SYSTEM_LINK name='Link' FOCUSABLE default_action='jump' action_name='jump' -++++ROLE_SYSTEM_STATICTEXT name='Link' action_name='showContextMenu' +++++ROLE_SYSTEM_STATICTEXT name='Link' action_name='doDefault' ++ROLE_SYSTEM_TEXT FOCUSABLE default_action='activate' action_name='activate' ++ROLE_SYSTEM_TEXT FOCUSABLE default_action='activate' action_name='activate' ++ROLE_SYSTEM_TEXT FOCUSABLE IA2_STATE_MULTI_LINE default_action='activate' action_name='activate' @@ -14,16 +14,16 @@ ++ROLE_SYSTEM_CHECKBUTTON CHECKED FOCUSABLE IA2_STATE_CHECKABLE checkable:true default_action='uncheck' action_name='uncheck' ++ROLE_SYSTEM_RADIOBUTTON FOCUSABLE IA2_STATE_CHECKABLE checkable:true default_action='check' action_name='check' ++IA2_ROLE_TOGGLE_BUTTON name='ARIA Switch' FOCUSABLE IA2_STATE_CHECKABLE checkable:true default_action='check' action_name='check' -++ROLE_SYSTEM_GROUPING action_name='showContextMenu' +++ROLE_SYSTEM_GROUPING action_name='doDefault' ++++ROLE_SYSTEM_PUSHBUTTON name='Summary' COLLAPSED FOCUSABLE default_action='press' action_name='press' -++++++ROLE_SYSTEM_STATICTEXT name='Summary' action_name='showContextMenu' +++++++ROLE_SYSTEM_STATICTEXT name='Summary' action_name='doDefault' ++ROLE_SYSTEM_COMBOBOX value='Pop-up button' COLLAPSED FOCUSABLE HASPOPUP haspopup:menu default_action='open' action_name='open' ++IA2_ROLE_SECTION default_action='click' action_name='click' -++++ROLE_SYSTEM_STATICTEXT name='Div with click handler' action_name='showContextMenu' +++++ROLE_SYSTEM_STATICTEXT name='Div with click handler' action_name='doDefault' ++ROLE_SYSTEM_GROUPING default_action='click' action_name='click' ++++IA2_ROLE_PARAGRAPH default_action='click ancestor' action_name='clickAncestor' -++++++ROLE_SYSTEM_STATICTEXT name='Paragraph with click handler on parent' action_name='showContextMenu' -++ROLE_SYSTEM_MENUPOPUP action_name='showContextMenu' +++++++ROLE_SYSTEM_STATICTEXT name='Paragraph with click handler on parent' action_name='doDefault' +++ROLE_SYSTEM_MENUPOPUP action_name='doDefault' ++++ROLE_SYSTEM_MENUITEM name='Menu item 1' default_action='select' action_name='select' ++++IA2_ROLE_CHECK_MENU_ITEM name='Menu item 2' CHECKED IA2_STATE_CHECKABLE checkable:true default_action='uncheck' action_name='uncheck' ++++IA2_ROLE_RADIO_MENU_ITEM name='Menu item 3' IA2_STATE_CHECKABLE checkable:true default_action='check' action_name='check' @@ -35,4 +35,4 @@ ++IA2_ROLE_SECTION default_action='click' action_name='click' ++++IA2_ROLE_TOGGLE_BUTTON name='ARIA switch in clickable container' IA2_STATE_CHECKABLE checkable:true default_action='check' action_name='check' ++++IA2_ROLE_SECTION default_action='click ancestor' action_name='clickAncestor' -++++++ROLE_SYSTEM_STATICTEXT name='Generic in clickable container' action_name='showContextMenu' +++++++ROLE_SYSTEM_STATICTEXT name='Generic in clickable container' action_name='doDefault'
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 77d5908..24d13b5 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -528,6 +528,8 @@ crbug.com/1364333 [ win debug angle-vulkan passthrough ] conformance/glsl/bugs/temp-expressions-should-not-crash.html [ Slow ] crbug.com/1364333 [ win debug angle-vulkan passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +[ win angle-swiftshader passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] +[ win angle-swiftshader passthrough ] conformance/renderbuffers/framebuffer-object-attachment.html [ Slow ] #################### # Mac failures # @@ -611,6 +613,8 @@ crbug.com/1271688 [ linux angle-vulkan passthrough nvidia ] conformance/ogles/GL/mod/mod_001_to_008.html [ Failure ] crbug.com/1271688 [ linux angle-vulkan passthrough nvidia ] conformance/ogles/GL/pow/pow_017_to_024.html [ Failure ] +[ linux angle-swiftshader passthrough ] conformance/uniforms/no-over-optimization-on-uniform-array-* [ Slow ] + #################### # Android failures # ####################
diff --git a/content/web_test/browser/web_test_content_browser_client.cc b/content/web_test/browser/web_test_content_browser_client.cc index d3ae5f3..815df24 100644 --- a/content/web_test/browser/web_test_content_browser_client.cc +++ b/content/web_test/browser/web_test_content_browser_client.cc
@@ -652,9 +652,11 @@ std::vector<std::string> font_files = switches::GetSideloadFontFiles(); for (std::vector<std::string>::const_iterator i(font_files.begin()); i != font_files.end(); ++i) { - policy->GetConfig()->AddRule(sandbox::SubSystem::kFiles, - sandbox::Semantics::kFilesAllowReadonly, - base::UTF8ToWide(*i).c_str()); + sandbox::ResultCode result = policy->GetConfig()->AddRule( + sandbox::SubSystem::kFiles, sandbox::Semantics::kFilesAllowReadonly, + base::UTF8ToWide(*i).c_str()); + if (result != sandbox::SBOX_ALL_OK) + return false; } } return true;
diff --git a/device/bluetooth/test/bluetooth_test_win.cc b/device/bluetooth/test/bluetooth_test_win.cc index defbd64f..0614e5f 100644 --- a/device/bluetooth/test/bluetooth_test_win.cc +++ b/device/bluetooth/test/bluetooth_test_win.cc
@@ -689,8 +689,8 @@ } BluetoothTestWinrt::BluetoothTestWinrt() { - std::vector<base::Feature> enabled; - std::vector<base::Feature> disabled; + std::vector<base::test::FeatureRef> enabled; + std::vector<base::test::FeatureRef> disabled; if (GetParam().new_ble_implementation_enabled) { enabled.push_back(kNewBLEWinImplementation); if (base::win::GetVersion() >= base::win::Version::WIN10) {
diff --git a/docs/speed/perf_lab_platforms.md b/docs/speed/perf_lab_platforms.md index 0ec56edb..32aa39a 100644 --- a/docs/speed/perf_lab_platforms.md +++ b/docs/speed/perf_lab_platforms.md
@@ -12,13 +12,10 @@ * [android-pixel2-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2-perf): Android OPM1.171019.021. * [android-pixel2-perf-calibration](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2-perf-calibration): Android OPM1.171019.021. * [android-pixel2-perf-pgo](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2-perf-pgo): Android OPM1.171019.021. - * [android-pixel2_weblayer-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2_weblayer-perf): Android OPM1.171019.021. * [android-pixel2_webview-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2_webview-perf): Android OPM1.171019.021. * [android-pixel2_webview-perf-pgo](https://ci.chromium.org/p/chrome/builders/ci/android-pixel2_webview-perf-pgo): Android OPM1.171019.021. * [android-pixel4-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4-perf): Android R. * [android-pixel4-perf-pgo](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4-perf-pgo): Android R. - * [android-pixel4_weblayer-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4_weblayer-perf): Android R. - * [android-pixel4_weblayer-perf-pgo](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4_weblayer-perf-pgo): Android R. * [android-pixel4_webview-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4_webview-perf): Android R. * [android-pixel4a_power-perf](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4a_power-perf): Android QD4A.200102.001.A1. * [android-pixel4a_power-perf-pgo](https://ci.chromium.org/p/chrome/builders/ci/android-pixel4a_power-perf-pgo): Android QD4A.200102.001.A1.
diff --git a/extensions/browser/api/web_request/web_request_api.cc b/extensions/browser/api/web_request/web_request_api.cc index ba9ad0f..f1d4f07 100644 --- a/extensions/browser/api/web_request/web_request_api.cc +++ b/extensions/browser/api/web_request/web_request_api.cc
@@ -2841,13 +2841,23 @@ extension ? extension->name() : extension_id_safe(); if (!web_view_instance_id) { + auto has_blocking_permission = [&extension, &event_name]() { + if (extension->permissions_data()->HasAPIPermission( + APIPermissionID::kWebRequestBlocking)) { + return true; + } + + return event_name == keys::kOnAuthRequiredEvent && + extension->permissions_data()->HasAPIPermission( + APIPermissionID::kWebRequestAuthProvider); + }; + // We check automatically whether the extension has the 'webRequest' // permission. For blocking calls we require the additional permission - // 'webRequestBlocking'. - if ((extra_info_spec & - (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) && - !extension->permissions_data()->HasAPIPermission( - APIPermissionID::kWebRequestBlocking)) { + // 'webRequestBlocking' or 'webRequestAuthProvider'. + bool is_blocking = extra_info_spec & (ExtraInfoSpec::BLOCKING | + ExtraInfoSpec::ASYNC_BLOCKING); + if (is_blocking && !has_blocking_permission()) { return RespondNow(Error(keys::kBlockingPermissionRequired)); }
diff --git a/extensions/common/api/_permission_features.json b/extensions/common/api/_permission_features.json index dd27f971..8ea8fa8 100644 --- a/extensions/common/api/_permission_features.json +++ b/extensions/common/api/_permission_features.json
@@ -772,5 +772,9 @@ "extension_types": ["extension"], "location": "policy", "min_manifest_version": 3 - }] + }], + "webRequestAuthProvider": { + "channel": "stable", + "extension_types": ["extension"] + } }
diff --git a/extensions/common/mojom/api_permission_id.mojom b/extensions/common/mojom/api_permission_id.mojom index 9ce492e..1eb96ac4 100644 --- a/extensions/common/mojom/api_permission_id.mojom +++ b/extensions/common/mojom/api_permission_id.mojom
@@ -267,6 +267,7 @@ kOffscreen = 240, kSidePanel = 241, kDownloadsUi = 242, + kWebRequestAuthProvider = 243, // Add new entries at the end of the enum and be sure to update the // "ExtensionPermission3" enum in tools/metrics/histograms/enums.xml
diff --git a/extensions/common/permissions/extensions_api_permissions.cc b/extensions/common/permissions/extensions_api_permissions.cc index b17d58ff..583777a9 100644 --- a/extensions/common/permissions/extensions_api_permissions.cc +++ b/extensions/common/permissions/extensions_api_permissions.cc
@@ -161,6 +161,7 @@ APIPermissionInfo::kFlagCannotBeOptional | APIPermissionInfo::kFlagDoesNotRequireManagedSessionFullLoginWarning}, {APIPermissionID::kWebRequest, "webRequest"}, + {APIPermissionID::kWebRequestAuthProvider, "webRequestAuthProvider"}, {APIPermissionID::kWebRequestBlocking, "webRequestBlocking"}, {APIPermissionID::kWebView, "webview", APIPermissionInfo::kFlagCannotBeOptional},
diff --git a/gpu/command_buffer/service/gl_context_virtual.cc b/gpu/command_buffer/service/gl_context_virtual.cc index bd38c5e..55f7116 100644 --- a/gpu/command_buffer/service/gl_context_virtual.cc +++ b/gpu/command_buffer/service/gl_context_virtual.cc
@@ -98,11 +98,6 @@ shared_context_->SetUnbindFboOnMakeCurrent(); } -gl::YUVToRGBConverter* GLContextVirtual::GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) { - return shared_context_->GetYUVToRGBConverter(color_space); -} - void GLContextVirtual::ForceReleaseVirtuallyCurrent() { shared_context_->OnReleaseVirtuallyCurrent(this); }
diff --git a/gpu/command_buffer/service/gl_context_virtual.h b/gpu/command_buffer/service/gl_context_virtual.h index 36873a5..4f0e645 100644 --- a/gpu/command_buffer/service/gl_context_virtual.h +++ b/gpu/command_buffer/service/gl_context_virtual.h
@@ -45,8 +45,6 @@ void SetSafeToForceGpuSwitch() override; unsigned int CheckStickyGraphicsResetStatusImpl() override; void SetUnbindFboOnMakeCurrent() override; - gl::YUVToRGBConverter* GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) override; void ForceReleaseVirtuallyCurrent() override; #if BUILDFLAG(IS_MAC) uint64_t BackpressureFenceCreate() override;
diff --git a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc index 750f789..2296d45c8 100644 --- a/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc +++ b/gpu/command_buffer/tests/webgpu_mailbox_unittest.cc
@@ -262,7 +262,7 @@ webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - GetGpuServiceHolder()->ScheduleGpuTask(base::BindOnce( + GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce( [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedTexture reservation, gpu::Mailbox mailbox) { // Error case: device client id doesn't exist. @@ -348,7 +348,9 @@ }, GetDecoder(), reservation, mailbox)); - GetGpuServiceHolder()->gpu_thread_task_runner()->RunsTasksInCurrentSequence(); + GetGpuServiceHolder() + ->gpu_main_thread_task_runner() + ->RunsTasksInCurrentSequence(); } // Test that AssociateMailbox with a bad mailbox produces an error texture. @@ -362,7 +364,7 @@ webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - GetGpuServiceHolder()->ScheduleGpuTask(base::BindOnce( + GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce( [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedTexture reservation, gpu::Mailbox mailbox) { // Error case: invalid mailbox @@ -396,7 +398,7 @@ webgpu::ReservedTexture reservation = webgpu()->ReserveTexture(device_.Get()); - GetGpuServiceHolder()->ScheduleGpuTask(base::BindOnce( + GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce( [](webgpu::WebGPUDecoder* decoder, webgpu::ReservedTexture reservation, gpu::Mailbox mailbox) { // Associate a mailbox so we can later dissociate it. @@ -440,7 +442,9 @@ }, GetDecoder(), reservation, mailbox)); - GetGpuServiceHolder()->gpu_thread_task_runner()->RunsTasksInCurrentSequence(); + GetGpuServiceHolder() + ->gpu_main_thread_task_runner() + ->RunsTasksInCurrentSequence(); } // Test that Associate and Dissociate mailbox may be used after the device is @@ -1167,7 +1171,7 @@ auto CreateAndMakeGLContextCurrent = [&](scoped_refptr<gl::GLContext>* gl_context_out, scoped_refptr<gl::GLSurface>* gl_surface_out) { - GetGpuServiceHolder()->ScheduleGpuTask(base::BindOnce( + GetGpuServiceHolder()->ScheduleGpuMainTask(base::BindOnce( [](scoped_refptr<gl::GLContext>* gl_context_out, scoped_refptr<gl::GLSurface>* gl_surface_out) { auto gl_surface = gl::init::CreateOffscreenGLSurface( @@ -1183,7 +1187,7 @@ }, gl_context_out, gl_surface_out)); GetGpuServiceHolder() - ->gpu_thread_task_runner() + ->gpu_main_thread_task_runner() ->RunsTasksInCurrentSequence(); }; @@ -1230,7 +1234,7 @@ WaitForCompletion(device_); // Delete the GL contexts on the GPU thread. - GetGpuServiceHolder()->ScheduleGpuTask( + GetGpuServiceHolder()->ScheduleGpuMainTask( base::BindOnce([](scoped_refptr<gl::GLContext> gl_context1, scoped_refptr<gl::GLContext> gl_context2, scoped_refptr<gl::GLSurface> gl_surface1,
diff --git a/gpu/command_buffer/tests/webgpu_test.cc b/gpu/command_buffer/tests/webgpu_test.cc index a39fa11f..93e9c4b 100644 --- a/gpu/command_buffer/tests/webgpu_test.cc +++ b/gpu/command_buffer/tests/webgpu_test.cc
@@ -174,7 +174,7 @@ void WebGPUTest::RunPendingTasks() { context_->GetTaskRunner()->RunPendingTasks(); - gpu_service_holder_->ScheduleGpuTask(base::BindOnce( + gpu_service_holder_->ScheduleGpuMainTask(base::BindOnce( [](webgpu::WebGPUDecoder* decoder) { if (decoder->HasPollingWork()) { decoder->PerformPollingWork(); @@ -210,7 +210,7 @@ } webgpu()->FlushCommands(); base::WaitableEvent wait; - gpu_service_holder_->ScheduleGpuTask( + gpu_service_holder_->ScheduleGpuMainTask( base::BindLambdaForTesting([&wait, decoder = GetDecoder()]() { while (decoder->HasPollingWork()) { base::PlatformThread::Sleep(TestTimeouts::tiny_timeout());
diff --git a/infra/config/generated/builders/ci/ASAN Debug/properties.json b/infra/config/generated/builders/ci/ASAN Debug/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/ASAN Debug/properties.json +++ b/infra/config/generated/builders/ci/ASAN Debug/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ASAN Release Media/properties.json b/infra/config/generated/builders/ci/ASAN Release Media/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/ASAN Release Media/properties.json +++ b/infra/config/generated/builders/ci/ASAN Release Media/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/ASAN Release/properties.json b/infra/config/generated/builders/ci/ASAN Release/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/ASAN Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" index 77be319..d2e0e3b 100644 --- "a/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Debug \05032-bit x86 with V8-ARM\051/properties.json"
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" index 77be319..d2e0e3b 100644 --- "a/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Release \05032-bit x86 with V8-ARM\051/properties.json"
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" "b/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" index 77be319..d2e0e3b 100644 --- "a/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json" +++ "b/infra/config/generated/builders/ci/ASan Release Media \05032-bit x86 with V8-ARM\051/properties.json"
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/Android WebView M \050dbg\051/properties.json" "b/infra/config/generated/builders/ci/Android WebView M \050dbg\051/properties.json" index ba8f215..edae6d2 100644 --- "a/infra/config/generated/builders/ci/Android WebView M \050dbg\051/properties.json" +++ "b/infra/config/generated/builders/ci/Android WebView M \050dbg\051/properties.json"
@@ -101,8 +101,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050kevin\051/properties.json" "b/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050kevin\051/properties.json" index 1aaa05f..ee3a803 100644 --- "a/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050kevin\051/properties.json" +++ "b/infra/config/generated/builders/ci/ChromeOS FYI Release Skylab \050kevin\051/properties.json"
@@ -32,7 +32,11 @@ ], "config": "chromium" }, - "run_tests_serially": true + "run_tests_serially": true, + "skylab_upload_location": { + "gs_bucket": "lacros-arm64-generic-rel-skylab-try", + "gs_extra": "chromeos_gpu" + } } } ]
diff --git a/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json b/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json index 0ca09b2..3c360dd 100644 --- a/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/ChromiumOS ASAN Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" "b/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" index 77be319..d2e0e3b 100644 --- "a/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json" +++ "b/infra/config/generated/builders/ci/MSAN Release \050chained origins\051/properties.json"
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git "a/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" "b/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" index 77be319..d2e0e3b 100644 --- "a/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json" +++ "b/infra/config/generated/builders/ci/MSAN Release \050no origins\051/properties.json"
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json b/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json +++ b/infra/config/generated/builders/ci/Mac ASAN Release Media/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Mac ASAN Release/properties.json b/infra/config/generated/builders/ci/Mac ASAN Release/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/Mac ASAN Release/properties.json +++ b/infra/config/generated/builders/ci/Mac ASAN Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Marshmallow 64 bit Tester/properties.json b/infra/config/generated/builders/ci/Marshmallow 64 bit Tester/properties.json index c769cf1d..b6db63d 100644 --- a/infra/config/generated/builders/ci/Marshmallow 64 bit Tester/properties.json +++ b/infra/config/generated/builders/ci/Marshmallow 64 bit Tester/properties.json
@@ -99,8 +99,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Marshmallow Tablet Tester/properties.json b/infra/config/generated/builders/ci/Marshmallow Tablet Tester/properties.json index 9547bf7..837d4fd 100644 --- a/infra/config/generated/builders/ci/Marshmallow Tablet Tester/properties.json +++ b/infra/config/generated/builders/ci/Marshmallow Tablet Tester/properties.json
@@ -95,8 +95,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/TSAN Debug/properties.json b/infra/config/generated/builders/ci/TSAN Debug/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/TSAN Debug/properties.json +++ b/infra/config/generated/builders/ci/TSAN Debug/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/TSAN Release/properties.json b/infra/config/generated/builders/ci/TSAN Release/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/TSAN Release/properties.json +++ b/infra/config/generated/builders/ci/TSAN Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/UBSan Release/properties.json b/infra/config/generated/builders/ci/UBSan Release/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/UBSan Release/properties.json +++ b/infra/config/generated/builders/ci/UBSan Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/UBSan vptr Release/properties.json b/infra/config/generated/builders/ci/UBSan vptr Release/properties.json index 77be319..d2e0e3b 100644 --- a/infra/config/generated/builders/ci/UBSan vptr Release/properties.json +++ b/infra/config/generated/builders/ci/UBSan vptr Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Win ASan Release Media/properties.json b/infra/config/generated/builders/ci/Win ASan Release Media/properties.json index d8efc74..5dd708a0 100644 --- a/infra/config/generated/builders/ci/Win ASan Release Media/properties.json +++ b/infra/config/generated/builders/ci/Win ASan Release Media/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/Win ASan Release/properties.json b/infra/config/generated/builders/ci/Win ASan Release/properties.json index d8efc74..5dd708a0 100644 --- a/infra/config/generated/builders/ci/Win ASan Release/properties.json +++ b/infra/config/generated/builders/ci/Win ASan Release/properties.json
@@ -12,5 +12,8 @@ ] }, "builder_group": "chromium.fuzz", - "recipe": "chromium" + "recipe": "chromium", + "sheriff_rotations": [ + "chromium.fuzz" + ] } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-arm64-proguard-rel/properties.json b/infra/config/generated/builders/ci/android-arm64-proguard-rel/properties.json index 7179c607..fa6ed4c4 100644 --- a/infra/config/generated/builders/ci/android-arm64-proguard-rel/properties.json +++ b/infra/config/generated/builders/ci/android-arm64-proguard-rel/properties.json
@@ -61,8 +61,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-bfcache-rel/properties.json b/infra/config/generated/builders/ci/android-bfcache-rel/properties.json index 864f492..ba1242e 100644 --- a/infra/config/generated/builders/ci/android-bfcache-rel/properties.json +++ b/infra/config/generated/builders/ci/android-bfcache-rel/properties.json
@@ -65,8 +65,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-marshmallow-x86-fyi-rel-reviver/properties.json b/infra/config/generated/builders/ci/android-marshmallow-x86-fyi-rel-reviver/properties.json deleted file mode 100644 index b6e2921..0000000 --- a/infra/config/generated/builders/ci/android-marshmallow-x86-fyi-rel-reviver/properties.json +++ /dev/null
@@ -1,16 +0,0 @@ -{ - "$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.android.fyi", - "recipe": "chromium" -} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-marshmallow-x86-rel-non-cq/properties.json b/infra/config/generated/builders/ci/android-marshmallow-x86-rel-non-cq/properties.json index 78355ebb..9c0904f 100644 --- a/infra/config/generated/builders/ci/android-marshmallow-x86-rel-non-cq/properties.json +++ b/infra/config/generated/builders/ci/android-marshmallow-x86-rel-non-cq/properties.json
@@ -65,8 +65,5 @@ ] }, "builder_group": "chromium.android", - "recipe": "chromium", - "sheriff_rotations": [ - "android" - ] + "recipe": "chromium" } \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-marshmallow-x86-fyi-rel-reviver/properties.json b/infra/config/generated/builders/try/android-marshmallow-x86-fyi-rel-reviver/properties.json deleted file mode 100644 index d90599c..0000000 --- a/infra/config/generated/builders/try/android-marshmallow-x86-fyi-rel-reviver/properties.json +++ /dev/null
@@ -1,17 +0,0 @@ -{ - "$build/goma": { - "enable_ats": true, - "rpc_extra_params": "?prod", - "server_host": "goma.chromium.org", - "use_luci_auth": true - }, - "$recipe_engine/resultdb/test_presentation": { - "column_keys": [], - "grouping_keys": [ - "status", - "v.test_suite" - ] - }, - "builder_group": "tryserver.chromium.android", - "recipe": "chromium_trybot" -} \ No newline at end of file
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 2843c72..ded9d6cd 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -562,10 +562,6 @@ includable_only: true } builders { - name: "chromium/try/android-marshmallow-x86-fyi-rel-reviver" - includable_only: true - } - builders { name: "chromium/try/android-marshmallow-x86-rel" includable_only: true }
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 5b56fa7..16d12975 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -219,7 +219,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -303,7 +306,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -387,7 +393,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -471,7 +480,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -555,7 +567,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -639,7 +654,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -715,7 +733,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_afl"' + ' "recipe": "chromium_afl",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -1754,10 +1775,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -3591,7 +3609,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -10527,7 +10548,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 14400 build_numbers: YES @@ -10603,7 +10627,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -10679,7 +10706,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 14400 build_numbers: YES @@ -10755,7 +10785,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -10829,7 +10862,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 18000 build_numbers: YES @@ -10905,7 +10941,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -10981,7 +11020,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -11057,7 +11099,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -11133,7 +11178,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 14400 build_numbers: YES @@ -11209,7 +11257,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -11285,7 +11336,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -11359,7 +11413,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 14400 build_numbers: YES @@ -11433,7 +11490,10 @@ ' ]' ' },' ' "builder_group": "chromium.fuzz",' - ' "recipe": "chromium_libfuzzer"' + ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 18000 build_numbers: YES @@ -11508,6 +11568,9 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "recipe": "chromium_libfuzzer",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ],' ' "xcode_build_version": "14a309"' '}' execution_timeout_secs: 14400 @@ -14765,7 +14828,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -14849,7 +14915,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -14931,7 +15000,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -15013,7 +15085,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -17965,10 +18040,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -18052,10 +18124,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 54000 build_numbers: YES @@ -18490,7 +18559,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -18574,7 +18646,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -21749,7 +21824,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -21833,7 +21911,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -22532,7 +22613,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -22614,7 +22698,10 @@ ' },' ' "builder_group": "chromium.fuzz",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' + ' "recipe": "chromium",' + ' "sheriff_rotations": [' + ' "chromium.fuzz"' + ' ]' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -25976,10 +26063,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 21600 build_numbers: YES @@ -26418,10 +26502,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -28313,91 +28394,6 @@ } } builders { - name: "android-marshmallow-x86-fyi-rel-reviver" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "free_space:standard" - dimensions: "os:Ubuntu-18.04" - dimensions: "pool:luci.chromium.ci" - dimensions: "ssd:0" - 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/android-marshmallow-x86-fyi-rel-reviver/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "chromium.android.fyi",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium"' - '}' - priority: 35 - execution_timeout_secs: 10800 - build_numbers: YES - service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" - experiments { - key: "chromium_swarming.expose_merge_script_failures" - value: 10 - } - 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/.+)|(ninja://[^/]*blink_wpt_tests/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "android-marshmallow-x86-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -28519,10 +28515,7 @@ ' },' ' "builder_group": "chromium.android",' ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium",' - ' "sheriff_rotations": [' - ' "android"' - ' ]' + ' "recipe": "chromium"' '}' execution_timeout_secs: 10800 build_numbers: YES @@ -57733,112 +57726,6 @@ description_html: "This is the compilator half of an orchestrator + compilator pair of builders. The orchestrator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-marshmallow-arm64-rel\">android-marshmallow-arm64-rel</a>." } builders { - name: "android-marshmallow-x86-fyi-rel-reviver" - swarming_host: "chromium-swarm.appspot.com" - dimensions: "builderless:1" - dimensions: "cores:8" - dimensions: "cpu:x86-64" - dimensions: "os:Ubuntu-18.04" - dimensions: "pool:luci.chromium.try" - dimensions: "ssd:0" - 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/try/android-marshmallow-x86-fyi-rel-reviver/properties.json",' - ' "top_level_project": {' - ' "ref": "refs/heads/main",' - ' "repo": {' - ' "host": "chromium.googlesource.com",' - ' "project": "chromium/src"' - ' }' - ' }' - ' },' - ' "builder_group": "tryserver.chromium.android",' - ' "led_builder_is_bootstrapped": true,' - ' "recipe": "chromium_trybot"' - '}' - execution_timeout_secs: 14400 - expiration_secs: 7200 - grace_period { - seconds: 120 - } - caches { - name: "win_toolchain" - path: "win_toolchain" - } - build_numbers: YES - service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" - task_template_canary_percentage { - value: 5 - } - experiments { - key: "chromium_swarming.expose_merge_script_failures" - value: 20 - } - experiments { - key: "enable_weetbix_queries" - value: 100 - } - experiments { - key: "luci.recipes.use_python3" - value: 100 - } - experiments { - key: "weetbix.enable_weetbix_exonerations" - value: 100 - } - experiments { - key: "weetbix.retry_weak_exonerations" - value: 100 - } - resultdb { - enable: true - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "try_test_results" - test_results {} - } - bq_exports { - project: "chrome-luci-data" - dataset: "chromium" - table: "gpu_try_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_try_test_results" - test_results { - predicate { - test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*blink_wpt_tests/.+)" - } - } - } - history_options { - use_invocation_timestamp: true - } - } - } - builders { name: "android-marshmallow-x86-rel" swarming_host: "chromium-swarm.appspot.com" dimensions: "cores:4"
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index c24a991b..33bc583 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -4631,11 +4631,6 @@ short_name: "and" } builders { - name: "buildbucket/luci.chromium.ci/android-marshmallow-x86-fyi-rel-reviver" - category: "reviver" - short_name: "M" - } - builders { name: "buildbucket/luci.chromium.ci/android-pie-x86-fyi-rel-reviver" category: "reviver" short_name: "P" @@ -16236,9 +16231,6 @@ name: "buildbucket/luci.chromium.try/android-marshmallow-arm64-rel-compilator" } builders { - name: "buildbucket/luci.chromium.try/android-marshmallow-x86-fyi-rel-reviver" - } - builders { name: "buildbucket/luci.chromium.try/android-marshmallow-x86-rel" } builders { @@ -17429,9 +17421,6 @@ name: "buildbucket/luci.chromium.try/android-marshmallow-arm64-rel-compilator" } builders { - name: "buildbucket/luci.chromium.try/android-marshmallow-x86-fyi-rel-reviver" - } - builders { name: "buildbucket/luci.chromium.try/android-marshmallow-x86-rel" } builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 0297889..faa93050 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -4691,17 +4691,6 @@ } } job { - id: "android-marshmallow-x86-fyi-rel-reviver" - realm: "ci" - schedule: "0 1,4,7,10,13 * * *" - acl_sets: "ci" - buildbucket { - server: "cr-buildbucket.appspot.com" - bucket: "ci" - builder: "android-marshmallow-x86-fyi-rel-reviver" - } -} -job { id: "android-marshmallow-x86-rel" realm: "ci" acl_sets: "ci"
diff --git a/infra/config/generated/sheriff-rotations/android.txt b/infra/config/generated/sheriff-rotations/android.txt index 438b51d..beb43d06 100644 --- a/infra/config/generated/sheriff-rotations/android.txt +++ b/infra/config/generated/sheriff-rotations/android.txt
@@ -1,5 +1,4 @@ ci/Android ASAN (dbg) -ci/Android WebView M (dbg) ci/Android WebView N (dbg) ci/Android WebView O (dbg) ci/Android WebView P (dbg) @@ -12,15 +11,10 @@ ci/Cast Android (dbg) ci/Deterministic Android ci/Deterministic Android (dbg) -ci/Marshmallow 64 bit Tester -ci/Marshmallow Tablet Tester ci/Nougat Phone Tester ci/android-10-arm64-rel ci/android-androidx-packager -ci/android-arm64-proguard-rel -ci/android-bfcache-rel ci/android-binary-size-generator -ci/android-marshmallow-x86-rel-non-cq ci/android-nougat-x86-rel ci/android-pie-arm64-dbg ci/android-pie-arm64-rel
diff --git a/infra/config/generated/sheriff-rotations/chromium.fuzz.txt b/infra/config/generated/sheriff-rotations/chromium.fuzz.txt new file mode 100644 index 0000000..2b7d4083 --- /dev/null +++ b/infra/config/generated/sheriff-rotations/chromium.fuzz.txt
@@ -0,0 +1,32 @@ +ci/ASAN Debug +ci/ASAN Release +ci/ASAN Release Media +ci/ASan Debug (32-bit x86 with V8-ARM) +ci/ASan Release (32-bit x86 with V8-ARM) +ci/ASan Release Media (32-bit x86 with V8-ARM) +ci/Afl Upload Linux ASan +ci/ChromiumOS ASAN Release +ci/Libfuzzer Upload Chrome OS ASan +ci/Libfuzzer Upload Linux ASan +ci/Libfuzzer Upload Linux ASan Debug +ci/Libfuzzer Upload Linux MSan +ci/Libfuzzer Upload Linux UBSan +ci/Libfuzzer Upload Linux V8-ARM64 ASan +ci/Libfuzzer Upload Linux V8-ARM64 ASan Debug +ci/Libfuzzer Upload Linux32 ASan +ci/Libfuzzer Upload Linux32 ASan Debug +ci/Libfuzzer Upload Linux32 V8-ARM ASan +ci/Libfuzzer Upload Linux32 V8-ARM ASan Debug +ci/Libfuzzer Upload Mac ASan +ci/Libfuzzer Upload Windows ASan +ci/Libfuzzer Upload iOS Catalyst Debug +ci/MSAN Release (chained origins) +ci/MSAN Release (no origins) +ci/Mac ASAN Release +ci/Mac ASAN Release Media +ci/TSAN Debug +ci/TSAN Release +ci/UBSan Release +ci/UBSan vptr Release +ci/Win ASan Release +ci/Win ASan Release Media
diff --git a/infra/config/groups/sheriff-rotations/CHROMIUM_FUZZ_OWNERS b/infra/config/groups/sheriff-rotations/CHROMIUM_FUZZ_OWNERS new file mode 100644 index 0000000..f186ce8 --- /dev/null +++ b/infra/config/groups/sheriff-rotations/CHROMIUM_FUZZ_OWNERS
@@ -0,0 +1,7 @@ +# Temporary owners set to Chrome Security Smithy team +adetaylor@chromium.org +adetaylor@google.com +flowerhack@google.com +pgrace@chromium.org +pgrace@google.com +
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 25182db8..27c2e42b 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -162,6 +162,7 @@ CHROMIUM = _rotation("chromium"), FUCHSIA = _rotation("fuchsia"), CHROMIUM_CLANG = _rotation("chromium.clang"), + CHROMIUM_FUZZ = _rotation("chromium.fuzz"), CHROMIUM_GPU = _rotation("chromium.gpu"), IOS = _rotation("ios"), )
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star index 00b2b58..e4cfdf58 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -83,20 +83,6 @@ ), ) -ci.builder( - name = "android-marshmallow-x86-fyi-rel-reviver", - console_view_entry = consoles.console_view_entry( - category = "reviver", - short_name = "M", - ), - # To avoid peak hours, we run it at 1 AM, 4 AM, 7 AM, 10AM, 1 PM UTC. - schedule = "0 1,4,7,10,13 * * *", - # Set to an empty list to avoid chromium-gitiles-trigger triggering new - # builds. Also we don't set any `schedule` since this builder is for - # reference only and should not run any new builds. - triggered_by = [], -) - # TODO(crbug.com/1022533#c40): Remove this builder once there are no associated # disabled tests. ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index ef4477e..794d0a6 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -108,6 +108,7 @@ ), cq_mirrors_console_view = "mirrors", triggered_by = ["ci/Android arm64 Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), ) ci.thin_tester( @@ -569,6 +570,7 @@ ), cq_mirrors_console_view = "mirrors", triggered_by = ["ci/Android arm64 Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), ) ci.thin_tester( @@ -604,6 +606,7 @@ # tests in parallel, hence the high timeout. execution_timeout = 15 * time.hour, triggered_by = ["ci/Android arm Builder (dbg)"], + sheriff_rotations = args.ignore_default(None), ) ci.thin_tester( @@ -775,6 +778,7 @@ goma_backend = goma.backend.RBE_PROD, goma_jobs = goma.jobs.MANY_JOBS_FOR_CI, reclient_instance = None, + sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -806,6 +810,7 @@ category = "bfcache", short_name = "bfc", ), + sheriff_rotations = args.ignore_default(None), ) ci.builder( @@ -1304,6 +1309,7 @@ category = "builder_tester|x86", short_name = "M_non-cq", ), + sheriff_rotations = args.ignore_default(None), ) ci.builder(
diff --git a/infra/config/subprojects/chromium/ci/chromium.fuzz.star b/infra/config/subprojects/chromium/ci/chromium.fuzz.star index 20fec2b..ee7b774 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fuzz.star +++ b/infra/config/subprojects/chromium/ci/chromium.fuzz.star
@@ -3,7 +3,7 @@ # found in the LICENSE file. """Definitions of builders in the chromium.fuzz builder group.""" -load("//lib/builders.star", "goma", "os", "reclient", "xcode") +load("//lib/builders.star", "goma", "os", "reclient", "sheriff_rotations", "xcode") load("//lib/ci.star", "ci") load("//lib/consoles.star", "consoles") @@ -18,6 +18,7 @@ os = os.LINUX_DEFAULT, pool = ci.DEFAULT_POOL, service_account = ci.DEFAULT_SERVICE_ACCOUNT, + sheriff_rotations = sheriff_rotations.CHROMIUM_FUZZ, # TODO(crbug.com/1362440): remove this. omit_python2 = False,
diff --git a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star index e3a4de58..3366e311 100644 --- a/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.gpu.fyi.star
@@ -335,6 +335,10 @@ target_platform = builder_config.target_platform.CHROMEOS, ), run_tests_serially = True, + skylab_upload_location = builder_config.skylab_upload_location( + gs_bucket = "lacros-arm64-generic-rel-skylab-try", + gs_extra = "chromeos_gpu", + ), ), console_view_entry = consoles.console_view_entry( category = "ChromeOS|ARM",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 98c2adf..84684f25 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -239,10 +239,6 @@ mirrors = builder_config.copy_from("try/android-pie-x86-rel"), ) -try_.builder( - name = "android-marshmallow-x86-fyi-rel-reviver", -) - try_.orchestrator_builder( name = "android-marshmallow-arm64-rel", mirrors = [
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 115c3f2..feaa12a 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -1239,9 +1239,6 @@ flag_descriptions::kTFLiteLanguageDetectionIgnoreDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(translate::kTFLiteLanguageDetectionIgnoreEnabled)}, - {"disable-feed-ios14", flag_descriptions::kDisableFeediOS14Name, - flag_descriptions::kDisableFeediOS14Description, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kDisableFeediOS14)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index e21f739..6d7a434 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -281,10 +281,6 @@ const char kEnableFeedAblationDescription[] = "If Enabled the Feed will be removed from the NTP"; -const char kDisableFeediOS14Name[] = "Disable the feed on iOS14 devices"; -const char kDisableFeediOS14Description[] = - "If disabled the feed will be removed from the iOS14 devices."; - const char kEnableFREUIModuleIOSName[] = "Enable FRE UI module"; const char kEnableFREUIModuleIOSDescription[] = "Use the new FRE UI module for first run.";
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 23eac77..dcbeaf8 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -257,10 +257,6 @@ extern const char kEnableFeedAblationName[]; extern const char kEnableFeedAblationDescription[]; -// Title and description for the flag to remove the Feed from iOS14 devices. -extern const char kDisableFeediOS14Name[]; -extern const char kDisableFeediOS14Description[]; - // Title and description for the flag to test the FRE default browser promo // experiment. extern const char kEnableFREDefaultBrowserPromoScreenName[];
diff --git a/ios/chrome/browser/metrics/ios_feed_enabled_metrics_provider_unittest.mm b/ios/chrome/browser/metrics/ios_feed_enabled_metrics_provider_unittest.mm index 151b8114..b6f8dc7 100644 --- a/ios/chrome/browser/metrics/ios_feed_enabled_metrics_provider_unittest.mm +++ b/ios/chrome/browser/metrics/ios_feed_enabled_metrics_provider_unittest.mm
@@ -37,10 +37,6 @@ // Tests the implementation of ProvideCurrentSessionData TEST_F(IOSFeedEnabledMetricsProviderTest, ProvideCurrentSessionData) { - // TODO(crbug.com/1369142): Remove this when the issue is fixed. - base::test::ScopedFeatureList local_feature; - local_feature.InitAndDisableFeature(kDisableFeediOS14); - IOSFeedEnabledMetricsProvider provider(&testing_pref_service_); provider.ProvideCurrentSessionData(nullptr /* uma_proto */); histogram_tester_.ExpectBucketCount("ContentSuggestions.Feed.CanBeShown",
diff --git a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm index c6f02eae..629fecc 100644 --- a/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm +++ b/ios/chrome/browser/ui/app_store_rating/app_store_rating_scene_agent.mm
@@ -129,10 +129,11 @@ // Add kActiveDaysInPastWeek to NSUserDefaults if it doesn't already exist. if ([defaults objectForKey:kActiveDaysInPastWeek] == nil) { - [defaults setObject:[NSMutableArray alloc] forKey:kActiveDaysInPastWeek]; + [defaults setObject:[[NSMutableArray alloc] init] + forKey:kActiveDaysInPastWeek]; } NSMutableArray* activeDaysInPastWeek = - [defaults objectForKey:kActiveDaysInPastWeek]; + [[defaults objectForKey:kActiveDaysInPastWeek] mutableCopy]; // Exit early if the last recorded day was today. if ([activeDaysInPastWeek lastObject] != nil &&
diff --git a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm index ac250daf..9f109c3 100644 --- a/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/tangible_sync/tangible_sync_coordinator.mm
@@ -80,6 +80,7 @@ _firstRun = appState.initStage == InitStageFirstRun; _viewController = [[TangibleSyncViewController alloc] init]; _viewController.delegate = self; + _viewController.modalInPresentation = YES; ChromeBrowserState* browserState = self.browser->GetBrowserState(); AuthenticationService* authenticationService = AuthenticationServiceFactory::GetForBrowserState(browserState);
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_feature.h b/ios/chrome/browser/ui/ntp/new_tab_page_feature.h index 01bc933..dd7ccab 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_feature.h +++ b/ios/chrome/browser/ui/ntp/new_tab_page_feature.h
@@ -27,10 +27,6 @@ // Feature flag to enable the sync promo on top of the discover feed. BASE_DECLARE_FEATURE(kEnableDiscoverFeedTopSyncPromo); -// Flag that disables the feed for users on iOS 14. -// TODO(crbug.com/1369142): Remove this when the issue is fixed. -BASE_DECLARE_FEATURE(kDisableFeediOS14); - // A parameter to indicate whether Reconstructed Templates is enabled for static // resource serving. extern const char kDiscoverFeedSRSReconstructedTemplatesEnabled[];
diff --git a/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm b/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm index 1d7d1ec..1a487934 100644 --- a/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm +++ b/ios/chrome/browser/ui/ntp/new_tab_page_feature.mm
@@ -50,12 +50,6 @@ "FeedAblationEnabled", base::FEATURE_DISABLED_BY_DEFAULT); -// Flag that disables the feed for users on iOS 14. -// TODO(crbug.com/1369142): Remove this when the issue is fixed. -BASE_FEATURE(kDisableFeediOS14, - "DisableFeediOS14", - base::FEATURE_ENABLED_BY_DEFAULT); - bool IsDiscoverFeedPreviewEnabled() { return base::FeatureList::IsEnabled(kEnableDiscoverFeedPreview); } @@ -79,9 +73,7 @@ } bool IsFeedAblationEnabled() { - return base::FeatureList::IsEnabled(kEnableFeedAblation) || - (base::FeatureList::IsEnabled(kDisableFeediOS14) && - !base::ios::IsRunningOnIOS15OrLater()); + return base::FeatureList::IsEnabled(kEnableFeedAblation); } bool IsContentSuggestionsForSupervisedUserEnabled(PrefService* pref_service) {
diff --git a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn index cb81fc1..515540c 100644 --- a/ios/chrome/browser/ui/post_restore_signin/BUILD.gn +++ b/ios/chrome/browser/ui/post_restore_signin/BUILD.gn
@@ -9,6 +9,8 @@ source_set("post_restore_signin") { sources = [ + "metrics.h", + "metrics.mm", "post_restore_signin_provider.h", "post_restore_signin_provider.mm", "post_restore_signin_view_controller.h",
diff --git a/ios/chrome/browser/ui/post_restore_signin/metrics.h b/ios/chrome/browser/ui/post_restore_signin/metrics.h new file mode 100644 index 0000000..efc01bc --- /dev/null +++ b/ios/chrome/browser/ui/post_restore_signin/metrics.h
@@ -0,0 +1,21 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_POST_RESTORE_SIGNIN_METRICS_H_ +#define IOS_CHROME_BROWSER_UI_POST_RESTORE_SIGNIN_METRICS_H_ + +// Histogram to record when the post restore signin promo is displayed. +extern const char kIOSPostRestoreSigninDisplayedHistogram[]; + +// Histogram to record which choice the user made when the promo was presented. +extern const char kIOSPostRestoreSigninChoiceHistogram[]; + +// Enum containing bucket values for kIOSPostRestoreSigninChoiceHistogram. +enum class IOSPostRestoreSigninChoice { + Continue = 0, + Dismiss = 1, + kMaxValue = Dismiss, +}; + +#endif // IOS_CHROME_BROWSER_UI_POST_RESTORE_SIGNIN_METRICS_H_
diff --git a/ios/chrome/browser/ui/post_restore_signin/metrics.mm b/ios/chrome/browser/ui/post_restore_signin/metrics.mm new file mode 100644 index 0000000..3d395c8 --- /dev/null +++ b/ios/chrome/browser/ui/post_restore_signin/metrics.mm
@@ -0,0 +1,15 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/post_restore_signin/metrics.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +const char kIOSPostRestoreSigninDisplayedHistogram[] = + "IOS.PostRestoreSignin.Displayed"; + +const char kIOSPostRestoreSigninChoiceHistogram[] = + "IOS.PostRestoreSignin.Choice";
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h index 059eb43..b5ec5d0 100644 --- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h +++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h
@@ -19,6 +19,9 @@ - (instancetype)init; +// Delegate callback to tell the provider that the promo was displayed. +- (void)promoWasDisplayed; + // The handler is used to start the sign-in flow. @property(nonatomic, weak) id<PromosManagerCommands> handler;
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm index 332d24ee..f486220236 100644 --- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm +++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h" #import "base/check_op.h" +#import "base/metrics/histogram_functions.h" #import "base/notreached.h" #import "base/strings/sys_string_conversions.h" #import "components/signin/public/identity_manager/account_info.h" @@ -12,6 +13,7 @@ #import "ios/chrome/browser/signin/signin_util.h" #import "ios/chrome/browser/ui/commands/show_signin_command.h" #import "ios/chrome/browser/ui/post_restore_signin/features.h" +#import "ios/chrome/browser/ui/post_restore_signin/metrics.h" #import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_view_controller.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" #import "ios/chrome/grit/ios_strings.h" @@ -76,6 +78,10 @@ return promos_manager::Promo::PostRestoreSignInFullscreen; } +- (void)promoWasDisplayed { + base::UmaHistogramBoolean(kIOSPostRestoreSigninDisplayedHistogram, true); +} + #pragma mark - StandardPromoAlertHandler - (void)standardPromoAlertDefaultAction { @@ -83,7 +89,8 @@ } - (void)standardPromoAlertCancelAction { - // TODO(crbug.com/1363893): Implement UMA metrics. + base::UmaHistogramEnumeration(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Dismiss); } #pragma mark - StandardPromoAlertProvider @@ -153,7 +160,8 @@ // // In both variations, the same dismiss functionality is desired. - (void)standardPromoDismissAction { - // TODO(crbug.com/1363893): Implement UMA metrics. + base::UmaHistogramEnumeration(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Dismiss); } #pragma mark - Internal @@ -177,6 +185,9 @@ - (void)showSignin { DCHECK(self.handler); + base::UmaHistogramEnumeration(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Continue); + ShowSigninCommand* command = [[ShowSigninCommand alloc] initWithOperation:AuthenticationOperationReauthenticate identity:nil
diff --git a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm index 7d86020..59485b0 100644 --- a/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm +++ b/ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider_unittest.mm
@@ -4,11 +4,13 @@ #import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h" +#import "base/test/metrics/histogram_tester.h" #import "base/test/scoped_feature_list.h" #import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/signin/signin_util.h" #import "ios/chrome/browser/ui/commands/promos_manager_commands.h" #import "ios/chrome/browser/ui/post_restore_signin/features.h" +#import "ios/chrome/browser/ui/post_restore_signin/metrics.h" #import "testing/platform_test.h" #import "third_party/ocmock/OCMock/OCMock.h" #import "third_party/ocmock/gtest_support.h" @@ -129,3 +131,33 @@ EnableFeatureVariationFullscreen(); EXPECT_TRUE(provider_.viewController != nil); } + +TEST_F(PostRestoreSignInProviderTest, recordsChoiceDismissed) { + base::HistogramTester histogram_tester; + + // Test the Alert version. + [provider_ standardPromoAlertCancelAction]; + histogram_tester.ExpectBucketCount(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Dismiss, 1); + + // Test the Fullscreen version. + [provider_ standardPromoDismissAction]; + histogram_tester.ExpectBucketCount(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Dismiss, 2); +} + +TEST_F(PostRestoreSignInProviderTest, recordsChoiceContinue) { + base::HistogramTester histogram_tester; + SetupMockHandler(); + OCMStub([mock_handler_ showSignin:[OCMArg any]]); + [provider_ standardPromoAlertDefaultAction]; + histogram_tester.ExpectBucketCount(kIOSPostRestoreSigninChoiceHistogram, + IOSPostRestoreSigninChoice::Continue, 1); +} + +TEST_F(PostRestoreSignInProviderTest, recordsDisplayed) { + base::HistogramTester histogram_tester; + [provider_ promoWasDisplayed]; + histogram_tester.ExpectBucketCount(kIOSPostRestoreSigninDisplayedHistogram, + true, 1); +}
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn index bacabd34..11a4889 100644 --- a/ios/chrome/browser/ui/promos_manager/BUILD.gn +++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -82,6 +82,7 @@ "promos_manager_coordinator_unittest.mm", ] deps = [ + ":promos", ":promos_manager", "//base", "//base/test:test_support", @@ -92,8 +93,8 @@ "//ios/chrome/browser/prefs:pref_names", "//ios/chrome/browser/promos_manager:features", "//ios/chrome/browser/promos_manager:promos_manager", - "//ios/chrome/browser/ui/post_restore_signin", - "//ios/chrome/browser/ui/post_restore_signin:features", + "//ios/chrome/common/ui/confirmation_alert", + "//ios/chrome/common/ui/promo_style", "//ios/chrome/test:test_support", "//testing/gtest", "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h index 6b20a0c..0cdd75d9e 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h
@@ -2,7 +2,9 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#import "ios/chrome/browser/ui/promos_manager/bannered_promo_view_provider.h" #import "ios/chrome/browser/ui/promos_manager/promos_manager_mediator.h" +#import "ios/chrome/browser/ui/promos_manager/standard_promo_view_provider.h" #import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" #import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" @@ -15,6 +17,12 @@ // A mediator that observes when it's a good time to display a promo. @property(nonatomic, strong) PromosManagerMediator* mediator; +// The current StandardPromoViewProvider, if any. +@property(nonatomic, weak) id<StandardPromoViewProvider> provider; + +// The current BanneredPromoViewProvider, if any. +@property(nonatomic, weak) id<BanneredPromoViewProvider> banneredProvider; + // The current ConfirmationAlertViewController, if any. @property(nonatomic, strong) ConfirmationAlertViewController* viewController; @@ -22,7 +30,8 @@ @property(nonatomic, strong) PromoStyleViewController* banneredViewController; // UIAdaptivePresentationControllerDelegate. -- (void)presentationControllerDidDismiss; +- (void)presentationControllerDidDismiss: + (UIPresentationController*)presentationController; // ConfirmationAlertActionHandler. - (void)confirmationAlertDismissAction;
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm index 3268ea6..194ca5d0 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
@@ -381,8 +381,6 @@ respondsToSelector:@selector(standardPromoDismissAction)]) { [self.banneredProvider standardPromoDismissAction]; [self dismissViewControllers]; - } else { - NOTREACHED(); } } @@ -390,7 +388,18 @@ - (void)presentationControllerDidDismiss: (UIPresentationController*)presentationController { - [self confirmationAlertDismissAction]; + DCHECK(self.provider || self.banneredProvider); + + if ([self.provider respondsToSelector:@selector(standardPromoDismissSwipe)]) { + [self.provider standardPromoDismissSwipe]; + [self dismissViewControllers]; + } else if ([self.banneredProvider + respondsToSelector:@selector(standardPromoDismissSwipe)]) { + [self.banneredProvider standardPromoDismissSwipe]; + [self dismissViewControllers]; + } else { + [self confirmationAlertDismissAction]; + } } #pragma mark - Private
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm index d7d2b4fa..73ec13b 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator_unittest.mm
@@ -16,9 +16,12 @@ #import "ios/chrome/browser/prefs/pref_names.h" #import "ios/chrome/browser/promos_manager/features.h" #import "ios/chrome/browser/promos_manager/promos_manager.h" -#import "ios/chrome/browser/ui/post_restore_signin/features.h" -#import "ios/chrome/browser/ui/post_restore_signin/post_restore_signin_provider.h" +#import "ios/chrome/browser/ui/promos_manager/bannered_promo_view_provider.h" #import "ios/chrome/browser/ui/promos_manager/promos_manager_coordinator+internal.h" +#import "ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h" +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h" +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" +#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" #import "ios/chrome/test/scoped_key_window.h" #import "testing/gtest/include/gtest/gtest.h" #import "testing/platform_test.h" @@ -62,63 +65,74 @@ prefs::kIosPromosManagerSingleDisplayActivePromos); } -// Tests the initializer correctly creates a PromosManagerMediator. -TEST_F(PromosManagerCoordinatorTest, InitCreatesMediator) { - scoped_feature_list_.InitWithFeatures( - {kFullscreenPromosManager, - post_restore_signin::features::kIOSNewPostRestoreExperience}, - {}); - CreatePromosManagerCoordinator(); - - EXPECT_NE(coordinator_.mediator, nil); -} - -// Tests the initializer does not create a PromosManagerMediator, because there -// are no promos registered with the coordinator. -TEST_F(PromosManagerCoordinatorTest, InitDoesNotCreatesMediator) { - scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); - CreatePromosManagerCoordinator(); - - EXPECT_EQ(coordinator_.mediator, nil); -} - -// Tests dismissViewControllers is called when a banneredViewController's -// secondary button is pressed, and the banneredProvider implements -// standardPromoDismissAction. -TEST_F(PromosManagerCoordinatorTest, - BanneredViewControllerDismissesUsingSecondaryButton) { - scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); - - PromosManagerCoordinator* mockCoordinator = - OCMClassMock([PromosManagerCoordinator class]); - mockCoordinator.banneredViewController = - OCMClassMock([PostRestoreSignInProvider class]); - - OCMStub([mockCoordinator dismissViewControllers]) - .andDo(^(NSInvocation* invocation) { - SUCCEED(); - }); - - [mockCoordinator.banneredViewController.delegate didTapSecondaryActionButton]; -} - -// Tests dismissViewControllers is called when a viewController's dismiss button -// is pressed, and the provider implements standardPromoDismissAction. +// Tests a provider's standardPromoDismissAction is called when a +// viewController's dismiss button is pressed. TEST_F(PromosManagerCoordinatorTest, ViewControllerDismissesUsingDismissButton) { scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); - PromosManagerCoordinator* mockCoordinator = - OCMClassMock([PromosManagerCoordinator class]); - mockCoordinator.viewController = - OCMClassMock([PostRestoreSignInProvider class]); + CreatePromosManagerCoordinator(); - OCMStub([mockCoordinator dismissViewControllers]) - .andDo(^(NSInvocation* invocation) { - SUCCEED(); - }); + id provider = OCMProtocolMock(@protocol(StandardPromoViewProvider)); + coordinator_.provider = provider; - [mockCoordinator confirmationAlertDismissAction]; + OCMExpect([provider standardPromoDismissAction]); + + [coordinator_ confirmationAlertDismissAction]; + + [provider verify]; +} + +// Tests a banneredProvider's standardPromoDismissAction is called when a +// banneredViewController's dismiss button is pressed. +TEST_F(PromosManagerCoordinatorTest, + BanneredViewControllerDismissesUsingSecondaryButton) { + scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); + + CreatePromosManagerCoordinator(); + + id banneredProvider = OCMProtocolMock(@protocol(BanneredPromoViewProvider)); + coordinator_.banneredProvider = banneredProvider; + + OCMExpect([banneredProvider standardPromoDismissAction]); + + [coordinator_ confirmationAlertDismissAction]; + + [banneredProvider verify]; +} + +// Tests standardPromoDismissSwipe is called when a viewController is +// dismissed via swipe. +TEST_F(PromosManagerCoordinatorTest, ViewControllerDismissesViaSwipe) { + scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); + + CreatePromosManagerCoordinator(); + + id provider = OCMProtocolMock(@protocol(StandardPromoViewProvider)); + coordinator_.provider = provider; + + OCMExpect([provider standardPromoDismissSwipe]); + + [coordinator_ presentationControllerDidDismiss:nil]; + + [provider verify]; +} + +// Tests standardPromoDismissSwipe is called when a banneredViewController is +// dismissed via swipe. +TEST_F(PromosManagerCoordinatorTest, BanneredViewControllerDismissesViaSwipe) { + scoped_feature_list_.InitWithFeatures({kFullscreenPromosManager}, {}); + + CreatePromosManagerCoordinator(); + + id banneredProvider = OCMProtocolMock(@protocol(BanneredPromoViewProvider)); + coordinator_.banneredProvider = banneredProvider; + + OCMExpect([banneredProvider standardPromoDismissSwipe]); + + [coordinator_ presentationControllerDidDismiss:nil]; + + [banneredProvider verify]; } // TODO(crbug.com/1370763): Add unit tests for promoWasDisplayed being
diff --git a/ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h b/ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h index d53e2aa4..88ceb8c 100644 --- a/ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h +++ b/ios/chrome/browser/ui/promos_manager/standard_promo_action_handler.h
@@ -14,6 +14,10 @@ @optional +// - - - - - - - - - - - - - - - - - - - - - - - - - - +// Button-based actions. (Invoked via a button press.) +// - - - - - - - - - - - - - - - - - - - - - - - - - - + // The "Dismiss" button was touched. - (void)standardPromoDismissAction; @@ -26,6 +30,18 @@ // The "Tertiary Action" was touched. - (void)standardPromoTertiaryAction; +// - - - - - - - - - - - - - - - - - - - - - - - - +// Gesture-based actions. (Invoked via a gesture.) +// - - - - - - - - - - - - - - - - - - - - - - - - + +// Important: If `standardPromoDismissSwipe` is not implemented, but +// `standardPromoDismissAction` is, `standardPromoDismissAction` will be called +// for both `standardPromoDismissAction` and `standardPromoDismissSwipe`. +// However, if both `standardPromoDismissAction` and `standardPromoDismissSwipe` +// are implemented, they will be called separately at their respective points of +// invocation. +- (void)standardPromoDismissSwipe; + @end #endif // IOS_CHROME_BROWSER_UI_PROMOS_MANAGER_STANDARD_PROMO_ACTION_HANDLER_H_
diff --git a/ios/chrome/browser/ui/whats_new/BUILD.gn b/ios/chrome/browser/ui/whats_new/BUILD.gn index 13c7db0a..f5da009 100644 --- a/ios/chrome/browser/ui/whats_new/BUILD.gn +++ b/ios/chrome/browser/ui/whats_new/BUILD.gn
@@ -9,6 +9,9 @@ "whats_new_coordinator.mm", "whats_new_detail_view_controller.h", "whats_new_detail_view_controller.mm", + "whats_new_mediator.h", + "whats_new_mediator.mm", + "whats_new_primary_action_handler.h", "whats_new_table_view_controller.h", "whats_new_table_view_controller.mm", ] @@ -19,6 +22,7 @@ "//ios/chrome/browser/ui/table_view", "//ios/chrome/browser/ui/table_view:utils", "//ios/chrome/browser/ui/whats_new/cells", + "//ios/chrome/browser/ui/whats_new/data_source", "//ios/chrome/common/ui/colors", "//ios/chrome/common/ui/elements", "//ios/chrome/common/ui/util",
diff --git a/ios/chrome/browser/ui/whats_new/data_source/BUILD.gn b/ios/chrome/browser/ui/whats_new/data_source/BUILD.gn new file mode 100644 index 0000000..1f759a3 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/BUILD.gn
@@ -0,0 +1,39 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("data_source") { + configs += [ "//build/config/compiler:enable_arc" ] + sources = [ + "whats_new_data_source.h", + "whats_new_data_source.mm", + "whats_new_item.h", + "whats_new_item.mm", + ] + deps = [ + "resources:whats_new_entries_plist", + "//base", + "//ios/chrome/browser/ui/first_run/resources:default_browser_screen_banner", + "//ios/chrome/browser/ui/icons:symbols", + "//ios/chrome/common/ui/colors", + "//ui/base", + "//url", + ] + frameworks = [ "UIKit.framework" ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "whats_new_data_source_unittest.mm" ] + + deps = [ + ":data_source", + "resources:unit_tests_resources", + "//base", + "//base/test:test_support", + "//ios/chrome/app/strings:ios_strings_grit", + "//testing/gtest", + "//ui/base", + ] + configs += [ "//build/config/compiler:enable_arc" ] +}
diff --git a/ios/chrome/browser/ui/whats_new/data_source/resources/BUILD.gn b/ios/chrome/browser/ui/whats_new/data_source/resources/BUILD.gn new file mode 100644 index 0000000..71c156dd --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/resources/BUILD.gn
@@ -0,0 +1,36 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//ios/chrome/tools/strings/substitute_strings_identifier.gni") + +substitute_strings_identifier("convert_whats_new_items") { + source = "whats_new_entries.plist" + output = "$target_gen_dir/whats_new_items.plist" + headers = [ "$root_gen_dir/ios/chrome/grit/ios_strings.h" ] + deps = [ "//ios/chrome/app/strings:ios_strings" ] +} + +bundle_data("whats_new_entries_plist") { + public_deps = [ ":convert_whats_new_items" ] + sources = get_target_outputs(":convert_whats_new_items") + + outputs = [ "{{bundle_resources_dir}}/whats_new_entries.plist" ] +} + +substitute_strings_identifier("convert_unit_tests_resources") { + source = "test/data/whats_new_test.plist" + output = "$target_gen_dir/whats_new/test/data/whats_new_test.plist" + headers = [ "$root_gen_dir/ios/chrome/grit/ios_strings.h" ] + deps = [ "//ios/chrome/app/strings:ios_strings" ] +} + +bundle_data("unit_tests_resources") { + visibility = [ "//ios/chrome/browser/ui/whats_new/data_source:unit_tests" ] + testonly = true + public_deps = [ ":convert_unit_tests_resources" ] + sources = get_target_outputs(":convert_unit_tests_resources") + + outputs = + [ "{{bundle_resources_dir}}/whats_new/test/data/whats_new_test.plist" ] +}
diff --git a/ios/chrome/browser/ui/whats_new/data_source/resources/test/data/whats_new_test.plist b/ios/chrome/browser/ui/whats_new/data_source/resources/test/data/whats_new_test.plist new file mode 100644 index 0000000..190d7b3d6 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/resources/test/data/whats_new_test.plist
@@ -0,0 +1,126 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Features</key> + <array> + <dict> + <key>Type</key> + <integer>0</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>magnifyingglass</string> + <key>IconBackgroundColor</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> + <key>ChromeTips</key> + <array> + <dict> + <key>Type</key> + <integer>4</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>fullcolor_branding_icon</string> + <key>icon_background_color</key> + <string>white</string> + <key>IsSymbol</key> + <false/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <true/> + <key>PrimaryActionTitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_BUTTON_TITLE</string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> + <key>WhatsNewItemTestKey</key> + <array> + <dict> + <key>Type</key> + <integer>1</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>ellipsis</string> + <key>icon_background_color</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> + <key>WhatsNewItemTestKeyError</key> + <array> + <dict> + <key>Type</key> + <integer>100</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>ellipsis</string> + <key>icon_background_color</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> +</dict> +</plist>
diff --git a/ios/chrome/browser/ui/whats_new/data_source/resources/whats_new_entries.plist b/ios/chrome/browser/ui/whats_new/data_source/resources/whats_new_entries.plist new file mode 100644 index 0000000..4f265d9f --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/resources/whats_new_entries.plist
@@ -0,0 +1,206 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> +<plist version="1.0"> +<dict> + <key>Features</key> + <array> + <dict> + <key>Type</key> + <integer>0</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>magnifyingglass</string> + <key>IconBackgroundColor</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_2</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_3</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + <dict> + <key>Type</key> + <integer>1</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>ellipsis</string> + <key>icon_background_color</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + <dict> + <key>Type</key> + <integer>2</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SHARE_HIGHLIGHT_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_SHARE_HIGHLIGHT_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>square.and.arrow.up</string> + <key>icon_background_color</key> + <string>Pink</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_SHARE_HIGHLIGHT_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_SHARE_HIGHLIGHT_STEP_2</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_SHARE_HIGHLIGHT_STEP_3</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + <dict> + <key>Type</key> + <integer>3</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>password_key</string> + <key>icon_background_color</key> + <string>yellow</string> + <key>IsSymbol</key> + <false/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_STEP_2</string> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_STEP_3</string> + </array> + <key>HasPrimaryAction</key> + <true/> + <key>PrimaryActionTitle</key> + <string>IDS_IOS_WHATS_NEW_FEATURE_ADD_PASSWORDS_MANUALLY_BUTTON_TITLE</string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> + <key>ChromeTips</key> + <array> + <dict> + <key>Type</key> + <integer>4</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>fullcolor_branding_icon</string> + <key>icon_background_color</key> + <string>white</string> + <key>IsSymbol</key> + <false/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_2</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_3</string> + </array> + <key>HasPrimaryAction</key> + <true/> + <key>PrimaryActionTitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_BUTTON_TITLE</string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + <dict> + <key>Type</key> + <integer>5</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>password_key</string> + <key>icon_background_color</key> + <string>yellow</string> + <key>IsSymbol</key> + <false/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_STEP_2</string> + </array> + <key>HasPrimaryAction</key> + <true/> + <key>PrimaryActionTitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_PASSWORDS_IN_OTHER_APPS_BUTTON_TITLE</string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + <dict> + <key>Type</key> + <integer>6</integer> + <key>Title</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_AUTOFILL_TITLE</string> + <key>Subtitle</key> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_AUTOFILL_SUBTITLE</string> + <key>BannerImageName</key> + <string>default_browser_screen_banner</string> + <key>IconImageName</key> + <string>pencil.and.ellipsis.rectangle</string> + <key>icon_background_color</key> + <string>blue</string> + <key>IsSymbol</key> + <true/> + <key>InstructionSteps</key> + <array> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_AUTOFILL_STEP_1</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_AUTOFILL_STEP_2</string> + <string>IDS_IOS_WHATS_NEW_CHROME_TIP_AUTOFILL_STEP_3</string> + </array> + <key>HasPrimaryAction</key> + <false/> + <key>PrimaryActionTitle</key> + <string></string> + <key>LearnMoreUrlString</key> + <string>https://support.google.com/chrome</string> + </dict> + </array> +</dict> +</plist>
diff --git a/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h new file mode 100644 index 0000000..28e82c50 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h
@@ -0,0 +1,24 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_DATA_SOURCE_H_ +#define IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_DATA_SOURCE_H_ + +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h" + +// Returns an array of feature items with entries from `whats_new_entries.plist` +// under `Features`. +NSArray<WhatsNewItem*>* WhatsNewFeatureEntries(NSString* path); + +// Returns an array of chrome tip items with entries from +// `whats_new_entries.plist` under `ChromeTips`. +NSArray<WhatsNewItem*>* WhatsNewChromeTipEntries(NSString* path); + +// Returns a `WhatsNewItem` from the data loaded from `whats_new_entries.plist`. +WhatsNewItem* ConstructWhatsNewItem(NSDictionary* entry); + +// Returns a path to What's New entries. +NSString* WhatsNewFilePath(); + +#endif // IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_DATA_SOURCE_H_
diff --git a/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.mm b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.mm new file mode 100644 index 0000000..99f8f90 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.mm
@@ -0,0 +1,208 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h" + +#import "base/mac/bundle_locations.h" +#import "base/mac/foundation_util.h" +#import "base/notreached.h" +#import "base/strings/string_util.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/ui/icons/chrome_symbol.h" +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ui/base/l10n/l10n_util_mac.h" +#import "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +// The size of the icon image. +const CGFloat kIconImageWhatsNew = 22; + +// The file name. +NSString* const kfileName = @"whats_new_entries.plist"; + +// Dictionary keys. +NSString* const kDictionaryFeaturesKey = @"Features"; +NSString* const kDictionaryChromeTipsKey = @"ChromeTips"; +NSString* const kDictionaryTypeKey = @"Type"; +NSString* const kDictionaryTitleKey = @"Title"; +NSString* const kDictionarySubtitleKey = @"Subtitle"; +NSString* const kDictionaryIsSymbolKey = @"IsSymbol"; +NSString* const kDictionaryBannerImageKey = @"BannerImageName"; +NSString* const kDictionaryIconImageKey = @"IconImageName"; +NSString* const kDictionaryBackgroundColorKey = @"IconBackgroundColor"; +NSString* const kDictionaryInstructionsKey = @"InstructionSteps"; +NSString* const kDictionaryHasPrimaryActionKey = @"HasPrimaryAction"; +NSString* const kDictionaryPrimaryActionKey = @"PrimaryActionTitle"; +NSString* const kDictionaryLearnMoreURLKey = @"LearnMoreUrlString"; + +// Returns the UIColor corresponding to `color`. +UIColor* GenerateColor(NSString* color) { + if ([color isEqualToString:@"blue"]) { + return [UIColor colorNamed:kBlue500Color]; + } else if ([color isEqualToString:@"pink"]) { + return [UIColor colorNamed:kPink400Color]; + } else if ([color isEqualToString:@"yellow"]) { + return [UIColor colorNamed:kYellow500Color]; + } else { + return [UIColor colorNamed:kPrimaryBackgroundColor]; + } +} + +// Returns a UIImage given an image name. +UIImage* GenerateImage(BOOL is_symbol, NSString* image) { + if (is_symbol) { + return DefaultSymbolTemplateWithPointSize(image, kIconImageWhatsNew); + } + return [UIImage imageNamed:image]; +} + +// Returns a localized string array given `instructions`. +NSArray<NSString*>* GenerateLocalizedInstructions(NSArray* instructions) { + NSMutableArray<NSString*>* localized_instructions = + [[NSMutableArray alloc] init]; + for (NSObject* instruction in instructions) { + NSNumber* instruction_id = base::mac::ObjCCast<NSNumber>(instruction); + if (!instruction_id) { + return nil; + } + + [localized_instructions + addObject:l10n_util::GetNSString([instruction_id intValue])]; + } + return localized_instructions; +} + +WhatsNewType WhatsNewTypeFromInt(int type) { + const int min_value = static_cast<int>(WhatsNewType::kMinValue); + const int max_value = static_cast<int>(WhatsNewType::kMaxValue); + + if (min_value > type || type > max_value) { + NOTREACHED() << "unexpected type: " << type; + return WhatsNewType::kError; + } + + return static_cast<WhatsNewType>(type); +} + +NSArray<WhatsNewItem*>* WhatsNewItemsFromFileAndKey(NSString* path, + NSString* key) { + NSDictionary* entries = [NSDictionary dictionaryWithContentsOfFile:path]; + NSMutableArray<WhatsNewItem*>* items = [[NSMutableArray alloc] init]; + + NSArray<NSObject*>* keys = entries[key]; + if (!keys) { + return items; + } + + for (NSObject* entry_key in keys) { + NSDictionary* entry = base::mac::ObjCCast<NSDictionary>(entry_key); + if (!entry) { + continue; + } + + WhatsNewItem* item = ConstructWhatsNewItem(entry); + if (!item) { + continue; + } + + [items addObject:item]; + } + return items; +} + +} // namespace + +NSArray<WhatsNewItem*>* WhatsNewFeatureEntries(NSString* path) { + return WhatsNewItemsFromFileAndKey(path, kDictionaryFeaturesKey); +} + +NSArray<WhatsNewItem*>* WhatsNewChromeTipEntries(NSString* path) { + return WhatsNewItemsFromFileAndKey(path, kDictionaryChromeTipsKey); +} + +WhatsNewItem* ConstructWhatsNewItem(NSDictionary* entry) { + // Load the entry type. + NSNumber* type_value = + base::mac::ObjCCast<NSNumber>(entry[kDictionaryTypeKey]); + if (!type_value) { + return nil; + } + WhatsNewType type = WhatsNewTypeFromInt([type_value intValue]); + // Do not create a WhatsNewItem with an inalid type. + if (type == WhatsNewType::kError) { + return nil; + } + + WhatsNewItem* whats_new_item = [[WhatsNewItem alloc] init]; + whats_new_item.type = type; + + // Load the entry title. + NSNumber* title = base::mac::ObjCCast<NSNumber>(entry[kDictionaryTitleKey]); + if (!title) { + return nil; + } + whats_new_item.title = l10n_util::GetNSString([title intValue]); + + // Load the entry subtitle. + NSNumber* subtitle = + base::mac::ObjCCast<NSNumber>(entry[kDictionarySubtitleKey]); + if (!subtitle) { + return nil; + } + whats_new_item.subtitle = l10n_util::GetNSString([subtitle intValue]); + + // Load the entry banner image. + whats_new_item.bannerImage = + GenerateImage(false, entry[kDictionaryBannerImageKey]); + + // Load the entry icon. + BOOL is_symbol = [entry[kDictionaryIsSymbolKey] boolValue]; + whats_new_item.iconImage = + GenerateImage(is_symbol, entry[kDictionaryIconImageKey]); + + // Load the entry icon background image. + whats_new_item.backgroundColor = + GenerateColor(entry[kDictionaryBackgroundColorKey]); + + // Load the entry instructions. + NSArray<NSString*>* instructions = + GenerateLocalizedInstructions(entry[kDictionaryInstructionsKey]); + if (!instructions) { + return nil; + } + whats_new_item.instructionSteps = instructions; + + // Load the entry primary action bool. + whats_new_item.hasPrimaryAction = + [entry[kDictionaryHasPrimaryActionKey] boolValue]; + + // Load the entry primary action title. + NSNumber* primary_action_title = + base::mac::ObjCCast<NSNumber>(entry[kDictionaryPrimaryActionKey]); + if (!primary_action_title) { + whats_new_item.primaryActionTitle = nil; + } else { + whats_new_item.primaryActionTitle = + l10n_util::GetNSString([primary_action_title intValue]); + } + + // Load the entry learn more url. + GURL url(base::SysNSStringToUTF8(entry[kDictionaryLearnMoreURLKey])); + [whats_new_item setLearnMoreURL:url]; + + return whats_new_item; +} + +NSString* WhatsNewFilePath() { + NSString* bundle_path = [base::mac::FrameworkBundle() bundlePath]; + NSString* entries_file_path = + [bundle_path stringByAppendingPathComponent:kfileName]; + return entries_file_path; +}
diff --git a/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source_unittest.mm b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source_unittest.mm new file mode 100644 index 0000000..65eb37a7 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source_unittest.mm
@@ -0,0 +1,133 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h" + +#import "base/base_paths.h" +#import "base/files/file_util.h" +#import "base/path_service.h" +#import "base/strings/sys_string_conversions.h" +#import "base/test/gtest_util.h" +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h" +#import "ios/chrome/grit/ios_strings.h" +#import "testing/platform_test.h" +#import "ui/base/l10n/l10n_util_mac.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +namespace { + +using WhatsNewDataSourceTest = PlatformTest; + +base::FilePath GetTestDataPath() { + base::FilePath test_path; + EXPECT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &test_path)); + test_path = test_path.Append(FILE_PATH_LITERAL("whats_new")); + test_path = test_path.Append(FILE_PATH_LITERAL("test")); + test_path = test_path.Append(FILE_PATH_LITERAL("data")); + test_path = test_path.Append(FILE_PATH_LITERAL("whats_new_test.plist")); + return test_path; +} + +} // namespace + +// Test that WhatsNewItem is constructed correctly from a valid entry in the +// test file. +TEST_F(WhatsNewDataSourceTest, TestConstructionOfWhatsNewItem) { + base::FilePath test_path; + test_path = GetTestDataPath(); + NSString* path = base::SysUTF8ToNSString(test_path.value().c_str()); + + NSDictionary* entries = [NSDictionary dictionaryWithContentsOfFile:path]; + NSArray<NSDictionary*>* keys = [entries objectForKey:@"WhatsNewItemTestKey"]; + NSDictionary* entry = [keys objectAtIndex:0]; + + WhatsNewItem* item = ConstructWhatsNewItem(entry); + EXPECT_EQ(item.type, WhatsNewType::kNewOverflowMenu); + EXPECT_TRUE([item.title + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_TITLE)]); + EXPECT_TRUE([item.subtitle + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_SUBTITLE)]); + EXPECT_TRUE([item.instructionSteps[0] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_1)]); + EXPECT_TRUE([item.instructionSteps[1] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_NEW_MENU_STEP_2)]); + EXPECT_EQ(item.hasPrimaryAction, false); + EXPECT_EQ(item.primaryActionTitle, nil); +} + +// Test that WhatsNewItem is not constructed when the entry in the test file has +// an invalid type. +TEST_F(WhatsNewDataSourceTest, TestWhatsNewItemEntryError) { + base::FilePath test_path; + test_path = GetTestDataPath(); + NSString* path = base::SysUTF8ToNSString(test_path.value().c_str()); + + NSDictionary* entries = [NSDictionary dictionaryWithContentsOfFile:path]; + NSArray<NSDictionary*>* keys = + [entries objectForKey:@"WhatsNewItemTestKeyError"]; + NSDictionary* entry = [keys objectAtIndex:0]; + + EXPECT_CHECK_DEATH(ConstructWhatsNewItem(entry)); +} + +// Test that `WhatsNewFeatureEntries` correctly returns entries Features entry +TEST_F(WhatsNewDataSourceTest, TestFeatureEntries) { + base::FilePath test_path; + test_path = GetTestDataPath(); + NSString* path = base::SysUTF8ToNSString(test_path.value().c_str()); + NSArray<WhatsNewItem*>* features = WhatsNewFeatureEntries(path); + + WhatsNewItem* item = [features objectAtIndex:0]; + EXPECT_EQ(item.type, WhatsNewType::kSearchTabs); + EXPECT_TRUE([item.title + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_TITLE)]); + EXPECT_TRUE([item.subtitle + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_SUBTITLE)]); + EXPECT_TRUE([item.instructionSteps[0] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_1)]); + EXPECT_TRUE([item.instructionSteps[1] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_FEATURE_SEARCH_TABS_STEP_2)]); + EXPECT_EQ(item.hasPrimaryAction, false); + EXPECT_EQ(item.primaryActionTitle, nil); +} + +// Test that `WhatsNewChromeTipEntries` correctly returns ChromeTips entry. +TEST_F(WhatsNewDataSourceTest, TestChromeTipEntries) { + base::FilePath test_path; + test_path = GetTestDataPath(); + NSString* path = base::SysUTF8ToNSString(test_path.value().c_str()); + NSArray<WhatsNewItem*>* chrome_tips = WhatsNewChromeTipEntries(path); + + WhatsNewItem* item = [chrome_tips objectAtIndex:0]; + EXPECT_EQ(item.type, WhatsNewType::kUseChromeByDefault); + EXPECT_TRUE([item.title + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_CHROME_TIP_CHROME_DEFAULT_TITLE)]); + EXPECT_TRUE([item.subtitle + isEqualToString: + l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_SUBTITLE)]); + EXPECT_TRUE([item.instructionSteps[0] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_1)]); + EXPECT_TRUE([item.instructionSteps[1] + isEqualToString:l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_STEP_2)]); + EXPECT_EQ(item.hasPrimaryAction, true); + EXPECT_TRUE([item.primaryActionTitle + isEqualToString: + l10n_util::GetNSString( + IDS_IOS_WHATS_NEW_CHROME_TIP_CHROME_DEFAULT_BUTTON_TITLE)]); +}
diff --git a/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h b/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h new file mode 100644 index 0000000..cfdce66 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h
@@ -0,0 +1,53 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_ITEM_H_ +#define IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_ITEM_H_ + +#import <UIKit/UIKit.h> + +// An enum representing the different Features and Chrome tips added to What's +// New. +enum class WhatsNewType { + kError = -1, + kMinValue = 0, + kSearchTabs = kMinValue, + kNewOverflowMenu = 1, + kSharedHighlighting = 2, + kAddPasswordManually = 3, + kUseChromeByDefault = 4, + kPasswordsInOtherApps = 5, + kAutofill = 6, + kMaxValue = kAutofill, +}; + +class GURL; + +// Represents a `WhatsNewEntry`. +@interface WhatsNewItem : NSObject + +// What's New entry type. +@property(nonatomic, assign) WhatsNewType type; +// What's New entry title. +@property(nonatomic, copy) NSString* title; +// What's New entry subtitle. +@property(nonatomic, copy) NSString* subtitle; +// What's New entry banner image. +@property(nonatomic, copy) UIImage* bannerImage; +// What's New entry icon image. +@property(nonatomic, copy) UIImage* iconImage; +// What's New entry icon background color. +@property(nonatomic, copy) UIColor* backgroundColor; +// What's New entry instruction steps. +@property(nonatomic, copy) NSArray<NSString*>* instructionSteps; +// Whether the What's New entry has a pimiary action button. +@property(nonatomic, assign) BOOL hasPrimaryAction; +// Title of the pimiary action button if the What's New entry has one. +@property(nonatomic, copy) NSString* primaryActionTitle; +// What's New entry URL to learn more about the feature or chrome tip. +@property(nonatomic, assign) const GURL& learnMoreURL; + +@end + +#endif // IOS_CHROME_BROWSER_UI_WHATS_NEW_DATA_SOURCE_WHATS_NEW_ITEM_H_
diff --git a/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.mm b/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.mm new file mode 100644 index 0000000..e16d4c8 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/data_source/whats_new_item.mm
@@ -0,0 +1,27 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h" + +#import "url/gurl.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation WhatsNewItem { + GURL _learnMoreURL; +} + +#pragma mark - Properties + +- (const GURL&)learnMoreURL { + return _learnMoreURL; +} + +- (void)setLearnMoreURL:(const GURL&)url { + _learnMoreURL = url; +} + +@end
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_coordinator.h b/ios/chrome/browser/ui/whats_new/whats_new_coordinator.h index adb7822..3442e2e 100644 --- a/ios/chrome/browser/ui/whats_new/whats_new_coordinator.h +++ b/ios/chrome/browser/ui/whats_new/whats_new_coordinator.h
@@ -8,7 +8,6 @@ #import "ios/chrome/browser/ui/coordinators/chrome_coordinator.h" @interface WhatsNewCoordinator : ChromeCoordinator - @end #endif // IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_COORDINATOR_H_ \ No newline at end of file
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_coordinator.mm b/ios/chrome/browser/ui/whats_new/whats_new_coordinator.mm index b49e80b..4a70daf 100644 --- a/ios/chrome/browser/ui/whats_new/whats_new_coordinator.mm +++ b/ios/chrome/browser/ui/whats_new/whats_new_coordinator.mm
@@ -3,21 +3,30 @@ // found in the LICENSE file. #import "ios/chrome/browser/ui/whats_new/whats_new_coordinator.h" +#import "ios/chrome/browser/ui/whats_new/whats_new_mediator.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support." #endif +@interface WhatsNewCoordinator () + +@property(nonatomic, strong) WhatsNewMediator* mediator; + +@end + @implementation WhatsNewCoordinator #pragma mark - ChromeCoordinator - (void)start { [super start]; + self.mediator = [[WhatsNewMediator alloc] init]; } - (void)stop { + self.mediator = nil; [super stop]; } -@end \ No newline at end of file +@end
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_mediator.h b/ios/chrome/browser/ui/whats_new/whats_new_mediator.h new file mode 100644 index 0000000..8d86583 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/whats_new_mediator.h
@@ -0,0 +1,24 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_MEDIATOR_H_ +#define IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_MEDIATOR_H_ + +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_item.h" +#import "ios/chrome/browser/ui/whats_new/whats_new_primary_action_handler.h" + +// Mediator between the Model and the UI. +// What's New mediator between `WhatsNewModel` and the view layers +// `WhatsNewTableViewController` and `WhatsNewDetailViewController`. +@interface WhatsNewMediator : NSObject <WhatsNewPrimaryActionHandler> + +// Array of Features `WhatsNewItem`. +@property(nonatomic, readonly) NSArray<WhatsNewItem*>* whatsNewFeatureEntries; + +// Array of Chrome Tips `WhatsNewItem`. +@property(nonatomic, readonly) NSArray<WhatsNewItem*>* whatsNewChromeTipEntries; + +@end + +#endif // IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_MEDIATOR_H_
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_mediator.mm b/ios/chrome/browser/ui/whats_new/whats_new_mediator.mm new file mode 100644 index 0000000..6f029add6 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/whats_new_mediator.mm
@@ -0,0 +1,54 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/whats_new/whats_new_mediator.h" + +#import "base/notreached.h" +#import "ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +@implementation WhatsNewMediator + +#pragma mark - Public + +- (NSArray<WhatsNewItem*>*)whatsNewChromeTipEntries { + return WhatsNewChromeTipEntries(WhatsNewFilePath()); +} + +- (NSArray<WhatsNewItem*>*)whatsNewFeatureEntries { + return WhatsNewFeatureEntries(WhatsNewFilePath()); +} + +#pragma mark - WhatsNewPrimaryActionHandler + +- (void)didTapActionButton:(WhatsNewItem*)item { + if (!item.hasPrimaryAction) { + return; + } + + switch (item.type) { + case WhatsNewType::kAddPasswordManually: + case WhatsNewType::kUseChromeByDefault: + case WhatsNewType::kPasswordsInOtherApps: + [self openSettingsURLString]; + break; + default: + NOTREACHED(); + break; + }; +} + +#pragma mark Private + +- (void)openSettingsURLString { + [[UIApplication sharedApplication] + openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] + options:{} + completionHandler:nil]; +} + +@end
diff --git a/ios/chrome/browser/ui/whats_new/whats_new_primary_action_handler.h b/ios/chrome/browser/ui/whats_new/whats_new_primary_action_handler.h new file mode 100644 index 0000000..9889911 --- /dev/null +++ b/ios/chrome/browser/ui/whats_new/whats_new_primary_action_handler.h
@@ -0,0 +1,21 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_PRIMARY_ACTION_HANDLER_H_ +#define IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_PRIMARY_ACTION_HANDLER_H_ + +#include "ios/chrome/browser/ui/whats_new/data_source/whats_new_data_source.h" + +// Delegate protocol for `WhatsNewDetailViewController` +// to communicate with `WhatsNewMediator`. +@protocol WhatsNewPrimaryActionHandler + +// Invoked when the action button is tapped. +// Invoked when a user interacts with the primary button for a specific +// `WhatsNewEntryId`. +- (void)didTapActionButton:(WhatsNewItem*)item; + +@end + +#endif // IOS_CHROME_BROWSER_UI_WHATS_NEW_WHATS_NEW_PRIMARY_ACTION_HANDLER_H_
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 6cf2979..a71e3b30 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -382,6 +382,7 @@ "//ios/chrome/browser/ui/util:unit_tests", "//ios/chrome/browser/ui/voice:unit_tests", "//ios/chrome/browser/ui/whats_new/cells:unit_tests", + "//ios/chrome/browser/ui/whats_new/data_source:unit_tests", "//ios/chrome/browser/update_client:unit_tests", "//ios/chrome/browser/upgrade:unit_tests", "//ios/chrome/browser/url_loading:unit_tests",
diff --git a/ios/chrome/test/earl_grey/chrome_test_case.mm b/ios/chrome/test/earl_grey/chrome_test_case.mm index 7beec54..a81d3676 100644 --- a/ios/chrome/test/earl_grey/chrome_test_case.mm +++ b/ios/chrome/test/earl_grey/chrome_test_case.mm
@@ -186,13 +186,6 @@ gStartupTest = false; } -// TODO(crbug.com/1369142): Remove this entire method when the issue is fixed. -- (AppLaunchConfiguration)appConfigurationForTestCase { - AppLaunchConfiguration config = [super appConfigurationForTestCase]; - config.features_disabled.push_back(kDisableFeediOS14); - return config; -} - - (net::EmbeddedTestServer*)testServer { if (!_testServer) { _testServer = std::make_unique<net::EmbeddedTestServer>();
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 2b0ed25a..0b383791 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -915,14 +915,6 @@ #endif // BUILDFLAG(IS_CHROMEOS) #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) -#if BUILDFLAG(IS_MAC) -// Enable binding multiple shared images to a single GpuMemoryBuffer for -// accelerated video decode using VideoToolbox. -BASE_FEATURE(kMultiPlaneVideoToolboxSharedImages, - "MultiPlaneVideoToolboxSharedImages", - base::FEATURE_ENABLED_BY_DEFAULT); -#endif // BUILDFLAG(IS_MAC) - #if BUILDFLAG(IS_WIN) // Does NV12->NV12 video copy on the main thread right before the texture's // used by GL.
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 04f56038..fc5d51a1 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -256,10 +256,6 @@ #endif // BUILDFLAG(IS_CHROMEOS) #endif // BUILDFLAG(USE_CHROMEOS_MEDIA_ACCELERATION) -#if BUILDFLAG(IS_MAC) -MEDIA_EXPORT BASE_DECLARE_FEATURE(kMultiPlaneVideoToolboxSharedImages); -#endif // BUILDFLAG(IS_MAC) - #if BUILDFLAG(IS_WIN) MEDIA_EXPORT BASE_DECLARE_FEATURE(kDelayCopyNV12Textures); MEDIA_EXPORT BASE_DECLARE_FEATURE(kDirectShowGetPhotoState);
diff --git a/media/cast/sender/audio_sender.cc b/media/cast/sender/audio_sender.cc index 205e2f60..e279d7e 100644 --- a/media/cast/sender/audio_sender.cc +++ b/media/cast/sender/audio_sender.cc
@@ -35,12 +35,14 @@ AudioSender::AudioSender(scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& audio_config, StatusChangeOnceCallback status_change_cb, - openscreen::cast::Sender* sender) - : AudioSender( - cast_environment, - audio_config, - std::move(status_change_cb), - FrameSender::Create(cast_environment, audio_config, sender, *this)) { + std::unique_ptr<openscreen::cast::Sender> sender) + : AudioSender(cast_environment, + audio_config, + std::move(status_change_cb), + FrameSender::Create(cast_environment, + audio_config, + std::move(sender), + *this)) { DCHECK(base::FeatureList::IsEnabled(kOpenscreenCastStreamingSession)); }
diff --git a/media/cast/sender/audio_sender.h b/media/cast/sender/audio_sender.h index cf70f013..5e36fef 100644 --- a/media/cast/sender/audio_sender.h +++ b/media/cast/sender/audio_sender.h
@@ -47,7 +47,7 @@ AudioSender(scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& audio_config, StatusChangeOnceCallback status_change_cb, - openscreen::cast::Sender* sender); + std::unique_ptr<openscreen::cast::Sender> sender); AudioSender(const AudioSender&) = delete; AudioSender& operator=(const AudioSender&) = delete;
diff --git a/media/cast/sender/frame_sender.h b/media/cast/sender/frame_sender.h index 3c57e1e..6e7c712 100644 --- a/media/cast/sender/frame_sender.h +++ b/media/cast/sender/frame_sender.h
@@ -68,7 +68,7 @@ static std::unique_ptr<FrameSender> Create( scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& config, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, Client& client, GetSuggestedVideoBitrateCB get_bitrate_cb = GetSuggestedVideoBitrateCB());
diff --git a/media/cast/sender/openscreen_frame_sender.cc b/media/cast/sender/openscreen_frame_sender.cc index 643c663b..439836de 100644 --- a/media/cast/sender/openscreen_frame_sender.cc +++ b/media/cast/sender/openscreen_frame_sender.cc
@@ -30,11 +30,12 @@ std::unique_ptr<FrameSender> FrameSender::Create( scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& config, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, Client& client, FrameSender::GetSuggestedVideoBitrateCB get_bitrate_cb) { - return std::make_unique<OpenscreenFrameSender>( - cast_environment, config, sender, client, std::move(get_bitrate_cb)); + return std::make_unique<OpenscreenFrameSender>(cast_environment, config, + std::move(sender), client, + std::move(get_bitrate_cb)); } // Convenience macro used in logging statements throughout this file. @@ -45,11 +46,11 @@ OpenscreenFrameSender::OpenscreenFrameSender( scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& config, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, Client& client, FrameSender::GetSuggestedVideoBitrateCB get_bitrate_cb) : cast_environment_(cast_environment), - sender_(sender), + sender_(std::move(sender)), client_(client), get_bitrate_cb_(std::move(get_bitrate_cb)), max_frame_rate_(config.max_frame_rate),
diff --git a/media/cast/sender/openscreen_frame_sender.h b/media/cast/sender/openscreen_frame_sender.h index 19d906c4..76b62ae 100644 --- a/media/cast/sender/openscreen_frame_sender.h +++ b/media/cast/sender/openscreen_frame_sender.h
@@ -30,17 +30,18 @@ // // For more information, see the Cast Streaming README.md located at: // https://source.chromium.org/chromium/chromium/src/+/main:third_party/openscreen/src/cast/streaming/README.md - class OpenscreenFrameSender : public FrameSender, openscreen::cast::Sender::Observer { public: - // TODO(https://crbug.com/1318499): will likely need to remove - // FrameSenderConfig here once the migration to libcast is complete. OpenscreenFrameSender(scoped_refptr<CastEnvironment> cast_environment, const FrameSenderConfig& config, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, Client& client, FrameSender::GetSuggestedVideoBitrateCB get_bitrate_cb); + OpenscreenFrameSender(OpenscreenFrameSender&& other) = delete; + OpenscreenFrameSender& operator=(OpenscreenFrameSender&& other) = delete; + OpenscreenFrameSender(const OpenscreenFrameSender&) = delete; + OpenscreenFrameSender& operator=(const OpenscreenFrameSender&) = delete; ~OpenscreenFrameSender() override; // FrameSender overrides. @@ -91,9 +92,7 @@ const scoped_refptr<CastEnvironment> cast_environment_; // The backing Open Screen sender implementation. - // TODO(https://crbug.com/1363500): the OenscreenFrameSender should own the - // openscreen::cast::Sender instance as a unique pointer. - raw_ptr<openscreen::cast::Sender> const sender_; + std::unique_ptr<openscreen::cast::Sender> const sender_; // The frame sender client. Client& client_;
diff --git a/media/cast/sender/video_sender.cc b/media/cast/sender/video_sender.cc index e7194b5..64e9a13 100644 --- a/media/cast/sender/video_sender.cc +++ b/media/cast/sender/video_sender.cc
@@ -113,7 +113,7 @@ const FrameSenderConfig& video_config, StatusChangeCallback status_change_cb, const CreateVideoEncodeAcceleratorCallback& create_vea_cb, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, PlayoutDelayChangeCB playout_delay_change_cb, media::VideoCaptureFeedbackCB feedback_cb, FrameSender::GetSuggestedVideoBitrateCB get_bitrate_cb) @@ -123,7 +123,7 @@ std::move(create_vea_cb), FrameSender::Create(cast_environment, video_config, - sender, + std::move(sender), *this, std::move(get_bitrate_cb)), std::move(playout_delay_change_cb),
diff --git a/media/cast/sender/video_sender.h b/media/cast/sender/video_sender.h index 5bf6d47..d07adfb 100644 --- a/media/cast/sender/video_sender.h +++ b/media/cast/sender/video_sender.h
@@ -60,7 +60,7 @@ const FrameSenderConfig& video_config, StatusChangeCallback status_change_cb, const CreateVideoEncodeAcceleratorCallback& create_vea_cb, - openscreen::cast::Sender* sender, + std::unique_ptr<openscreen::cast::Sender> sender, PlayoutDelayChangeCB playout_delay_change_cb, media::VideoCaptureFeedbackCB feedback_cb, FrameSender::GetSuggestedVideoBitrateCB get_bitrate_cb);
diff --git a/media/cdm/BUILD.gn b/media/cdm/BUILD.gn index f7635455..83d5806b 100644 --- a/media/cdm/BUILD.gn +++ b/media/cdm/BUILD.gn
@@ -117,6 +117,8 @@ "cdm_document_service.h", "cdm_helpers.cc", "cdm_helpers.h", + "load_cdm_uma_helper.cc", + "load_cdm_uma_helper.h", ] deps += [ ":cdm_api",
diff --git a/media/cdm/cdm_module.cc b/media/cdm/cdm_module.cc index 2962804..83bd26b 100644 --- a/media/cdm/cdm_module.cc +++ b/media/cdm/cdm_module.cc
@@ -7,13 +7,13 @@ #include "base/files/file_util.h" #include "base/logging.h" #include "base/memory/ptr_util.h" -#include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" #include "build/build_config.h" #include "components/crash/core/common/crash_key.h" +#include "load_cdm_uma_helper.h" #if BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) #include "base/feature_list.h" @@ -33,6 +33,9 @@ static CdmModule* g_cdm_module = nullptr; +// UMA report prefix +const char kUmaPrefix[] = "Media.EME.Cdm"; + #if BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) void InitCdmHostVerification( base::NativeLibrary cdm_library, @@ -50,34 +53,6 @@ } #endif // BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) -// These enums are reported to UMA so values should not be renumbered or reused. -enum class LoadResult { - kLoadSuccess, - kFileMissing, // The CDM does not exist. - kLoadFailed, // CDM exists but LoadNativeLibrary() failed. - kEntryPointMissing, // CDM loaded but somce required entry point missing. - // NOTE: Add new values only immediately above this line. - kLoadResultCount // Boundary value for UMA_HISTOGRAM_ENUMERATION. -}; - -void ReportLoadResult(LoadResult load_result) { - DCHECK_LT(load_result, LoadResult::kLoadResultCount); - UMA_HISTOGRAM_ENUMERATION("Media.EME.CdmLoadResult", load_result, - LoadResult::kLoadResultCount); -} - -void ReportLoadErrorCode(const base::NativeLibraryLoadError* error) { -// Only report load error code on Windows because that's the only platform that -// has a numerical error value. -#if BUILDFLAG(IS_WIN) - base::UmaHistogramSparse("Media.EME.CdmLoadErrorCode", error->code); -#endif -} - -void ReportLoadTime(const base::TimeDelta load_time) { - UMA_HISTOGRAM_TIMES("Media.EME.CdmLoadTime", load_time); -} - } // namespace // static @@ -138,14 +113,15 @@ if (!library_.is_valid()) { LOG(ERROR) << "CDM at " << cdm_path.value() << " could not be loaded."; LOG(ERROR) << "Error: " << library_.GetError()->ToString(); - ReportLoadResult(base::PathExists(cdm_path) ? LoadResult::kLoadFailed - : LoadResult::kFileMissing); - ReportLoadErrorCode(library_.GetError()); + ReportLoadResult(kUmaPrefix, base::PathExists(cdm_path) + ? CdmLoadResult::kLoadFailed + : CdmLoadResult::kFileMissing); + ReportLoadErrorCode(kUmaPrefix, library_.GetError()); return false; } // Only report load time for success loads. - ReportLoadTime(load_time); + ReportLoadTime(kUmaPrefix, load_time); // Get function pointers. // TODO(xhwang): Define function names in macros to avoid typo errors. @@ -166,7 +142,7 @@ create_cdm_func_ = nullptr; get_cdm_version_func_ = nullptr; library_.reset(); - ReportLoadResult(LoadResult::kEntryPointMissing); + ReportLoadResult(kUmaPrefix, CdmLoadResult::kEntryPointMissing); return false; } @@ -189,7 +165,7 @@ InitCdmHostVerification(library_.get(), cdm_path_, cdm_host_file_paths); #endif // BUILDFLAG(ENABLE_CDM_HOST_VERIFICATION) - ReportLoadResult(LoadResult::kLoadSuccess); + ReportLoadResult(kUmaPrefix, CdmLoadResult::kLoadSuccess); return true; }
diff --git a/media/cdm/load_cdm_uma_helper.cc b/media/cdm/load_cdm_uma_helper.cc new file mode 100644 index 0000000..12e9d61 --- /dev/null +++ b/media/cdm/load_cdm_uma_helper.cc
@@ -0,0 +1,35 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "load_cdm_uma_helper.h" + +#include <string> + +#include "base/metrics/histogram_functions.h" +#include "base/native_library.h" +#include "base/time/time.h" + +namespace media { + +void ReportLoadResult(const std::string& uma_prefix, + CdmLoadResult load_result) { + DCHECK_LE(load_result, CdmLoadResult::kMaxValue); + base::UmaHistogramEnumeration(uma_prefix + "LoadResult", load_result); +} + +void ReportLoadErrorCode(const std::string& uma_prefix, + const base::NativeLibraryLoadError* error) { +// Only report load error code on Windows because that's the only platform that +// has a numerical error value. +#if BUILDFLAG(IS_WIN) + base::UmaHistogramSparse(uma_prefix + "LoadErrorCode", error->code); +#endif +} + +void ReportLoadTime(const std::string& uma_prefix, + const base::TimeDelta load_time) { + base::UmaHistogramTimes(uma_prefix + "LoadTime", load_time); +} + +} // namespace media
diff --git a/media/cdm/load_cdm_uma_helper.h b/media/cdm/load_cdm_uma_helper.h new file mode 100644 index 0000000..4ee148c --- /dev/null +++ b/media/cdm/load_cdm_uma_helper.h
@@ -0,0 +1,40 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_CDM_LOAD_CDM_UMA_HELPER_H_ +#define MEDIA_CDM_LOAD_CDM_UMA_HELPER_H_ + +#include <string> + +#include "base/native_library.h" +#include "base/time/time.h" + +namespace media { + +// These enums are reported to UMA so values should not be renumbered or +// reused. +enum class CdmLoadResult { + kLoadSuccess, + kFileMissing, // The CDM does not exist. + kLoadFailed, // CDM exists but LoadNativeLibrary() failed. + kEntryPointMissing, // CDM loaded but some required entry point missing. + kActivateCdmFactoryFailed, // CDM loaded but ActivateCdmFactory() failed. + kMaxValue = + kActivateCdmFactoryFailed // Max value for Uma Histogram Enumeration. +}; + +// Reports the result of loading CDM library to UMA. +void ReportLoadResult(const std::string& uma_prefix, CdmLoadResult load_result); + +// Reports the error code of loading CDM library to UMA. +void ReportLoadErrorCode(const std::string& uma_prefix, + const base::NativeLibraryLoadError* error); + +// Reports the loading time of CDM library to UMA. +void ReportLoadTime(const std::string& uma_prefix, + const base::TimeDelta load_time); + +} // namespace media + +#endif // MEDIA_CDM_LOAD_CDM_UMA_HELPER_H_
diff --git a/media/cdm/win/media_foundation_cdm_module.cc b/media/cdm/win/media_foundation_cdm_module.cc index eca08054..a77e224 100644 --- a/media/cdm/win/media_foundation_cdm_module.cc +++ b/media/cdm/win/media_foundation_cdm_module.cc
@@ -6,10 +6,12 @@ #include "base/files/file_util.h" #include "base/logging.h" +#include "base/metrics/histogram_functions.h" #include "base/strings/utf_string_conversions.h" #include "base/win/scoped_hstring.h" #include "media/base/win/hresults.h" #include "media/base/win/mf_helpers.h" +#include "media/cdm/load_cdm_uma_helper.h" namespace media { @@ -19,6 +21,9 @@ static MediaFoundationCdmModule* g_cdm_module = nullptr; +// UMA report prefix +const char kUmaPrefix[] = "Media.EME.MediaFoundationCdm."; + } // namespace // static @@ -42,10 +47,21 @@ // If `cdm_path_` is not empty, load the CDM before the sandbox is sealed. if (!cdm_path_.empty()) { + base::TimeTicks start = base::TimeTicks::Now(); library_ = base::ScopedNativeLibrary(cdm_path_); - LOG_IF(ERROR, !library_.is_valid()) - << __func__ << ": Failed to load CDM at " << cdm_path_.value() - << " (Error: " << library_.GetError()->ToString() << ")"; + base::TimeDelta load_time = base::TimeTicks::Now() - start; + if (!library_.is_valid()) { + LOG(ERROR) << __func__ << ": Failed to load CDM at " << cdm_path_.value() + << " (Error: " << library_.GetError()->ToString() << ")"; + ReportLoadResult(kUmaPrefix, base::PathExists(cdm_path) + ? CdmLoadResult::kLoadFailed + : CdmLoadResult::kFileMissing); + ReportLoadErrorCode(kUmaPrefix, library_.GetError()); + return; + } + + // Only report load time for success loads. + ReportLoadTime(kUmaPrefix, load_time); } } @@ -70,8 +86,17 @@ return E_NOT_VALID_STATE; } - if (!cdm_factory_) - RETURN_IF_FAILED(ActivateCdmFactory()); + if (!cdm_factory_) { + auto hr = ActivateCdmFactory(); + if (FAILED(hr)) { + ReportLoadResult(kUmaPrefix, CdmLoadResult::kActivateCdmFactoryFailed); + base::UmaHistogramSparse( + std::string(kUmaPrefix) + "ActivateCdmFactoryResult", hr); + return hr; + } + + ReportLoadResult(kUmaPrefix, CdmLoadResult::kLoadSuccess); + } cdm_factory = cdm_factory_; return S_OK;
diff --git a/media/gpu/mac/vt_video_decode_accelerator_mac.cc b/media/gpu/mac/vt_video_decode_accelerator_mac.cc index 55f1c05..21f1b33c 100644 --- a/media/gpu/mac/vt_video_decode_accelerator_mac.cc +++ b/media/gpu/mac/vt_video_decode_accelerator_mac.cc
@@ -2127,19 +2127,15 @@ // Request new pictures. picture_size_ = frame.image_size; - picture_format_ = PIXEL_FORMAT_RGBAF16; + picture_format_ = PIXEL_FORMAT_UNKNOWN; if (config_.profile == VP9PROFILE_PROFILE2 || config_.profile == HEVCPROFILE_MAIN10 || config_.profile == HEVCPROFILE_REXT) { buffer_format_ = gfx::BufferFormat::P010; - if (base::FeatureList::IsEnabled(kMultiPlaneVideoToolboxSharedImages)) { - picture_format_ = PIXEL_FORMAT_P016LE; - } + picture_format_ = PIXEL_FORMAT_P016LE; } else { buffer_format_ = gfx::BufferFormat::YUV_420_BIPLANAR; - if (base::FeatureList::IsEnabled(kMultiPlaneVideoToolboxSharedImages)) { - picture_format_ = PIXEL_FORMAT_NV12; - } + picture_format_ = PIXEL_FORMAT_NV12; } DVLOG(3) << "ProvidePictureBuffers(" << kNumPictureBuffers @@ -2169,32 +2165,16 @@ const gfx::ColorSpace color_space = GetImageBufferColorSpace(frame.image); std::vector<gfx::BufferPlane> planes; - switch (picture_format_) { - case PIXEL_FORMAT_NV12: - case PIXEL_FORMAT_P016LE: - planes.push_back(gfx::BufferPlane::Y); - planes.push_back(gfx::BufferPlane::UV); - break; - case PIXEL_FORMAT_RGBAF16: - planes.push_back(gfx::BufferPlane::DEFAULT); - break; - default: - NOTREACHED(); - break; - } - + planes.push_back(gfx::BufferPlane::Y); + planes.push_back(gfx::BufferPlane::UV); for (size_t plane = 0; plane < planes.size(); ++plane) { const gfx::Size plane_size( CVPixelBufferGetWidthOfPlane(frame.image.get(), plane), CVPixelBufferGetHeightOfPlane(frame.image.get(), plane)); gfx::BufferFormat plane_buffer_format = gpu::GetPlaneBufferFormat(planes[plane], buffer_format_); - // TODO(https://crbug.com/1108909): BGRA is not an appropriate value for - // these parameters. const viz::ResourceFormat viz_resource_format = - (picture_format_ == PIXEL_FORMAT_RGBAF16) - ? viz::ResourceFormat::RGBA_F16 - : viz::GetResourceFormat(plane_buffer_format); + viz::GetResourceFormat(plane_buffer_format); const GLenum gl_format = viz::GLDataFormat(viz_resource_format); scoped_refptr<gl::GLImageIOSurface> gl_image( @@ -2202,13 +2182,10 @@ if (!gl_image->InitializeWithCVPixelBuffer( frame.image.get(), plane, gfx::GenericSharedMemoryId(g_cv_pixel_buffer_ids.GetNext()), - plane_buffer_format)) { + plane_buffer_format, color_space)) { NOTIFY_STATUS("Failed to initialize GLImageIOSurface", PLATFORM_FAILURE, SFT_PLATFORM_ERROR); } - gl_image->DisableInUseByWindowServer(); - gl_image->SetColorSpaceForYUVToRGBConversion(color_space); - gl_image->SetColorSpaceShallow(color_space); if (picture_info->uses_shared_images) { gpu::SharedImageStub* shared_image_stub = client_->GetSharedImageStub();
diff --git a/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc b/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc index 4ea6a379..474ad6d 100644 --- a/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc +++ b/media/video/renderable_gpu_memory_buffer_video_frame_pool.cc
@@ -11,6 +11,7 @@ #include <utility> #include "base/bind.h" +#include "base/bits.h" #include "base/logging.h" #include "base/task/bind_post_task.h" #include "base/threading/sequenced_task_runner_handle.h" @@ -169,9 +170,15 @@ constexpr gfx::BufferFormat kBufferFormat = gfx::BufferFormat::YUV_420_BIPLANAR; + // All YUV420 buffers must have dimensions dividable by 2. + constexpr int kI420Alignment = 2; + gfx::Size buffer_size_in_pixels( + base::bits::AlignUp(coded_size_.width(), kI420Alignment), + base::bits::AlignUp(coded_size_.height(), kI420Alignment)); + // Create the GpuMemoryBuffer. - gpu_memory_buffer_ = - context->CreateGpuMemoryBuffer(coded_size_, kBufferFormat, kBufferUsage); + gpu_memory_buffer_ = context->CreateGpuMemoryBuffer( + buffer_size_in_pixels, kBufferFormat, kBufferUsage); if (!gpu_memory_buffer_) { DLOG(ERROR) << "Failed to allocate GpuMemoryBuffer for frame: coded_size=" << coded_size_.ToString()
diff --git a/remoting/host/chromeos/BUILD.gn b/remoting/host/chromeos/BUILD.gn index d79578c..1f88f2c 100644 --- a/remoting/host/chromeos/BUILD.gn +++ b/remoting/host/chromeos/BUILD.gn
@@ -33,6 +33,7 @@ "//components/viz/host", "//gpu/command_buffer/common", "//remoting/protocol", + "//services/viz/privileged/mojom/compositing", "//skia", "//third_party/webrtc_overrides:webrtc_component", "//ui/aura",
diff --git a/remoting/host/desktop_capturer_proxy.cc b/remoting/host/desktop_capturer_proxy.cc index c54de31..6e0a3b4 100644 --- a/remoting/host/desktop_capturer_proxy.cc +++ b/remoting/host/desktop_capturer_proxy.cc
@@ -97,7 +97,14 @@ } #elif defined(REMOTING_USE_WAYLAND) if (options.allow_pipewire() && DesktopCapturer::IsRunningUnderWayland()) { - capturer_ = std::make_unique<WaylandDesktopCapturer>(options); + // Even though wayland itself has mechanism to detect surface damage in a + // fine grained fashion, the framebuffer handed over by the compositor over + // to the pipewire stream contains the entire scene (and not just the delta) + // from one frame to another. DesktopCapturerDiffWrapper is the closest + // thing that can help mimic XDamage behavior for wayland and avoid + // unnecessary frame encoding overhead. + capturer_ = std::make_unique<webrtc::DesktopCapturerDifferWrapper>( + std::make_unique<WaylandDesktopCapturer>(options)); } else { capturer_ = webrtc::DesktopCapturer::CreateScreenCapturer(options); }
diff --git a/remoting/host/linux/wayland_display.h b/remoting/host/linux/wayland_display.h index ccf94098..9da02e73 100644 --- a/remoting/host/linux/wayland_display.h +++ b/remoting/host/linux/wayland_display.h
@@ -8,12 +8,13 @@ #include <string> #include <vector> +#include <xdg-output-unstable-v1-client-protocol.h> + #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" #include "remoting/base/logging.h" #include "remoting/host/desktop_display_info.h" #include "remoting/host/linux/wayland_display_info.h" -#include "third_party/wayland-protocols/src/unstable/xdg-output/xdg-output-unstable-v1-client-protocol.h" namespace remoting {
diff --git a/remoting/host/linux/wayland_display_info.h b/remoting/host/linux/wayland_display_info.h index 4e7291b..6c2ac07 100644 --- a/remoting/host/linux/wayland_display_info.h +++ b/remoting/host/linux/wayland_display_info.h
@@ -7,7 +7,7 @@ #include <string> -#include "third_party/wayland-protocols/src/unstable/xdg-output/xdg-output-unstable-v1-client-protocol.h" +#include <xdg-output-unstable-v1-client-protocol.h> namespace remoting {
diff --git a/rlz/buildflags/buildflags.gni b/rlz/buildflags/buildflags.gni index 8090796..acfc599 100644 --- a/rlz/buildflags/buildflags.gni +++ b/rlz/buildflags/buildflags.gni
@@ -9,4 +9,9 @@ # rlz codes for searches but do not use the library. enable_rlz_support = is_win || is_apple || is_chromeos_ash -enable_rlz = is_chrome_branded && enable_rlz_support +declare_args() { + enable_rlz = is_chrome_branded && enable_rlz_support +} + +assert(!enable_rlz || enable_rlz_support, + "RLZ is only supported on Windows, Apple and ChromeOS Ash.")
diff --git a/sandbox/policy/win/sandbox_policy_feature_test.cc b/sandbox/policy/win/sandbox_policy_feature_test.cc index 5a3d385d..c476fca 100644 --- a/sandbox/policy/win/sandbox_policy_feature_test.cc +++ b/sandbox/policy/win/sandbox_policy_feature_test.cc
@@ -8,8 +8,8 @@ namespace policy { SandboxFeatureTest::SandboxFeatureTest() { - std::vector<base::Feature> enabled_features; - std::vector<base::Feature> disabled_features; + std::vector<base::test::FeatureRef> enabled_features; + std::vector<base::test::FeatureRef> disabled_features; if (::testing::get<TestParameter::kEnableRendererAppContainer>(GetParam())) enabled_features.push_back(features::kRendererAppContainer);
diff --git a/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc b/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc index ee757c9..78984a9c 100644 --- a/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc +++ b/sandbox/win/fuzzer/sandbox_policy_rule_fuzzer.cc
@@ -23,19 +23,28 @@ auto policy = std::make_unique<sandbox::PolicyBase>(""); auto* config = policy->GetConfig(); - config->AddRule(sandbox::SubSystem::kWin32kLockdown, - sandbox::Semantics::kFakeGdiInit, nullptr); + auto result = config->AddRule(sandbox::SubSystem::kWin32kLockdown, + sandbox::Semantics::kFakeGdiInit, nullptr); + if (result != sandbox::SBOX_ALL_OK) + return nullptr; - config->AddRule(sandbox::SubSystem::kFiles, - sandbox::Semantics::kFilesAllowAny, L"\\??\\pipe\\chrome.*"); + result = config->AddRule(sandbox::SubSystem::kFiles, + sandbox::Semantics::kFilesAllowAny, + L"\\??\\pipe\\chrome.*"); + if (result != sandbox::SBOX_ALL_OK) + return nullptr; - config->AddRule(sandbox::SubSystem::kNamedPipes, - sandbox::Semantics::kNamedPipesAllowAny, - L"\\\\.\\pipe\\chrome.nacl.*"); + result = config->AddRule(sandbox::SubSystem::kNamedPipes, + sandbox::Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\chrome.nacl.*"); + if (result != sandbox::SBOX_ALL_OK) + return nullptr; - config->AddRule(sandbox::SubSystem::kNamedPipes, - sandbox::Semantics::kNamedPipesAllowAny, - L"\\\\.\\pipe\\chrome.sync.*"); + result = config->AddRule(sandbox::SubSystem::kNamedPipes, + sandbox::Semantics::kNamedPipesAllowAny, + L"\\\\.\\pipe\\chrome.sync.*"); + if (result != sandbox::SBOX_ALL_OK) + return nullptr; sandbox::BrokerServicesBase::FreezeTargetConfigForTesting( policy->GetConfig());
diff --git a/sandbox/win/src/app_container_test.cc b/sandbox/win/src/app_container_test.cc index 0227943..b901777 100644 --- a/sandbox/win/src/app_container_test.cc +++ b/sandbox/win/src/app_container_test.cc
@@ -302,8 +302,9 @@ if (!container_) return; - policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, + USER_UNPROTECTED)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities(); @@ -318,9 +319,9 @@ if (!container_) return; - policy_->GetConfig()->SetTokenLevel(USER_LOCKDOWN, - USER_RESTRICTED_SAME_ACCESS); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel( + USER_RESTRICTED_SAME_ACCESS, USER_LOCKDOWN)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities(); @@ -338,8 +339,9 @@ container_->AddCapability(base::win::WellKnownCapability::kInternetClient); container_->AddCapability( base::win::WellKnownCapability::kInternetClientServer); - policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, + USER_UNPROTECTED)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities(); @@ -357,9 +359,9 @@ container_->AddCapability(base::win::WellKnownCapability::kInternetClient); container_->AddCapability( base::win::WellKnownCapability::kInternetClientServer); - policy_->GetConfig()->SetTokenLevel(USER_LOCKDOWN, - USER_RESTRICTED_SAME_ACCESS); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel( + USER_RESTRICTED_SAME_ACCESS, USER_LOCKDOWN)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities(); @@ -381,8 +383,9 @@ base::win::WellKnownCapability::kPrivateNetworkClientServer); container_->AddImpersonationCapability( base::win::WellKnownCapability::kPicturesLibrary); - policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, + USER_UNPROTECTED)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities(); @@ -400,8 +403,9 @@ return; container_->SetEnableLowPrivilegeAppContainer(true); - policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); - policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetTokenLevel(USER_UNPROTECTED, + USER_UNPROTECTED)); + EXPECT_EQ(SBOX_ALL_OK, policy_->GetConfig()->SetJobLevel(JobLevel::kNone, 0)); CreateProcess(); auto security_capabilities = container_->GetSecurityCapabilities();
diff --git a/sandbox/win/src/integrity_level_test.cc b/sandbox/win/src/integrity_level_test.cc index b4636f9..458ce6a 100644 --- a/sandbox/win/src/integrity_level_test.cc +++ b/sandbox/win/src/integrity_level_test.cc
@@ -46,9 +46,11 @@ auto runner = std::make_unique<TestRunner>( JobLevel::kLockdown, USER_INTERACTIVE, USER_INTERACTIVE); runner->SetTimeout(INFINITE); - runner->GetPolicy()->CreateAlternateDesktop(Desktop::kAlternateWinstation); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->CreateAlternateDesktop( + Desktop::kAlternateWinstation)); runner->GetPolicy()->GetConfig()->SetDesktop(Desktop::kAlternateWinstation); - runner->GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); return runner; } @@ -91,7 +93,7 @@ TestRunner runner(JobLevel::kLockdown, USER_RESTRICTED_SAME_ACCESS, USER_LOCKDOWN); auto* config = runner.GetPolicy()->GetConfig(); - config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW)); config->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_UNTRUSTED); config->SetLockdownDefaultDacl(); @@ -105,7 +107,7 @@ TestRunner runner(JobLevel::kLockdown, USER_RESTRICTED_SAME_ACCESS, USER_LOCKDOWN); auto* config = runner.GetPolicy()->GetConfig(); - config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW)); config->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_LOW); config->SetLockdownDefaultDacl();
diff --git a/sandbox/win/src/policy_target_test.cc b/sandbox/win/src/policy_target_test.cc index 00321760..d9ed6a1b 100644 --- a/sandbox/win/src/policy_target_test.cc +++ b/sandbox/win/src/policy_target_test.cc
@@ -280,7 +280,8 @@ auto policy = broker->CreatePolicy(); policy->GetConfig()->SetDesktop(Desktop::kAlternateDesktop); - policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, USER_LOCKDOWN); + EXPECT_EQ(SBOX_ALL_OK, policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, + USER_LOCKDOWN)); PROCESS_INFORMATION temp_process_info = {}; result = broker->SpawnTarget(prog_name, arguments.c_str(), std::move(policy), @@ -334,7 +335,8 @@ auto policy = broker->CreatePolicy(); policy->GetConfig()->SetDesktop(Desktop::kAlternateDesktop); - policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, USER_LOCKDOWN); + EXPECT_EQ(SBOX_ALL_OK, policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, + USER_LOCKDOWN)); PROCESS_INFORMATION temp_process_info = {}; // Keep the desktop name to test against later (note - it was precreated). std::wstring desktop_name = policy->GetDesktopName(); @@ -396,7 +398,8 @@ auto policy = broker->CreatePolicy(); policy->GetConfig()->SetDesktop(Desktop::kAlternateWinstation); - policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, USER_LOCKDOWN); + EXPECT_EQ(SBOX_ALL_OK, policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, + USER_LOCKDOWN)); PROCESS_INFORMATION temp_process_info = {}; DWORD last_error = ERROR_SUCCESS; // Keep the desktop name for later (note - it was precreated). @@ -510,7 +513,8 @@ ResultCode warning_result = SBOX_ALL_OK; base::win::ScopedProcessInformation target; - policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, USER_LOCKDOWN); + EXPECT_EQ(SBOX_ALL_OK, policy->GetConfig()->SetTokenLevel(USER_INTERACTIVE, + USER_LOCKDOWN)); PROCESS_INFORMATION temp_process_info = {}; DWORD last_error = ERROR_SUCCESS; result =
diff --git a/sandbox/win/src/process_mitigations_dyncode_unittest.cc b/sandbox/win/src/process_mitigations_dyncode_unittest.cc index 377a23e..bbd17f6 100644 --- a/sandbox/win/src/process_mitigations_dyncode_unittest.cc +++ b/sandbox/win/src/process_mitigations_dyncode_unittest.cc
@@ -249,7 +249,9 @@ std::unique_ptr<sandbox::TestRunner> RunnerWithMitigation( sandbox::MitigationFlags mitigations) { auto runner = std::make_unique<sandbox::TestRunner>(); - runner->GetPolicy()->GetConfig()->SetDelayedProcessMitigations(mitigations); + EXPECT_EQ(sandbox::SBOX_ALL_OK, + runner->GetPolicy()->GetConfig()->SetDelayedProcessMitigations( + mitigations)); return runner; } @@ -304,9 +306,10 @@ // Need token level >= USER_LIMITED to be able to successfully run test 3. runner = enable_mitigation ? RunnerWithMitigation(which_mitigation) : std::make_unique<sandbox::TestRunner>(); - runner->GetPolicy()->GetConfig()->SetTokenLevel( - sandbox::TokenLevel::USER_RESTRICTED_SAME_ACCESS, - sandbox::TokenLevel::USER_LIMITED); + EXPECT_EQ(sandbox::SBOX_ALL_OK, + runner->GetPolicy()->GetConfig()->SetTokenLevel( + sandbox::TokenLevel::USER_RESTRICTED_SAME_ACCESS, + sandbox::TokenLevel::USER_LIMITED)); test = base::StringPrintf(L"%ls %u", shared.c_str(), MAPVIEWCUSTOM); EXPECT_EQ((expect_success ? sandbox::SBOX_TEST_SUCCEEDED
diff --git a/sandbox/win/src/process_mitigations_unittest.cc b/sandbox/win/src/process_mitigations_unittest.cc index 18a949e..cd47d13 100644 --- a/sandbox/win/src/process_mitigations_unittest.cc +++ b/sandbox/win/src/process_mitigations_unittest.cc
@@ -1057,8 +1057,9 @@ sandbox::TargetConfig* config = runner.GetPolicy()->GetConfig(); // Set a policy that would normally allow for process creation. - config->SetJobLevel(JobLevel::kInteractive, 0); - config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); + EXPECT_EQ(SBOX_ALL_OK, config->SetJobLevel(JobLevel::kInteractive, 0)); + EXPECT_EQ(SBOX_ALL_OK, + config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED)); runner.SetDisableCsrss(false); base::FilePath cmd; @@ -1081,8 +1082,9 @@ // Now set the job level to be <= JobLevel::kLimitedUser // and ensure we can no longer create a child process. - config->SetJobLevel(JobLevel::kLimitedUser, 0); - config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); + EXPECT_EQ(SBOX_ALL_OK, config->SetJobLevel(JobLevel::kLimitedUser, 0)); + EXPECT_EQ(SBOX_ALL_OK, + config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED)); runner.SetDisableCsrss(false); base::FilePath cmd; @@ -1107,8 +1109,9 @@ sandbox::TargetConfig* config = runner.GetPolicy()->GetConfig(); // Set a policy that would normally allow for process creation. - config->SetJobLevel(JobLevel::kInteractive, 0); - config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED); + EXPECT_EQ(SBOX_ALL_OK, config->SetJobLevel(JobLevel::kInteractive, 0)); + EXPECT_EQ(SBOX_ALL_OK, + config->SetTokenLevel(USER_UNPROTECTED, USER_UNPROTECTED)); runner.SetDisableCsrss(false); base::FilePath cmd;
diff --git a/sandbox/win/src/restricted_token_test.cc b/sandbox/win/src/restricted_token_test.cc index 11efb3d..0823910 100644 --- a/sandbox/win/src/restricted_token_test.cc +++ b/sandbox/win/src/restricted_token_test.cc
@@ -28,7 +28,9 @@ USER_LOCKDOWN); auto* config = runner.GetPolicy()->GetConfig(); config->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_UNTRUSTED); - config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + ResultCode result = config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; if (lockdown_dacl) config->SetLockdownDefaultDacl(); runner.SetAsynchronous(true); @@ -39,7 +41,9 @@ USER_LIMITED); auto* config2 = runner2.GetPolicy()->GetConfig(); config2->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_LOW); - config2->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + result = config2->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; runner2.SetUnsandboxed(unsandboxed); return runner2.RunTest( base::StringPrintf(L"RestrictedTokenTest_openprocess %d 0x%08X", @@ -53,7 +57,10 @@ TestRunner runner(JobLevel::kNone, USER_RESTRICTED_SAME_ACCESS, USER_LIMITED); auto* config = runner.GetPolicy()->GetConfig(); config->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_LOW); - config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + ResultCode result = config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; + if (lockdown_dacl) { config->SetLockdownDefaultDacl(); config->AddRestrictingRandomSid(); @@ -66,7 +73,9 @@ USER_LIMITED); auto* config2 = runner2.GetPolicy()->GetConfig(); config2->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_LOW); - config2->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + result = config2->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; runner2.SetUnsandboxed(unsandboxed); return runner2.RunTest( base::StringPrintf(L"RestrictedTokenTest_openprocess %d 0x%08X", @@ -78,7 +87,9 @@ TestRunner runner(JobLevel::kNone, USER_RESTRICTED_SAME_ACCESS, USER_LIMITED); auto* config = runner.GetPolicy()->GetConfig(); config->SetDelayedIntegrityLevel(INTEGRITY_LEVEL_LOW); - config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + ResultCode result = config->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; config->SetLockdownDefaultDacl(); if (add_random_sid) config->AddRestrictingRandomSid();
diff --git a/sandbox/win/src/sandbox_policy.h b/sandbox/win/src/sandbox_policy.h index a97cee92..aa5072e5 100644 --- a/sandbox/win/src/sandbox_policy.h +++ b/sandbox/win/src/sandbox_policy.h
@@ -92,7 +92,8 @@ // Important: most of the sandbox-provided security relies on this single // setting. The caller should strive to set the lockdown level as restricted // as possible. - virtual ResultCode SetTokenLevel(TokenLevel initial, TokenLevel lockdown) = 0; + [[nodiscard]] virtual ResultCode SetTokenLevel(TokenLevel initial, + TokenLevel lockdown) = 0; // Returns the initial token level. virtual TokenLevel GetInitialTokenLevel() const = 0; @@ -133,8 +134,8 @@ // http://msdn2.microsoft.com/en-us/library/ms684152.aspx // // Note: the recommended level is JobLevel::kLockdown. - virtual ResultCode SetJobLevel(JobLevel job_level, - uint32_t ui_exceptions) = 0; + [[nodiscard]] virtual ResultCode SetJobLevel(JobLevel job_level, + uint32_t ui_exceptions) = 0; // Returns the job level. virtual JobLevel GetJobLevel() const = 0; @@ -155,9 +156,9 @@ // "c:\\documents and settings\\vince\\*.dmp" // "c:\\documents and settings\\*\\crashdumps\\*.dmp" // "c:\\temp\\app_log_?????_chrome.txt" - virtual ResultCode AddRule(SubSystem subsystem, - Semantics semantics, - const wchar_t* pattern) = 0; + [[nodiscard]] virtual ResultCode AddRule(SubSystem subsystem, + Semantics semantics, + const wchar_t* pattern) = 0; // Adds a dll that will be unloaded in the target process before it gets // a chance to initialize itself. Typically, dlls that cause the target @@ -168,7 +169,7 @@ // token and the main token will be affected by this. If the integrity level // is set to a level higher than the current level, the sandbox will fail // to start. - virtual ResultCode SetIntegrityLevel(IntegrityLevel level) = 0; + [[nodiscard]] virtual ResultCode SetIntegrityLevel(IntegrityLevel level) = 0; // Returns the initial integrity level used. virtual IntegrityLevel GetIntegrityLevel() const = 0; @@ -182,20 +183,22 @@ // Sets the LowBox token for sandboxed process. This is mutually exclusive // with SetAppContainer method. - virtual ResultCode SetLowBox(const wchar_t* sid) = 0; + [[nodiscard]] virtual ResultCode SetLowBox(const wchar_t* sid) = 0; // Sets the mitigations enabled when the process is created. Most of these // are implemented as attributes passed via STARTUPINFOEX. So they take // effect before any thread in the target executes. The declaration of // MitigationFlags is followed by a detailed description of each flag. - virtual ResultCode SetProcessMitigations(MitigationFlags flags) = 0; + [[nodiscard]] virtual ResultCode SetProcessMitigations( + MitigationFlags flags) = 0; // Returns the currently set mitigation flags. virtual MitigationFlags GetProcessMitigations() = 0; // Sets process mitigation flags that don't take effect before the call to // LowerToken(). - virtual ResultCode SetDelayedProcessMitigations(MitigationFlags flags) = 0; + [[nodiscard]] virtual ResultCode SetDelayedProcessMitigations( + MitigationFlags flags) = 0; // Returns the currently set delayed mitigation flags. virtual MitigationFlags GetDelayedProcessMitigations() const = 0; @@ -213,8 +216,9 @@ // name of the profile to use. Specifying True for |create_profile| ensures // the profile exists, if set to False process creation will fail if the // profile has not already been created. - virtual ResultCode AddAppContainerProfile(const wchar_t* package_name, - bool create_profile) = 0; + [[nodiscard]] virtual ResultCode AddAppContainerProfile( + const wchar_t* package_name, + bool create_profile) = 0; // Get the configured AppContainer. virtual scoped_refptr<AppContainer> GetAppContainer() = 0; @@ -229,12 +233,13 @@ // Adds a handle that will be closed in the target process after lockdown. // A nullptr value for handle_name indicates all handles of the specified // type. An empty string for handle_name indicates the handle is unnamed. - virtual ResultCode AddKernelObjectToClose(const wchar_t* handle_type, - const wchar_t* handle_name) = 0; + [[nodiscard]] virtual ResultCode AddKernelObjectToClose( + const wchar_t* handle_type, + const wchar_t* handle_name) = 0; // Disconnect the target from CSRSS when TargetServices::LowerToken() is // called inside the target. - virtual ResultCode SetDisconnectCsrss() = 0; + [[nodiscard]] virtual ResultCode SetDisconnectCsrss() = 0; // Specifies the desktop on which the application is going to run. The // requested alternate desktop must have been created via the TargetPolicy
diff --git a/sandbox/win/src/sandbox_policy_base.cc b/sandbox/win/src/sandbox_policy_base.cc index c017181d..b7ba2f9 100644 --- a/sandbox/win/src/sandbox_policy_base.cc +++ b/sandbox/win/src/sandbox_policy_base.cc
@@ -431,6 +431,7 @@ } ResultCode ConfigBase::SetTokenLevel(TokenLevel initial, TokenLevel lockdown) { + // Note: TokenLevel enum values increase as lockdown decreases. if (initial < lockdown) { return SBOX_ERROR_BAD_PARAMS; }
diff --git a/sandbox/win/tests/common/controller.cc b/sandbox/win/tests/common/controller.cc index d6dd7cd..99f9cf21 100644 --- a/sandbox/win/tests/common/controller.cc +++ b/sandbox/win/tests/common/controller.cc
@@ -120,8 +120,12 @@ if (!policy_) return; - policy_->GetConfig()->SetJobLevel(job_level, 0); - policy_->GetConfig()->SetTokenLevel(startup_token, main_token); + auto result = policy_->GetConfig()->SetJobLevel(job_level, 0); + if (result != SBOX_ALL_OK) + return; + result = policy_->GetConfig()->SetTokenLevel(startup_token, main_token); + if (result != SBOX_ALL_OK) + return; is_init_ = true; } @@ -206,15 +210,18 @@ target_process_id_ = 0; } - if (disable_csrss_) - policy_->GetConfig()->SetDisconnectCsrss(); + ResultCode result = SBOX_ALL_OK; + if (disable_csrss_) { + result = policy_->GetConfig()->SetDisconnectCsrss(); + if (result != SBOX_ALL_OK) + return SBOX_TEST_FAILED_SETUP; + } // Get the path to the sandboxed process. wchar_t prog_name[MAX_PATH]; GetModuleFileNameW(NULL, prog_name, MAX_PATH); // Launch the sandboxed process. - ResultCode result = SBOX_ALL_OK; ResultCode warning_result = SBOX_ALL_OK; DWORD last_error = ERROR_SUCCESS; PROCESS_INFORMATION target = {0};
diff --git a/sandbox/win/tests/common/controller.h b/sandbox/win/tests/common/controller.h index 6105553..0442c39 100644 --- a/sandbox/win/tests/common/controller.h +++ b/sandbox/win/tests/common/controller.h
@@ -61,7 +61,9 @@ SBOX_TEST_TIMED_OUT, // Test failed. (0xE5B1000B or -441384949) SBOX_TEST_FAILED, - // Last Result. (0xE5B1000C or -441384948) + // Failed to configure sandbox before test. (0xE5B1000C or -441384948) + SBOX_TEST_FAILED_SETUP, + // Last Result. (0xE5B1000D or -441384947) SBOX_TEST_LAST_RESULT };
diff --git a/sandbox/win/tests/validation_tests/suite.cc b/sandbox/win/tests/validation_tests/suite.cc index 11d0a48..ed83418 100644 --- a/sandbox/win/tests/validation_tests/suite.cc +++ b/sandbox/win/tests/validation_tests/suite.cc
@@ -158,9 +158,11 @@ std::unique_ptr<TestRunner> DesktopRunner() { auto runner = std::make_unique<TestRunner>(); - runner->GetPolicy()->CreateAlternateDesktop(Desktop::kAlternateWinstation); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->CreateAlternateDesktop( + Desktop::kAlternateWinstation)); runner->GetPolicy()->GetConfig()->SetDesktop(Desktop::kAlternateWinstation); - runner->GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); return runner; } @@ -184,11 +186,14 @@ TestRunner runner; wchar_t command[1024] = {0}; runner.SetTimeout(3600000); - runner.GetPolicy()->CreateAlternateDesktop(Desktop::kAlternateWinstation); + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->CreateAlternateDesktop( + Desktop::kAlternateWinstation)); runner.GetPolicy()->GetConfig()->SetDesktop(Desktop::kAlternateWinstation); - runner.GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); // Ensure the desktop is created. - runner.GetPolicy()->CreateAlternateDesktop(Desktop::kAlternateWinstation); + EXPECT_EQ(SBOX_ALL_OK, runner.GetPolicy()->CreateAlternateDesktop( + Desktop::kAlternateWinstation)); std::wstring desktop_name = runner.GetPolicy()->GetDesktopName(); desktop_name = desktop_name.substr(desktop_name.find('\\') + 1); wsprintf(command, L"OpenAlternateDesktop %lS", desktop_name.c_str()); @@ -197,9 +202,11 @@ std::unique_ptr<TestRunner> AlternateDesktopLocalWinstationRunner() { auto runner = std::make_unique<TestRunner>(); - runner->GetPolicy()->CreateAlternateDesktop(Desktop::kAlternateDesktop); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->CreateAlternateDesktop( + Desktop::kAlternateDesktop)); runner->GetPolicy()->GetConfig()->SetDesktop(Desktop::kAlternateDesktop); - runner->GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); return runner; } @@ -252,9 +259,10 @@ std::unique_ptr<TestRunner> ProcessDenyLowIntegrityRunner() { auto runner = std::make_unique<TestRunner>(); - runner->GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); - runner->GetPolicy()->GetConfig()->SetTokenLevel(USER_RESTRICTED_SAME_ACCESS, - USER_INTERACTIVE); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetTokenLevel( + USER_RESTRICTED_SAME_ACCESS, USER_INTERACTIVE)); return runner; } @@ -275,8 +283,8 @@ auto runner = std::make_unique<TestRunner>(); runner->GetPolicy()->GetConfig()->SetDelayedIntegrityLevel( INTEGRITY_LEVEL_UNTRUSTED); - runner->GetPolicy()->GetConfig()->SetTokenLevel(USER_RESTRICTED_SAME_ACCESS, - USER_INTERACTIVE); + EXPECT_EQ(SBOX_ALL_OK, runner->GetPolicy()->GetConfig()->SetTokenLevel( + USER_RESTRICTED_SAME_ACCESS, USER_INTERACTIVE)); return runner; } @@ -284,9 +292,10 @@ TEST(ValidationSuite, TestProcessDenyBelowLowIntegrity) { TestRunner target; target.SetAsynchronous(true); - target.GetPolicy()->GetConfig()->SetIntegrityLevel(INTEGRITY_LEVEL_LOW); - target.GetPolicy()->GetConfig()->SetTokenLevel(USER_RESTRICTED_SAME_ACCESS, - USER_INTERACTIVE); + EXPECT_EQ(SBOX_ALL_OK, target.GetPolicy()->GetConfig()->SetIntegrityLevel( + INTEGRITY_LEVEL_LOW)); + EXPECT_EQ(SBOX_ALL_OK, target.GetPolicy()->GetConfig()->SetTokenLevel( + USER_RESTRICTED_SAME_ACCESS, USER_INTERACTIVE)); EXPECT_EQ(SBOX_TEST_SUCCEEDED, target.RunTest(L"SleepCmd 30000"));
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index f429d7a8..7ef1f7c 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -624,1511 +624,6 @@ } ] }, - "android-marshmallow-x86-fyi-rel-reviver": { - "gtest_tests": [ - { - "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", - "android_browsertests" - ], - "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, - "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" - } - ], - "quickrun_shards": 6, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--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", - "android_sync_integration_tests" - ], - "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, - "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": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "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", - "android_webview_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, - "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": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_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", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_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" - }, - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests", - "--git-revision=${got_revision}" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_java_test_wpr_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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": "chrome_java_test_wpr_tests", - "test_id_prefix": "ninja://chrome/test/android:chrome_java_test_wpr_tests/" - }, - { - "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", - "chrome_modern_public_bundle_smoke_test" - ], - "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, - "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": "chrome_modern_public_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_modern_public_bundle_smoke_test/" - }, - { - "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", - "chrome_public_smoke_test" - ], - "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, - "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": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--gtest_filter=-org.chromium.chrome.browser.contextualsearch.ContextualSearchManagerTest.test*ExternalNavigationWithUserGesture*:org.chromium.shape_detection.*", - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests", - "--git-revision=${got_revision}" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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_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", - "shards": 25 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests", - "--git-revision=${got_revision}" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "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", - "components_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, - "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", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_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", - "content_shell_test_apk" - ], - "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, - "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" - } - ], - "quickrun_shards": 8, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "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", - "device_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, - "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": "device_unittests", - "test_id_prefix": "ninja://device:device_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", - "display_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, - "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": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_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", - "gfx_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, - "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": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--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", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "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": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "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", - "gl_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, - "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": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_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", - "mojo_test_apk" - ], - "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, - "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": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "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", - "sandbox_linux_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, - "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": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_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", - "ui_android_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, - "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": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_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", - "unit_tests" - ], - "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, - "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", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "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", - "viz_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, - "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": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_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", - "webview_instrumentation_test_apk" - ], - "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, - "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", - "shards": 9 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - } - ], - "isolated_scripts": [ - { - "args": [ - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests" - ], - "isolate_name": "monochrome_public_apk_checker", - "isolate_profile_data": true, - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "monochrome_public_apk_checker", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_os_flavor": null, - "device_playstore_version": 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" - } - ] - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://chrome/android/monochrome:monochrome_public_apk_checker/" - } - ], - "scripts": [ - { - "args": [ - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb", - "--gtest_also_run_disabled_tests" - ], - "isolate_profile_data": true, - "name": "check_network_annotations", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "script": "check_network_annotations.py", - "swarming": {} - } - ] - }, "android-pie-arm64-wpt-rel-non-cq": { "isolated_scripts": [ { @@ -5925,306 +4420,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "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", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "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", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "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", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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", "webview_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -6539,117 +4734,6 @@ } ] }, - "android-weblayer-pie-x86-wpt-fyi-rel": { - "isolated_scripts": [ - { - "args": [ - "--no-wpt-internal", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb" - ], - "experiment_percentage": 100, - "isolate_name": "weblayer_shell_wpt", - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "weblayer_shell_wpt", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "e2-standard-8", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "expiration": 18000, - "hard_timeout": 14400, - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 18 - }, - "test_id_prefix": "ninja://weblayer/shell/android:weblayer_shell_wpt/" - } - ] - }, - "android-weblayer-pie-x86-wpt-smoketest": { - "isolated_scripts": [ - { - "args": [ - "--no-wpt-internal", - "--avd-config=../../tools/android/avd/proto/generic_android28.textpb", - "--default-exclude", - "--include-file=../../third_party/blink/web_tests/android/WPTSmokeTestCases" - ], - "experiment_percentage": 100, - "isolate_name": "weblayer_shell_wpt", - "merge": { - "args": [ - "--verbose" - ], - "script": "//third_party/blink/tools/merge_web_test_results.py" - }, - "name": "weblayer_shell_wpt", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "results_handler": "layout tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "machine_type": "e2-standard-8", - "os": "Ubuntu-18.04", - "pool": "chromium.tests.avd" - } - ], - "expiration": 18000, - "hard_timeout": 14400, - "named_caches": [ - { - "name": "generic_android28", - "path": ".android_emulator/generic_android28" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android28" - } - ] - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test_id_prefix": "ninja://weblayer/shell/android:weblayer_shell_wpt/" - } - ] - }, "android-webview-12-x64-dbg-tests": { "gtest_tests": [ {
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index 558ec2102..5f72564 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -1544,13 +1544,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "name": "weblayer_junit_tests", - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ] }, @@ -4328,221 +4321,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -7420,226 +7198,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -12523,184 +12081,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", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android30.textpb", - "--gtest_filter=-org.chromium.weblayer.test.MediaCaptureTest.*" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "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", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android30.textpb", "--gtest_filter=-org.chromium.net.NetworkChangeNotifierTest.testNetworkChangeNotifierJavaObservers" ], @@ -16732,302 +16112,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "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", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android31.textpb", - "--gtest_filter=-org.chromium.weblayer.test.BrowserControlsTest.testTopExpandedOnLoadWhenOnlyExpandAtTop" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "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", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -21088,301 +20172,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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_android32_foldable", - "path": ".android_emulator/generic_android32_foldable" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android32_foldable" - } - ] - }, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android32_foldable.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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_android32_foldable", - "path": ".android_emulator/generic_android32_foldable" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android32_foldable" - } - ] - }, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android32_foldable.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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_android32_foldable", - "path": ".android_emulator/generic_android32_foldable" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android32_foldable" - } - ] - }, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android32_foldable.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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_android32_foldable", - "path": ".android_emulator/generic_android32_foldable" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android32_foldable" - } - ] - }, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android32_foldable.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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_android32_foldable", - "path": ".android_emulator/generic_android32_foldable" - } - ], - "optional_dimensions": { - "60": [ - { - "caches": "generic_android32_foldable" - } - ] - }, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android32_foldable.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -24350,221 +23139,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_instrumentation_test_apk" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -24935,17 +23509,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "name": "weblayer_junit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ] }, @@ -28817,8 +27380,7 @@ "additional_compile_targets": [ "cronet_test_instrumentation_apk", "chrome_nocompile_tests", - "monochrome_static_initializers", - "weblayer_shell" + "monochrome_static_initializers" ], "gtest_tests": [ { @@ -31406,227 +29968,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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" - } - ], - "quickrun_shards": 2, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "wtf_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -32046,18 +30387,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "isolate_profile_data": true, - "name": "weblayer_junit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ], "scripts": [ @@ -35807,183 +34136,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", - "--avd-config=../../tools/android/avd/proto/generic_android23.textpb" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "wtf_unittests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -39903,306 +38055,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", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "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", - "weblayer_instrumentation_test_apk" - ], - "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, - "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_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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "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", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "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", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices", "--avd-config=../../tools/android/avd/proto/generic_android24.textpb", "--gtest_filter=-android.assist.cts.WebViewTest#testWebView" ], @@ -40997,18 +38849,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "isolate_profile_data": true, - "name": "weblayer_junit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ], "scripts": [ @@ -41030,8 +38870,7 @@ "android-pie-arm64-coverage-experimental-rel": { "additional_compile_targets": [ "monochrome_static_initializers", - "validate_expectations", - "weblayer_shell" + "validate_expectations" ], "gtest_tests": [ { @@ -44167,8 +42006,7 @@ }, "android-pie-arm64-rel": { "additional_compile_targets": [ - "monochrome_static_initializers", - "weblayer_shell" + "monochrome_static_initializers" ], "gtest_tests": [ { @@ -44774,50 +42612,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_64_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -48664,301 +46458,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "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", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "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", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "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", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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", "webview_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py"
diff --git a/testing/buildbot/chromium.clang.json b/testing/buildbot/chromium.clang.json index 2326ea6..1ec26ff 100644 --- a/testing/buildbot/chromium.clang.json +++ b/testing/buildbot/chromium.clang.json
@@ -1407,40 +1407,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -3198,42 +3164,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -4882,42 +4812,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -7978,17 +7872,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "name": "weblayer_junit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ] }, @@ -12338,40 +12221,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -14127,46 +13976,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -15664,40 +15473,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -17286,42 +17061,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -19525,40 +19264,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -21064,40 +20769,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -27818,30 +27489,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -29074,30 +28721,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -30298,30 +29921,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -32094,42 +31693,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -33934,42 +33497,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -35774,42 +35301,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -38136,42 +37627,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -39976,42 +39431,6 @@ ], "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10", - "pool": "chrome.tests" - } - ], - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -43501,40 +42920,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-19042" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-19042" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.dev.json b/testing/buildbot/chromium.dev.json index a62c82a0..a2aa5303 100644 --- a/testing/buildbot/chromium.dev.json +++ b/testing/buildbot/chromium.dev.json
@@ -90,50 +90,6 @@ }, "test": "chrome_modern_public_bundle_smoke_test", "test_id_prefix": "ninja://chrome/android:chrome_modern_public_bundle_smoke_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "dimension_sets": [ - { - "device_os": "MMB29Q", - "device_os_type": "userdebug", - "device_type": "bullhead", - "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-dev@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" } ] },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index b229b12..83b4c50 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -1478,40 +1478,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -5572,52 +5538,6 @@ "hard_timeout": 7200, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-20.04" - } - ], - "expiration": 10800, - "hard_timeout": 7200, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-20.04" - } - ], - "expiration": 10800, - "hard_timeout": 7200, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -8936,28 +8856,6 @@ "swarming": { "can_use_on_swarming_builders": false }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": false - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": false - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -13025,231 +12923,6 @@ "--bucket", "chromium-result-details", "--test-name", - "weblayer_browsertests" - ], - "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, - "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": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_bundle_test" - ], - "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, - "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": "weblayer_bundle_test", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_bundle_test/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_instrumentation_test_apk" - ], - "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, - "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": "weblayer_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_private_instrumentation_test_apk" - ], - "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, - "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": "weblayer_private_instrumentation_test_apk", - "test_id_prefix": "ninja://weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "weblayer_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, - "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": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "isolate_profile_data": true, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", "webview_cts_tests" ], "script": "//build/android/pylib/results/presentation/test_results_presentation.py" @@ -13716,18 +13389,6 @@ "swarming": {}, "test": "webapk_shell_apk_junit_tests", "test_id_prefix": "ninja://chrome/android/webapk/shell_apk:webapk_shell_apk_junit_tests/" - }, - { - "experiment_percentage": 100, - "isolate_profile_data": true, - "name": "weblayer_junit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": {}, - "test": "weblayer_junit_tests", - "test_id_prefix": "ninja://weblayer/browser/java:weblayer_junit_tests/" } ] }, @@ -92803,48 +92464,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--enable-features=PartitionAllocBackupRefPtr:enabled-processes/non-renderer" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--enable-features=PartitionAllocBackupRefPtr:enabled-processes/non-renderer" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -98556,42 +98175,6 @@ ], "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" - } - ], - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -106510,46 +106093,6 @@ "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/" }, @@ -116859,32 +116402,6 @@ "can_use_on_swarming_builders": true, "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, - "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, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -119005,48 +118522,6 @@ "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/" },
diff --git a/testing/buildbot/chromium.linux.json b/testing/buildbot/chromium.linux.json index 6173da29..0f39f23 100644 --- a/testing/buildbot/chromium.linux.json +++ b/testing/buildbot/chromium.linux.json
@@ -3407,42 +3407,6 @@ ], "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" - } - ], - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -5921,50 +5885,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--no-xvfb", - "--use-weston", - "--ozone-platform=wayland" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--no-xvfb", - "--use-weston", - "--ozone-platform=wayland" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -7460,40 +7380,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index e57634c..3c3a15e 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -1683,46 +1683,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -3472,46 +3432,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -5092,40 +5012,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -10701,48 +10587,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "cpu": "x86-64", - "os": "Ubuntu-16.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -12481,46 +12325,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "args": [ - "--test-launcher-print-test-stdio=always" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -22880,40 +22684,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Ubuntu-18.04" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -24575,40 +24345,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-15063" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-10-15063" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/chromium.perf.json b/testing/buildbot/chromium.perf.json index 2a57f4a9..e124092 100644 --- a/testing/buildbot/chromium.perf.json +++ b/testing/buildbot/chromium.perf.json
@@ -662,54 +662,6 @@ "script": "//tools/perf/process_perf_results.py" } }, - "android-pixel2_weblayer-perf": { - "isolated_scripts": [ - { - "args": [ - "-v", - "--browser=android-weblayer", - "--upload-results", - "--test-shard-map-filename=android-pixel2_weblayer-perf_map.json" - ], - "isolate_name": "performance_weblayer_test_suite", - "merge": { - "script": "//tools/perf/process_perf_results.py" - }, - "name": "performance_weblayer_test_suite", - "override_compile_targets": [ - "performance_weblayer_test_suite" - ], - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_os": "OPM1.171019.021", - "device_os_flavor": "google", - "device_type": "walleye", - "os": "Android", - "pool": "chrome.tests.perf-weblayer" - } - ], - "expiration": 7200, - "hard_timeout": 21600, - "io_timeout": 21600, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "trigger_script": { - "args": [ - "--multiple-dimension-script-verbose", - "True" - ], - "requires_simultaneous_shard_dispatch": true, - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - } - ] - }, "android-pixel2_webview-perf": { "isolated_scripts": [ { @@ -914,102 +866,6 @@ } ] }, - "android-pixel4_weblayer-perf": { - "isolated_scripts": [ - { - "args": [ - "-v", - "--browser=android-weblayer-trichrome-google-bundle", - "--upload-results", - "--test-shard-map-filename=android-pixel4_weblayer-perf_map.json" - ], - "isolate_name": "performance_weblayer_test_suite", - "merge": { - "script": "//tools/perf/process_perf_results.py" - }, - "name": "performance_weblayer_test_suite", - "override_compile_targets": [ - "performance_weblayer_test_suite" - ], - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_os": "RP1A.201105.002", - "device_os_flavor": "google", - "device_type": "flame", - "os": "Android", - "pool": "chrome.tests.perf-weblayer" - } - ], - "expiration": 7200, - "hard_timeout": 21600, - "io_timeout": 21600, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "trigger_script": { - "args": [ - "--multiple-dimension-script-verbose", - "True" - ], - "requires_simultaneous_shard_dispatch": true, - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - } - ] - }, - "android-pixel4_weblayer-perf-pgo": { - "isolated_scripts": [ - { - "args": [ - "-v", - "--browser=android-weblayer-trichrome-google-bundle", - "--upload-results", - "--test-shard-map-filename=android-pixel4_weblayer-perf-pgo_map.json" - ], - "isolate_name": "performance_weblayer_test_suite", - "merge": { - "script": "//tools/perf/process_perf_results.py" - }, - "name": "performance_weblayer_test_suite", - "override_compile_targets": [ - "performance_weblayer_test_suite" - ], - "resultdb": { - "enable": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_os": "RP1A.201105.002", - "device_os_flavor": "google", - "device_type": "flame", - "os": "Android", - "pool": "chrome.tests.perf-weblayer" - } - ], - "expiration": 7200, - "hard_timeout": 21600, - "io_timeout": 21600, - "service_account": "chrome-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "trigger_script": { - "args": [ - "--multiple-dimension-script-verbose", - "True" - ], - "requires_simultaneous_shard_dispatch": true, - "script": "//testing/trigger_scripts/perf_device_trigger.py" - } - } - ] - }, "android-pixel4_webview-perf": { "isolated_scripts": [ { @@ -1167,8 +1023,7 @@ "chromium_builder_perf", "push_apps_to_background_apk", "system_webview_apk", - "system_webview_shell_apk", - "telemetry_weblayer_apks" + "system_webview_shell_apk" ], "isolated_scripts": [ { @@ -1408,8 +1263,7 @@ "chromium_builder_perf", "push_apps_to_background_apk", "system_webview_apk", - "system_webview_shell_apk", - "telemetry_weblayer_apks" + "system_webview_shell_apk" ] }, "chromecast-linux-builder-perf": {
diff --git a/testing/buildbot/chromium.win.json b/testing/buildbot/chromium.win.json index 651437ba..365afe5e 100644 --- a/testing/buildbot/chromium.win.json +++ b/testing/buildbot/chromium.win.json
@@ -1647,40 +1647,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-7-SP1" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "os": "Windows-7-SP1" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -3992,44 +3958,6 @@ ], "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" - } - ], - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -6168,42 +6096,6 @@ ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "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" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -8392,44 +8284,6 @@ ], "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-11-22000" - } - ], - "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-11-22000" - } - ], - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" }, @@ -10105,30 +9959,6 @@ "can_use_on_swarming_builders": true, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, - "test": "weblayer_browsertests", - "test_id_prefix": "ninja://weblayer/test:weblayer_browsertests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "weblayer_unittests", - "test_id_prefix": "ninja://weblayer/test:weblayer_unittests/" - }, - { - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "swarming": { - "can_use_on_swarming_builders": true, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, "test": "wm_unittests", "test_id_prefix": "ninja://ui/wm:wm_unittests/" },
diff --git a/testing/buildbot/gn_isolate_map.pyl b/testing/buildbot/gn_isolate_map.pyl index dc918abd..d2e89a6 100644 --- a/testing/buildbot/gn_isolate_map.pyl +++ b/testing/buildbot/gn_isolate_map.pyl
@@ -1505,14 +1505,6 @@ "script": "//third_party/catapult/devil/devil/android/tools/system_app.py", "type": "script", }, - "performance_weblayer_test_suite": { - "args": [ - "../../tools/perf/run_benchmark", - ], - "label": "//chrome/test:performance_weblayer_test_suite", - "script": "//testing/scripts/run_performance_tests.py", - "type": "script", - }, "polymer_tools_python_unittests": { "args": [ "../../tools/polymer/run_polymer_tools_tests.py", @@ -1795,10 +1787,6 @@ "script": "//testing/scripts/run_telemetry_as_googletest.py", "type": "script", }, - "telemetry_weblayer_apks": { - "label": "//tools/perf/chrome_telemetry_build:telemetry_weblayer_apks", - "type": "additional_compile_target", - }, "test_ash_chrome": { "label": "//chrome/test:test_ash_chrome", "type": "additional_compile_target", @@ -2033,18 +2021,6 @@ "${ISOLATED_OUTDIR}", ], }, - "weblayer_browsertests": { - "label": "//weblayer/test:weblayer_browsertests", - "type": "windowed_test_launcher", - }, - "weblayer_shell_wpt": { - "label": "//weblayer/shell/android:weblayer_shell_wpt", - "type": "generated_script", - }, - "weblayer_unittests": { - "label": "//weblayer/test:weblayer_unittests", - "type": "windowed_test_launcher", - }, "webview_cts_tests": { "args": [ "--skip-expected-failures", @@ -2116,26 +2092,6 @@ "label": "//android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk", "type": "console_test_launcher", }, - "weblayer_bundle_test": { - "label": "//weblayer/browser/android/javatests:weblayer_bundle_test", - "type": "console_test_launcher", - }, - "weblayer_instrumentation_test_apk": { - "label": "//weblayer/browser/android/javatests:weblayer_instrumentation_test_apk", - "type": "console_test_launcher", - }, - "weblayer_junit_tests": { - "label": "//weblayer/browser/java:weblayer_junit_tests", - "type": "junit_test", - }, - "weblayer_private_instrumentation_test_apk": { - "label": "//weblayer/browser/android/javatests:weblayer_private_instrumentation_test_apk", - "type": "console_test_launcher", - }, - "weblayer_shell": { - "label": "//weblayer/shell/android:run_weblayer_shell", - "type": "additional_compile_target", - }, "wm_unittests": { "label": "//ui/wm:wm_unittests", "type": "windowed_test_launcher",
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 8a2e1626..b5d4831 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -53,12 +53,6 @@ 'quickrun_shards': 3, }, }, - 'android-marshmallow-x86-fyi-rel-reviver': { - 'swarming': { - 'shards': 2, - 'quickrun_shards': 6, - }, - }, 'android-marshmallow-x86-rel': { 'swarming': { 'shards': 2, @@ -1330,13 +1324,6 @@ 'service_account': 'chrome-gold-dev@chops-service-accounts.iam.gserviceaccount.com' }, }, - 'android-marshmallow-x86-fyi-rel-reviver': { - 'swarming': { - # TODO(crbug.com/1127110): Revisit shards and machine_type if there - # are n2 machines available in the test pool. - 'shards': 25, - }, - }, 'android-marshmallow-x86-rel': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.chrome_public_test_apk.filter', @@ -1387,7 +1374,6 @@ 'chrome_public_test_apk_with_playstore': { 'remove_from': [ # Android Emulator does not ship playstore image on Marshmallow. - 'android-marshmallow-x86-fyi-rel-reviver', 'android-marshmallow-x86-rel', ], 'modifications': { @@ -1903,11 +1889,6 @@ '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12.content_shell_test_apk.filter', ], }, - 'android-marshmallow-x86-fyi-rel-reviver': { - 'swarming': { - 'quickrun_shards': 8, - }, - }, 'android-marshmallow-x86-rel': { 'args': [ '--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_m.content_shell_test_apk.filter', @@ -4031,70 +4012,6 @@ }, }, }, - 'weblayer_browsertests': { - 'remove_from': [ - 'android-pie-arm64-rel', # crbug.com/1354867 - ], - }, - 'weblayer_bundle_test': { - 'remove_from': [ - 'android-marshmallow-x86-rel-non-cq', # crbug.com/1088013 - 'android-pie-arm64-rel', # crbug.com/1354867 - 'android-11-x86-rel', # crbug.com/1165280 - ], - }, - 'weblayer_instrumentation_test_apk': { - 'remove_from': [ - 'android-marshmallow-x86-rel-non-cq', # crbug.com/1088013 - 'android-pie-arm64-rel', # crbug.com/1354867 - 'android-11-x86-rel', # crbug.com/1165280 - ], - 'modifications': { - 'android-marshmallow-arm64-rel': { - 'swarming': { - 'quickrun_shards': 2, - }, - }, - 'android-nougat-x86-rel': { - 'swarming': { - 'dimension_sets': [ - { - 'machine_type': 'e2-standard-8', # use 8-core to shorten runtime - }, - ], - }, - }, - }, - }, - 'weblayer_private_instrumentation_test_apk': { - 'modifications': { - # TODO(crbug.com/1189403): Remove the filter once the issue is fixed. - 'android-11-x86-rel': { - 'args': [ - '--gtest_filter=-org.chromium.weblayer.test.MediaCaptureTest.*', - ], - }, - 'android-12-x64-rel': { - 'args': [ - # crbug.com/1275200 - '--gtest_filter=-org.chromium.weblayer.test.BrowserControlsTest.testTopExpandedOnLoadWhenOnlyExpandAtTop', - ], - }, - }, - }, - 'weblayer_shell_wpt': { - 'modifications': { - 'android-weblayer-pie-x86-wpt-smoketest': { - 'args': [ - '--default-exclude', - '--include-file=../../third_party/blink/web_tests/android/WPTSmokeTestCases', - ], - 'swarming': { - 'shards': 1, - }, - }, - }, - }, 'webview_64_cts_tests': { 'modifications': { 'android-pie-arm64-rel': { @@ -4158,11 +4075,6 @@ '--gtest_filter=-org.chromium.net.NetworkChangeNotifierTest.testNetworkChangeNotifierJavaObservers', ], }, - 'android-marshmallow-x86-fyi-rel-reviver': { - 'swarming': { - 'shards': 9, - }, - }, 'android-marshmallow-x86-rel': { 'swarming': { 'shards': 9,
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 6273499..e422b20 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -238,8 +238,6 @@ }, }, 'viz_unittests': {}, - 'weblayer_bundle_test': {}, - 'weblayer_instrumentation_test_apk': {}, 'webview_instrumentation_test_apk': { 'swarming': { 'shards': 7, @@ -1140,13 +1138,6 @@ 'nougat-x86-emulator', ], }, - 'weblayer_junit_tests': { - 'remove_mixins': [ - 'nougat-x86-emulator', - ], - # Experimental until we're sure these are stable. - 'experiment_percentage': 100 - }, }, 'chromium_linux_scripts': { @@ -1188,7 +1179,6 @@ 'chromium_swarm_android_gtests': { 'base_unittests': {}, 'chrome_modern_public_bundle_smoke_test': {}, - 'weblayer_bundle_test': {}, }, 'chromium_swarm_desktop_gtests': { @@ -4855,43 +4845,6 @@ 'web_runner_integration_tests': {}, }, - 'weblayer_android_gtests': { - 'weblayer_bundle_test': { - }, - 'weblayer_instrumentation_test_apk': { - }, - 'weblayer_private_instrumentation_test_apk': { - }, - }, - - 'weblayer_gtests': { - 'weblayer_browsertests': { - }, - 'weblayer_unittests': { - }, - }, - - 'weblayer_shell_wpt': { - 'weblayer_shell_wpt': { - 'args': [ - '--no-wpt-internal', - ], - 'swarming': { - 'shards': 18, - 'expiration': 18000, - 'hard_timeout': 14400, - }, - 'experiment_percentage': 100, - 'merge': { - 'args': [ - '--verbose', - ], - 'script': '//third_party/blink/tools/merge_web_test_results.py', - }, - 'results_handler': 'layout tests', - }, - }, - 'webrtc_chromium_baremetal_gtests': { 'browser_tests': { 'args': [ @@ -5341,8 +5294,6 @@ 'chromium_gtests', 'vr_android_specific_chromium_tests', 'vr_platform_specific_chromium_gtests', - 'weblayer_android_gtests', - 'weblayer_gtests', ], # List gtests that run on android-marshmallow-x86-rel builder. @@ -5365,8 +5316,6 @@ # chromium_gtests are enabled in this suite. 'components_capacity_tests', 'linux_flavor_specific_chromium_gtests', - #'weblayer_android_gtests', - #'weblayer_gtests', ], # Note that tests here are gradually moved to @@ -5378,8 +5327,6 @@ # is android_wpr_record_replay_tests 'android_marshmallow_emulator_non_cq_gtests': [ 'chromium_gtests', - 'weblayer_android_gtests', - 'weblayer_gtests', ], 'android_marshmallow_gtests': [ @@ -5392,8 +5339,6 @@ 'linux_flavor_specific_chromium_gtests', 'vr_android_specific_chromium_tests', 'vr_platform_specific_chromium_gtests', - 'weblayer_android_gtests', - 'weblayer_gtests', ], 'android_nougat_emulator_gtests': [ @@ -5406,8 +5351,6 @@ 'chromium_gtests_for_devices_with_graphical_output', 'linux_flavor_specific_chromium_gtests', 'system_webview_shell_instrumentation_tests', # Not an experimental test - 'weblayer_android_gtests', - 'weblayer_gtests', 'webview_cts_tests_gtest', 'webview_ui_instrumentation_tests', ], @@ -5429,8 +5372,7 @@ # This is the same as 'chromium_android_gtests' # with the addition of 'android_modern_smoke_tests', - # 'webview_cts_tests_gtest', 'webview_ui_instrumentation_tests', - # 'weblayer_android_gtests', and 'weblayer_gtests'. + # 'webview_cts_tests_gtest', and 'webview_ui_instrumentation_tests', 'android_pie_coverage_gtests': [ 'android_modern_smoke_tests', 'android_smoke_tests', @@ -5441,8 +5383,6 @@ 'linux_flavor_specific_chromium_gtests', 'vr_android_specific_chromium_tests', 'vr_platform_specific_chromium_gtests', - 'weblayer_android_gtests', - 'weblayer_gtests', 'webview_cts_tests_gtest', 'webview_ui_instrumentation_tests', ], @@ -5471,8 +5411,6 @@ 'chromium_gtests_for_devices_with_graphical_output', 'linux_flavor_specific_chromium_gtests', 'system_webview_shell_instrumentation_tests', # Not an experimental test - 'weblayer_android_gtests', - 'weblayer_gtests', 'webview_cts_tests_gtest', 'webview_ui_instrumentation_tests', ], @@ -5493,8 +5431,6 @@ 'system_webview_shell_instrumentation_tests', # 'vr_android_specific_chromium_tests', # 'vr_platform_specific_chromium_gtests', - # 'weblayer_android_gtests', - 'weblayer_gtests', 'webview_64_cts_tests_gtest', 'webview_ui_instrumentation_tests', ], @@ -5570,7 +5506,6 @@ 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', 'overlay_prioritization_gtests', - 'weblayer_gtests', ], # This is meant to be a superset of 'chromium_linux_and_gl_gtests'. Any @@ -5590,7 +5525,6 @@ 'non_android_and_cast_and_chromeos_chromium_gtests', 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', - 'weblayer_gtests', ], # gl_tests requires dedicated slaves with GPUs on linux, so have a separate @@ -5609,7 +5543,6 @@ 'non_android_and_cast_and_chromeos_chromium_gtests', 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', - 'weblayer_gtests', ], 'chromium_linux_cast_audio_gtests': [ @@ -5648,7 +5581,6 @@ 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', 'overlay_prioritization_gtests', - 'weblayer_gtests', ], 'chromium_linux_rel_isolated_scripts': [ @@ -5733,7 +5665,6 @@ 'non_android_chromium_gtests_skia_gold', 'pixel_browser_tests_gtests', 'vr_platform_specific_chromium_gtests', - 'weblayer_gtests', 'win_specific_chromium_gtests', ], @@ -5767,7 +5698,6 @@ 'non_android_and_cast_and_chromeos_chromium_gtests', 'non_android_chromium_gtests', 'vr_platform_specific_chromium_gtests', - 'weblayer_gtests', 'win_specific_chromium_gtests', ], @@ -6313,8 +6243,6 @@ 'chromium_gtests_for_devices_with_graphical_output': {}, 'linux_flavor_specific_chromium_gtests': {}, 'system_webview_shell_instrumentation_tests': {}, # Not an experimental test - 'weblayer_android_gtests': {}, - 'weblayer_gtests': {}, 'webview_trichrome_cts_tests': { 'variants': [ 'WEBVIEW_TRICHROME_FULL_CTS_TESTS', @@ -6337,8 +6265,6 @@ 'chromium_gtests_for_devices_with_graphical_output': {}, 'linux_flavor_specific_chromium_gtests': {}, 'system_webview_shell_instrumentation_tests': {}, # Not an experimental test - 'weblayer_android_gtests': {}, - 'weblayer_gtests': {}, 'webview_trichrome_64_cts_tests': { 'variants': [ 'WEBVIEW_TRICHROME_FULL_CTS_TESTS', @@ -6357,8 +6283,6 @@ 'chromium_gtests_for_devices_with_graphical_output': {}, 'linux_flavor_specific_chromium_gtests': {}, 'system_webview_shell_instrumentation_tests': {}, # Not an experimental test - 'weblayer_android_gtests': {}, - 'weblayer_gtests': {}, 'webview_ui_instrumentation_tests': {}, },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index cb359375..941741b0 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -988,7 +988,6 @@ 'cronet_test_instrumentation_apk', 'chrome_nocompile_tests', 'monochrome_static_initializers', - 'weblayer_shell', ], 'test_suites': { 'gtest_tests': 'android_marshmallow_device_gtests', @@ -1055,7 +1054,6 @@ 'additional_compile_targets': [ 'monochrome_static_initializers', 'validate_expectations', - 'weblayer_shell', ], 'test_suites': { 'gtest_tests': 'chromium_android_gtests', @@ -1086,7 +1084,6 @@ ], 'additional_compile_targets': [ 'monochrome_static_initializers', - 'weblayer_shell', ], 'test_suites': { 'gtest_tests': 'android_pie_rel_gtests', @@ -1200,26 +1197,6 @@ }, 'os_type': 'android', }, - # A builder for early prototype of test-reviver in Clank. - # TODO(crbug.com/1300020): Remove this builder once we have a way to reuse - # the built binaries or a formal solution for test-reviver. - 'android-marshmallow-x86-fyi-rel-reviver': { - 'mixins': [ - 'has_native_resultdb_integration', - 'isolate_profile_data', - 'marshmallow-x86-emulator', - 'emulator-4-cores', - 'linux-bionic', - 'x86-64', - 'gtest_run_disabled', - ], - 'os_type': 'android', - 'test_suites': { - 'gtest_tests': 'android_marshmallow_emulator_gtests', - 'isolated_scripts': 'monochrome_public_apk_checker_isolated_script', - 'scripts': 'chromium_android_scripts', - }, - }, 'android-pie-arm64-wpt-rel-non-cq': { 'mixins': [ 'has_native_resultdb_integration', @@ -1250,34 +1227,6 @@ 'scripts': 'chromium_android_scripts', } }, - 'android-weblayer-pie-x86-wpt-fyi-rel': { - 'mixins': [ - 'has_native_resultdb_integration', - 'pie-x86-emulator', - 'emulator-8-cores', - 'linux-bionic', - 'x86-64', - ], - 'test_suites': { - 'isolated_scripts': 'weblayer_shell_wpt', - }, - 'use_swarming': True, - 'os_type': 'android', - }, - 'android-weblayer-pie-x86-wpt-smoketest': { - 'mixins': [ - 'has_native_resultdb_integration', - 'pie-x86-emulator', - 'emulator-8-cores', - 'linux-bionic', - 'x86-64', - ], - 'test_suites': { - 'isolated_scripts': 'weblayer_shell_wpt', - }, - 'use_swarming': True, - 'os_type': 'android', - }, 'android-webview-12-x64-dbg-tests': { 'mixins': [ '12-x64-emulator',
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 447ea60..7226a3d 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -945,6 +945,24 @@ ] } ], + "AutofillAssistantNiuEaadharDownloadInChromeTriggering": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "params": { + "json_parameters": "\n {\n \"intent\":\"NIU_ID_DOWNLOAD\",\n \"heuristics\":[\n {\n \"conditionSet\":{\n \"urlMatches\":\"https://myaadhaar.uidai.gov.in\"\n }\n }\n ],\n \"enabledInCustomTabs\":true,\n \"enabledForSignedOutUsers\":true\n }\n " + }, + "enable_features": [ + "AutofillAssistantUrlHeuristic3" + ] + } + ] + } + ], "AutofillAssistantNiuWtvInChromeTriggering": [ { "platforms": [
diff --git a/third_party/blink/renderer/core/css/popup.css b/third_party/blink/renderer/core/css/popup.css index 518f0fb..59b53947 100644 --- a/third_party/blink/renderer/core/css/popup.css +++ b/third_party/blink/renderer/core/css/popup.css
@@ -26,10 +26,12 @@ background-color: Canvas; } -[popup]::backdrop { +[popup]:open::backdrop { /* From the (modified) fullscreen spec: https://fullscreen.spec.whatwg.org/#user-agent-level-style-sheet-defaults: */ position: fixed; inset: 0; /* Specific to [popup]: */ pointer-events: none !important; + /* https://github.com/openui/open-ui/issues/561#issuecomment-1242297093 */ + background-color: transparent; }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index d5244eea..13426e9 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2532,7 +2532,8 @@ HidePopupForcingLevel::kHideAfterAnimations); } // Then hide open pop-ups that aren't ancestors of this hint. - if (const Element* hint_ancestor = NearestOpenAncestralPopup(*this)) { + if (const Element* hint_ancestor = + NearestOpenAncestralPopup(*this, PopUpAncestorType::kNewPopUp)) { HideAllPopupsUntil(hint_ancestor, document, HidePopupFocusBehavior::kNone, HidePopupForcingLevel::kHideAfterAnimations, @@ -2543,7 +2544,8 @@ // stack, and hide any hint pop-ups. Because this pop-up isn't yet in the // stack, we call NearestOpenAncestralPopup to find this pop-up's // ancestor, if any. - const Element* auto_ancestor = NearestOpenAncestralPopup(*this); + const Element* auto_ancestor = + NearestOpenAncestralPopup(*this, PopUpAncestorType::kNewPopUp); HideAllPopupsUntil(auto_ancestor, document, HidePopupFocusBehavior::kNone, HidePopupForcingLevel::kHideAfterAnimations, HidePopupIndependence::kHideUnrelated); @@ -2636,7 +2638,8 @@ // If there is a hint showing that is a descendant of something on the // stack, then the hint should be hidden before that ancestor is hidden, // regardless of popup_independence. - hint_ancestor = NearestOpenAncestralPopup(*document.PopupHintShowing()); + hint_ancestor = NearestOpenAncestralPopup(*document.PopupHintShowing(), + PopUpAncestorType::kDefault); if (!hint_ancestor && popup_independence == HidePopupIndependence::kHideUnrelated) { document.PopupHintShowing()->HidePopUpInternal(focus_behavior, @@ -2947,8 +2950,9 @@ // pop-up found during the tree-walk is included in the search. If it is false, // the |node| parameter must be a pop-up, and the highest pop-up *below* that // starting pop- up will be returned. -const Element* Element::NearestOpenAncestralPopup(const Node& node, - bool inclusive) { +const Element* Element::NearestOpenAncestralPopup( + const Node& node, + PopUpAncestorType ancestor_type) { DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled( node.GetDocument().GetExecutionContext())); // popup_positions is a map from all showing (or about-to-show) pop-ups to @@ -2971,20 +2975,18 @@ } } auto* element = DynamicTo<Element>(node); - bool new_element = - element && element->HasPopupAttribute() && !element->popupOpen(); - if (new_element) { - DCHECK(!inclusive); + if (ancestor_type == PopUpAncestorType::kNewPopUp) { + DCHECK(element && element->HasPopupAttribute() && !element->popupOpen()); popup_positions.Set(element, indx++); } // upper_bound is one above the maximum pop-up stack height to accept. It is // typically the position of the provided element. int upper_bound = popup_positions.Contains(element) ? popup_positions.at(element) : INT_MAX; - if (hint_showing && new_element) { + if (hint_showing && ancestor_type == PopUpAncestorType::kNewPopUp) { upper_bound = popup_positions.at(hint_showing); // Do not include the hint } - if (inclusive) { + if (ancestor_type == PopUpAncestorType::kInclusive) { // For inclusive mode, we need to walk up the tree until we find an open // pop-up, or an invoker for an open pop-up, and then modify the upper bound // to include the highest such pop-up found, if any. @@ -3032,7 +3034,7 @@ const AtomicString& event_type = event.type(); if (event_type == event_type_names::kMousedown) { document.SetPopUpMousedownTarget( - NearestOpenAncestralPopup(*target_node, /*inclusive*/ true)); + NearestOpenAncestralPopup(*target_node, PopUpAncestorType::kInclusive)); } else if (event_type == event_type_names::kMouseup) { // Hide everything up to the clicked element. We do this on mouseup, // rather than mousedown or click, primarily for accessibility concerns. @@ -3043,7 +3045,7 @@ // mouse-drag on a pop-up, and finishes off the pop-up (to highlight text), // the ancestral pop-up is stored in mousedown and compared here. auto* ancestor_pop_up = - NearestOpenAncestralPopup(*target_node, /*inclusive*/ true); + NearestOpenAncestralPopup(*target_node, PopUpAncestorType::kInclusive); bool same_target = ancestor_pop_up == document.PopUpMousedownTarget(); document.SetPopUpMousedownTarget(nullptr); if (same_target) { @@ -6209,10 +6211,11 @@ document.TopmostPopupAutoOrHint()) { // If there's a pop-up showing, and we focus an element, hide all pop-ups // outside the that element's pop-up tree, including unrelated pop-ups. - HideAllPopupsUntil(NearestOpenAncestralPopup(*this, /*inclusive*/ true), - document, HidePopupFocusBehavior::kNone, - HidePopupForcingLevel::kHideAfterAnimations, - HidePopupIndependence::kHideUnrelated); + HideAllPopupsUntil( + NearestOpenAncestralPopup(*this, PopUpAncestorType::kInclusive), + document, HidePopupFocusBehavior::kNone, + HidePopupForcingLevel::kHideAfterAnimations, + HidePopupIndependence::kHideUnrelated); } }
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index ddb7194..49256bfb 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -193,6 +193,12 @@ kHideUnrelated, }; +enum class PopUpAncestorType { + kDefault, + kNewPopUp, + kInclusive, +}; + typedef HeapVector<Member<Attr>> AttrNodeList; typedef HashMap<AtomicString, SpecificTrustedType> AttrNameToTrustedType; @@ -600,8 +606,8 @@ void HidePopUpInternal(HidePopupFocusBehavior focus_behavior, HidePopupForcingLevel forcing_level); void PopupHideFinishIfNeeded(); - static const Element* NearestOpenAncestralPopup(const Node& node, - bool inclusive = false); + static const Element* NearestOpenAncestralPopup(const Node&, + PopUpAncestorType); // Retrieves the element pointed to by this element's 'anchor' content // attribute, if that element exists, and if this element is a pop-up. Element* anchorElement() const;
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index 3870c02..7225efb7 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -336,7 +336,6 @@ visitor->Trace(lifecycle_observers_); visitor->Trace(fullscreen_video_elements_); visitor->Trace(pending_transform_updates_); - visitor->Trace(pending_opacity_updates_); } void LocalFrameView::ForAllChildViewsAndPlugins( @@ -5019,52 +5018,17 @@ return true; } -bool LocalFrameView::UpdateAllPendingTransforms() { +void LocalFrameView::UpdateAllPendingTransforms() { DCHECK(GetFrame().IsLocalRoot() || !IsAttached()); - bool updated = false; - ForAllNonThrottledLocalFrameViews([&updated](LocalFrameView& frame_view) { + ForAllNonThrottledLocalFrameViews([](LocalFrameView& frame_view) { if (frame_view.pending_transform_updates_) { for (const LayoutObject* object : *frame_view.pending_transform_updates_) { PaintPropertyTreeBuilder::DirectlyUpdateTransformMatrix(*object); - updated = true; } frame_view.pending_transform_updates_->clear(); } }); - return updated; } -void LocalFrameView::AddPendingOpacityUpdate(LayoutObject& object) { - if (!pending_opacity_updates_) { - pending_opacity_updates_ = - MakeGarbageCollected<HeapHashSet<Member<LayoutObject>>>(); - } - pending_opacity_updates_->insert(&object); -} - -bool LocalFrameView::RemovePendingOpacityUpdate(const LayoutObject& object) { - if (!pending_opacity_updates_) - return false; - auto it = pending_opacity_updates_->find(const_cast<LayoutObject*>(&object)); - if (it == pending_opacity_updates_->end()) - return false; - pending_opacity_updates_->erase(it); - return true; -} - -bool LocalFrameView::UpdateAllPendingOpacityUpdates() { - DCHECK(GetFrame().IsLocalRoot() || !IsAttached()); - bool updated = false; - ForAllNonThrottledLocalFrameViews([&updated](LocalFrameView& frame_view) { - if (frame_view.pending_opacity_updates_) { - for (const LayoutObject* object : *frame_view.pending_opacity_updates_) { - PaintPropertyTreeBuilder::DirectlyUpdateOpacityValue(*object); - updated = true; - } - frame_view.pending_opacity_updates_->clear(); - } - }); - return updated; -} } // namespace blink
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 328b541..7fab93b 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -769,11 +769,7 @@ void AddPendingTransformUpdate(LayoutObject& object); bool RemovePendingTransformUpdate(const LayoutObject& object); - bool UpdateAllPendingTransforms(); - - void AddPendingOpacityUpdate(LayoutObject& object); - bool RemovePendingOpacityUpdate(const LayoutObject& object); - bool UpdateAllPendingOpacityUpdates(); + void UpdateAllPendingTransforms(); protected: void FrameRectsChanged(const gfx::Rect&) override; @@ -1180,9 +1176,7 @@ // possible, avoids needing to walk the tree to update them. See: // https://chromium.googlesource.com/chromium/src/+/main/third_party/blink/renderer/core/paint/README.md#Transform-update-optimization // for more on the fast path - // TODO(yotha): unify these into one HeapHashMap. Member<HeapHashSet<Member<LayoutObject>>> pending_transform_updates_; - Member<HeapHashSet<Member<LayoutObject>>> pending_opacity_updates_; // TODO(1370937): Currently we don't yet know how to handle soft navigation // UKM reporting. This flag indicates that First Contentful Paint was reported
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 6388af3..d1e4c49 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -2646,6 +2646,9 @@ return PhysicalBackgroundRect(kBackgroundKnownOpaqueRect).Contains(rect); } +// Note that callers are responsible for checking +// ChildPaintBlockedByDisplayLock(), since that is a property of the parent +// rather than of the child. static bool IsCandidateForOpaquenessTest(const LayoutBox& child_box) { // Skip all layers to simplify ForegroundIsKnownToBeOpaqueInRect(). This // covers cases of clipped, transformed, translucent, composited, etc. @@ -2669,6 +2672,8 @@ NOT_DESTROYED(); if (!max_depth_to_test) return false; + if (ChildPaintBlockedByDisplayLock()) + return false; for (LayoutObject* child = SlowFirstChild(); child; child = child->NextSibling()) { // We do not bother checking descendants of |LayoutInline|, including
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index e73b051..13e3e2e7 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -3674,7 +3674,6 @@ if (GetFrameView()) { GetFrameView()->RemovePendingTransformUpdate(*this); - GetFrameView()->RemovePendingOpacityUpdate(*this); SetIsBackgroundAttachmentFixedObject(false); } }
diff --git a/third_party/blink/renderer/core/paint/README.md b/third_party/blink/renderer/core/paint/README.md index af393b2..c13720a 100644 --- a/third_party/blink/renderer/core/paint/README.md +++ b/third_party/blink/renderer/core/paint/README.md
@@ -462,9 +462,9 @@ from its containing self-painting layer to this layer, assuming that this layer needs all paint phases that its container self-painting layer needs. -### Property tree update optimization +### Transform update optimization -In some specific cases of style updates, we can directly update the property +In specific cases of a transform update, we can directly update the property tree without needing to run the property tree builder (Which requires a layout tree walk). During `PaintLayer::StyleDidChange` we check if this update meets the requirements for a quick update, and if so we add it to a list of pending @@ -472,13 +472,9 @@ changes can't be detected correctly). The updates are executed later in `PrePaintTreeWalk::WalkTree` using the -the designated functions (For example - -`LocalFrameView::UpdateAllPendingTransforms`). If at some point during -pre-paint we reach a node that has a pending update, we mark that node as needs -full update, and remove the pending update from the list. - -Current updates that are checked for an optimized update are transform updates -and opacity updates. +`LocalFrameView::UpdateAllPendingTransforms`. If at some point during pre-paint +we reach a node that has a pending update, we mark that node as needs full +update, and remove the pending update from the list. ### Hit test information recording
diff --git a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc index c6e446e2..56b5a04 100644 --- a/third_party/blink/renderer/core/paint/compositing/compositing_test.cc +++ b/third_party/blink/renderer/core/paint/compositing/compositing_test.cc
@@ -981,75 +981,6 @@ EXPECT_FALSE(transform_node->transform_changed); } -// Same as the test above but for opacity changes -TEST_P(CompositingSimTest, FastPathOpacityUpdateFromStyle) { - InitializeWithHTML(R"HTML( - <!DOCTYPE html> - <style> - @keyframes animation { - 0% { opacity: 0.2; } - 100% { opacity: 0.8; } - } - #div { - opacity: 0.1; - width: 100px; - height: 100px; - /* - This causes the opacity to have an active animation, but because - the delay is so large, it will not have an effect for the duration - of this unit test. - */ - animation-name: animation; - animation-duration: 999s; - animation-delay: 999s; - } - </style> - <div id='div'></div> - )HTML"); - - Compositor().BeginFrame(); - - // Check the initial state of the blink effect node. - auto* div = GetElementById("div"); - auto* div_properties = - div->GetLayoutObject()->FirstFragment().PaintProperties(); - ASSERT_TRUE(div_properties); - EXPECT_NEAR(0.1, div_properties->Effect()->Opacity(), 0.001); - EXPECT_TRUE(div_properties->Effect()->HasActiveOpacityAnimation()); - EXPECT_FALSE(div->GetLayoutObject()->NeedsPaintPropertyUpdate()); - - // Check the initial state of the cc effect node. - auto* div_cc_layer = CcLayerByDOMElementId("div"); - auto effect_tree_index = div_cc_layer->effect_tree_index(); - const auto* effect_node = - GetPropertyTrees()->effect_tree().Node(effect_tree_index); - EXPECT_FALSE(effect_node->effect_changed); - EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate()); - EXPECT_NEAR(0.1, effect_node->opacity, 0.001); - - // Change the effect style and ensure the blink and cc effect nodes are - // not marked for a full update. - div->setAttribute(html_names::kStyleAttr, "opacity: 0.15"); - GetDocument().View()->UpdateLifecycleToLayoutClean( - DocumentUpdateReason::kTest); - EXPECT_FALSE(div->GetLayoutObject()->NeedsPaintPropertyUpdate()); - EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate()); - - // Continue to run the lifecycle to paint and ensure that updates are - // performed. - UpdateAllLifecyclePhasesExceptPaint(); - EXPECT_NEAR(0.15, div_properties->Effect()->Opacity(), 0.001); - EXPECT_NEAR(0.15, effect_node->opacity, 0.001); - EXPECT_TRUE(effect_node->effect_changed); - EXPECT_FALSE(div->GetLayoutObject()->NeedsPaintPropertyUpdate()); - EXPECT_FALSE(paint_artifact_compositor()->NeedsUpdate()); - EXPECT_TRUE(effect_node->effect_changed); - - // After a frame the |opacity_changed| value should be reset. - Compositor().BeginFrame(); - EXPECT_FALSE(effect_node->effect_changed); -} - TEST_P(CompositingSimTest, DirectSVGTransformPropertyUpdate) { InitializeWithHTML(R"HTML( <!doctype html>
diff --git a/third_party/blink/renderer/core/paint/object_paint_properties.h b/third_party/blink/renderer/core/paint/object_paint_properties.h index 7bc1c0b6..d417496 100644 --- a/third_party/blink/renderer/core/paint/object_paint_properties.h +++ b/third_party/blink/renderer/core/paint/object_paint_properties.h
@@ -321,18 +321,6 @@ std::move(transform_and_origin), animation_state); } - PaintPropertyChangeType DirectlyUpdateOpacity( - float opacity, - const EffectPaintPropertyNode::AnimationState& animation_state) { - // TODO(yotha): Remove this check once we make sure crbug.com/1370268 is - // fixed - DCHECK(effect_ != nullptr); - if (effect_ == nullptr) { - return PaintPropertyChangeType::kNodeAddedOrRemoved; - } - return effect_->DirectlyUpdateOpacity(opacity, animation_state); - } - private: // Return true if the property tree structure changes (an existing node was // deleted), and false otherwise. See the class-level comment ("update & clear
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index 9f30bbb..98c1f9e 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -2456,18 +2456,9 @@ } } - bool needs_full_opacity_update = diff.OpacityChanged(); - if (needs_full_opacity_update) { - if (PaintPropertyTreeBuilder::ScheduleDeferredOpacityNodeUpdate( - GetLayoutObject())) { - needs_full_opacity_update = false; - SetNeedsDescendantDependentFlagsUpdate(); - } - } - // See also |LayoutObject::SetStyle| which handles these invalidations if a // PaintLayer is not present. - if (needs_full_transform_update || needs_full_opacity_update || + if (needs_full_transform_update || diff.OpacityChanged() || diff.ZIndexChanged() || diff.FilterChanged() || diff.CssClipChanged() || diff.BlendModeChanged() || diff.MaskChanged() || diff.CompositingReasonsChanged()) {
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 23c1cbbb..5971312 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -851,24 +851,6 @@ } } -static void DirectlyUpdateCcOpacity(const LayoutObject& object, - ObjectPaintProperties& properties, - PaintPropertyChangeType& change_type) { - if (change_type == PaintPropertyChangeType::kChangedOnlySimpleValues && - properties.Effect()->HasDirectCompositingReasons()) { - if (auto* paint_artifact_compositor = - object.GetFrameView()->GetPaintArtifactCompositor()) { - bool updated = - paint_artifact_compositor->DirectlyUpdateCompositedOpacityValue( - *properties.Effect()); - if (updated) { - change_type = PaintPropertyChangeType::kChangedOnlyCompositedValues; - properties.Effect()->CompositorSimpleValuesUpdated(); - } - } - } -} - // TODO(dbaron): Remove this function when we can remove the // BackfaceVisibilityInteropEnabled() check, and have the caller use // CompositingReason::kDirectReasonsForTransformProperty directly. @@ -1464,9 +1446,6 @@ void FragmentPaintPropertyTreeBuilder::UpdateEffect() { DCHECK(properties_); - // Since we're doing a full update, clear list of objects waiting for a - // deferred update - object_.GetFrameView()->RemovePendingOpacityUpdate(object_); const ComputedStyle& style = object_.StyleRef(); if (NeedsPaintPropertyUpdate()) { @@ -1578,7 +1557,25 @@ // If we have simple value change, which means opacity, we should try to // directly update it on the PaintArtifactCompositor in order to avoid // doing a full rebuild. - DirectlyUpdateCcOpacity(object_, *properties_, effective_change_type); + if (effective_change_type == + PaintPropertyChangeType::kChangedOnlySimpleValues && + properties_->Effect()->HasDirectCompositingReasons() && + // TODO(crbug.com/1253797): Due to the bug, we may create multiple + // cc effect nodes for one blink effect node of a fragmented object, + // and direct update would be incomplete in the case. + !object_.FirstFragment().NextFragment()) { + if (auto* paint_artifact_compositor = + object_.GetFrameView()->GetPaintArtifactCompositor()) { + bool updated = + paint_artifact_compositor->DirectlyUpdateCompositedOpacityValue( + *properties_->Effect()); + if (updated) { + effective_change_type = + PaintPropertyChangeType::kChangedOnlyCompositedValues; + properties_->Effect()->CompositorSimpleValuesUpdated(); + } + } + } OnUpdateEffect(effective_change_type); auto mask_direct_compositing_reasons = @@ -2930,8 +2927,7 @@ // |translation_2d_to_layout_shift_root_delta|) is updated properly. // See: ../paint/README.md#Transform-update-optimization for more on // optimized transform updates - if (object_.GetFrameView()->RemovePendingTransformUpdate(object_) || - object_.GetFrameView()->RemovePendingOpacityUpdate(object_)) + if (object_.GetFrameView()->RemovePendingTransformUpdate(object_)) object_.GetMutableForPainting().SetOnlyThisNeedsPaintPropertyUpdate(); if (box.Size() == box.PreviousSize()) @@ -4198,17 +4194,6 @@ return false; } -bool PaintPropertyTreeBuilder::ScheduleDeferredOpacityNodeUpdate( - LayoutObject& object) { - if (!base::FeatureList::IsEnabled(features::kFastPathPaintPropertyUpdates)) - return false; - if (CanDoDeferredOpacityNodeUpdate(object)) { - object.GetFrameView()->AddPendingOpacityUpdate(object); - return true; - } - return false; -} - // Fast-path for directly updating transforms. Returns true if successful. This // is similar to |FragmentPaintPropertyTreeBuilder::UpdateIndividualTransform|. void PaintPropertyTreeBuilder::DirectlyUpdateTransformMatrix( @@ -4267,34 +4252,6 @@ } } -void PaintPropertyTreeBuilder::DirectlyUpdateOpacityValue( - const LayoutObject& object) { - DCHECK(CanDoDeferredOpacityNodeUpdate(object)); - const ComputedStyle& style = object.StyleRef(); - - EffectPaintPropertyNode::AnimationState animation_state; - animation_state.is_running_opacity_animation_on_compositor = - style.IsRunningOpacityAnimationOnCompositor(); - animation_state.is_running_backdrop_filter_animation_on_compositor = - style.IsRunningBackdropFilterAnimationOnCompositor(); - - FragmentData* fragment_data = &object.GetMutableForPainting().FirstFragment(); - auto* properties = fragment_data->PaintProperties(); - auto effective_change_type = - properties->DirectlyUpdateOpacity(style.Opacity(), animation_state); - // If we have simple value change, which means opacity, we should try to - // directly update it on the PaintArtifactCompositor in order to avoid - // needing to run the property tree builder at all. - DirectlyUpdateCcOpacity(object, *properties, effective_change_type); - - if (effective_change_type >= - PaintPropertyChangeType::kChangedOnlySimpleValues) { - object.GetFrameView()->SetPaintArtifactCompositorNeedsUpdate( - PaintArtifactCompositorUpdateReason:: - kPaintPropertyTreeBuilderPaintPropertyChanged); - } -} - void PaintPropertyTreeBuilder::IssueInvalidationsAfterUpdate() { // We need to update property tree states of paint chunks. auto max_change = properties_changed_.Max(); @@ -4402,38 +4359,4 @@ return true; } -bool PaintPropertyTreeBuilder::CanDoDeferredOpacityNodeUpdate( - const LayoutObject& object) { - // If we already need a full update, do not do the direct update. - if (object.NeedsPaintPropertyUpdate() || - object.DescendantNeedsPaintPropertyUpdate()) { - return false; - } - - // In some cases where we need to remove the update, objects that are not - // boxes can cause a bug. (See SetNeedsPaintPropertyUpdateIfNeeded) - if (!object.IsBox()) - return false; - - // This fast path does not support iterating over each fragment, so do not - // run the fast path in the presence of fragmentation. - if (object.FirstFragment().NextFragment()) - return false; - - auto* properties = object.FirstFragment().PaintProperties(); - // Cannot directly update properties if they have not been created yet. - if (!properties || !properties->Effect()) - return false; - - // Descendant state depends on opacity being zero, so we can't do a direct - // update if it changes - bool old_opacity_is_zero = properties->Effect()->Opacity() == 0; - bool new_opacity_is_zero = object.Style()->Opacity() == 0; - if (old_opacity_is_zero != new_opacity_is_zero) { - return false; - } - - return true; -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.h b/third_party/blink/renderer/core/paint/paint_property_tree_builder.h index 66f00d2..0bcd685 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.h +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.h
@@ -371,10 +371,8 @@ } static void DirectlyUpdateTransformMatrix(const LayoutObject& object); - static void DirectlyUpdateOpacityValue(const LayoutObject& object); static bool ScheduleDeferredTransformNodeUpdate(LayoutObject& object); - static bool ScheduleDeferredOpacityNodeUpdate(LayoutObject& object); private: ALWAYS_INLINE void InitFragmentPaintProperties( @@ -412,7 +410,6 @@ bool IsInNGFragmentTraversal() const { return pre_paint_info_; } static bool CanDoDeferredTransformNodeUpdate(const LayoutObject& object); - static bool CanDoDeferredOpacityNodeUpdate(const LayoutObject& object); const LayoutObject& object_; NGPrePaintInfo* pre_paint_info_;
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc b/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc index 8f11d0fe..ba1d707 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_update_tests.cc
@@ -1973,25 +1973,4 @@ EXPECT_EQ(200, div_properties->Transform()->Translation2D().x()); } -TEST_P(PaintPropertyTreeUpdateTest, - DirectOpacityUpdateSkipsPropertyTreeBuilder) { - SetBodyInnerHTML(R"HTML( - <div id='div' style="opacity:0.5"></div> - )HTML"); - - auto* div_properties = PaintPropertiesForElement("div"); - ASSERT_TRUE(div_properties); - EXPECT_EQ(0.5, div_properties->Effect()->Opacity()); - auto* div = GetDocument().getElementById("div"); - EXPECT_FALSE(div->GetLayoutObject()->NeedsPaintPropertyUpdate()); - - div->setAttribute(html_names::kStyleAttr, "opacity:0.8"); - GetDocument().View()->UpdateLifecycleToLayoutClean( - DocumentUpdateReason::kTest); - EXPECT_FALSE(div->GetLayoutObject()->NeedsPaintPropertyUpdate()); - - UpdateAllLifecyclePhasesExceptPaint(); - EXPECT_NEAR(0.8, div_properties->Effect()->Opacity(), 0.001); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc index 2e1ad9a1..a6a0a23 100644 --- a/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc +++ b/third_party/blink/renderer/core/paint/pre_paint_tree_walk.cc
@@ -78,10 +78,6 @@ ShowAllPropertyTrees(root_frame_view); #endif - if (root_frame_view.UpdateAllPendingTransforms() || - root_frame_view.UpdateAllPendingOpacityUpdates()) - needs_invalidate_chrome_client_ = true; - // If the page has anything changed, we need to inform the chrome client // so that the client will initiate repaint of the contents if needed (e.g. // when this page is embedded as a non-composited content of another page). @@ -89,6 +85,7 @@ if (auto* client = root_frame_view.GetChromeClient()) client->InvalidateContainer(); } + root_frame_view.UpdateAllPendingTransforms(); } void PrePaintTreeWalk::Walk(LocalFrameView& frame_view,
diff --git a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc index 125d286b..ac107e71 100644 --- a/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc +++ b/third_party/blink/renderer/modules/media_controls/elements/media_control_input_element.cc
@@ -84,6 +84,14 @@ overflow_menu_container_->setAttribute(html_names::kAriaHiddenAttr, "true"); aria_label_ = button->FastGetAttribute(html_names::kAriaLabelAttr) + " " + button->GetOverflowMenuString(); + + // The button label along with the overflow menu string will be part of + // the aria-label for the overflow label element, so all information is + // already available to the screen reader. Additionally, invoking the + // overflow label element (it's a menuitem) will invoke the button so + // the button should be hidden from screenreaders. + button->setAttribute(html_names::kAriaHiddenAttr, "true"); + UpdateOverflowSubtitleElement(button->GetOverflowMenuSubtitleString()); overflow_label_element_->ParserAppendChild(overflow_menu_container_);
diff --git a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc index 8b6d931..cea7063 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_webcodecs_video_frame.cc
@@ -22,7 +22,6 @@ #include "third_party/blink/renderer/platform/scheduler/public/post_cross_thread_task.h" #include "third_party/blink/renderer/platform/scheduler/public/worker_pool.h" #include "third_party/blink/renderer/platform/wtf/cross_thread_functional.h" -#include "ui/gfx/color_transform.h" namespace blink { @@ -248,12 +247,6 @@ MakeGarbageCollected<VideoColorSpace>(src_color_space); video_frame_handle->setColorSpace(video_frame_color_space); - gfx::ColorSpace dst_color_space = gfx::ColorSpace::CreateSRGB(); - std::unique_ptr<gfx::ColorTransform> color_transform( - gfx::ColorTransform::NewColorTransform(src_color_space, dst_color_space)); - video_frame_handle->setColorConversionShaderFunc( - color_transform->GetShaderSource().c_str()); - // Bookkeeping of imported video frames. GLuint tex0 = info_array[0]->texture()->Object(); tex0_to_video_frame_map_.insert(tex0, frame);
diff --git a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc index b23bab2..28a479bf 100644 --- a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc +++ b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.cc
@@ -42,8 +42,18 @@ } bool opacity_changed = opacity != other.opacity; bool opacity_change_is_simple = - IsOpacityChangeSimple(opacity, other.opacity, direct_compositing_reasons, - other.direct_compositing_reasons); + opacity_changed && + // Opacity change is simple if + // - opacity doesn't change from or to 1, or + // - there was and is active opacity animation, or + // TODO(crbug.com/1285498): Optimize for will-change: opacity. + // The rule is because whether opacity is 1 affects whether the effect + // should create a render surface if there is no active opacity animation. + ((opacity != 1.f && other.opacity != 1.f) || + ((direct_compositing_reasons & + CompositingReason::kActiveOpacityAnimation) && + (other.direct_compositing_reasons & + CompositingReason::kActiveOpacityAnimation))); if (opacity_changed && !opacity_change_is_simple) { DCHECK(!animation_state.is_running_opacity_animation_on_compositor); return PaintPropertyChangeType::kChangedOnlyValues; @@ -84,19 +94,6 @@ return PaintPropertyChangeType::kUnchanged; } -bool EffectPaintPropertyNode::State::IsOpacityChangeSimple( - float opacity, - float new_opacity, - CompositingReasons direct_compositing_reasons, - CompositingReasons new_direct_compositing_reasons) { - bool opacity_changed = opacity != new_opacity; - return opacity_changed && ((opacity != 1.f && new_opacity != 1.f) || - ((direct_compositing_reasons & - CompositingReason::kActiveOpacityAnimation) && - (new_direct_compositing_reasons & - CompositingReason::kActiveOpacityAnimation))); -} - const EffectPaintPropertyNode& EffectPaintPropertyNode::Root() { DEFINE_STATIC_REF(EffectPaintPropertyNode, root, base::AdoptRef(new EffectPaintPropertyNode( @@ -152,40 +149,6 @@ } } -PaintPropertyChangeType EffectPaintPropertyNode::State::ComputeOpacityChange( - float new_opacity, - const AnimationState& animation_state) const { - bool opacity_changed = opacity != new_opacity; - bool opacity_change_is_simple = State::IsOpacityChangeSimple( - opacity, new_opacity, direct_compositing_reasons, - direct_compositing_reasons); - if (opacity_changed && !opacity_change_is_simple) { - DCHECK(!animation_state.is_running_opacity_animation_on_compositor); - return PaintPropertyChangeType::kChangedOnlyValues; - } - - bool simple_values_changed = - opacity_change_is_simple && - !animation_state.is_running_opacity_animation_on_compositor; - if (simple_values_changed) { - return PaintPropertyChangeType::kChangedOnlySimpleValues; - } - if (opacity_changed) { - return PaintPropertyChangeType::kChangedOnlyCompositedValues; - } - return PaintPropertyChangeType::kUnchanged; -} - -PaintPropertyChangeType EffectPaintPropertyNode::DirectlyUpdateOpacity( - float opacity, - const AnimationState& animation_state) { - auto change = state_.ComputeOpacityChange(opacity, animation_state); - state_.opacity = opacity; - if (change != PaintPropertyChangeType::kUnchanged) - AddChanged(change); - return change; -} - gfx::RectF EffectPaintPropertyNode::MapRect(const gfx::RectF& rect) const { if (state_.filter.IsEmpty()) return rect;
diff --git a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h index e98e719..e40a762 100644 --- a/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/effect_paint_property_node.h
@@ -132,22 +132,6 @@ PaintPropertyChangeType ComputeChange( const State& other, const AnimationState& animation_state) const; - - PaintPropertyChangeType ComputeOpacityChange( - float opacity, - const AnimationState& animation_state) const; - - // Opacity change is simple if - // - opacity doesn't change from or to 1, or - // - there was and is active opacity animation, or - // TODO(crbug.com/1285498): Optimize for will-change: opacity. - // The rule is because whether opacity is 1 affects whether the effect - // should create a render surface if there is no active opacity animation. - static bool IsOpacityChangeSimple( - float opacity, - float new_opacity, - CompositingReasons direct_compositing_reasons, - CompositingReasons new_direct_compositing_reasons); }; // This node is really a sentinel, and does not represent a real effect. @@ -173,10 +157,6 @@ return std::max(parent_changed, state_changed); } - PaintPropertyChangeType DirectlyUpdateOpacity( - float opacity, - const AnimationState& animation_state); - const EffectPaintPropertyNode& Unalias() const = delete; bool IsParentAlias() const = delete;
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 9fb727e..7a11426d 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -307,6 +307,7 @@ crbug.com/1351556 virtual/document-transition-wide-gamut/wpt_internal/document-transition/commit-timeout-crash.html [ Failure Timeout ] crbug.com/1351556 virtual/document-transition/document-transition/capture-callback-exception.html [ Failure ] crbug.com/1351556 virtual/document-transition-wide-gamut/document-transition/capture-callback-exception.html [ Failure ] +crbug.com/1366886 [ Mac12-arm64 ] virtual/document-transition-wide-gamut/wpt_internal/document-transition/iframe-transition.sub.html [ Timeout Failure ] ########## Ref tests can't be rebaselined ########## crbug.com/619103 paint/invalidation/background/background-resize-width.html [ Failure Pass ] @@ -6934,7 +6935,6 @@ crbug.com/1339538 [ Linux ] fast/frames/002.html [ Failure Pass ] crbug.com/1339538 [ Win10.20h2 ] fast/frames/002.html [ Failure Pass ] crbug.com/1097040 media/controls/overflow-menu-always-visible.html [ Failure Pass ] -crbug.com/1342526 external/wpt/dom/events/non-cancelable-when-passive/non-passive-wheel-event-listener-on-body.html [ Failure Pass ] # Sheriff 2022-07-08 crbug.com/1180274 virtual/plz-dedicated-worker/http/tests/inspector-protocol/network/navigate-iframe-out2in.js [ Skip ] @@ -6943,7 +6943,6 @@ # Sheriff 2022-07-12 crbug.com/1343674 editing/deleting/460938.html [ Failure Pass ] -crbug.com/1343664 external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-document.html [ Failure Pass ] # Disable test to land a MSE change. Spec change (MSE PR#306) is still pending, # and once landed, this line can be removed. @@ -6960,7 +6959,6 @@ # Sheriff 2022-07-13 crbug.com/1204176 [ Linux ] fast/scrolling/overflow-scrollability.html [ Failure Pass ] -crbug.com/1344175 [ Mac12 ] external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-root.html [ Failure Pass ] # Sheriff 2022-07-15 crbug.com/1344652 [ Mac ] external/wpt/webmessaging/with-ports/020.html [ Failure Pass ] @@ -6971,12 +6969,6 @@ crbug.com/1345235 external/wpt/content-security-policy/style-src/stylehash-basic-blocked.sub.html [ Skip ] crbug.com/1334674 [ Mac11 ] http/tests/devtools/oopif/oopif-presentation-console-messages.js [ Failure Pass ] -# Sheriff 2022-07-21 -crbug.com/1346158 crbug.com/1346158 external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-window.html [ Failure Pass ] - -# Sheriff 2022-07-25 -crbug.com/1343935 [ Mac10.15 ] external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body.html [ Failure Pass ] - # Sheriff 2022-07-26 crbug.com/1347459 [ Fuchsia ] fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links.html [ Skip ] crbug.com/1347459 [ Fuchsia ] fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow.html [ Skip ] @@ -7090,7 +7082,7 @@ # Disable step failure trigger flaky tests crbug.com/1351571 [ Mac12-arm64 ] http/tests/devtools/persistence/automapping-bind-committed-network-sourcecode.js [ Failure Pass Timeout ] crbug.com/1351571 [ Mac11-arm64 ] http/tests/devtools/persistence/automapping-bind-committed-network-sourcecode.js [ Failure Pass Timeout ] -crbug.com/1358333 [ Mac10.15 ] external/wpt/webmessaging/event.origin.sub.htm [ Failure Pass ] +crbug.com/1358333 [ Mac ] external/wpt/webmessaging/event.origin.sub.htm [ Failure Pass ] # Sheriff 2022-08-31 crbug.com/1306304 [ Mac ] plugins/multiple-plugins.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/WebDriverExpectations b/third_party/blink/web_tests/WebDriverExpectations index 00bf6abb..f29b8cb 100644 --- a/third_party/blink/web_tests/WebDriverExpectations +++ b/third_party/blink/web_tests/WebDriverExpectations
@@ -88,6 +88,8 @@ crbug.com/1167321 [ Linux ] external/wpt/webdriver/tests/find_element_from_shadow_root/find.py>>test_find_element[xpath-//a] [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/element_send_keys/form_controls.py>>test_date [ Failure ] +crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/new_session/create_firstMatch.py>>test_valid[browserVersion-None] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/perform_actions/pointer_mouse.py>>test_drag_and_drop_with_draggable_element[0] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/perform_actions/pointer_mouse.py>>test_drag_and_drop_with_draggable_element[300] [ Failure ] crbug.com/626703 [ Linux ] external/wpt/webdriver/tests/perform_actions/pointer_mouse.py>>test_drag_and_drop_with_draggable_element[800] [ Failure ]
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 9a09933..54700e90 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -87540,6 +87540,19 @@ {} ] ], + "overflow-clip-013.html": [ + "31137b58fbc4618f63dcb5b38d92e1cd058fea17", + [ + null, + [ + [ + "/css/reference/ref-filled-green-100px-square.xht", + "==" + ] + ], + {} + ] + ], "overflowed-block-with-no-room-after-000.html": [ "084e16fb38de072fb83f92ba01302a2e404cdd97", [ @@ -249080,6 +249093,32 @@ {} ] ], + "lang-attribute-dynamic.svg": [ + "d57b4decde7f57684504d917a77a06df1009902a", + [ + null, + [ + [ + "/svg/text/reftests/lang-attribute-dynamic-ref.svg", + "==" + ] + ], + {} + ] + ], + "lang-attribute.svg": [ + "c619f8253eca91026ba089d4a1b5437f53343e38", + [ + null, + [ + [ + "/svg/text/reftests/lang-attribute-ref.svg", + "!=" + ] + ], + {} + ] + ], "multiple-textpaths.svg": [ "6df4ecc27bbddaa76709e041620dacdc5c1303bd", [ @@ -249521,6 +249560,32 @@ ], {} ] + ], + "xml-lang-attribute-dynamic.svg": [ + "c604eb8c70e06890726e43a81265237d640b42f3", + [ + null, + [ + [ + "/svg/text/reftests/lang-attribute-dynamic-ref.svg", + "==" + ] + ], + {} + ] + ], + "xml-lang-attribute.svg": [ + "2e03716a0d9a48a508fd2720c486ca065c58bb2f", + [ + null, + [ + [ + "/svg/text/reftests/lang-attribute-ref.svg", + "!=" + ] + ], + {} + ] ] } } @@ -266412,7 +266477,7 @@ [] ], "KeyframeEffect-getKeyframes.tentative-expected.txt": [ - "05f08527426414d178d42af8461180f04f6ccb68", + "51b5c2105d9bfe0f76db2922d623a60312a38ac0", [] ], "META.yml": [ @@ -267249,6 +267314,10 @@ } } }, + "background-size-001-expected.txt": [ + "71027fb7e19800d45674c8062cea5db92a0fdfef", + [] + ], "background-size-cover-003-ref.html": [ "bd965cfecff2647fdbccc1898c67d371c69cf9b7", [] @@ -267522,6 +267591,10 @@ "72b3686bcbc34aac5e0d03f7e413129e48140cd4", [] ], + "background-size-computed-expected.txt": [ + "86fd198b61f420d4b25b7d63de2d9e45ca7daeb6", + [] + ], "border-shorthand-expected.txt": [ "f78d14d1f75bbaeb39b547fa94bd3498e7f45f1b", [] @@ -297415,10 +297488,6 @@ } }, "css-typed-om": { - "CSSMatrixComponent-DOMMatrix-mutable-expected.txt": [ - "918c97d6da7562004967a205522e3614d9c5d35f", - [] - ], "META.yml": [ "a448fc800d26f26f7976bb9358251a5c392262e1", [] @@ -305196,7 +305265,7 @@ [] ], "testdriver.md": [ - "8c694facfc4d651ef21a88ad45878c3058788d05", + "cc28008456fe5b1919eadfab30f60a113c7e3e60", [] ], "testharness-api.md": [ @@ -305935,10 +306004,6 @@ "ace65c7331a8e456200006a0566d82cb31de7ac6", [] ], - "aria-element-reflection.tentative-expected.txt": [ - "a4b34447c66e0fe79be6de68c0f4faee2a61786a", - [] - ], "attributes.js": [ "ef32bf6a67732c5820fc75f31e8eae5ba42c54cd", [] @@ -312874,7 +312939,7 @@ [] ], "messaging-serialize-helpers.js": [ - "13c900c0cbcff75f5af4251b08e52f1f5b1a0ea5", + "c7dfc0436e3fec49c31c0ef374c72ee830b2bc15", [] ], "opaque-origin-sandbox.html": [ @@ -318379,10 +318444,6 @@ "e5b83c9b8699969677fa64c45dcd10b5b396716e", [] ], - "aria-element-reflection.tentative-expected.txt": [ - "e5b83c9b8699969677fa64c45dcd10b5b396716e", - [] - ], "directionality": { "bdi-element-invalid-dir-ref.html": [ "88ccd4b9b53ee27a8450bd77ec794861fc01a708", @@ -330610,6 +330671,22 @@ "file_upload_data.txt": [ "097d2a3a3f31dbd8f14cff73974cf042b6ebfcd2", [] + ], + "get_all_cookies.sub.html.headers": [ + "3dc39a56736614f1d864bda185f368e3adba7419", + [] + ], + "get_all_cookies.sub.https.html.headers": [ + "3dc39a56736614f1d864bda185f368e3adba7419", + [] + ], + "get_named_cookie.sub.html.headers": [ + "3dc39a56736614f1d864bda185f368e3adba7419", + [] + ], + "get_named_cookie.sub.https.html.headers": [ + "3dc39a56736614f1d864bda185f368e3adba7419", + [] ] }, "testharness": { @@ -335553,17 +335630,9 @@ "d07ed3fc7bbd716324703ca7bcc74fa0f566bee5", [] ], - "active-document-cross-origin.https.sub.html.ini": [ - "581f8bb0828ed94b3ef59f9cebad2857c958d917", - [] - ], "active-document-same-origin.https-expected.txt": [ "b2bf628ba99b7f22179b1f3ac0738653f307378b", [] - ], - "active-document-same-origin.https.html.ini": [ - "9420ee58b9ad67efe9a57c87d6487773672094b4", - [] ] }, "constructor_convert_method_data.https-expected.txt": [ @@ -335594,10 +335663,6 @@ "fcd48cac84c558fd2ae1d0b58927167625407aba", [] ], - "onmerchantvalidation-attribute.https.html.ini": [ - "c2d77067d7e69f5b8bcb5bbac4688363fe514a31", - [] - ], "payment-is-showing.https-expected.txt": [ "d28aedc79dbc424a13c63bb2f690e6cee4140108", [] @@ -335618,10 +335683,6 @@ "9f0cc8d67e22c8f0c8b25e72c24d67488955bf7e", [] ], - "payment-request-canmakepayment-method-protection.https.html.ini": [ - "86108c80e98d924e6892475446e3cd7828a3c02c", - [] - ], "payment-request-canmakepayment-method.https-expected.txt": [ "0dd8ef2c03f99307cc01a093fbc163d1e707eff6", [] @@ -339316,7 +339377,7 @@ [] ], "mock-pressure-service.js": [ - "b6b1f2715eaf836a488b520643a84e118099ddf6", + "27a684e1de9b777b9f4c5902a5992696682e210f", [] ], "mock-pressure-service.js.headers": [ @@ -339429,7 +339490,7 @@ [] ], "testdriver.js": [ - "0737e64a50b313a357a4587c1cb49f7927ac7d42", + "5a59c724a7a1330f0b8686315ef836ae8975e5fb", [] ], "testdriver.js.headers": [ @@ -345222,6 +345283,14 @@ "3fe1224b9a0120e9691688fe36048ad0e6323a84", [] ], + "lang-attribute-dynamic-ref.svg": [ + "191adc036c35242ec88784fe90282078c1ee7cda", + [] + ], + "lang-attribute-ref.svg": [ + "957cc24d8185fddacaf4cc076f386bf3e59132c1", + [] + ], "multiple-textpaths-ref.svg": [ "a6dcd3c5d5e5fe1a9aa74d2539c14e66c95cbece", [] @@ -387449,6 +387518,13 @@ {} ] ], + "anchor-name-multicol-003.tentative.html": [ + "214251120eb4e73bd25666a254d18476d71e19bd", + [ + null, + {} + ] + ], "anchor-parse-invalid.tentative.html": [ "6eceb9bdfd9c81374e9a174480abab089554ea09", [ @@ -387832,7 +387908,7 @@ ] ], "KeyframeEffect-getKeyframes.tentative.html": [ - "0167fda679996b045ae4205d615f73b72e23095c", + "a716745c8431520a7fef856178a9f44b3007bd3e", [ null, {} @@ -388532,7 +388608,7 @@ ] ], "background-size-001.html": [ - "fee271de14a4664a0aff4f99b4511107b36beb77", + "ce1666c9a8160e0a57f364caed98352873131e93", [ null, {} @@ -388785,7 +388861,7 @@ ] ], "background-size-computed.html": [ - "2c6e340edd08787d46103ac234ef1d86ac05e688", + "80fdd0fb27bb93fe34682ac08e2ff54c19649b4e", [ null, {} @@ -394512,7 +394588,7 @@ ] ], "font-variant-east-asian-invalid.html": [ - "30dbe403b8db67ec1921390e1611683407da3f23", + "c61a4b9b139f65f95e67711d9fd5601d3c2a1442", [ null, {} @@ -409773,7 +409849,7 @@ }, "css-typed-om": { "CSSMatrixComponent-DOMMatrix-mutable.html": [ - "1820ffc9861f0e771bdbf0c11856c55f67cee53d", + "f90526ae6957e9207dec775e66396179bb1e4507", [ null, {} @@ -488493,7 +488569,16 @@ null, {} ] - ] + ], + "the-select-element": { + "select-as-listbox-default-styles.tentative.html": [ + "3e9b001f99589f0a223074aa8083c1617a2faa05", + [ + null, + {} + ] + ] + } } }, "semantics": { @@ -507305,6 +507390,42 @@ } ] ], + "get_all_cookies.sub.html": [ + "ab9ac071dd1cedcf28e218931546b753c2eefe20", + [ + null, + { + "testdriver": true + } + ] + ], + "get_all_cookies.sub.https.html": [ + "1359a75b5edd415a4b8c227f26f102ca4fd28579", + [ + null, + { + "testdriver": true + } + ] + ], + "get_named_cookie.sub.html": [ + "2a6fb57024d92a692813cf5d4cc7019be35809dc", + [ + null, + { + "testdriver": true + } + ] + ], + "get_named_cookie.sub.https.html": [ + "0a99590195143aa3a023db3ff3ff3d54893cbaad", + [ + null, + { + "testdriver": true + } + ] + ], "send_keys.html": [ "71ca4405f48dae89c820775a10f1d000866380d8", [ @@ -511376,10 +511497,12 @@ ] ], "math-global-event-handlers.tentative.html": [ - "b7d569fbe3d56f1909d3a184e6383d2119c1baf8", + "b924eefa7d330a3405d58f970ba3da99911165e4", [ null, - {} + { + "timeout": "long" + } ] ], "tabindex-001.html": [ @@ -526151,7 +526274,7 @@ ] ], "excluded-properties-002.html": [ - "5f98bc283ebc2b5d719815c59c3d1cd53acd2ed9", + "b8b3b2e5c58cf06c5a8c52ebd70fea08c80220f1", [ null, {} @@ -538575,6 +538698,13 @@ {} ] ], + "ordering.html": [ + "1cd9950c53499b61ab4a2b9f401c12223d8182a6", + [ + null, + {} + ] + ], "scrollbars-2.html": [ "51b470c8a2d61377692e46142bbe76773b876546", [ @@ -612728,7 +612858,7 @@ }, "element_send_keys": { "content_editable.py": [ - "7f628f96a53a00ab86fe7d77af390a4397482067", + "9db19d5b8a2da810b603b369cf1981e036790177", [ null, {} @@ -612742,14 +612872,14 @@ ] ], "file_upload.py": [ - "ef792f4dd855555147139f9329a13f5a30188381", + "f62a633c202d6fca8d5062ae6b15e2df8b20783c", [ null, {} ] ], "form_controls.py": [ - "0403dc92372eeadaae2a0237d8014349ec65fe8c", + "364d4c28fae7807f109cdcdc32aead43d985a1fe", [ null, {} @@ -612763,7 +612893,7 @@ ] ], "scroll_into_view.py": [ - "205c4e30e1edfa261017028e9093b6da490aa9c1", + "7ccaeaf8142011ccbe7830876147d73853d0b07a", [ null, {}
diff --git a/third_party/blink/web_tests/external/wpt/.well-known/web-identity b/third_party/blink/web_tests/external/wpt/.well-known/web-identity index 6f503637..f3a99e2 100644 --- a/third_party/blink/web_tests/external/wpt/.well-known/web-identity +++ b/third_party/blink/web_tests/external/wpt/.well-known/web-identity
@@ -1,4 +1,6 @@ def main(request, response): + if not b"sec-fetch-dest" in request.headers or request.headers[b"sec-fetch-dest"] != b"webidentity": + return (500, [], "Missing Sec-Fetch-Dest header") config = request.server.config host = config.browser_host + ":" + str(config.ports["https"][0]) return """
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/accounts.py b/third_party/blink/web_tests/external/wpt/credential-management/support/accounts.py index ffe0d31..e9828cf 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/accounts.py +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/accounts.py
@@ -1,4 +1,6 @@ def main(request, response): + if not b"sec-fetch-dest" in request.headers or request.headers[b"sec-fetch-dest"] != b"webidentity": + return (500, [], "Missing Sec-Fetch-Dest header") if not b"cookie" in request.cookies or request.cookies[b"cookie"].value != b"1": return (500, [], "Missing cookie") return """
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/client_metadata.py b/third_party/blink/web_tests/external/wpt/credential-management/support/client_metadata.py index 51393c5..e9ae722 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/client_metadata.py +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/client_metadata.py
@@ -1,4 +1,6 @@ def main(request, response): + if not b"sec-fetch-dest" in request.headers or request.headers[b"sec-fetch-dest"] != b"webidentity": + return (500, [], "Missing Sec-Fetch-Dest header") if b"cookie" in request.cookies: return (500, [], "Cookie should not be sent to this endpoint") return """
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/token.py b/third_party/blink/web_tests/external/wpt/credential-management/support/token.py index e9b07767..1ce4348 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/token.py +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/token.py
@@ -1,4 +1,6 @@ def main(request, response): + if not b"sec-fetch-dest" in request.headers or request.headers[b"sec-fetch-dest"] != b"webidentity": + return (500, [], "Missing Sec-Fetch-Dest header") if not b"cookie" in request.cookies or request.cookies[b"cookie"].value != b"1": return (500, [], "Missing cookie") return "{\"token\": \"token\"}"
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt index 05f0852..51b5c21 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ b/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt
@@ -23,12 +23,12 @@ FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes +FAIL KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes assert_equals: value for 'backgroundSize' on ComputedKeyframe #1 should match expected "50% auto, 6px auto, contain" but got "50%, 6px, contain" PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -PASS KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% +FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html b/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html index 0167fda6..a716745c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html +++ b/third_party/blink/web_tests/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative.html
@@ -698,7 +698,7 @@ { offset: 0, computedOffset: 0, easing: "ease", composite: "auto", backgroundSize: "auto" }, { offset: 1, computedOffset: 1, easing: "ease", composite: "auto", - backgroundSize: "50%, 6px, contain" }, + backgroundSize: "50% auto, 6px auto, contain" }, ]; for (let i = 0; i < frames.length; i++) { @@ -708,7 +708,7 @@ // Test inheriting a background-size value expected[0].backgroundSize = div.style.backgroundSize = - "30px, 40%, auto"; + "30px auto, 40% auto, auto"; frames = getKeyframes(div); for (let i = 0; i < frames.length; i++) {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001-expected.txt new file mode 100644 index 0000000..71027fb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001-expected.txt
@@ -0,0 +1,23 @@ +This is a testharness.js-based test. +PASS background-size_initial +PASS background-size_auto +PASS background-size_cover +PASS background-size_contain +FAIL background-size_length_zero assert_equals: background-size supporting value expected "0px auto" but got "0px" +FAIL background-size_length_negative_zero assert_equals: background-size supporting value expected "0px auto" but got "0px" +FAIL background-size_length_positive_zero assert_equals: background-size supporting value expected "0px auto" but got "0px" +FAIL background-size_length_normal assert_equals: background-size supporting value expected "15px auto" but got "15px" +FAIL background-size_percentage_min assert_equals: background-size supporting value expected "0% auto" but got "0%" +FAIL background-size_percentage_normal assert_equals: background-size supporting value expected "50% auto" but got "50%" +FAIL background-size_percentage_max assert_equals: background-size supporting value expected "100% auto" but got "100%" +PASS background-size_auto_auto +PASS background-size_auto_length +PASS background-size_auto_percentage +FAIL background-size_length_auto assert_equals: background-size supporting value expected "15px auto" but got "15px" +PASS background-size_length_length +PASS background-size_length_percentage +FAIL background-size_percentage_auto assert_equals: background-size supporting value expected "50% auto" but got "50%" +PASS background-size_percentage_length +PASS background-size_percentage_percentage +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001.html index fee271de..ce1666c 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/background-size-001.html
@@ -39,43 +39,43 @@ document.getElementById("test").style.backgroundSize = "0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_zero"); document.getElementById("test").style.backgroundSize = "-0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_negative_zero"); document.getElementById("test").style.backgroundSize = "+0px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0px", "background-size supporting value"); + "0px auto", "background-size supporting value"); }, "background-size_length_positive_zero"); document.getElementById("test").style.backgroundSize = "15px"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "15px", "background-size supporting value"); + "15px auto", "background-size supporting value"); }, "background-size_length_normal"); document.getElementById("test").style.backgroundSize = "0%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "0%", "background-size supporting value"); + "0% auto", "background-size supporting value"); }, "background-size_percentage_min"); document.getElementById("test").style.backgroundSize = "50%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "50%", "background-size supporting value"); + "50% auto", "background-size supporting value"); }, "background-size_percentage_normal"); document.getElementById("test").style.backgroundSize = "100%"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "100%", "background-size supporting value"); + "100% auto", "background-size supporting value"); }, "background-size_percentage_max"); document.getElementById("test").style.backgroundSize = "auto auto"; @@ -99,7 +99,7 @@ document.getElementById("test").style.backgroundSize = "15px auto"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "15px", "background-size supporting value"); + "15px auto", "background-size supporting value"); }, "background-size_length_auto"); document.getElementById("test").style.backgroundSize = "15px 15px"; @@ -117,7 +117,7 @@ document.getElementById("test").style.backgroundSize = "50% auto"; test(function() { assert_equals(getComputedStyle(document.getElementById("test"), null).getPropertyValue("background-size"), - "50%", "background-size supporting value"); + "50% auto", "background-size supporting value"); }, "background-size_percentage_auto"); document.getElementById("test").style.backgroundSize = "50% 15px";
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed-expected.txt new file mode 100644 index 0000000..86fd198b6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed-expected.txt
@@ -0,0 +1,14 @@ +This is a testharness.js-based test. +FAIL Property background-size value '1px' assert_equals: expected "1px auto" but got "1px" +FAIL Property background-size value '1px auto' assert_equals: expected "1px auto" but got "1px" +PASS Property background-size value '2% 3%' +PASS Property background-size value 'auto' +PASS Property background-size value 'auto auto' +PASS Property background-size value 'auto 4%' +PASS Property background-size value 'contain' +PASS Property background-size value 'cover' +PASS Property background-size value 'calc(10px + 0.5em) calc(10px - 0.5em)' +PASS Property background-size value 'calc(10px - 0.5em) calc(10px + 0.5em)' +PASS Property background-size value 'auto 1px, 2% 3%, contain' +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed.html index 2c6e340..80fdd0f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/parsing/background-size-computed.html
@@ -17,8 +17,8 @@ <body> <div id="target"></div> <script> -test_computed_value("background-size", "1px", "1px"); -test_computed_value("background-size", "1px auto", "1px"); +test_computed_value("background-size", "1px", "1px auto"); +test_computed_value("background-size", "1px auto", "1px auto"); test_computed_value("background-size", "2% 3%"); test_computed_value("background-size", "auto"); test_computed_value("background-size", "auto auto", "auto");
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/dynamic-change-paint-fully-obscuring-child-001.html b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/dynamic-change-paint-fully-obscuring-child-001.html new file mode 100644 index 0000000..781a11c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/content-visibility/dynamic-change-paint-fully-obscuring-child-001.html
@@ -0,0 +1,44 @@ +<!DOCTYPE HTML> +<html class="reftest-wait"> +<title>content-visibility:hidden elements painting with a fully-obscuring child</title> +<link rel="author" title="L. David Baron" href="https://dbaron.org/"> +<link rel="author" title="Google" href="http://www.google.com/"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#content-visibility"> +<link rel="help" href="https://bugs.chromium.org/p/chromium/issues/detail?id=1370776"> +<link rel="match" href="../../reference/ref-filled-green-100px-square.xht"> +<style> + +div { width: 100px; height: 100px; } + +.small { height: 50px; } + +.hidden { content-visibility: hidden } + +.green { background: green; } +.red { background: red; } + +</style> + +<p>Test passes if there is a filled green square and <strong>no red</strong>.</p> + +<!-- + This example shows the bug because the child would fully obscure the + parent if the parent were not content-visibility: hidden. + + If the child has class="small", then the bug is not present. + +--> +<div class="green"> + <div class="red"></div> +</div> + +<script> + +document.documentElement.addEventListener("TestRendered", function(event) { + for (let elt of document.querySelectorAll("body > div")) { + elt.classList.add("hidden"); + } + document.documentElement.classList.remove("reftest-wait"); +}); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-variant-east-asian-invalid.html b/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-variant-east-asian-invalid.html index 30dbe40..c61a4b9b 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-variant-east-asian-invalid.html +++ b/third_party/blink/web_tests/external/wpt/css/css-fonts/parsing/font-variant-east-asian-invalid.html
@@ -16,6 +16,14 @@ test_invalid_value('font-variant-east-asian', 'jis78 jis83'); test_invalid_value('font-variant-east-asian', 'full-width proportional-width'); + +test_invalid_value('font-variant-east-asian', 'normal garbage'); +test_invalid_value('font-variant-east-asian', 'normal none'); +test_invalid_value('font-variant-east-asian', 'normal 30px'); + +test_invalid_value('font-variant-east-asian', 'full-width garbage'); +test_invalid_value('font-variant-east-asian', 'full-width none'); +test_invalid_value('font-variant-east-asian', 'full-width 30px'); </script> </body> </html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable-expected.txt b/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable-expected.txt deleted file mode 100644 index 918c97d6..0000000 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL CSSMatrixComponent's matrix attribute is mutable CSSMatrixTransformComponent is not defined -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable.html b/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable.html index 1820ffc..f90526a 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable.html +++ b/third_party/blink/web_tests/external/wpt/css/css-typed-om/CSSMatrixComponent-DOMMatrix-mutable.html
@@ -8,7 +8,7 @@ <div id="log"></div> <script> test(function() { - var component = new CSSMatrixTransformComponent(new DOMMatrix()); + var component = new CSSMatrixComponent(new DOMMatrix()); assert_equals(component.matrix.m11, 1, 'DOMMatrix expected to be initialized to identity'); component.matrix.m11 = 2; assert_equals(component.matrix.m11, 2, 'modification of m11 component of DOMMatrix expected to succeed');
diff --git a/third_party/blink/web_tests/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative.html b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative.html new file mode 100644 index 0000000..3e9b001 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative.html
@@ -0,0 +1,113 @@ +<!doctype html> +<title>default styles for select as a listbox</title> +<meta name="viewport" content="width=device-width"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/html/rendering/support/test-ua-stylesheet.js"></script> +<style> +/* Specify this bogus namespace, so the rules in this stylesheet only apply to the `fakeClone`d elements in #refs, not the HTML elements in #tests. */ +@namespace url(urn:not-html); + +select { + letter-spacing: initial; + word-spacing: initial; + line-height: initial; + text-transform: initial; + text-indent: initial; + text-shadow: initial; + appearance: auto; +} + +select { + text-align: initial; +} + +select { + box-sizing: border-box; +} + +/* When the element renders as a list box, it is a devolvable widget expected to render as an 'inline-block' box whose 'height' is the height necessary to contain as many rows for items as given by the element's display size, or four rows if the attribute is absent, and whose 'width' is the width of the select's labels plus the width of a scrollbar. */ +select { + display: inline-block; +} + +</style> + +<style> +/* non-initial styles on parent to test 'initial' in UA stylesheet */ +#tests, #refs { + letter-spacing: 1px; + word-spacing: 1px; + line-height: 20px; + text-transform: lowercase; + text-indent: 1px; + text-shadow: 0px 0px; + text-align: justify; +} +</style> + +<div id="log"></div> + +<div id="tests"> + + <select multiple><option>1</option><optgroup label=2><option>3</select> + +</div> + +<div id="refs"></div> + +<script> + const props = [ + 'display', + 'margin-top', + 'margin-right', + 'margin-bottom', + 'margin-left', + 'padding-top', + 'padding-right', + 'padding-bottom', + 'padding-left', + 'letter-spacing', + 'word-spacing', + 'text-transform', + 'text-indent', + 'text-shadow', + 'appearance', + 'box-sizing', + 'border-top-width', + 'border-right-width', + 'border-bottom-width', + 'border-left-width', + 'border-top-style', + 'border-right-style', + 'border-bottom-style', + 'border-left-style', + 'border-top-color', + 'border-right-color', + 'border-bottom-color', + 'border-left-color', + 'align-items', + 'white-space', + 'color', + 'background-color', + 'cursor', + 'font-style', + 'font-weight', + 'font-size', + 'font-family', + 'writing-mode', + 'scrollbar-width', + 'overflow', + 'vertical-align', + 'user-select', + 'page-break-inside', + 'overflow-clip-box', + 'font-variant-ligatures', + 'font-variant-caps', + 'font-variant-numeric', + 'font-variant-east-asian', + 'text-rendering', + ]; + runUAStyleTests(props); + +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance-ref.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance-ref.tentative.html new file mode 100644 index 0000000..41681c7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance-ref.tentative.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Dialog-Popup appearance</title> +<link rel="author" href="mailto:masonf@chromium.org"> + +<p>Both dialogs should have the same shades of background.</p> +<p>The pop-up should have a completely-transparent ::backdrop.</p> +<dialog popup id=d1>This is a modal dialog</dialog> +<dialog popup id=d2>This is a dialog pop-up</dialog> + +<style> + dialog { + left: 50px; + right: auto; + bottom: auto; + } + #d1 {top:100px;} + #d2 {top:150px;} + /* Force backdrop to spec: */ + #d1::backdrop { + /* https://html.spec.whatwg.org/multipage/rendering.html#flow-content-3 */ + background-color: rgba(0, 0, 0, 0.1); + } + #d2::backdrop { + /* When shown as a pop-up, backdrop must be transparent */ + background-color: transparent; + } +</style> + +<script> + document.getElementById('d1').showModal(); + document.getElementById('d2').showPopUp(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance.tentative.html new file mode 100644 index 0000000..57afa91 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-appearance.tentative.html
@@ -0,0 +1,26 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Dialog-Popup appearance</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popup.research.explainer"> +<link rel="match" href="popup-dialog-appearance-ref.tentative.html"> + +<p>Both dialogs should have the same shades of background.</p> +<p>The pop-up should have a completely-transparent ::backdrop.</p> +<dialog popup id=d1>This is a modal dialog</dialog> +<dialog popup id=d2>This is a dialog pop-up</dialog> + +<style> + dialog { + left: 50px; + right: auto; + bottom: auto; + } + #d1 {top:100px;} + #d2 {top:150px;} +</style> + +<script> + document.getElementById('d1').showModal(); + document.getElementById('d2').showPopUp(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-crash.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-crash.tentative.html new file mode 100644 index 0000000..01b8a05 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-dialog-crash.tentative.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<meta charset="utf-8" /> +<title>Dialog-Popup crash</title> +<link rel="author" href="mailto:masonf@chromium.org"> +<link rel=help href="https://open-ui.org/components/popup.research.explainer"> + +<p>This test passes if it does not crash.</p> +<dialog popup>This is a modal dialog</dialog> +<div popup>This is a pop-up</div> + +<script> + const dialog = document.querySelector('dialog[popup]'); + const popUp = document.querySelector('div[popup]'); + dialog.showModal(); + popUp.showPopUp(); + dialog.dispatchEvent(new Event('mouseup')); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/quirks/unitless-length/excluded-properties-002.html b/third_party/blink/web_tests/external/wpt/quirks/unitless-length/excluded-properties-002.html index 5f98bc28..b8b3b2e 100644 --- a/third_party/blink/web_tests/external/wpt/quirks/unitless-length/excluded-properties-002.html +++ b/third_party/blink/web_tests/external/wpt/quirks/unitless-length/excluded-properties-002.html
@@ -35,6 +35,7 @@ target.style[property] = '1234'; assert_not_equals(target.style[property], '1234'); assert_not_equals(target.style[property], '1234px'); + assert_not_equals(target.style[property], '1234px auto'); }, 'Property ' + property + ' does not support quirky length'); } </script>
diff --git a/third_party/blink/web_tests/external/wpt/resize-observer/ordering.html b/third_party/blink/web_tests/external/wpt/resize-observer/ordering.html new file mode 100644 index 0000000..1cd9950c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/resize-observer/ordering.html
@@ -0,0 +1,24 @@ +<!doctype html> +<title>ResizeObserver and IntersectionObserver ordering</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + async_test(function(t) { + let sawResize = false; + let sawIo = false; + let resizeObserver = new ResizeObserver(t.step_func(function() { + assert_false(sawIo, "ResizeObserver notification should be delivered before IntersectionObserver notification"); + sawResize = true; + resizeObserver.disconnect(); + })); + + let io = new IntersectionObserver(t.step_func_done(function() { + assert_true(sawResize, "IntersectionObserver notification should be delivered after ResizeObserver notification"); + sawIo = true; + io.disconnect(); + })); + + resizeObserver.observe(document.documentElement); + io.observe(document.documentElement); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/content_editable.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/content_editable.py index 7f628f9..9db19d5 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/content_editable.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/content_editable.py
@@ -1,18 +1,30 @@ +from tests.support.asserts import assert_element_has_focus + + def test_sets_insertion_point_to_end(session, inline): session.url = inline('<div contenteditable=true>Hello,</div>') + body = session.find.css("body", all=False) + assert_element_has_focus(body) + input = session.find.css("div", all=False) input.send_keys(' world!') - text = session.execute_script('return arguments[0].innerText', args=[input]) + text = session.execute_script('return arguments[0].textContent', args=[input]) assert "Hello, world!" == text.strip() + assert_element_has_focus(input) -# 12. Let current text length be the element's length. -# -# 13. Set the text insertion caret using set selection range using current -# text length for both the start and end parameters. def test_sets_insertion_point_to_after_last_text_node(session, inline): session.url = inline('<div contenteditable=true>Hel<span>lo</span>,</div>') input = session.find.css("div", all=False) input.send_keys(" world!") - text = session.execute_script("return arguments[0].innerText", args=[input]) + text = session.execute_script("return arguments[0].textContent", args=[input]) assert "Hello, world!" == text.strip() + + +def test_no_move_caret_if_focused(session, inline): + session.url = inline("""<div contenteditable=true>Hel<span>lo</span>,</div> +<script>document.getElementsByTagName("div")[0].focus()</script>""") + input = session.find.css("div", all=False) + input.send_keys("world!") + text = session.execute_script("return arguments[0].textContent", args=[input]) + assert "world!Hello," == text.strip()
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/file_upload.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/file_upload.py index ef792f4d..f62a633 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/file_upload.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/file_upload.py
@@ -1,6 +1,9 @@ import pytest -from tests.support.asserts import assert_error, assert_files_uploaded, assert_success +from tests.support.asserts import (assert_element_has_focus, + assert_error, + assert_files_uploaded, + assert_success) from . import map_files_to_multiline_text @@ -207,6 +210,38 @@ assert_files_uploaded(session, element, files) +@pytest.mark.capabilities({"strictFileInteractability": False}) +def test_not_focused(session, create_files, inline): + files = create_files(["foo"]) + + session.url = inline("<input type=file>") + body = session.find.css("body", all=False) + element = session.find.css("input", all=False) + assert_element_has_focus(body) + + response = element_send_keys(session, element, str(files[0])) + assert_success(response) + assert_element_has_focus(body) + + assert_files_uploaded(session, element, files) + + +@pytest.mark.capabilities({"strictFileInteractability": True}) +def test_focused(session, create_files, inline): + files = create_files(["foo"]) + + session.url = inline("<input type=file>") + body = session.find.css("body", all=False) + element = session.find.css("input", all=False) + assert_element_has_focus(body) + + response = element_send_keys(session, element, str(files[0])) + assert_success(response) + assert_element_has_focus(element) + + assert_files_uploaded(session, element, files) + + @pytest.mark.capabilities({"strictFileInteractability": True}) def test_strict_hidden(session, create_files, inline): files = create_files(["foo"])
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/form_controls.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/form_controls.py index 0403dc9..364d4c2 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/form_controls.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/form_controls.py
@@ -31,10 +31,13 @@ def test_input_append(session, inline): session.url = inline("<input value=a>") + body = session.find.css("body", all=False) + assert_element_has_focus(body) element = session.find.css("input", all=False) assert element.property("value") == "a" element_send_keys(session, element, "b") + assert_element_has_focus(element) assert element.property("value") == "ab" element_send_keys(session, element, "c") @@ -43,11 +46,57 @@ def test_textarea_append(session, inline): session.url = inline("<textarea>a</textarea>") + body = session.find.css("body", all=False) + assert_element_has_focus(body) element = session.find.css("textarea", all=False) assert element.property("value") == "a" element_send_keys(session, element, "b") + assert_element_has_focus(element) assert element.property("value") == "ab" element_send_keys(session, element, "c") assert element.property("value") == "abc" + + +def test_input_insert_when_focused(session, inline): + session.url = inline("""<input value=a> +<script> +let elem = document.getElementsByTagName("input")[0]; +elem.focus(); +elem.setSelectionRange(0, 0); +</script>""") + element = session.find.css("input", all=False) + assert element.property("value") == "a" + + element_send_keys(session, element, "b") + assert element.property("value") == "ba" + + element_send_keys(session, element, "c") + assert element.property("value") == "bca" + + +def test_textarea_insert_when_focused(session, inline): + session.url = inline("""<textarea>a</textarea> +<script> +let elem = document.getElementsByTagName("textarea")[0]; +elem.focus(); +elem.setSelectionRange(0, 0); +</script>""") + element = session.find.css("textarea", all=False) + assert element.property("value") == "a" + + element_send_keys(session, element, "b") + assert element.property("value") == "ba" + + element_send_keys(session, element, "c") + assert element.property("value") == "bca" + + +def test_date(session, inline): + session.url = inline("<input type=date>") + element = session.find.css("input", all=False) + + element_send_keys(session, element, "2000-01-01") + assert element.property("value") == "2000-01-01" + assert_element_has_focus(element)
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/scroll_into_view.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/scroll_into_view.py index 205c4e30..7ccaeaf8 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/scroll_into_view.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/element_send_keys/scroll_into_view.py
@@ -30,42 +30,6 @@ assert is_element_in_viewport(session, element) -def test_option_select_container_outside_of_scrollable_viewport(session, inline): - session.url = inline(""" - <select style="margin-top: 102vh;"> - <option value="foo">foo</option> - <option value="bar" id="bar">bar</option> - </select> - """) - element = session.find.css("option#bar", all=False) - select = session.find.css("select", all=False) - - response = element_send_keys(session, element, "bar") - assert_success(response) - - assert is_element_in_viewport(session, select) - assert is_element_in_viewport(session, element) - - -def test_option_stays_outside_of_scrollable_viewport(session, inline): - session.url = inline(""" - <select multiple style="height: 105vh; margin-top: 100vh;"> - <option value="foo" id="foo" style="height: 100vh;">foo</option> - <option value="bar" id="bar" style="background-color: yellow;">bar</option> - </select> - """) - select = session.find.css("select", all=False) - option_foo = session.find.css("option#foo", all=False) - option_bar = session.find.css("option#bar", all=False) - - response = element_send_keys(session, option_bar, "bar") - assert_success(response) - - assert is_element_in_viewport(session, select) - assert is_element_in_viewport(session, option_foo) - assert not is_element_in_viewport(session, option_bar) - - def test_contenteditable_element_outside_of_scrollable_viewport(session, inline): session.url = inline("<div contenteditable style=\"margin-top: 102vh;\"></div>") element = session.find.css("div", all=False)
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie-expected.txt new file mode 100644 index 0000000..39fcaa5 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie-expected.txt
@@ -0,0 +1,3 @@ +Tests handling of Set-Cookie following a request with overridden URL. +http://127.0.0.1:8000/protocol/inspector-protocol-page.html?originalURL +
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie.js b/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie.js new file mode 100644 index 0000000..53b81828 --- /dev/null +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fetch/url-override-set-cookie.js
@@ -0,0 +1,22 @@ +(async function(testRunner) { + const {session, dp} = await testRunner.startBlank( + `Tests handling of Set-Cookie following a request with overridden URL.`); + + const url = 'http://127.0.0.1:8000/protocol/inspector-protocol-page.html'; + + dp.Fetch.enable({patterns: [{}, {requestStage: 'Response'}]}); + const navigationPromise = session.navigate(url + '?originalURL'); + const requestId = (await dp.Fetch.onceRequestPaused()).params.requestId; + dp.Fetch.continueRequest({requestId, url: url + '?modifiedURL'}); + await dp.Fetch.onceRequestPaused(); + dp.Fetch.fulfillRequest({ + requestId, + responseCode: 200, + body: btoa('<body>hello world!</body>'), + headers: [{name: 'Set-Cookie', value: 'name=value'}] + }); + + await navigationPromise; + testRunner.log(await session.evaluate('location.href')); + testRunner.completeTest(); +})
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/linux/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/linux/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/linux/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body-expected.txt b/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body-expected.txt deleted file mode 100644 index 867b5e2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-body-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL non-passive mousewheel event listener on body assert_equals: expected true but got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div-expected.txt b/third_party/blink/web_tests/platform/mac-mac11/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div-expected.txt deleted file mode 100644 index 07cf21e2..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/external/wpt/dom/events/non-cancelable-when-passive/non-passive-mousewheel-event-listener-on-div-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL non-passive mousewheel event listener on div assert_equals: expected true but got false -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/mac/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt new file mode 100644 index 0000000..20d6aef4 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt
@@ -0,0 +1,197 @@ +This is a testharness.js-based test. +Found 193 tests; 154 PASS, 39 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS <select multiple=""><option>1 - display +PASS <select multiple=""><option>1 - margin-top +PASS <select multiple=""><option>1 - margin-right +PASS <select multiple=""><option>1 - margin-bottom +PASS <select multiple=""><option>1 - margin-left +PASS <select multiple=""><option>1 - padding-top +PASS <select multiple=""><option>1 - padding-right +PASS <select multiple=""><option>1 - padding-bottom +PASS <select multiple=""><option>1 - padding-left +PASS <select multiple=""><option>1 - letter-spacing +PASS <select multiple=""><option>1 - word-spacing +PASS <select multiple=""><option>1 - text-transform +PASS <select multiple=""><option>1 - text-indent +PASS <select multiple=""><option>1 - text-shadow +PASS <select multiple=""><option>1 - appearance +PASS <select multiple=""><option>1 - box-sizing +FAIL <select multiple=""><option>1 - border-top-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-right-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-bottom-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-left-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-top-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-right-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-bottom-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-left-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-top-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-right-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-bottom-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-left-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - align-items assert_equals: expected "normal" but got "flex-start" +FAIL <select multiple=""><option>1 - white-space assert_equals: expected "normal" but got "nowrap" +PASS <select multiple=""><option>1 - color +FAIL <select multiple=""><option>1 - background-color assert_equals: expected "rgba(0, 0, 0, 0)" but got "rgb(255, 255, 255)" +FAIL <select multiple=""><option>1 - cursor assert_equals: expected "auto" but got "default" +PASS <select multiple=""><option>1 - font-style +PASS <select multiple=""><option>1 - font-weight +FAIL <select multiple=""><option>1 - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <select multiple=""><option>1 - font-family assert_equals: expected "Times" but got "Arial" +PASS <select multiple=""><option>1 - writing-mode +PASS <select multiple=""><option>1 - scrollbar-width +FAIL <select multiple=""><option>1 - overflow assert_equals: expected "visible" but got "hidden scroll" +FAIL <select multiple=""><option>1 - vertical-align assert_equals: expected "baseline" but got "text-bottom" +PASS <select multiple=""><option>1 - user-select +PASS <select multiple=""><option>1 - page-break-inside +PASS <select multiple=""><option>1 - overflow-clip-box +PASS <select multiple=""><option>1 - font-variant-ligatures +PASS <select multiple=""><option>1 - font-variant-caps +PASS <select multiple=""><option>1 - font-variant-numeric +PASS <select multiple=""><option>1 - font-variant-east-asian +PASS <select multiple=""><option>1 - text-rendering +PASS <option>1 (in <select multiple="">) - margin-top +PASS <option>1 (in <select multiple="">) - margin-right +PASS <option>1 (in <select multiple="">) - margin-bottom +PASS <option>1 (in <select multiple="">) - margin-left +PASS <option>1 (in <select multiple="">) - padding-top +FAIL <option>1 (in <select multiple="">) - padding-right assert_equals: expected "0px" but got "2px" +FAIL <option>1 (in <select multiple="">) - padding-bottom assert_equals: expected "0px" but got "1px" +FAIL <option>1 (in <select multiple="">) - padding-left assert_equals: expected "0px" but got "2px" +PASS <option>1 (in <select multiple="">) - letter-spacing +PASS <option>1 (in <select multiple="">) - word-spacing +PASS <option>1 (in <select multiple="">) - text-transform +PASS <option>1 (in <select multiple="">) - text-indent +PASS <option>1 (in <select multiple="">) - text-shadow +PASS <option>1 (in <select multiple="">) - appearance +PASS <option>1 (in <select multiple="">) - box-sizing +PASS <option>1 (in <select multiple="">) - border-top-width +PASS <option>1 (in <select multiple="">) - border-right-width +PASS <option>1 (in <select multiple="">) - border-bottom-width +PASS <option>1 (in <select multiple="">) - border-left-width +PASS <option>1 (in <select multiple="">) - border-top-style +PASS <option>1 (in <select multiple="">) - border-right-style +PASS <option>1 (in <select multiple="">) - border-bottom-style +PASS <option>1 (in <select multiple="">) - border-left-style +PASS <option>1 (in <select multiple="">) - border-top-color +PASS <option>1 (in <select multiple="">) - border-right-color +PASS <option>1 (in <select multiple="">) - border-bottom-color +PASS <option>1 (in <select multiple="">) - border-left-color +PASS <option>1 (in <select multiple="">) - align-items +FAIL <option>1 (in <select multiple="">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <option>1 (in <select multiple="">) - color +PASS <option>1 (in <select multiple="">) - background-color +FAIL <option>1 (in <select multiple="">) - cursor assert_equals: expected "auto" but got "default" +PASS <option>1 (in <select multiple="">) - font-style +PASS <option>1 (in <select multiple="">) - font-weight +FAIL <option>1 (in <select multiple="">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <option>1 (in <select multiple="">) - font-family assert_equals: expected "Times" but got "Arial" +PASS <option>1 (in <select multiple="">) - writing-mode +PASS <option>1 (in <select multiple="">) - scrollbar-width +PASS <option>1 (in <select multiple="">) - overflow +PASS <option>1 (in <select multiple="">) - vertical-align +PASS <option>1 (in <select multiple="">) - user-select +PASS <option>1 (in <select multiple="">) - page-break-inside +PASS <option>1 (in <select multiple="">) - overflow-clip-box +PASS <option>1 (in <select multiple="">) - font-variant-ligatures +PASS <option>1 (in <select multiple="">) - font-variant-caps +PASS <option>1 (in <select multiple="">) - font-variant-numeric +PASS <option>1 (in <select multiple="">) - font-variant-east-asian +PASS <option>1 (in <select multiple="">) - text-rendering +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-top +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-right +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-bottom +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-left +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-top +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-right +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-bottom +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-left +PASS <optgroup label="2"><option>3 (in <select multiple="">) - letter-spacing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - word-spacing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-transform +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-indent +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-shadow +PASS <optgroup label="2"><option>3 (in <select multiple="">) - appearance +PASS <optgroup label="2"><option>3 (in <select multiple="">) - box-sizing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - align-items +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - background-color +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - cursor assert_equals: expected "auto" but got "default" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-style +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-weight assert_equals: expected "400" but got "700" +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-family assert_equals: expected "Times" but got "Arial" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - writing-mode +PASS <optgroup label="2"><option>3 (in <select multiple="">) - scrollbar-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - overflow +PASS <optgroup label="2"><option>3 (in <select multiple="">) - vertical-align +PASS <optgroup label="2"><option>3 (in <select multiple="">) - user-select +PASS <optgroup label="2"><option>3 (in <select multiple="">) - page-break-inside +PASS <optgroup label="2"><option>3 (in <select multiple="">) - overflow-clip-box +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-ligatures +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-caps +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-numeric +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-east-asian +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-rendering +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-top +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-right +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-bottom +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-left +PASS <option>3 (in <select multiple=""><optgroup label="2">) - padding-top +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-right assert_equals: expected "0px" but got "2px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-bottom assert_equals: expected "0px" but got "1px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-left assert_equals: expected "0px" but got "2px" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - letter-spacing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - word-spacing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-transform +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-indent +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-shadow +PASS <option>3 (in <select multiple=""><optgroup label="2">) - appearance +PASS <option>3 (in <select multiple=""><optgroup label="2">) - box-sizing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - align-items +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - background-color +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - cursor assert_equals: expected "auto" but got "default" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-weight +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - font-family assert_equals: expected "Times" but got "Arial" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - writing-mode +PASS <option>3 (in <select multiple=""><optgroup label="2">) - scrollbar-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - overflow +PASS <option>3 (in <select multiple=""><optgroup label="2">) - vertical-align +PASS <option>3 (in <select multiple=""><optgroup label="2">) - user-select +PASS <option>3 (in <select multiple=""><optgroup label="2">) - page-break-inside +PASS <option>3 (in <select multiple=""><optgroup label="2">) - overflow-clip-box +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-ligatures +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-caps +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-numeric +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-east-asian +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-rendering +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt b/third_party/blink/web_tests/platform/win/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt new file mode 100644 index 0000000..d76850e --- /dev/null +++ b/third_party/blink/web_tests/platform/win/external/wpt/html/rendering/widgets/the-select-element/select-as-listbox-default-styles.tentative-expected.txt
@@ -0,0 +1,197 @@ +This is a testharness.js-based test. +Found 193 tests; 154 PASS, 39 FAIL, 0 TIMEOUT, 0 NOTRUN. +PASS <select multiple=""><option>1 - display +PASS <select multiple=""><option>1 - margin-top +PASS <select multiple=""><option>1 - margin-right +PASS <select multiple=""><option>1 - margin-bottom +PASS <select multiple=""><option>1 - margin-left +PASS <select multiple=""><option>1 - padding-top +PASS <select multiple=""><option>1 - padding-right +PASS <select multiple=""><option>1 - padding-bottom +PASS <select multiple=""><option>1 - padding-left +PASS <select multiple=""><option>1 - letter-spacing +PASS <select multiple=""><option>1 - word-spacing +PASS <select multiple=""><option>1 - text-transform +PASS <select multiple=""><option>1 - text-indent +PASS <select multiple=""><option>1 - text-shadow +PASS <select multiple=""><option>1 - appearance +PASS <select multiple=""><option>1 - box-sizing +FAIL <select multiple=""><option>1 - border-top-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-right-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-bottom-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-left-width assert_equals: expected "0px" but got "1px" +FAIL <select multiple=""><option>1 - border-top-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-right-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-bottom-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-left-style assert_equals: expected "none" but got "solid" +FAIL <select multiple=""><option>1 - border-top-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-right-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-bottom-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - border-left-color assert_equals: expected "rgb(0, 0, 0)" but got "rgb(118, 118, 118)" +FAIL <select multiple=""><option>1 - align-items assert_equals: expected "normal" but got "flex-start" +FAIL <select multiple=""><option>1 - white-space assert_equals: expected "normal" but got "nowrap" +PASS <select multiple=""><option>1 - color +FAIL <select multiple=""><option>1 - background-color assert_equals: expected "rgba(0, 0, 0, 0)" but got "rgb(255, 255, 255)" +FAIL <select multiple=""><option>1 - cursor assert_equals: expected "auto" but got "default" +PASS <select multiple=""><option>1 - font-style +PASS <select multiple=""><option>1 - font-weight +FAIL <select multiple=""><option>1 - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <select multiple=""><option>1 - font-family assert_equals: expected "\"times new roman\"" but got "Arial" +PASS <select multiple=""><option>1 - writing-mode +PASS <select multiple=""><option>1 - scrollbar-width +FAIL <select multiple=""><option>1 - overflow assert_equals: expected "visible" but got "hidden scroll" +FAIL <select multiple=""><option>1 - vertical-align assert_equals: expected "baseline" but got "text-bottom" +PASS <select multiple=""><option>1 - user-select +PASS <select multiple=""><option>1 - page-break-inside +PASS <select multiple=""><option>1 - overflow-clip-box +PASS <select multiple=""><option>1 - font-variant-ligatures +PASS <select multiple=""><option>1 - font-variant-caps +PASS <select multiple=""><option>1 - font-variant-numeric +PASS <select multiple=""><option>1 - font-variant-east-asian +PASS <select multiple=""><option>1 - text-rendering +PASS <option>1 (in <select multiple="">) - margin-top +PASS <option>1 (in <select multiple="">) - margin-right +PASS <option>1 (in <select multiple="">) - margin-bottom +PASS <option>1 (in <select multiple="">) - margin-left +PASS <option>1 (in <select multiple="">) - padding-top +FAIL <option>1 (in <select multiple="">) - padding-right assert_equals: expected "0px" but got "2px" +FAIL <option>1 (in <select multiple="">) - padding-bottom assert_equals: expected "0px" but got "1px" +FAIL <option>1 (in <select multiple="">) - padding-left assert_equals: expected "0px" but got "2px" +PASS <option>1 (in <select multiple="">) - letter-spacing +PASS <option>1 (in <select multiple="">) - word-spacing +PASS <option>1 (in <select multiple="">) - text-transform +PASS <option>1 (in <select multiple="">) - text-indent +PASS <option>1 (in <select multiple="">) - text-shadow +PASS <option>1 (in <select multiple="">) - appearance +PASS <option>1 (in <select multiple="">) - box-sizing +PASS <option>1 (in <select multiple="">) - border-top-width +PASS <option>1 (in <select multiple="">) - border-right-width +PASS <option>1 (in <select multiple="">) - border-bottom-width +PASS <option>1 (in <select multiple="">) - border-left-width +PASS <option>1 (in <select multiple="">) - border-top-style +PASS <option>1 (in <select multiple="">) - border-right-style +PASS <option>1 (in <select multiple="">) - border-bottom-style +PASS <option>1 (in <select multiple="">) - border-left-style +PASS <option>1 (in <select multiple="">) - border-top-color +PASS <option>1 (in <select multiple="">) - border-right-color +PASS <option>1 (in <select multiple="">) - border-bottom-color +PASS <option>1 (in <select multiple="">) - border-left-color +PASS <option>1 (in <select multiple="">) - align-items +FAIL <option>1 (in <select multiple="">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <option>1 (in <select multiple="">) - color +PASS <option>1 (in <select multiple="">) - background-color +FAIL <option>1 (in <select multiple="">) - cursor assert_equals: expected "auto" but got "default" +PASS <option>1 (in <select multiple="">) - font-style +PASS <option>1 (in <select multiple="">) - font-weight +FAIL <option>1 (in <select multiple="">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <option>1 (in <select multiple="">) - font-family assert_equals: expected "\"times new roman\"" but got "Arial" +PASS <option>1 (in <select multiple="">) - writing-mode +PASS <option>1 (in <select multiple="">) - scrollbar-width +PASS <option>1 (in <select multiple="">) - overflow +PASS <option>1 (in <select multiple="">) - vertical-align +PASS <option>1 (in <select multiple="">) - user-select +PASS <option>1 (in <select multiple="">) - page-break-inside +PASS <option>1 (in <select multiple="">) - overflow-clip-box +PASS <option>1 (in <select multiple="">) - font-variant-ligatures +PASS <option>1 (in <select multiple="">) - font-variant-caps +PASS <option>1 (in <select multiple="">) - font-variant-numeric +PASS <option>1 (in <select multiple="">) - font-variant-east-asian +PASS <option>1 (in <select multiple="">) - text-rendering +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-top +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-right +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-bottom +PASS <optgroup label="2"><option>3 (in <select multiple="">) - margin-left +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-top +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-right +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-bottom +PASS <optgroup label="2"><option>3 (in <select multiple="">) - padding-left +PASS <optgroup label="2"><option>3 (in <select multiple="">) - letter-spacing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - word-spacing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-transform +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-indent +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-shadow +PASS <optgroup label="2"><option>3 (in <select multiple="">) - appearance +PASS <optgroup label="2"><option>3 (in <select multiple="">) - box-sizing +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-style +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-top-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-right-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-bottom-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - border-left-color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - align-items +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - color +PASS <optgroup label="2"><option>3 (in <select multiple="">) - background-color +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - cursor assert_equals: expected "auto" but got "default" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-style +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-weight assert_equals: expected "400" but got "700" +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <optgroup label="2"><option>3 (in <select multiple="">) - font-family assert_equals: expected "\"times new roman\"" but got "Arial" +PASS <optgroup label="2"><option>3 (in <select multiple="">) - writing-mode +PASS <optgroup label="2"><option>3 (in <select multiple="">) - scrollbar-width +PASS <optgroup label="2"><option>3 (in <select multiple="">) - overflow +PASS <optgroup label="2"><option>3 (in <select multiple="">) - vertical-align +PASS <optgroup label="2"><option>3 (in <select multiple="">) - user-select +PASS <optgroup label="2"><option>3 (in <select multiple="">) - page-break-inside +PASS <optgroup label="2"><option>3 (in <select multiple="">) - overflow-clip-box +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-ligatures +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-caps +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-numeric +PASS <optgroup label="2"><option>3 (in <select multiple="">) - font-variant-east-asian +PASS <optgroup label="2"><option>3 (in <select multiple="">) - text-rendering +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-top +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-right +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-bottom +PASS <option>3 (in <select multiple=""><optgroup label="2">) - margin-left +PASS <option>3 (in <select multiple=""><optgroup label="2">) - padding-top +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-right assert_equals: expected "0px" but got "2px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-bottom assert_equals: expected "0px" but got "1px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - padding-left assert_equals: expected "0px" but got "2px" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - letter-spacing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - word-spacing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-transform +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-indent +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-shadow +PASS <option>3 (in <select multiple=""><optgroup label="2">) - appearance +PASS <option>3 (in <select multiple=""><optgroup label="2">) - box-sizing +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-top-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-right-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-bottom-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - border-left-color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - align-items +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - white-space assert_equals: expected "normal" but got "nowrap" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - color +PASS <option>3 (in <select multiple=""><optgroup label="2">) - background-color +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - cursor assert_equals: expected "auto" but got "default" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-style +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-weight +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - font-size assert_equals: expected "16px" but got "13.3333px" +FAIL <option>3 (in <select multiple=""><optgroup label="2">) - font-family assert_equals: expected "\"times new roman\"" but got "Arial" +PASS <option>3 (in <select multiple=""><optgroup label="2">) - writing-mode +PASS <option>3 (in <select multiple=""><optgroup label="2">) - scrollbar-width +PASS <option>3 (in <select multiple=""><optgroup label="2">) - overflow +PASS <option>3 (in <select multiple=""><optgroup label="2">) - vertical-align +PASS <option>3 (in <select multiple=""><optgroup label="2">) - user-select +PASS <option>3 (in <select multiple=""><optgroup label="2">) - page-break-inside +PASS <option>3 (in <select multiple=""><optgroup label="2">) - overflow-clip-box +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-ligatures +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-caps +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-numeric +PASS <option>3 (in <select multiple=""><optgroup label="2">) - font-variant-east-asian +PASS <option>3 (in <select multiple=""><optgroup label="2">) - text-rendering +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/win10/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/win10/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/win10/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win10/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt b/third_party/blink/web_tests/platform/win10/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt deleted file mode 100644 index c882308..0000000 --- a/third_party/blink/web_tests/platform/win10/virtual/threaded/external/wpt/css/css-animations/KeyframeEffect-getKeyframes.tentative-expected.txt +++ /dev/null
@@ -1,34 +0,0 @@ -This is a testharness.js-based test. -FAIL KeyframeEffect.getKeyframes() returns no frames for various kinds of empty enimations assert_equals: number of frames with empty @keyframes expected 0 but got 2 -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing comes from animation-timing-function on the element -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on each keyframe -PASS KeyframeEffect.getKeyframes() returns frames with expected easing values, when the easing is specified on some keyframes -PASS KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is set on the effect using animation-composition on the element -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on each keyframe assert_equals: value of 'composite' on ComputedKeyframe #0 expected "replace" but got "auto" -FAIL KeyframeEffect.getKeyframes() returns frames with expected composite values, when the composite is specified on some keyframes assert_equals: value of 'composite' on ComputedKeyframe #0 expected "add" but got "auto" -PASS KeyframeEffect.getKeyframes() returns expected frames for a simple animation that specifies a single shorthand property -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 0% keyframe and no 100% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a 100% keyframe and no 0% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with no 0% or 100% keyframe but with a 50% keyframe -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with a partially complete 100% keyframe (because the !important rule is ignored) -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with different properties on different keyframes, with a different easing function on each -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time, and all with the same easing function -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions -PASS KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different but equivalent easing functions -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different composite operations assert_equals: Number of keyframes should match expected 3 but got 2 -FAIL KeyframeEffect.getKeyframes() returns expected frames for an animation with multiple keyframes for the same time and with different easing functions and composite operations assert_equals: Number of keyframes should match expected 4 but got 3 -PASS KeyframeEffect.getKeyframes() returns expected frames for overlapping keyframes -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with filter properties and missing keyframes assert_equals: value for 'filter' on Keyframe #1 should match expected "blur(5px) sepia(60%) saturate(30%)" but got "blur(5px) sepia(0.6) saturate(0.3)" -PASS KeyframeEffect.getKeyframes() returns expected values for animation with drop-shadow of filter property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with text-shadow properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with background-size properties and missing keyframes -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values -PASS KeyframeEffect.getKeyframes() returns expected values for animations with CSS variables as keyframe values in a shorthand property -PASS KeyframeEffect.getKeyframes() returns expected values for animations with a CSS variable which is overriden by the value in keyframe -PASS KeyframeEffect.getKeyframes() returns expected values for animations with only custom property in a keyframe -PASS KeyframeEffect.getKeyframes() reflects changes to @keyframes rules -FAIL KeyframeEffect.getKeyframes() returns expected values for animations with implicit values and a non-default timingfunction specified for 0% and 100% assert_array_equals: properties on Keyframe #0 should match lengths differ, expected array ["composite", "computedOffset", "easing", "offset"] length 4, got ["composite", "computedOffset", "easing", "left", "offset"] length 5 -Harness: the test ran to completion. -
diff --git a/third_party/closure_compiler/externs/accessibility_features.js b/third_party/closure_compiler/externs/accessibility_features.js index 5b28aa4..61e2bef4 100644 --- a/third_party/closure_compiler/externs/accessibility_features.js +++ b/third_party/closure_compiler/externs/accessibility_features.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.accessibilityFeatures.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md // NOTE: This file was modified by hand after it was generated. All instances of // chrome.accessibilityFeatures.types.ChromeSetting must be changed to // ChromeSetting after this file is generated.
diff --git a/third_party/closure_compiler/externs/activity_log_private.js b/third_party/closure_compiler/externs/activity_log_private.js index 14395f07..ce47155 100644 --- a/third_party/closure_compiler/externs/activity_log_private.js +++ b/third_party/closure_compiler/externs/activity_log_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.activityLogPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: activityLogPrivate
diff --git a/third_party/closure_compiler/externs/arc_apps_private.js b/third_party/closure_compiler/externs/arc_apps_private.js index 7b83788..f2c5473b 100644 --- a/third_party/closure_compiler/externs/arc_apps_private.js +++ b/third_party/closure_compiler/externs/arc_apps_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.arcAppsPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: arcAppsPrivate
diff --git a/third_party/closure_compiler/externs/audio.js b/third_party/closure_compiler/externs/audio.js index a060146..0c1fe86 100644 --- a/third_party/closure_compiler/externs/audio.js +++ b/third_party/closure_compiler/externs/audio.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.audio.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: audio
diff --git a/third_party/closure_compiler/externs/bluetooth_private.js b/third_party/closure_compiler/externs/bluetooth_private.js index 4da9c4a..3945780 100644 --- a/third_party/closure_compiler/externs/bluetooth_private.js +++ b/third_party/closure_compiler/externs/bluetooth_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.bluetoothPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md // IMPORTANT NOTE: Work-around for crbug.com/543822 // s/chrome.bluetoothPrivate.bluetooth.Device/chrome.bluetooth.Device/
diff --git a/third_party/closure_compiler/externs/braille_display_private.js b/third_party/closure_compiler/externs/braille_display_private.js index 565f626..284f784 100644 --- a/third_party/closure_compiler/externs/braille_display_private.js +++ b/third_party/closure_compiler/externs/braille_display_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.brailleDisplayPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: brailleDisplayPrivate
diff --git a/third_party/closure_compiler/externs/chromeos_info_private.js b/third_party/closure_compiler/externs/chromeos_info_private.js index 0c6f887..ea58809 100644 --- a/third_party/closure_compiler/externs/chromeos_info_private.js +++ b/third_party/closure_compiler/externs/chromeos_info_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.chromeosInfoPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: chromeosInfoPrivate
diff --git a/third_party/closure_compiler/externs/clipboard.js b/third_party/closure_compiler/externs/clipboard.js index 6ddd64f..b9b175d9 100644 --- a/third_party/closure_compiler/externs/clipboard.js +++ b/third_party/closure_compiler/externs/clipboard.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.clipboard.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: clipboard
diff --git a/third_party/closure_compiler/externs/command_line_private.js b/third_party/closure_compiler/externs/command_line_private.js index 738f87b9..275842f 100644 --- a/third_party/closure_compiler/externs/command_line_private.js +++ b/third_party/closure_compiler/externs/command_line_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.commandLinePrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: commandLinePrivate
diff --git a/third_party/closure_compiler/externs/crash_report_private.js b/third_party/closure_compiler/externs/crash_report_private.js index 7cef7cdc..3d6c609 100644 --- a/third_party/closure_compiler/externs/crash_report_private.js +++ b/third_party/closure_compiler/externs/crash_report_private.js
@@ -7,8 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.crashReportPrivate.FooType'. // Please run the closure compiler before committing changes. -// See -// https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: crashReportPrivate
diff --git a/third_party/closure_compiler/externs/events.js b/third_party/closure_compiler/externs/events.js index 56c5c4e..7368d466 100644 --- a/third_party/closure_compiler/externs/events.js +++ b/third_party/closure_compiler/externs/events.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.events.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: events
diff --git a/third_party/closure_compiler/externs/file_system_provider.js b/third_party/closure_compiler/externs/file_system_provider.js index ef2f66b8..7ba5429 100644 --- a/third_party/closure_compiler/externs/file_system_provider.js +++ b/third_party/closure_compiler/externs/file_system_provider.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.fileSystemProvider.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: fileSystemProvider
diff --git a/third_party/closure_compiler/externs/management.js b/third_party/closure_compiler/externs/management.js index ff46a37..fc0b8197 100644 --- a/third_party/closure_compiler/externs/management.js +++ b/third_party/closure_compiler/externs/management.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.management.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: management
diff --git a/third_party/closure_compiler/externs/system_display.js b/third_party/closure_compiler/externs/system_display.js index e4515fc0..fdbb71e9 100644 --- a/third_party/closure_compiler/externs/system_display.js +++ b/third_party/closure_compiler/externs/system_display.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.system.display.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md // This was modified to add 'chrome.system = {};' // If the above tool that generates this file removes it, please readd it or
diff --git a/third_party/closure_compiler/externs/tab_groups.js b/third_party/closure_compiler/externs/tab_groups.js index 6caddcf..85c747818 100644 --- a/third_party/closure_compiler/externs/tab_groups.js +++ b/third_party/closure_compiler/externs/tab_groups.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.tabGroups.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: tabGroups
diff --git a/third_party/closure_compiler/externs/tabs.js b/third_party/closure_compiler/externs/tabs.js index 9831a53..053f773 100644 --- a/third_party/closure_compiler/externs/tabs.js +++ b/third_party/closure_compiler/externs/tabs.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.tabs.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md // IMPORTANT NOTE: Work-around for crbug.com/543822 // s/chrome.tabs.extensionTypes.ImageDetails/chrome.extensionTypes.ImageDetails/
diff --git a/third_party/closure_compiler/externs/test.js b/third_party/closure_compiler/externs/test.js index 3610307..abacdd3 100644 --- a/third_party/closure_compiler/externs/test.js +++ b/third_party/closure_compiler/externs/test.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.test.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: test
diff --git a/third_party/closure_compiler/externs/tts.js b/third_party/closure_compiler/externs/tts.js index c0a4a3f..5b035791 100644 --- a/third_party/closure_compiler/externs/tts.js +++ b/third_party/closure_compiler/externs/tts.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.tts.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: tts
diff --git a/third_party/closure_compiler/externs/users_private.js b/third_party/closure_compiler/externs/users_private.js index 51a4fce..0158337 100644 --- a/third_party/closure_compiler/externs/users_private.js +++ b/third_party/closure_compiler/externs/users_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.usersPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: usersPrivate
diff --git a/third_party/closure_compiler/externs/virtual_keyboard_private.js b/third_party/closure_compiler/externs/virtual_keyboard_private.js index c20c731..0032d3b 100644 --- a/third_party/closure_compiler/externs/virtual_keyboard_private.js +++ b/third_party/closure_compiler/externs/virtual_keyboard_private.js
@@ -7,7 +7,7 @@ // NOTE: The format of types has changed. 'FooType' is now // 'chrome.virtualKeyboardPrivate.FooType'. // Please run the closure compiler before committing changes. -// See https://chromium.googlesource.com/chromium/src/+/master/docs/closure_compilation.md +// See https://chromium.googlesource.com/chromium/src/+/main/docs/closure_compilation.md /** * @fileoverview Externs generated from namespace: virtualKeyboardPrivate
diff --git a/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc b/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc index a2b8c28..10939f1 100644 --- a/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc +++ b/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.cc
@@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.h b/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.h index e27b8d2..7d3b486 100644 --- a/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.h +++ b/third_party/maldoca/src/maldoca/service/common/process_doc_wrapper.h
@@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/maldoca/src/third_party/chromium/LICENSE b/third_party/maldoca/src/third_party/chromium/LICENSE index e6c0d72..f3f0fb0 100644 --- a/third_party/maldoca/src/third_party/chromium/LICENSE +++ b/third_party/maldoca/src/third_party/chromium/LICENSE
@@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2012 The Chromium Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are
diff --git a/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.cc b/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.cc index c5519aa..23d6bd6 100644 --- a/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.cc +++ b/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.cc
@@ -1,4 +1,4 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.h b/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.h index c92a2de..3dc9df9 100644 --- a/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.h +++ b/third_party/maldoca/src/third_party/chromium/third_party/zlib/google/zip_reader.h
@@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright 2011 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef THIRD_PARTY_ZLIB_GOOGLE_ZIP_READER_H_
diff --git a/third_party/material_design_icons/BUILD.gn b/third_party/material_design_icons/BUILD.gn index d35e955f..96085d9 100644 --- a/third_party/material_design_icons/BUILD.gn +++ b/third_party/material_design_icons/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. +# Copyright 2017 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/material_web_components/BUILD.gn b/third_party/material_web_components/BUILD.gn index a615495..654efbb 100644 --- a/third_party/material_web_components/BUILD.gn +++ b/third_party/material_web_components/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2022 The Chromium Authors. All rights reserved. +# Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/material_web_components/reproduce.sh b/third_party/material_web_components/reproduce.sh index 1ecd362..27be2bd 100755 --- a/third_party/material_web_components/reproduce.sh +++ b/third_party/material_web_components/reproduce.sh
@@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. @@ -65,7 +65,7 @@ fi cat > BUILD.gn << EOF -# Copyright 2022 The Chromium Authors. All rights reserved. +# Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/material_web_components/resolve_imports.js b/third_party/material_web_components/resolve_imports.js index 1dcb8f6..e9eab2cd 100644 --- a/third_party/material_web_components/resolve_imports.js +++ b/third_party/material_web_components/resolve_imports.js
@@ -1,4 +1,4 @@ -// Copyright 2021 The Chromium Authors. All rights reserved. +// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/material_web_components/rewrite_imports.gni b/third_party/material_web_components/rewrite_imports.gni index 5f6ad162..acae687 100644 --- a/third_party/material_web_components/rewrite_imports.gni +++ b/third_party/material_web_components/rewrite_imports.gni
@@ -1,4 +1,4 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/material_web_components/rewrite_imports.py b/third_party/material_web_components/rewrite_imports.py index 5c7b78a..796349e 100644 --- a/third_party/material_web_components/rewrite_imports.py +++ b/third_party/material_web_components/rewrite_imports.py
@@ -1,4 +1,4 @@ -# Copyright 2022 The Chromium Authors. All rights reserved. +# Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/maven/3pp/3pp.pb b/third_party/maven/3pp/3pp.pb index e4b0d69aa..ad39326f 100644 --- a/third_party/maven/3pp/3pp.pb +++ b/third_party/maven/3pp/3pp.pb
@@ -1,4 +1,4 @@ -# Copyright 2022 The Chromium Authors. All rights reserved. +# Copyright 2022 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/mesa_headers/BUILD.gn b/third_party/mesa_headers/BUILD.gn index d96b7f8..94a5da9 100644 --- a/third_party/mesa_headers/BUILD.gn +++ b/third_party/mesa_headers/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/metrics_proto/BUILD.gn b/third_party/metrics_proto/BUILD.gn index 44b744ea..fea6369 100644 --- a/third_party/metrics_proto/BUILD.gn +++ b/third_party/metrics_proto/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. +# Copyright 2014 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/metrics_proto/LICENSE b/third_party/metrics_proto/LICENSE index a32e00ce..8a18807 100644 --- a/third_party/metrics_proto/LICENSE +++ b/third_party/metrics_proto/LICENSE
@@ -1,4 +1,4 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2015 The Chromium Authors // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are
diff --git a/third_party/metrics_proto/PRESUBMIT.py b/third_party/metrics_proto/PRESUBMIT.py index 26da2b77..e65c920 100644 --- a/third_party/metrics_proto/PRESUBMIT.py +++ b/third_party/metrics_proto/PRESUBMIT.py
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/metrics_proto/PRESUBMIT_test.py b/third_party/metrics_proto/PRESUBMIT_test.py index bdecd21..2225d0b 100755 --- a/third_party/metrics_proto/PRESUBMIT_test.py +++ b/third_party/metrics_proto/PRESUBMIT_test.py
@@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/metrics_proto/call_stack_profile.proto b/third_party/metrics_proto/call_stack_profile.proto index 227877f..3e3912ad 100644 --- a/third_party/metrics_proto/call_stack_profile.proto +++ b/third_party/metrics_proto/call_stack_profile.proto
@@ -1,4 +1,4 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/cast_logs.proto b/third_party/metrics_proto/cast_logs.proto index e7d0c758..28acf8b 100644 --- a/third_party/metrics_proto/cast_logs.proto +++ b/third_party/metrics_proto/cast_logs.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/chrome_os_app_list_launch_event.proto b/third_party/metrics_proto/chrome_os_app_list_launch_event.proto index a22d278..ab8a41bf 100644 --- a/third_party/metrics_proto/chrome_os_app_list_launch_event.proto +++ b/third_party/metrics_proto/chrome_os_app_list_launch_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/chrome_searchbox_stats.proto b/third_party/metrics_proto/chrome_searchbox_stats.proto index 86c1c1c7..af669cc 100644 --- a/third_party/metrics_proto/chrome_searchbox_stats.proto +++ b/third_party/metrics_proto/chrome_searchbox_stats.proto
@@ -1,4 +1,4 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. +// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/chrome_user_metrics_extension.proto b/third_party/metrics_proto/chrome_user_metrics_extension.proto index e6f0e85..d069bf13 100644 --- a/third_party/metrics_proto/chrome_user_metrics_extension.proto +++ b/third_party/metrics_proto/chrome_user_metrics_extension.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/custom_tab_session.proto b/third_party/metrics_proto/custom_tab_session.proto index 114fbee..9d71d2bb 100644 --- a/third_party/metrics_proto/custom_tab_session.proto +++ b/third_party/metrics_proto/custom_tab_session.proto
@@ -1,4 +1,4 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. +// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/execution_context.proto b/third_party/metrics_proto/execution_context.proto index eb775682..0e7fad3 100644 --- a/third_party/metrics_proto/execution_context.proto +++ b/third_party/metrics_proto/execution_context.proto
@@ -1,4 +1,4 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/extension_install.proto b/third_party/metrics_proto/extension_install.proto index e550130..8719a5d 100644 --- a/third_party/metrics_proto/extension_install.proto +++ b/third_party/metrics_proto/extension_install.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/histogram_event.proto b/third_party/metrics_proto/histogram_event.proto index 0768146..6551ee3 100644 --- a/third_party/metrics_proto/histogram_event.proto +++ b/third_party/metrics_proto/histogram_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/omnibox_event.proto b/third_party/metrics_proto/omnibox_event.proto index ebf86bb0..3a27adf 100644 --- a/third_party/metrics_proto/omnibox_event.proto +++ b/third_party/metrics_proto/omnibox_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/omnibox_focus_type.proto b/third_party/metrics_proto/omnibox_focus_type.proto index 3fea37a..75e56462 100644 --- a/third_party/metrics_proto/omnibox_focus_type.proto +++ b/third_party/metrics_proto/omnibox_focus_type.proto
@@ -1,4 +1,4 @@ -// Copyright 2022 The Chromium Authors. All rights reserved. +// Copyright 2022 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/omnibox_input_type.proto b/third_party/metrics_proto/omnibox_input_type.proto index 77d65de..42e363fc 100644 --- a/third_party/metrics_proto/omnibox_input_type.proto +++ b/third_party/metrics_proto/omnibox_input_type.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/perf_data.proto b/third_party/metrics_proto/perf_data.proto index f3b0163a..f86b48d4 100644 --- a/third_party/metrics_proto/perf_data.proto +++ b/third_party/metrics_proto/perf_data.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/perf_stat.proto b/third_party/metrics_proto/perf_stat.proto index f8da6c37..de83606 100644 --- a/third_party/metrics_proto/perf_stat.proto +++ b/third_party/metrics_proto/perf_stat.proto
@@ -1,4 +1,4 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. +// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/printer_event.proto b/third_party/metrics_proto/printer_event.proto index ab53cf1..8f9c6af3 100644 --- a/third_party/metrics_proto/printer_event.proto +++ b/third_party/metrics_proto/printer_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/reporting_info.proto b/third_party/metrics_proto/reporting_info.proto index 23d89ce..d541507 100644 --- a/third_party/metrics_proto/reporting_info.proto +++ b/third_party/metrics_proto/reporting_info.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/sampled_profile.proto b/third_party/metrics_proto/sampled_profile.proto index 49afd25..d4d360f 100644 --- a/third_party/metrics_proto/sampled_profile.proto +++ b/third_party/metrics_proto/sampled_profile.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/structured_data.proto b/third_party/metrics_proto/structured_data.proto index f150ee1..de01afe 100644 --- a/third_party/metrics_proto/structured_data.proto +++ b/third_party/metrics_proto/structured_data.proto
@@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/system_profile.proto b/third_party/metrics_proto/system_profile.proto index bf64282a..435f8f1 100644 --- a/third_party/metrics_proto/system_profile.proto +++ b/third_party/metrics_proto/system_profile.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/trace_log.proto b/third_party/metrics_proto/trace_log.proto index f68de0f8..a8050849 100644 --- a/third_party/metrics_proto/trace_log.proto +++ b/third_party/metrics_proto/trace_log.proto
@@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/translate_event.proto b/third_party/metrics_proto/translate_event.proto index f3d0668..57739e5 100644 --- a/third_party/metrics_proto/translate_event.proto +++ b/third_party/metrics_proto/translate_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2016 The Chromium Authors. All rights reserved. +// Copyright 2016 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/ukm/aggregate.proto b/third_party/metrics_proto/ukm/aggregate.proto index bd7b2b4..6a00d3c 100644 --- a/third_party/metrics_proto/ukm/aggregate.proto +++ b/third_party/metrics_proto/ukm/aggregate.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/ukm/entry.proto b/third_party/metrics_proto/ukm/entry.proto index ef87dd6..b6b45576 100644 --- a/third_party/metrics_proto/ukm/entry.proto +++ b/third_party/metrics_proto/ukm/entry.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/ukm/report.proto b/third_party/metrics_proto/ukm/report.proto index 516c120..a40e402 100644 --- a/third_party/metrics_proto/ukm/report.proto +++ b/third_party/metrics_proto/ukm/report.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/ukm/source.proto b/third_party/metrics_proto/ukm/source.proto index fb92b3b1..7f1c76b 100644 --- a/third_party/metrics_proto/ukm/source.proto +++ b/third_party/metrics_proto/ukm/source.proto
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/user_action_event.proto b/third_party/metrics_proto/user_action_event.proto index d3216b3..afe879868 100644 --- a/third_party/metrics_proto/user_action_event.proto +++ b/third_party/metrics_proto/user_action_event.proto
@@ -1,4 +1,4 @@ -// Copyright 2014 The Chromium Authors. All rights reserved. +// Copyright 2014 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/metrics_proto/user_demographics.proto b/third_party/metrics_proto/user_demographics.proto index 8cba3fa..5691ca05 100644 --- a/third_party/metrics_proto/user_demographics.proto +++ b/third_party/metrics_proto/user_demographics.proto
@@ -1,4 +1,4 @@ -// Copyright 2019 The Chromium Authors. All rights reserved. +// Copyright 2019 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/microsoft_webauthn/BUILD.gn b/third_party/microsoft_webauthn/BUILD.gn index 6a6b2885..36640004 100644 --- a/third_party/microsoft_webauthn/BUILD.gn +++ b/third_party/microsoft_webauthn/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/mig/3pp/install.sh b/third_party/mig/3pp/install.sh index 7e16681..e326cf49 100755 --- a/third_party/mig/3pp/install.sh +++ b/third_party/mig/3pp/install.sh
@@ -1,5 +1,5 @@ #!/bin/bash -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/minigbm/BUILD.gn b/third_party/minigbm/BUILD.gn index f70eccc6..739e278 100644 --- a/third_party/minigbm/BUILD.gn +++ b/third_party/minigbm/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2015 The Chromium Authors. All rights reserved. +# Copyright 2015 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/minizip/BUILD.gn b/third_party/minizip/BUILD.gn index 00fbcf4..3d6cb8e 100644 --- a/third_party/minizip/BUILD.gn +++ b/third_party/minizip/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. +# Copyright 2017 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/minizip/minizip_compress_fuzzer.cc b/third_party/minizip/minizip_compress_fuzzer.cc index 4850448..caac651 100644 --- a/third_party/minizip/minizip_compress_fuzzer.cc +++ b/third_party/minizip/minizip_compress_fuzzer.cc
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/minizip/minizip_uncompress_fuzzer.cc b/third_party/minizip/minizip_uncompress_fuzzer.cc index 82624b8f..19635d2 100644 --- a/third_party/minizip/minizip_uncompress_fuzzer.cc +++ b/third_party/minizip/minizip_uncompress_fuzzer.cc
@@ -1,4 +1,4 @@ -// Copyright 2017 The Chromium Authors. All rights reserved. +// Copyright 2017 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/minizip/mz_os_chrome.cc b/third_party/minizip/mz_os_chrome.cc index 9d60d74..f19b6d4 100644 --- a/third_party/minizip/mz_os_chrome.cc +++ b/third_party/minizip/mz_os_chrome.cc
@@ -1,4 +1,4 @@ -// Copyright 2018 The Chromium Authors. All rights reserved. +// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/mockito/BUILD.gn b/third_party/mockito/BUILD.gn index 5228e51e..52eab0c2 100644 --- a/third_party/mockito/BUILD.gn +++ b/third_party/mockito/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. +# Copyright 2014 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/mockito/proguard.flags b/third_party/mockito/proguard.flags index 1333a47..86265d6 100644 --- a/third_party/mockito/proguard.flags +++ b/third_party/mockito/proguard.flags
@@ -1,4 +1,4 @@ -# Copyright 2018 The Chromium Authors. All rights reserved. +# Copyright 2018 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/modp_b64/BUILD.gn b/third_party/modp_b64/BUILD.gn index 539abe15..13ddaa1 100644 --- a/third_party/modp_b64/BUILD.gn +++ b/third_party/modp_b64/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright (c) 2013 The Chromium Authors. All rights reserved. +# Copyright 2013 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/mozilla/BUILD.gn b/third_party/mozilla/BUILD.gn index 36bbe0dd..bf5cf51 100644 --- a/third_party/mozilla/BUILD.gn +++ b/third_party/mozilla/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2014 The Chromium Authors. All rights reserved. +# Copyright 2014 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/mozilla/MozillaExport.h b/third_party/mozilla/MozillaExport.h index 489eade..2e16bde 100644 --- a/third_party/mozilla/MozillaExport.h +++ b/third_party/mozilla/MozillaExport.h
@@ -1,4 +1,4 @@ -// Copyright 2013 The Chromium Authors. All rights reserved. +// Copyright 2013 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file.
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn index 2ff63f85..8fecd75 100644 --- a/third_party/nearby/BUILD.gn +++ b/third_party/nearby/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. +# Copyright 2020 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/util/process_version.gni")
diff --git a/third_party/neon_2_sse/BUILD.gn b/third_party/neon_2_sse/BUILD.gn index a0c1133..3b00035 100644 --- a/third_party/neon_2_sse/BUILD.gn +++ b/third_party/neon_2_sse/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2020 The Chromium Authors. All rights reserved. +# Copyright 2020 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/netty-tcnative/BUILD.gn b/third_party/netty-tcnative/BUILD.gn index e01de5c..138fd83 100644 --- a/third_party/netty-tcnative/BUILD.gn +++ b/third_party/netty-tcnative/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2016 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/netty4/BUILD.gn b/third_party/netty4/BUILD.gn index 8e41b3f..3990878e 100644 --- a/third_party/netty4/BUILD.gn +++ b/third_party/netty4/BUILD.gn
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2016 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/netty4/netty4.gni b/third_party/netty4/netty4.gni index 27e045df..7ec93ae 100644 --- a/third_party/netty4/netty4.gni +++ b/third_party/netty4/netty4.gni
@@ -1,4 +1,4 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2016 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/PRESUBMIT.py b/third_party/node/PRESUBMIT.py index 7f18abb..e2dff00 100644 --- a/third_party/node/PRESUBMIT.py +++ b/third_party/node/PRESUBMIT.py
@@ -1,4 +1,4 @@ -# Copyright 2019 The Chromium Authors. All rights reserved. +# Copyright 2019 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/node.gni b/third_party/node/node.gni index 81c4f2c..7b81117 100644 --- a/third_party/node/node.gni +++ b/third_party/node/node.gni
@@ -1,4 +1,4 @@ -# Copyright 2021 The Chromium Authors. All rights reserved. +# Copyright 2021 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/node.py b/third_party/node/node.py index aa27e5d..2471ca1 100755 --- a/third_party/node/node.py +++ b/third_party/node/node.py
@@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2017 The Chromium Authors. All rights reserved. +# Copyright 2017 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/node_modules.py b/third_party/node/node_modules.py index 14eaacb..a6ae339 100755 --- a/third_party/node/node_modules.py +++ b/third_party/node/node_modules.py
@@ -1,5 +1,5 @@ #!/usr/bin/env python -# Copyright 2016 The Chromium Authors. All rights reserved. +# Copyright 2016 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/update_node_binaries b/third_party/node/update_node_binaries index e917649..22f1aaf 100755 --- a/third_party/node/update_node_binaries +++ b/third_party/node/update_node_binaries
@@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 The Chromium Authors. All rights reserved. +# Copyright 2017 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/node/update_npm_deps b/third_party/node/update_npm_deps index 8e98f49..d5abd01 100755 --- a/third_party/node/update_npm_deps +++ b/third_party/node/update_npm_deps
@@ -1,6 +1,6 @@ #!/bin/bash -# Copyright 2017 The Chromium Authors. All rights reserved. +# Copyright 2017 The Chromium Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file.
diff --git a/third_party/rust/Cargo.toml b/third_party/rust/Cargo.toml index 4e4fd8fed..5facb10 100644 --- a/third_party/rust/Cargo.toml +++ b/third_party/rust/Cargo.toml
@@ -63,429 +63,429 @@ version = "0.5" features = ["preserve_order"] [patch.crates-io.addr2line_v0_17] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/addr2line/v0_17/crate" +path = "addr2line/v0_17/crate" package = "addr2line" [patch.crates-io.adler_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/adler/v1/crate" +path = "adler/v1/crate" package = "adler" [patch.crates-io.aho-corasick_v0_7] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/aho_corasick/v0_7/crate" +path = "aho_corasick/v0_7/crate" package = "aho-corasick" [patch.crates-io.aquamarine_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/aquamarine/v0_1/crate" +path = "aquamarine/v0_1/crate" package = "aquamarine" [patch.crates-io.atty_v0_2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/atty/v0_2/crate" +path = "atty/v0_2/crate" package = "atty" [patch.crates-io.autocfg_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocfg/v1/crate" +path = "autocfg/v1/crate" package = "autocfg" [patch.crates-io.autocxx-bindgen_v0_60] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx_bindgen/v0_60/crate" +path = "autocxx_bindgen/v0_60/crate" package = "autocxx-bindgen" [patch.crates-io.autocxx-engine_v0_22] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx_engine/v0_22/crate" +path = "autocxx_engine/v0_22/crate" package = "autocxx-engine" [patch.crates-io.autocxx-gen_v0_22] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx_gen/v0_22/crate" +path = "autocxx_gen/v0_22/crate" package = "autocxx-gen" [patch.crates-io.autocxx-macro_v0_22] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx_macro/v0_22/crate" +path = "autocxx_macro/v0_22/crate" package = "autocxx-macro" [patch.crates-io.autocxx-parser_v0_22] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx_parser/v0_22/crate" +path = "autocxx_parser/v0_22/crate" package = "autocxx-parser" [patch.crates-io.autocxx_v0_22] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/autocxx/v0_22/crate" +path = "autocxx/v0_22/crate" package = "autocxx" [patch.crates-io.backtrace_v0_3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/backtrace/v0_3/crate" +path = "backtrace/v0_3/crate" package = "backtrace" [patch.crates-io.bindgen_v0_60] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/bindgen/v0_60/crate" +path = "bindgen/v0_60/crate" package = "bindgen" [patch.crates-io.bitflags_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/bitflags/v1/crate" +path = "bitflags/v1/crate" package = "bitflags" [patch.crates-io.camino_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/camino/v1/crate" +path = "camino/v1/crate" package = "camino" [patch.crates-io.cargo-platform_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cargo_platform/v0_1/crate" +path = "cargo_platform/v0_1/crate" package = "cargo-platform" [patch.crates-io.cargo_metadata_v0_14] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cargo_metadata/v0_14/crate" +path = "cargo_metadata/v0_14/crate" package = "cargo_metadata" [patch.crates-io.cexpr_v0_6] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cexpr/v0_6/crate" +path = "cexpr/v0_6/crate" package = "cexpr" [patch.crates-io.cfg-if_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cfg_if/v1/crate" +path = "cfg_if/v1/crate" package = "cfg-if" [patch.crates-io.clang-sys_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clang_sys/v1/crate" +path = "clang_sys/v1/crate" package = "clang-sys" [patch.crates-io.clap_lex_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clap_lex/v0_1/crate" +path = "clap_lex/v0_1/crate" package = "clap_lex" [patch.crates-io.clap_v3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/clap/v3/crate" +path = "clap/v3/crate" package = "clap" [patch.crates-io.codespan-reporting_v0_11] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/codespan_reporting/v0_11/crate" +path = "codespan_reporting/v0_11/crate" package = "codespan-reporting" [patch.crates-io.cxx-gen_v0_7] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cxx_gen/v0_7/crate" +path = "cxx_gen/v0_7/crate" package = "cxx-gen" [patch.crates-io.cxx_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cxx/v1/crate" +path = "cxx/v1/crate" package = "cxx" [patch.crates-io.cxxbridge-cmd_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cxxbridge_cmd/v1/crate" +path = "cxxbridge_cmd/v1/crate" package = "cxxbridge-cmd" [patch.crates-io.cxxbridge-macro_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/cxxbridge_macro/v1/crate" +path = "cxxbridge_macro/v1/crate" package = "cxxbridge-macro" [patch.crates-io.either_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/either/v1/crate" +path = "either/v1/crate" package = "either" [patch.crates-io.env_logger_v0_9] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/env_logger/v0_9/crate" +path = "env_logger/v0_9/crate" package = "env_logger" [patch.crates-io.fastrand_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/fastrand/v1/crate" +path = "fastrand/v1/crate" package = "fastrand" [patch.crates-io.gimli_v0_26] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/gimli/v0_26/crate" +path = "gimli/v0_26/crate" package = "gimli" [patch.crates-io.glob_v0_3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/glob/v0_3/crate" +path = "glob/v0_3/crate" package = "glob" [patch.crates-io.hashbrown_v0_11] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/hashbrown/v0_11/crate" +path = "hashbrown/v0_11/crate" package = "hashbrown" [patch.crates-io.heck_v0_4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/heck/v0_4/crate" +path = "heck/v0_4/crate" package = "heck" [patch.crates-io.humantime_v2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/humantime/v2/crate" +path = "humantime/v2/crate" package = "humantime" [patch.crates-io.indexmap_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/indexmap/v1/crate" +path = "indexmap/v1/crate" package = "indexmap" [patch.crates-io.indoc_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/indoc/v1/crate" +path = "indoc/v1/crate" package = "indoc" [patch.crates-io.is_ci_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/is_ci/v1/crate" +path = "is_ci/v1/crate" package = "is_ci" [patch.crates-io.itertools_v0_10] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/itertools/v0_10/crate" +path = "itertools/v0_10/crate" package = "itertools" [patch.crates-io.itertools_v0_9] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/itertools/v0_9/crate" +path = "itertools/v0_9/crate" package = "itertools" [patch.crates-io.itoa_v0_4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/itoa/v0_4/crate" +path = "itoa/v0_4/crate" package = "itoa" [patch.crates-io.itoa_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/itoa/v1/crate" +path = "itoa/v1/crate" package = "itoa" [patch.crates-io.lazy_static_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/lazy_static/v1/crate" +path = "lazy_static/v1/crate" package = "lazy_static" [patch.crates-io.lazycell_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/lazycell/v1/crate" +path = "lazycell/v1/crate" package = "lazycell" [patch.crates-io.libc_v0_2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/libc/v0_2/crate" +path = "libc/v0_2/crate" package = "libc" [patch.crates-io.libloading_v0_7] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/libloading/v0_7/crate" +path = "libloading/v0_7/crate" package = "libloading" [patch.crates-io.link-cplusplus_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/link_cplusplus/v1/crate" +path = "link_cplusplus/v1/crate" package = "link-cplusplus" [patch.crates-io.log_v0_4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/log/v0_4/crate" +path = "log/v0_4/crate" package = "log" [patch.crates-io.memchr_v2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/memchr/v2/crate" +path = "memchr/v2/crate" package = "memchr" [patch.crates-io.memoffset_v0_6] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/memoffset/v0_6/crate" +path = "memoffset/v0_6/crate" package = "memoffset" [patch.crates-io.miette-derive_v4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/miette_derive/v4/crate" +path = "miette_derive/v4/crate" package = "miette-derive" [patch.crates-io.miette_v4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/miette/v4/crate" +path = "miette/v4/crate" package = "miette" [patch.crates-io.minimal-lexical_v0_2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/minimal_lexical/v0_2/crate" +path = "minimal_lexical/v0_2/crate" package = "minimal-lexical" [patch.crates-io.miniz_oxide_v0_4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/miniz_oxide/v0_4/crate" +path = "miniz_oxide/v0_4/crate" package = "miniz_oxide" [patch.crates-io.moveit_v0_5] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/moveit/v0_5/crate" +path = "moveit/v0_5/crate" package = "moveit" [patch.crates-io.nom_v7] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/nom/v7/crate" +path = "nom/v7/crate" package = "nom" [patch.crates-io.object_v0_27] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/object/v0_27/crate" +path = "object/v0_27/crate" package = "object" [patch.crates-io.once_cell_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/once_cell/v1/crate" +path = "once_cell/v1/crate" package = "once_cell" [patch.crates-io.os_str_bytes_v6] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/os_str_bytes/v6/crate" +path = "os_str_bytes/v6/crate" package = "os_str_bytes" [patch.crates-io.owo-colors_v3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/owo_colors/v3/crate" +path = "owo_colors/v3/crate" package = "owo-colors" [patch.crates-io.pathdiff_v0_2] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/pathdiff/v0_2/crate" +path = "pathdiff/v0_2/crate" package = "pathdiff" [patch.crates-io.peeking_take_while_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/peeking_take_while/v0_1/crate" +path = "peeking_take_while/v0_1/crate" package = "peeking_take_while" [patch.crates-io.prettyplease_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/prettyplease/v0_1/crate" +path = "prettyplease/v0_1/crate" package = "prettyplease" [patch.crates-io.proc-macro-error-attr_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/proc_macro_error_attr/v1/crate" +path = "proc_macro_error_attr/v1/crate" package = "proc-macro-error-attr" [patch.crates-io.proc-macro-error_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/proc_macro_error/v1/crate" +path = "proc_macro_error/v1/crate" package = "proc-macro-error" [patch.crates-io.proc-macro2_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/proc_macro2/v1/crate" +path = "proc_macro2/v1/crate" package = "proc-macro2" [patch.crates-io.quote_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/quote/v1/crate" +path = "quote/v1/crate" package = "quote" [patch.crates-io.regex-syntax_v0_6] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/regex_syntax/v0_6/crate" +path = "regex_syntax/v0_6/crate" package = "regex-syntax" [patch.crates-io.regex_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/regex/v1/crate" +path = "regex/v1/crate" package = "regex" [patch.crates-io.remove_dir_all_v0_5] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/remove_dir_all/v0_5/crate" +path = "remove_dir_all/v0_5/crate" package = "remove_dir_all" [patch.crates-io.rstest_v0_12] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/rstest/v0_12/crate" +path = "rstest/v0_12/crate" package = "rstest" [patch.crates-io.rustc-demangle_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/rustc_demangle/v0_1/crate" +path = "rustc_demangle/v0_1/crate" package = "rustc-demangle" [patch.crates-io.rustc-hash_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/rustc_hash/v1/crate" +path = "rustc_hash/v1/crate" package = "rustc-hash" [patch.crates-io.rustc_version_v0_4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/rustc_version/v0_4/crate" +path = "rustc_version/v0_4/crate" package = "rustc_version" [patch.crates-io.rustversion_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/rustversion/v1/crate" +path = "rustversion/v1/crate" package = "rustversion" [patch.crates-io.ryu_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/ryu/v1/crate" +path = "ryu/v1/crate" package = "ryu" [patch.crates-io.semver_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/semver/v1/crate" +path = "semver/v1/crate" package = "semver" [patch.crates-io.serde_derive_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/serde_derive/v1/crate" +path = "serde_derive/v1/crate" package = "serde_derive" [patch.crates-io.serde_json_lenient_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/serde_json_lenient/v0_1/crate" +path = "serde_json_lenient/v0_1/crate" package = "serde_json_lenient" [patch.crates-io.serde_json_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/serde_json/v1/crate" +path = "serde_json/v1/crate" package = "serde_json" [patch.crates-io.serde_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/serde/v1/crate" +path = "serde/v1/crate" package = "serde" [patch.crates-io.shlex_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/shlex/v1/crate" +path = "shlex/v1/crate" package = "shlex" [patch.crates-io.small_ctor_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/small_ctor/v0_1/crate" +path = "small_ctor/v0_1/crate" package = "small_ctor" [patch.crates-io.smawk_v0_3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/smawk/v0_3/crate" +path = "smawk/v0_3/crate" package = "smawk" [patch.crates-io.static_assertions_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/static_assertions/v1/crate" +path = "static_assertions/v1/crate" package = "static_assertions" [patch.crates-io.strsim_v0_10] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/strsim/v0_10/crate" +path = "strsim/v0_10/crate" package = "strsim" [patch.crates-io.strum_macros_v0_24] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/strum_macros/v0_24/crate" +path = "strum_macros/v0_24/crate" package = "strum_macros" [patch.crates-io.supports-color_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/supports_color/v1/crate" +path = "supports_color/v1/crate" package = "supports-color" [patch.crates-io.supports-hyperlinks_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/supports_hyperlinks/v1/crate" +path = "supports_hyperlinks/v1/crate" package = "supports-hyperlinks" [patch.crates-io.supports-unicode_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/supports_unicode/v1/crate" +path = "supports_unicode/v1/crate" package = "supports-unicode" [patch.crates-io.syn_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/syn/v1/crate" +path = "syn/v1/crate" package = "syn" [patch.crates-io.tempfile_v3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/tempfile/v3/crate" +path = "tempfile/v3/crate" package = "tempfile" [patch.crates-io.termcolor_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/termcolor/v1/crate" +path = "termcolor/v1/crate" package = "termcolor" [patch.crates-io.terminal_size_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/terminal_size/v0_1/crate" +path = "terminal_size/v0_1/crate" package = "terminal_size" [patch.crates-io.textwrap_v0_15] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/textwrap/v0_15/crate" +path = "textwrap/v0_15/crate" package = "textwrap" [patch.crates-io.thiserror-impl_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/thiserror_impl/v1/crate" +path = "thiserror_impl/v1/crate" package = "thiserror-impl" [patch.crates-io.thiserror_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/thiserror/v1/crate" +path = "thiserror/v1/crate" package = "thiserror" [patch.crates-io.toml_v0_5] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/toml/v0_5/crate" +path = "toml/v0_5/crate" package = "toml" [patch.crates-io.unicode-ident_v1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/unicode_ident/v1/crate" +path = "unicode_ident/v1/crate" package = "unicode-ident" [patch.crates-io.unicode-linebreak_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/unicode_linebreak/v0_1/crate" +path = "unicode_linebreak/v0_1/crate" package = "unicode-linebreak" [patch.crates-io.unicode-width_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/unicode_width/v0_1/crate" +path = "unicode_width/v0_1/crate" package = "unicode-width" [patch.crates-io.unindent_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/unindent/v0_1/crate" +path = "unindent/v0_1/crate" package = "unindent" [patch.crates-io.version_check_v0_9] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/version_check/v0_9/crate" +path = "version_check/v0_9/crate" package = "version_check" [patch.crates-io.which_v4] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/which/v4/crate" +path = "which/v4/crate" package = "which" [patch.crates-io.winapi-util_v0_1] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/winapi_util/v0_1/crate" +path = "winapi_util/v0_1/crate" package = "winapi-util" [patch.crates-io.winapi_v0_3] -path = "/usr/local/google/home/collinbaker/chromium/src/third_party/rust/winapi/v0_3/crate" +path = "winapi/v0_3/crate" package = "winapi"
diff --git a/third_party/wayland-protocols/BUILD.gn b/third_party/wayland-protocols/BUILD.gn index dc038853..da6daca8 100644 --- a/third_party/wayland-protocols/BUILD.gn +++ b/third_party/wayland-protocols/BUILD.gn
@@ -2,19 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -import("//build/config/sysroot.gni") import("//third_party/wayland/wayland_protocol.gni") -# This component mixes protocols from different sources. One of those sources -# is special: that is the wayland-protocols package which defines a set of -# standardised protocols. When using the system libwayland for the client, we -# should use the manifest files provided in the sysroot. -if (use_system_libwayland_client) { - standard_protocol_prefix = "${sysroot}/usr/share/wayland-protocols" -} else { - standard_protocol_prefix = "src" -} - # ATTENTION! Please keep these rules alphabetized! wayland_protocol("alpha_compositing_protocol") { @@ -34,7 +23,7 @@ } wayland_protocol("fullscreen_shell_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/fullscreen-shell/fullscreen-shell-unstable-v1.xml" ] + sources = [ "src/unstable/fullscreen-shell/fullscreen-shell-unstable-v1.xml" ] } wayland_protocol("gaming_input_protocol") { @@ -50,15 +39,15 @@ } wayland_protocol("idle_inhibit_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml" ] + sources = [ "src/unstable/idle-inhibit/idle-inhibit-unstable-v1.xml" ] } wayland_protocol("input_method_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/input-method/input-method-unstable-v1.xml" ] + sources = [ "src/unstable/input-method/input-method-unstable-v1.xml" ] } wayland_protocol("input_timestamps_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/input-timestamps/input-timestamps-unstable-v1.xml" ] + sources = [ "src/unstable/input-timestamps/input-timestamps-unstable-v1.xml" ] } wayland_protocol("keyboard_configuration_protocol") { @@ -70,15 +59,15 @@ } wayland_protocol("keyboard_shortcuts_inhibit_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml" ] + sources = [ "src/unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml" ] } wayland_protocol("linux_dmabuf_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml" ] + sources = [ "src/unstable/linux-dmabuf/linux-dmabuf-unstable-v1.xml" ] } wayland_protocol("linux_explicit_synchronization_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/linux-explicit-synchronization/linux-explicit-synchronization-unstable-v1.xml" ] + sources = [ "src/unstable/linux-explicit-synchronization/linux-explicit-synchronization-unstable-v1.xml" ] } wayland_protocol("notification_shell_protocol") { @@ -90,23 +79,25 @@ } wayland_protocol("pointer_constraints_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml" ] + sources = + [ "src/unstable/pointer-constraints/pointer-constraints-unstable-v1.xml" ] } wayland_protocol("pointer_gestures_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml" ] + sources = [ "src/unstable/pointer-gestures/pointer-gestures-unstable-v1.xml" ] } wayland_protocol("presentation_time_protocol") { - sources = [ "${standard_protocol_prefix}/stable/presentation-time/presentation-time.xml" ] + sources = [ "src/stable/presentation-time/presentation-time.xml" ] } wayland_protocol("primary_selection_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/primary-selection/primary-selection-unstable-v1.xml" ] + sources = + [ "src/unstable/primary-selection/primary-selection-unstable-v1.xml" ] } wayland_protocol("relative_pointer_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/relative-pointer/relative-pointer-unstable-v1.xml" ] + sources = [ "src/unstable/relative-pointer/relative-pointer-unstable-v1.xml" ] } wayland_protocol("remote_shell_protocol") { @@ -133,7 +124,7 @@ } wayland_protocol("text_input_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/text-input/text-input-unstable-v1.xml" ] + sources = [ "src/unstable/text-input/text-input-unstable-v1.xml" ] } wayland_protocol("touchpad_haptics_protocol") { @@ -141,7 +132,7 @@ } wayland_protocol("viewporter_protocol") { - sources = [ "${standard_protocol_prefix}/stable/viewporter/viewporter.xml" ] + sources = [ "src/stable/viewporter/viewporter.xml" ] } wayland_protocol("vsync_feedback_protocol") { @@ -157,30 +148,27 @@ } wayland_protocol("xdg_activation") { - # XDG activation has been introduced in wayland-protocols version 1.21, which - # is newer than 1.20 which is currently in the sysroot for Debian bullseye. - # That is why we cannot use the standard protocol prefix here. sources = [ "src/staging/xdg-activation/xdg-activation-v1.xml" ] } wayland_protocol("xdg_decoration_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml" ] + sources = [ "src/unstable/xdg-decoration/xdg-decoration-unstable-v1.xml" ] } wayland_protocol("xdg_foreign") { sources = [ - "${standard_protocol_prefix}/unstable/xdg-foreign/xdg-foreign-unstable-v1.xml", - "${standard_protocol_prefix}/unstable/xdg-foreign/xdg-foreign-unstable-v2.xml", + "src/unstable/xdg-foreign/xdg-foreign-unstable-v1.xml", + "src/unstable/xdg-foreign/xdg-foreign-unstable-v2.xml", ] } wayland_protocol("xdg_output_protocol") { - sources = [ "${standard_protocol_prefix}/unstable/xdg-output/xdg-output-unstable-v1.xml" ] + sources = [ "src/unstable/xdg-output/xdg-output-unstable-v1.xml" ] } wayland_protocol("xdg_shell_protocol") { sources = [ - "${standard_protocol_prefix}/stable/xdg-shell/xdg-shell.xml", - "${standard_protocol_prefix}/unstable/xdg-shell/xdg-shell-unstable-v6.xml", + "src/stable/xdg-shell/xdg-shell.xml", + "src/unstable/xdg-shell/xdg-shell-unstable-v6.xml", ] }
diff --git a/third_party/wayland/BUILD.gn b/third_party/wayland/BUILD.gn index 03a02b30..f7386d7 100644 --- a/third_party/wayland/BUILD.gn +++ b/third_party/wayland/BUILD.gn
@@ -2,7 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/linux/pkg_config.gni") -import("//build/config/sysroot.gni") import("//third_party/wayland/features.gni") import("//third_party/wayland/wayland_protocol.gni") import("//tools/generate_stubs/rules.gni") @@ -10,11 +9,7 @@ # This should be open to both system and non - system libwayland as wayland_stubs # also uses this. wayland_protocol("wayland_protocol_c") { - if (use_system_libwayland_client) { - sources = [ "${sysroot}/usr/share/wayland/wayland.xml" ] - } else { - sources = [ "src/protocol/wayland.xml" ] - } + sources = [ "src/protocol/wayland.xml" ] code_marshalling = true }
diff --git a/third_party/webxr_test_pages/README.chromium b/third_party/webxr_test_pages/README.chromium index 4e4b646..3ad568b 100644 --- a/third_party/webxr_test_pages/README.chromium +++ b/third_party/webxr_test_pages/README.chromium
@@ -29,22 +29,36 @@ Instructions: -In order to serve the samples locally, few steps are required: +In order to serve the samples locally, a few steps are required: -1. Copy contents of src/chrome/test/data/xr/webxr_samples/media into - src/third_party/webxr_test_pages/webxr-samples/media +1. Most samples use images and glTF objects that are stored separately. To make + these available, copy the contents of + src/chrome/test/data/xr/webxr_samples/media/ + into a new directory: + src/third_party/webxr_test_pages/webxr-samples/media/ + You can skip this step if you are testing the 'barebones' samples. -2. Serve files, for example by running +2. Serve files using a local web server, for example by running `python -m SimpleHTTPServer <port number>` in - src/third_party/webxr_test_pages/webxr-samples + src/third_party/webxr_test_pages/webxr-samples/ 3. If you are having trouble with the python server such as it being unreliable serving media like the gltf files, try using "npm serve". To install: `sudo npm install -g serve` - To run: `serve .` in src/third_party/webxr_test_pages/webxr-samples + To run: `serve .` in src/third_party/webxr_test_pages/webxr-samples/ + +4. For testing on an Android phone, open chrome://inspect/?tracing#devices + and ensure that your phone is visible. The phone must have USB debugging enabled. + Then enable port forwarding for your local web server's port. This makes + the local web server available on the phone at the address + http://localhost/<port number>, for example http://localhost/8080/ + See https://developer.chrome.com/docs/devtools/remote-debugging/ + for more detailed instructions. -To verify if you have sufficient access to the cloud bucket: +The following instructions explain how to update the public copy of the repository +which is stored in a Google cloud bucket. To verify if you have sufficient +access to the cloud bucket: 1. Run: gsutil.py ls -d gs://chromium-webxr-test
diff --git a/tools/crates/gnrt/main.rs b/tools/crates/gnrt/main.rs index 0f0e59d..3b2035a4 100644 --- a/tools/crates/gnrt/main.rs +++ b/tools/crates/gnrt/main.rs
@@ -118,13 +118,10 @@ // Generate a fake root Cargo.toml for dependency resolution. let cargo_manifest = generate_fake_cargo_toml( third_party_manifest, - crates.iter().map(|(c, _)| { - let crate_path = paths.third_party.join(c.crate_path()).canonicalize().unwrap(); - manifest::PatchSpecification { - package_name: c.name.clone(), - patch_name: c.patch_name(), - path: crate_path, - } + crates.iter().map(|(c, _)| manifest::PatchSpecification { + package_name: c.name.clone(), + patch_name: c.patch_name(), + path: c.crate_path(), }), );
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 1706792..8c29a760 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -133,7 +133,6 @@ 'android-annotator-rel': 'android_release_bot_minimal_symbols_arm64_webview_google_reclient', 'android-chrome-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', 'android-cronet-asan-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86_clang_asan_reclient', - 'android-marshmallow-x86-fyi-rel-reviver': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_google_reclient', 'android-pie-arm64-wpt-rel-non-cq': 'android_release_bot_minimal_symbols_arm64_webview_monochrome_reclient', 'android-pie-x86-fyi-rel-reviver': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', 'android-weblayer-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', @@ -1008,7 +1007,6 @@ 'android-fieldtrial-rel': 'android_release_trybot_minimal_symbols_x86_fastbuild_disable_proguard_chrome_google', 'android-inverse-fieldtrials-pie-x86-fyi-rel': 'android_release_trybot_x86_fastbuild_webview_google_invert_fieldtrials', 'android-marshmallow-arm64-rel': 'gpu_tests_android_release_trybot_arm64_fastbuild_java_coverage', - 'android-marshmallow-x86-fyi-rel-reviver': 'android_release_trybot_x86_fastbuild_webview_google', 'android-marshmallow-x86-rel': 'android_release_trybot_x86_fastbuild_webview_google_coverage', 'android-marshmallow-x86-rel-non-cq': 'android_release_trybot_x86_fastbuild_webview_google', 'android-marshmallow-x86-rel-reclient': 'android_release_trybot_x86_fastbuild_webview_google_coverage_reclient',
diff --git a/tools/mb/mb_config_expectations/chromium.android.fyi.json b/tools/mb/mb_config_expectations/chromium.android.fyi.json index c810a2a..fb29cde 100644 --- a/tools/mb/mb_config_expectations/chromium.android.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.android.fyi.json
@@ -92,23 +92,6 @@ "use_thin_lto": false } }, - "android-marshmallow-x86-fyi-rel-reviver": { - "gn_args": { - "android_static_analysis": "off", - "dcheck_always_on": false, - "debuggable_apks": false, - "ffmpeg_branding": "Chrome", - "is_component_build": false, - "is_debug": false, - "proprietary_codecs": true, - "strip_debug_info": true, - "symbol_level": 1, - "system_webview_package_name": "com.google.android.webview", - "target_cpu": "x86", - "target_os": "android", - "use_remoteexec": true - } - }, "android-pie-arm64-wpt-rel-non-cq": { "gn_args": { "dcheck_always_on": false,
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.android.json b/tools/mb/mb_config_expectations/tryserver.chromium.android.json index d89326a0..30840682 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.android.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.android.json
@@ -608,23 +608,6 @@ "use_static_angle": true } }, - "android-marshmallow-x86-fyi-rel-reviver": { - "gn_args": { - "android_static_analysis": "off", - "dcheck_always_on": true, - "debuggable_apks": false, - "ffmpeg_branding": "Chrome", - "is_component_build": false, - "is_debug": false, - "proprietary_codecs": true, - "strip_debug_info": true, - "symbol_level": 0, - "system_webview_package_name": "com.google.android.webview", - "target_cpu": "x86", - "target_os": "android", - "use_goma": true - } - }, "android-marshmallow-x86-rel": { "gn_args": { "android_static_analysis": "off",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 37c1bc11..5233a05 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -36320,6 +36320,7 @@ <int value="240" label="kOffscreen"/> <int value="241" label="kSidePanel"/> <int value="242" label="kDownloadsUi"/> + <int value="243" label="kWebRequestAuthProvider"/> </enum> <enum name="ExtensionPointEnableState"> @@ -52524,6 +52525,11 @@ <int value="2" label="Camera and Microphone permissions"/> </enum> +<enum name="IOSPostRestoreSigninChoice"> + <int value="0" label="Continue"/> + <int value="1" label="Dismiss"/> +</enum> + <enum name="IOSRepeatedExternalAppPromptResponse"> <int value="0" label="Blocked"> User selected to block the application for the current session. @@ -57613,6 +57619,7 @@ <int value="-1454264660" label="ProminentDarkModeActiveTabTitle:disabled"/> <int value="-1453647118" label="PasswordLeakDetection:disabled"/> <int value="-1452786530" label="ChromeOSZramWriteback:enabled"/> + <int value="-1452408727" label="AutofillEnableCvcForVcnYellowPath:enabled"/> <int value="-1452010225" label="WindowNaming:disabled"/> <int value="-1451644187" label="OverviewSwipeToClose:enabled"/> <int value="-1450657485" label="EnableHardwareMirrorMode:enabled"/> @@ -58867,6 +58874,7 @@ <int value="-719147284" label="ExperimentalProductivityFeatures:disabled"/> <int value="-718884399" label="NewTabPageUIMd:enabled"/> <int value="-718626298" label="SysInternals:enabled"/> + <int value="-717339133" label="AutofillEnableCvcForVcnYellowPath:disabled"/> <int value="-716965886" label="NtpRealboxRoundedCorners:disabled"/> <int value="-716953514" label="disable-password-separated-signin-flow"/> <int value="-716272467" label="AssistantAppSupport:disabled"/>
diff --git a/tools/metrics/histograms/metadata/fingerprint/histograms.xml b/tools/metrics/histograms/metadata/fingerprint/histograms.xml index 22a17ad..890b5c5 100644 --- a/tools/metrics/histograms/metadata/fingerprint/histograms.xml +++ b/tools/metrics/histograms/metadata/fingerprint/histograms.xml
@@ -126,7 +126,6 @@ <histogram name="Fingerprint.Unlock.AttemptsCountBeforeSuccess" units="count" expires_after="2023-04-05"> <owner>emaamari@google.com</owner> - <owner>jessejames@chromium.org</owner> <owner>cros-lurs@google.com</owner> <summary> Counts the number of fingerprint attempts until successful screen unlock. @@ -142,11 +141,14 @@ <histogram name="Fingerprint.Unlock.AuthSuccessful" enum="BooleanSuccess" expires_after="2023-04-05"> <owner>emaamari@google.com</owner> - <owner>jessejames@chromium.org</owner> <owner>cros-lurs@google.com</owner> <summary> Counts the number of times that the fingerprint match successfully vs. rejected. + + This is recorded in the same location as Fingerprint.Unlock.Result. When the + Fingerprint.Unlock.Result is success, AuthSuccessful reports true, otherwise + AuthSuccessful reports false. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/ios/histograms.xml b/tools/metrics/histograms/metadata/ios/histograms.xml index dfa857b3..ec70e28b 100644 --- a/tools/metrics/histograms/metadata/ios/histograms.xml +++ b/tools/metrics/histograms/metadata/ios/histograms.xml
@@ -1380,6 +1380,24 @@ </summary> </histogram> +<histogram name="IOS.PostRestoreSignin.Choice" + enum="IOSPostRestoreSigninChoice" expires_after="2023-03-05"> + <owner>scottyoder@google.com</owner> + <owner>bling-get-set-up@google.com</owner> + <summary> + Logs a user's choice when presented with the Post Restore Signin Promo.' + </summary> +</histogram> + +<histogram name="IOS.PostRestoreSignin.Displayed" enum="Boolean" + expires_after="2023-03-05"> + <owner>scottyoder@google.com</owner> + <owner>bling-get-set-up@google.com</owner> + <summary> + Indicates whether the Post Restore Signin Promo was displayed. + </summary> +</histogram> + <histogram name="IOS.Process.ActivePrewarm" enum="Boolean" expires_after="2023-02-26"> <owner>justincohen@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 8afc918..ec960ad 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -2375,6 +2375,41 @@ </summary> </histogram> +<histogram name="Media.EME.MediaFoundationCdm.ActivateCdmFactory" + enum="Hresult" expires_after="2023-05-07"> + <owner>sangbaekpark@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + HRESULT of MediaFoundationCdmModule::ActivateCdmFactory(). This is only + reported when ActivateCdmFactory() fails. + </summary> +</histogram> + +<histogram name="Media.EME.MediaFoundationCdm.LoadErrorCode" + enum="WinGetLastError" expires_after="2023-05-07"> + <owner>sangbaekpark@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + The error code of a library CDM load failure. Only reported on Windows. + </summary> +</histogram> + +<histogram name="Media.EME.MediaFoundationCdm.LoadResult" enum="CdmLoadResult" + expires_after="2023-05-07"> + <owner>sangbaekpark@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary> + The result from an attempt to load a library MediaFoundation CDM. + </summary> +</histogram> + +<histogram name="Media.EME.MediaFoundationCdm.LoadTime" units="ms" + expires_after="2023-03-19"> + <owner>sangbaekpark@chromium.org</owner> + <owner>media-dev@chromium.org</owner> + <summary>The time spent to load a library MediaFoundation CDM.</summary> +</histogram> + <histogram name="Media.EME.MediaFoundationCdm.Widevine.HardwareSecure.FirstInitialize" enum="Hresult" expires_after="2023-05-07">
diff --git a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml index 6e0486a..122452e 100644 --- a/tools/metrics/histograms/metadata/new_tab_page/histograms.xml +++ b/tools/metrics/histograms/metadata/new_tab_page/histograms.xml
@@ -1701,7 +1701,7 @@ <histogram name="NewTabPage.SearchResumptionModule.NotShown" enum="SearchResumptionModule.ModuleNotShownReason" - expires_after="2022-10-31"> + expires_after="2023-04-30"> <owner>hanxi@chromium.org</owner> <owner>spdonghao@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index e8304d9..fcc1187c 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -14259,7 +14259,7 @@ </histogram> <histogram name="UpgradeDetector.HoursBeforeUpgrade" units="hours" - expires_after="2022-10-04"> + expires_after="2023-04-04"> <owner>emshack@chromium.org</owner> <owner>pbos@chromium.org</owner> <summary>
diff --git a/tools/perf/benchmark.csv b/tools/perf/benchmark.csv index 036d931a..80dfa4a 100644 --- a/tools/perf/benchmark.csv +++ b/tools/perf/benchmark.csv
@@ -75,7 +75,6 @@ system_health.memory_desktop,"pasko@chromium.org, lizeb@chromium.org",,https://bit.ly/system-health-benchmarks,"2016,2018,2019,2020,2021,accessibility,emerging_market,health_check,images,infinite_scroll,international,javascript_heavy,keyboard_input,scroll,tabs_switching,wasm,webgl" system_health.memory_mobile,"pasko@chromium.org, lizeb@chromium.org",,https://bit.ly/system-health-benchmarks,"2016,2018,2019,2020,2021,emerging_market,health_check,images,infinite_scroll,international,javascript_heavy" system_health.pcscan,"tmrts@chromium.org, mlippautz@chromium.org",Blink,https://bit.ly/36XBtpn,"2021,health_check,javascript_heavy" -system_health.weblayer_startup,"cduvall@chromium.org, weblayer-team@chromium.org",Internals>WebLayer,https://bit.ly/36XBtpn,2016 system_health.webview_startup,"oksamyt@chromium.org, torne@chromium.org, changwan@chromium.org",Mobile>WebView>Perf,,2016 tab_switching.typical_25,vovoy@chromium.org,OS>Performance,,"2016,tabs_switching" tracing.tracing_with_background_memory_infra,ssid@chromium.org,,,
diff --git a/tools/perf/benchmarks/system_health.py b/tools/perf/benchmarks/system_health.py index adab12d..4438011 100644 --- a/tools/perf/benchmarks/system_health.py +++ b/tools/perf/benchmarks/system_health.py
@@ -273,42 +273,6 @@ return 'system_health.webview_startup' -@benchmark.Info(emails=['cduvall@chromium.org', 'weblayer-team@chromium.org'], - component='Internals>WebLayer', - documentation_url='https://bit.ly/36XBtpn') -class WebLayerStartupSystemHealthBenchmark(perf_benchmark.PerfBenchmark): - """WebLayer startup time benchmark - - Benchmark that measures how long WebLayer takes to start up - and load a blank page. - """ - options = {'pageset_repeat': 20} - # TODO(rmhasan): Remove the SUPPORTED_PLATFORMS lists. - # SUPPORTED_PLATFORMS is deprecated, please put system specifier tags - # from expectations.config in SUPPORTED_PLATFORM_TAGS. - # TODO(crbug.com/1137468): Add WEBLAYER to telemetry platforms. - SUPPORTED_PLATFORM_TAGS = [platforms.MOBILE] - SUPPORTED_PLATFORMS = [story.expectations.ALL_MOBILE] - - def CreateStorySet(self, options): - return page_sets.SystemHealthBlankStorySet() - - def CreateCoreTimelineBasedMeasurementOptions(self): - options = timeline_based_measurement.Options() - options.SetTimelineBasedMetrics(['weblayerStartupMetric']) - options.config.enable_atrace_trace = True - # TODO(crbug.com/1028882): Recording a Chrome trace at the same time as - # atrace causes events to stack incorrectly. Fix this by recording a - # system+Chrome trace via system perfetto on the device instead. - options.config.enable_chrome_trace = False - options.config.atrace_config.app_name = 'org.chromium.weblayer.shell' - return options - - @classmethod - def Name(cls): - return 'system_health.weblayer_startup' - - @benchmark.Info(emails=['tmrts@chromium.org', 'mlippautz@chromium.org'], component='Blink', documentation_url='https://bit.ly/36XBtpn')
diff --git a/tools/perf/benchmarks/system_health_unittest.py b/tools/perf/benchmarks/system_health_unittest.py index 1b7f0bc9..d0f7256 100644 --- a/tools/perf/benchmarks/system_health_unittest.py +++ b/tools/perf/benchmarks/system_health_unittest.py
@@ -35,8 +35,6 @@ def testSystemHealthStorySetIsUsed(self): for b in _GetAllSystemHealthBenchmarks(): - if b is system_health_benchmark.WebLayerStartupSystemHealthBenchmark: - continue if b is system_health_benchmark.WebviewStartupSystemHealthBenchmark: continue if b is system_health_benchmark.PCScanSystemHealthBenchmark:
diff --git a/tools/perf/chrome_telemetry_build/BUILD.gn b/tools/perf/chrome_telemetry_build/BUILD.gn index ba89622..0c69677 100644 --- a/tools/perf/chrome_telemetry_build/BUILD.gn +++ b/tools/perf/chrome_telemetry_build/BUILD.gn
@@ -120,16 +120,6 @@ ] } - group("telemetry_chrome_test_android_weblayer") { - testonly = true - - data_deps = [ - ":telemetry_chrome_test", - ":telemetry_weblayer_apks", - "//chrome/android:monochrome_public_apk", - ] - } - group("telemetry_chrome_test_android_webview") { testonly = true @@ -180,22 +170,6 @@ } } -group("telemetry_weblayer_apks") { - testonly = true - - data_deps = [] - if (is_android) { - data_deps += [ - "//weblayer/shell/android:weblayer_shell_system_webview_apk", - - # TODO(crbug.com/1022823): Remove the following two deps once our tooling - # is configured to use weblayer_shell_system_webview_apk. - "//weblayer/shell/android:weblayer_shell_apk", - "//weblayer/shell/android:weblayer_support_apk", - ] - } -} - group("telemetry_chrome_test_without_chrome") { testonly = true
diff --git a/tools/perf/chrome_telemetry_build/android_browser_types.gni b/tools/perf/chrome_telemetry_build/android_browser_types.gni index bee8dbb..e74afd5b 100644 --- a/tools/perf/chrome_telemetry_build/android_browser_types.gni +++ b/tools/perf/chrome_telemetry_build/android_browser_types.gni
@@ -12,7 +12,6 @@ "_android_chrome", "_android_monochrome", "_android_monochrome_bundle", - "_android_weblayer", "_android_webview", ]
diff --git a/tools/perf/cli_tools/soundwave/studies/__init__.py b/tools/perf/cli_tools/soundwave/studies/__init__.py index 06f7022..39b93e4 100644 --- a/tools/perf/cli_tools/soundwave/studies/__init__.py +++ b/tools/perf/cli_tools/soundwave/studies/__init__.py
@@ -4,11 +4,10 @@ from cli_tools.soundwave.studies import health_study from cli_tools.soundwave.studies import v8_study -from cli_tools.soundwave.studies import weblayer_study from core.external_modules import pandas -_STUDIES = {'health': health_study, 'v8': v8_study, 'weblayer': weblayer_study} +_STUDIES = {'health': health_study, 'v8': v8_study} NAMES = sorted(_STUDIES)
diff --git a/tools/perf/cli_tools/soundwave/studies/weblayer_study.py b/tools/perf/cli_tools/soundwave/studies/weblayer_study.py deleted file mode 100644 index 4274852..0000000 --- a/tools/perf/cli_tools/soundwave/studies/weblayer_study.py +++ /dev/null
@@ -1,62 +0,0 @@ -# Copyright 2019 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -from __future__ import print_function -from core.services import dashboard_service -from cli_tools.soundwave.tables import timeseries - - -CLOUD_PATH = 'gs://chrome-health-tvdata/datasets/weblayer_study.csv' - -SYSTEM_HEALTH = [ - { - 'test_suite': 'system_health.memory_mobile', - 'measurement': ('memory:chrome:all_processes:reported_by_os:' - 'private_footprint_size_avg'), - } -] - -STARTUP_BY_BROWSER = { - 'cct': { - 'test_suite': 'startup.mobile', - 'measurement': 'first_contentful_paint_time', - 'test_case': 'cct_coldish_bbc' - }, - 'weblayer': { - 'test_suite': 'startup.mobile', - 'measurement': 'first_contentful_paint_time', - 'test_case': 'intent_coldish_bbc' - }, -} - - -def IterSystemHealthBots(): - yield 'ChromiumPerf:android-pixel2-perf' - yield 'ChromiumPerf:android-pixel2_weblayer-perf' - - -def GetBrowserFromBot(bot): - return 'weblayer' if 'weblayer' in bot else 'cct' - - -def GetHealthCheckStories(): - description = dashboard_service.Describe('system_health.common_mobile') - return description['caseTags']['health_check'] - - -def IterTestPaths(): - test_cases = GetHealthCheckStories() - for bot in IterSystemHealthBots(): - browser = GetBrowserFromBot(bot) - - # Startup. - yield timeseries.Key.FromDict(STARTUP_BY_BROWSER[browser], bot=bot) - - for series in SYSTEM_HEALTH: - measurement = series['measurement'] - for test_case in test_cases: - print(timeseries.Key.FromDict( - series, bot=bot, measurement=measurement, test_case=test_case)) - yield timeseries.Key.FromDict( - series, bot=bot, measurement=measurement, test_case=test_case)
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index df42990..eb4aa07 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -419,8 +419,7 @@ _GetBenchmarkConfig('speedometer'), _GetBenchmarkConfig('speedometer2')]) _ANDROID_GO_WEBVIEW_BENCHMARK_CONFIGS = _ANDROID_GO_BENCHMARK_CONFIGS -_ANDROID_PIXEL2_BENCHMARK_CONFIGS = PerfSuite( - _OFFICIAL_EXCEPT_DISPLAY_LOCKING).Remove(['system_health.weblayer_startup']) +_ANDROID_PIXEL2_BENCHMARK_CONFIGS = PerfSuite(_OFFICIAL_EXCEPT_DISPLAY_LOCKING) _ANDROID_PIXEL2_EXECUTABLE_CONFIGS = frozenset([ _components_perftests(60), ]) @@ -428,17 +427,9 @@ OFFICIAL_BENCHMARK_CONFIGS).Remove([ 'blink_perf.display_locking', 'jetstream2', - 'system_health.weblayer_startup', 'v8.browsing_mobile-future', ]) -_ANDROID_PIXEL2_WEBLAYER_BENCHMARK_CONFIGS = PerfSuite([ - _GetBenchmarkConfig('system_health.common_mobile', True), - _GetBenchmarkConfig('system_health.memory_mobile', True), - _GetBenchmarkConfig('startup.mobile'), - _GetBenchmarkConfig('system_health.weblayer_startup') -]) -_ANDROID_PIXEL4_BENCHMARK_CONFIGS = PerfSuite( - _OFFICIAL_EXCEPT_DISPLAY_LOCKING).Remove(['system_health.weblayer_startup']) +_ANDROID_PIXEL4_BENCHMARK_CONFIGS = PerfSuite(_OFFICIAL_EXCEPT_DISPLAY_LOCKING) _ANDROID_PIXEL4_EXECUTABLE_CONFIGS = frozenset([ _components_perftests(60), ]) @@ -446,15 +437,8 @@ OFFICIAL_BENCHMARK_CONFIGS).Remove([ 'blink_perf.display_locking', 'jetstream2', - 'system_health.weblayer_startup', 'v8.browsing_mobile-future', ]) -_ANDROID_PIXEL4_WEBLAYER_BENCHMARK_CONFIGS = PerfSuite([ - _GetBenchmarkConfig('system_health.common_mobile', True), - _GetBenchmarkConfig('system_health.memory_mobile', True), - _GetBenchmarkConfig('startup.mobile'), - _GetBenchmarkConfig('system_health.weblayer_startup') -]) _ANDROID_PIXEL4A_POWER_BENCHMARK_CONFIGS = PerfSuite([ _GetBenchmarkConfig('power.mobile'), _GetBenchmarkConfig('system_health.scroll_jank_mobile') @@ -662,9 +646,6 @@ ANDROID_PIXEL2_WEBVIEW_PGO = PerfPlatform( 'android-pixel2_webview-perf-pgo', 'Android OPM1.171019.021', _ANDROID_PIXEL2_WEBVIEW_BENCHMARK_CONFIGS, 21, 'android') -ANDROID_PIXEL2_WEBLAYER = PerfPlatform( - 'android-pixel2_weblayer-perf', 'Android OPM1.171019.021', - _ANDROID_PIXEL2_WEBLAYER_BENCHMARK_CONFIGS, 4, 'android') ANDROID_PIXEL4 = PerfPlatform('android-pixel4-perf', 'Android R', _ANDROID_PIXEL4_BENCHMARK_CONFIGS, @@ -681,12 +662,6 @@ ANDROID_PIXEL4_WEBVIEW = PerfPlatform( 'android-pixel4_webview-perf', 'Android R', _ANDROID_PIXEL4_WEBVIEW_BENCHMARK_CONFIGS, 21, 'android') -ANDROID_PIXEL4_WEBLAYER = PerfPlatform( - 'android-pixel4_weblayer-perf', 'Android R', - _ANDROID_PIXEL4_WEBLAYER_BENCHMARK_CONFIGS, 4, 'android') -ANDROID_PIXEL4_WEBLAYER_PGO = PerfPlatform( - 'android-pixel4_weblayer-perf-pgo', 'Android R', - _ANDROID_PIXEL4_WEBLAYER_BENCHMARK_CONFIGS, 4, 'android') ANDROID_PIXEL4A_POWER = PerfPlatform('android-pixel4a_power-perf', 'Android QD4A.200102.001.A1', _ANDROID_PIXEL4A_POWER_BENCHMARK_CONFIGS,
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index b77b05c0..0f08624 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -517,7 +517,6 @@ 'push_apps_to_background_apk', 'system_webview_apk', 'system_webview_shell_apk', - 'telemetry_weblayer_apks', ], 'tests': [ { @@ -605,7 +604,6 @@ 'push_apps_to_background_apk', 'system_webview_apk', 'system_webview_shell_apk', - 'telemetry_weblayer_apks', ], 'dimension': { 'cpu': 'x86', @@ -795,19 +793,6 @@ 'device_os_flavor': 'google', }, }, - 'android-pixel2_weblayer-perf': { - 'tests': [{ - 'isolate': 'performance_weblayer_test_suite', - }], - 'platform': 'android-weblayer', - 'dimension': { - 'pool': 'chrome.tests.perf-weblayer', - 'os': 'Android', - 'device_type': 'walleye', - 'device_os': 'OPM1.171019.021', - 'device_os_flavor': 'google', - }, - }, 'android-pixel2-perf': { 'tests': [{ 'isolate': @@ -851,32 +836,6 @@ 'device_os_flavor': 'google', }, }, - 'android-pixel4_weblayer-perf': { - 'tests': [{ - 'isolate': 'performance_weblayer_test_suite', - }], - 'platform': 'android-weblayer-trichrome-google-bundle', - 'dimension': { - 'pool': 'chrome.tests.perf-weblayer', - 'os': 'Android', - 'device_type': 'flame', - 'device_os': 'RP1A.201105.002', - 'device_os_flavor': 'google', - }, - }, - 'android-pixel4_weblayer-perf-pgo': { - 'tests': [{ - 'isolate': 'performance_weblayer_test_suite', - }], - 'platform': 'android-weblayer-trichrome-google-bundle', - 'dimension': { - 'pool': 'chrome.tests.perf-weblayer', - 'os': 'Android', - 'device_type': 'flame', - 'device_os': 'RP1A.201105.002', - 'device_os_flavor': 'google', - }, - }, 'android-pixel4-perf': { 'tests': [{ 'isolate': @@ -1661,7 +1620,6 @@ 'performance_test_suite_eve', 'performance_test_suite_octopus', 'performance_webview_test_suite', - 'performance_weblayer_test_suite', 'performance_web_engine_test_suite', ] for suffix in android_browser_types.TELEMETRY_ANDROID_BROWSER_TARGET_SUFFIXES:
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index 95b87d6..8ce679de 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,16 +5,16 @@ "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm64/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "win": { - "hash": "65ecf13a2147ba913f9a952fa13f5b7f15a16f60", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ad82476afb8e871871290f5e26b6477b9953db81/trace_processor_shell.exe" + "hash": "dbad4ee538391d519c93f5538d22fc7358fcf1e1", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/e552de0d99aadf1bafaf00a31375477241cc43a9/trace_processor_shell.exe" }, "linux_arm": { "hash": "58893933be305d3bfe0a72ebebcacde2ac3ca893", "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux_arm/49b4b5dcbc312d8d2c3751cf29238b8efeb4e494/trace_processor_shell" }, "mac": { - "hash": "52d287934ab7750cc91b878dcb9eac92642d4b57", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/cfd7aed8ea3518c78eb91ef185961be0ab784447/trace_processor_shell" + "hash": "f82b49bfc216f919ba6d62c869875c90f9e4add3", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/mac/ad82476afb8e871871290f5e26b6477b9953db81/trace_processor_shell" }, "mac_arm64": { "hash": "e1ad4861384b06d911a65f035317914b8cc975c6",
diff --git a/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm b/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm index 8e83de3..8e6364fd 100644 --- a/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm +++ b/ui/accelerated_widget_mac/ca_layer_tree_unittest_mac.mm
@@ -59,7 +59,8 @@ CVPixelBufferCreateWithIOSurface(nullptr, io_surface, nullptr, cv_pixel_buffer.InitializeInto()); gl_image->InitializeWithCVPixelBuffer(cv_pixel_buffer, 0, - gfx::GenericSharedMemoryId(), format); + gfx::GenericSharedMemoryId(), format, + gfx::ColorSpace::CreateREC709()); } else { gl_image->Initialize(io_surface, 0, gfx::GenericSharedMemoryId(), format); }
diff --git a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc index 91e65a7..a0c59157 100644 --- a/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc +++ b/ui/accessibility/platform/ax_platform_node_auralinux_unittest.cc
@@ -1029,8 +1029,9 @@ gint number_of_actions = atk_action_get_n_actions(ATK_ACTION(root_obj)); - // The only action exposed would be the context menu action. - EXPECT_EQ(1, number_of_actions); + // In absence of any other actions, we would expose the default and the + // context menu actions. + EXPECT_EQ(2, number_of_actions); g_object_unref(root_obj); }
diff --git a/ui/accessibility/platform/ax_platform_node_delegate.cc b/ui/accessibility/platform/ax_platform_node_delegate.cc index 1df468d9..163b1b37 100644 --- a/ui/accessibility/platform/ax_platform_node_delegate.cc +++ b/ui/accessibility/platform/ax_platform_node_delegate.cc
@@ -77,9 +77,10 @@ ax::mojom::Action::kScrollBackward}); std::vector<ax::mojom::Action> supported_actions; - // The default action, if it exists, must be listed at index 0. - if (HasDefaultActionVerb()) - supported_actions.push_back(ax::mojom::Action::kDoDefault); + // The default action must be listed at index 0. + // TODO(crbug.com/1370076): Find out why some nodes do not expose a + // default action (HasDefaultActionVerb() is false). + supported_actions.push_back(ax::mojom::Action::kDoDefault); // Users expect to be able to bring a context menu on any object via e.g. // right click, so we make the context menu action available to any object
diff --git a/ui/android/BUILD.gn b/ui/android/BUILD.gn index c6ded5c..70b1e71 100644 --- a/ui/android/BUILD.gn +++ b/ui/android/BUILD.gn
@@ -278,6 +278,7 @@ "java/src/org/chromium/ui/dragdrop/DragAndDropBrowserDelegate.java", "java/src/org/chromium/ui/dragdrop/DragAndDropDelegate.java", "java/src/org/chromium/ui/dragdrop/DragAndDropDelegateImpl.java", + "java/src/org/chromium/ui/dragdrop/DragEventDispatchHelper.java", "java/src/org/chromium/ui/dragdrop/DragStateTracker.java", "java/src/org/chromium/ui/dragdrop/DropDataAndroid.java", "java/src/org/chromium/ui/dragdrop/DropDataContentProvider.java", @@ -494,6 +495,7 @@ "junit/src/org/chromium/ui/base/MimeTypeUtilsTest.java", "junit/src/org/chromium/ui/base/SelectFileDialogTest.java", "junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java", + "junit/src/org/chromium/ui/dragdrop/DragEventDispatchHelperUnitTest.java", "junit/src/org/chromium/ui/dragdrop/DropDataAndroidUnitTest.java", "junit/src/org/chromium/ui/dragdrop/DropDataContentProviderTest.java", "junit/src/org/chromium/ui/drawable/AnimationLooperTest.java", @@ -535,6 +537,7 @@ "//third_party/androidx:androidx_appcompat_appcompat_resources_java", "//third_party/androidx:androidx_asynclayoutinflater_asynclayoutinflater_java", "//third_party/androidx:androidx_core_core_java", + "//third_party/androidx:androidx_lifecycle_lifecycle_common_java", "//third_party/androidx:androidx_test_core_java", "//third_party/androidx:androidx_test_ext_junit_java", "//third_party/androidx:androidx_test_runner_java",
diff --git a/ui/android/java/src/org/chromium/ui/base/EventForwarder.java b/ui/android/java/src/org/chromium/ui/base/EventForwarder.java index f93761c..c84cd6d3 100644 --- a/ui/android/java/src/org/chromium/ui/base/EventForwarder.java +++ b/ui/android/java/src/org/chromium/ui/base/EventForwarder.java
@@ -35,6 +35,10 @@ private float mCurrentTouchOffsetX; private float mCurrentTouchOffsetY; + // Offset for the drag events that's dispatching through other views. + private float mDragDispatchingOffsetX; + private float mDragDispatchingOffsetY; + private int mLastMouseButtonState; // Track the last tool type of touch sequence. @@ -218,9 +222,11 @@ /** * Sets the current amount to offset incoming touch events by (including MotionEvent and * DragEvent). This is used to handle content moving and not lining up properly with the - * android input system. - * @param dx The X offset in pixels to shift touch events. - * @param dy The Y offset in pixels to shift touch events. + * android input system. Usually used when view location shifted (e.g. by top browser control, + * etc.) + * + * @param dx The X offset in pixels to shift touch and drag events. + * @param dy The Y offset in pixels to shift touch and drag events. */ public void setCurrentTouchEventOffsets(float dx, float dy) { mCurrentTouchOffsetX = dx; @@ -228,6 +234,20 @@ } /** + * Sets the current amount to offset incoming drag events by. Used for {@link DragEvent} only. + * Usually used when dispatching drag events dispatched from views other than the ContentView. + * + * @param dx The X offset in pixels to shift drag events. + * @param dy The Y offset in pixels to shift drag events. + * + * @see #setCurrentTouchEventOffsets(float, float) to offset both touch and drag events. + */ + public void setDragDispatchingOffset(float dx, float dy) { + mDragDispatchingOffsetX = dx; + mDragDispatchingOffsetY = dy; + } + + /** * Creates a new motion event differed from the given event by current touch offset * if the offset is not zero. * @param src Source motion event. @@ -404,8 +424,8 @@ containerView.getLocationOnScreen(locationOnScreen); // All coordinates are in device pixel. Conversion to DIP happens in the native. - float x = event.getX() + mCurrentTouchOffsetX; - float y = event.getY() + mCurrentTouchOffsetY; + float x = event.getX() + mCurrentTouchOffsetX + mDragDispatchingOffsetX; + float y = event.getY() + mCurrentTouchOffsetY + mDragDispatchingOffsetY; float screenX = x + locationOnScreen[0]; float screenY = y + locationOnScreen[1];
diff --git a/ui/android/java/src/org/chromium/ui/base/EventOffsetHandler.java b/ui/android/java/src/org/chromium/ui/base/EventOffsetHandler.java index 4d7f059..d57e642 100644 --- a/ui/android/java/src/org/chromium/ui/base/EventOffsetHandler.java +++ b/ui/android/java/src/org/chromium/ui/base/EventOffsetHandler.java
@@ -20,6 +20,7 @@ public interface EventOffsetHandlerDelegate { float getTop(); void setCurrentTouchEventOffsets(float top); + void setCurrentDragEventOffsets(float dx, float dy); } private final EventOffsetHandlerDelegate mDelegate; @@ -31,9 +32,12 @@ /** * Call this before handling onDispatchDragEvent. * @param action Drag event action. + * @param dx The offset on x-axis for the current drag event. + * @param dy The offset on y-axis for the current drag event. */ - public void onPreDispatchDragEvent(int action) { + public void onPreDispatchDragEvent(int action, float dx, float dy) { setTouchEventOffsets(-mDelegate.getTop()); + setDragEventOffsets(dx, dy); } /** @@ -44,6 +48,7 @@ if (action == DragEvent.ACTION_DRAG_EXITED || action == DragEvent.ACTION_DRAG_ENDED || action == DragEvent.ACTION_DROP) { setTouchEventOffsets(0.f); + setDragEventOffsets(0.f, 0.f); } } @@ -79,4 +84,8 @@ private void setTouchEventOffsets(float y) { mDelegate.setCurrentTouchEventOffsets(y); } + + private void setDragEventOffsets(float dx, float dy) { + mDelegate.setCurrentDragEventOffsets(dx, dy); + } }
diff --git a/ui/android/java/src/org/chromium/ui/dragdrop/DragEventDispatchHelper.java b/ui/android/java/src/org/chromium/ui/dragdrop/DragEventDispatchHelper.java new file mode 100644 index 0000000..f18972b --- /dev/null +++ b/ui/android/java/src/org/chromium/ui/dragdrop/DragEventDispatchHelper.java
@@ -0,0 +1,159 @@ +// 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.ui.dragdrop; + +import android.util.SparseBooleanArray; +import android.view.DragEvent; +import android.view.View; +import android.view.View.OnDragListener; + +import androidx.annotation.Nullable; +import androidx.annotation.VisibleForTesting; + +/** + * Wrapper class that accounts for drag event coordinate differences when forwarding a + * {@link DragEvent} from View A to View B. This class currently only support destinations that + * implement {@link DragEventDispatchDestination}, in order to pass the offset correctly. + * Once an instance of this dispatcher helper is created, it will attach to the sourceView as an + * {@link View.OnDragListener}. + * + * <br/><br/>Sample use: + * + * <pre> + * + * class DestinationView implements DragEventDispatchDestination extends View { + * @Override + * View view() { return this; } + * + * @Override + * boolean onDragEventWithOffset(DragEvent event, int dx, int dy) { //... }; + * }; + * + * void setup() { + * View origin; + * DestinationView destination; + * new DragEventDispatchHelper(origin, destination); + * } + * </pre> + */ +public class DragEventDispatchHelper implements OnDragListener { + static final int[] ALL_DRAG_ACTIONS = new int[] {DragEvent.ACTION_DRAG_STARTED, + DragEvent.ACTION_DRAG_LOCATION, DragEvent.ACTION_DROP, DragEvent.ACTION_DRAG_ENDED, + DragEvent.ACTION_DRAG_ENTERED, DragEvent.ACTION_DRAG_EXITED}; + + /** + * Interface indicating this view accept drag events that dispatches from the other views. + * Expected to be implemented by a view class. + */ + public interface DragEventDispatchDestination { + /** + * @return The view instance this destination represents. + */ + View view(); + + /** + * Receive drag event with coordinate offset to {@link DragEvent#getX()} / + * {@link DragEvent#getY()}. This is used when dispatching drag event from a view that shows + * on top of the view hierarchy and blocks the drag event from passing into views on the + * back. + * + * To get the right X / Y for the drag events: + * X = {@link DragEvent#getX()} + dx + * Y = {@link DragEvent#getY()} + dy + * + * @param event DragEvent that is received by the foreground view. + * @param dx X-axis offset for the drag events. + * @param dy Y-axis offset for the drag events. + */ + boolean onDragEventWithOffset(DragEvent event, int dx, int dy); + + /** + * Helper function to get the DragEventDispatchDestination object from View, if it is an + * DragEventDispatchDestination instance. Return null otherwise. + */ + static @Nullable DragEventDispatchDestination from(View view) { + if (view instanceof DragEventDispatchDestination) { + return (DragEventDispatchDestination) view; + } + return null; + } + } + + private final View mSourceView; + private final DragEventDispatchDestination mDestinationView; + + private final SparseBooleanArray mSupportedActionsMask = + new SparseBooleanArray(ALL_DRAG_ACTIONS.length); + + /** + * Create a helper OnDragListener that will redirect the drag event from the |sourceView| onto + * the |destination|. The instance will be used as the OnDragListener of the |sourceView|. + * @param sourceView The sourceView where the drag event needs to be redirected. + * @param destination The destination to receive the redirected drag events. + */ + public DragEventDispatchHelper(View sourceView, DragEventDispatchDestination destination) { + mSourceView = sourceView; + mDestinationView = destination; + + mSourceView.setOnDragListener(this); + + // By default support forwarding all drag actions. + for (int action : ALL_DRAG_ACTIONS) { + // Do no notify DRAG_STARTED or DRAG_ENDED since Android will dispatch such drag event + // to all views in the current hierarchy. + boolean supported = (action != DragEvent.ACTION_DRAG_STARTED + && action != DragEvent.ACTION_DRAG_ENDED); + markActionSupported(action, supported); + } + } + + /** + * Stop dispatching drag events to the destination. + */ + public void stop() { + mSourceView.setOnDragListener(null); + } + + @Override + public boolean onDrag(View v, DragEvent event) { + // Always handle the DRAG_START to receive following updates from the OS. + boolean isDragStart = event.getAction() == DragEvent.ACTION_DRAG_STARTED; + + View destinationView = mDestinationView.view(); + if (destinationView == null || !destinationView.isEnabled() + || !destinationView.isAttachedToWindow() || !isActionSupported(event.getAction())) { + return isDragStart; + } + + // ACTION_DRAG_ENTERED / ACTION_DRAG_EXITED / ACTION_DRAG_ENDED do not have coordinates + // associated. Offset is not necessary when forwarding those events. + if (event.getAction() == DragEvent.ACTION_DRAG_ENTERED + || event.getAction() == DragEvent.ACTION_DRAG_EXITED + || event.getAction() == DragEvent.ACTION_DRAG_ENDED) { + return mDestinationView.onDragEventWithOffset(event, 0, 0) || isDragStart; + } + + int[] sourceLocation = new int[2]; + mSourceView.getLocationOnScreen(sourceLocation); + + int[] destLocation = new int[2]; + destinationView.getLocationOnScreen(destLocation); + + int dx = sourceLocation[0] - destLocation[0]; + int dy = sourceLocation[1] - destLocation[1]; + + return mDestinationView.onDragEventWithOffset(event, dx, dy) || isDragStart; + } + + @VisibleForTesting + void markActionSupported(int action, boolean supported) { + mSupportedActionsMask.put(action, supported); + } + + @VisibleForTesting + boolean isActionSupported(int action) { + return mSupportedActionsMask.get(action); + } +}
diff --git a/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java b/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java index 921008c..1f060ed7 100644 --- a/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java +++ b/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java
@@ -35,6 +35,9 @@ public void setCurrentTouchEventOffsets(float top) { mOffsetY = top; } + + @Override + public void setCurrentDragEventOffsets(float dx, float dy) {} }; private RectF mViewport; @@ -53,7 +56,7 @@ @Test public void testOffsetChangesWhileDragging() { - mHandler.onPreDispatchDragEvent(DragEvent.ACTION_DRAG_STARTED); + mHandler.onPreDispatchDragEvent(DragEvent.ACTION_DRAG_STARTED, 0.f, 0.f); mHandler.onPostDispatchDragEvent(DragEvent.ACTION_DRAG_STARTED); // Viewport position has been negated. @@ -69,7 +72,7 @@ assertOffsets(-200); - mHandler.onPreDispatchDragEvent(DragEvent.ACTION_DRAG_ENDED); + mHandler.onPreDispatchDragEvent(DragEvent.ACTION_DRAG_ENDED, 0.f, 0.f); mHandler.onPostDispatchDragEvent(DragEvent.ACTION_DRAG_ENDED); assertOffsets(0); }
diff --git a/ui/android/junit/src/org/chromium/ui/dragdrop/DragEventDispatchHelperUnitTest.java b/ui/android/junit/src/org/chromium/ui/dragdrop/DragEventDispatchHelperUnitTest.java new file mode 100644 index 0000000..1f017b99 --- /dev/null +++ b/ui/android/junit/src/org/chromium/ui/dragdrop/DragEventDispatchHelperUnitTest.java
@@ -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. + +package org.chromium.ui.dragdrop; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.mockito.Mockito.doReturn; + +import android.app.Activity; +import android.view.DragEvent; +import android.view.View; +import android.widget.FrameLayout; + +import androidx.core.util.Pair; +import androidx.lifecycle.Lifecycle.State; +import androidx.test.ext.junit.rules.ActivityScenarioRule; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; +import org.robolectric.annotation.Config; +import org.robolectric.shadows.ShadowView; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.PayloadCallbackHelper; +import org.chromium.ui.base.TestActivity; +import org.chromium.ui.dragdrop.DragEventDispatchHelper.DragEventDispatchDestination; + +/** + * Unit test for {@link DragEventDispatchHelper}. + */ +@RunWith(BaseRobolectricTestRunner.class) +@Config(shadows = ShadowView.class) +public class DragEventDispatchHelperUnitTest { + private static final int VIEW_SIZE = 100; + + DragEventDispatchDestination mDestination; + DragEventDispatchHelper mHelper; + + Activity mActivity; + + @Rule + public final MockitoRule mMockitoRule = MockitoJUnit.rule().silent(); + + @Rule + public ActivityScenarioRule<TestActivity> mActivityScenario = + new ActivityScenarioRule<>(TestActivity.class); + FrameLayout mContentView; + View mDestinationView; + View mStarterView; + + PayloadCallbackHelper<Pair<Integer, Integer>> mCordCallbackHelper = + new PayloadCallbackHelper<>(); + PayloadCallbackHelper<DragEvent> mDragEventCallbackHelper = new PayloadCallbackHelper<>(); + + @Before + public void setup() { + mActivityScenario.getScenario().onActivity(activity -> mActivity = activity); + mActivityScenario.getScenario().moveToState(State.STARTED); + + mContentView = new FrameLayout(mActivity); + mActivity.setContentView(mContentView); + + mStarterView = new View(mActivity); + mDestinationView = new View(mActivity); + mDestinationView.setOnDragListener((view, dragEvent) -> { + mDragEventCallbackHelper.notifyCalled(dragEvent); + return true; + }); + + mContentView.addView(mDestinationView); + mContentView.addView(mStarterView); + mStarterView.bringToFront(); + + mDestination = new DragEventDispatchDestination() { + @Override + public View view() { + return mDestinationView; + } + + @Override + public boolean onDragEventWithOffset(DragEvent event, int dx, int dy) { + mCordCallbackHelper.notifyCalled(new Pair<>(dx, dy)); + return mDestinationView.dispatchDragEvent(event); + } + }; + mHelper = new DragEventDispatchHelper(mStarterView, mDestination); + } + + @Test + public void supportActions() { + int[] defaultSupportedDragActions = new int[] { + DragEvent.ACTION_DRAG_LOCATION, + DragEvent.ACTION_DROP, + DragEvent.ACTION_DRAG_ENTERED, + DragEvent.ACTION_DRAG_EXITED, + }; + + int[] defaultUnSupportedActions = new int[] { + DragEvent.ACTION_DRAG_STARTED, + DragEvent.ACTION_DRAG_ENDED, + }; + + for (int action : defaultSupportedDragActions) { + assertTrue("Default for supported action is wrong.", mHelper.isActionSupported(action)); + } + + for (int action : defaultUnSupportedActions) { + assertFalse( + "Default for unsupported action is wrong.", mHelper.isActionSupported(action)); + } + + mHelper.markActionSupported(DragEvent.ACTION_DRAG_LOCATION, false); + assertFalse("Removed action is no longer supported.", + mHelper.isActionSupported(DragEvent.ACTION_DRAG_LOCATION)); + mHelper.markActionSupported(DragEvent.ACTION_DROP, false); + assertFalse("Removed action is no longer supported.", + mHelper.isActionSupported(DragEvent.ACTION_DROP)); + + mHelper.markActionSupported(DragEvent.ACTION_DRAG_LOCATION, true); + assertTrue("Action is supported again.", + mHelper.isActionSupported(DragEvent.ACTION_DRAG_LOCATION)); + mHelper.markActionSupported(DragEvent.ACTION_DROP, true); + assertTrue("Action is supported again.", mHelper.isActionSupported(DragEvent.ACTION_DROP)); + } + + @Test + public void alwaysAcceptDragStart() { + DragEvent d1 = mockDragEvent(DragEvent.ACTION_DRAG_STARTED, 1f, 1f); + assertTrue("Drag start is always handled by #onDrag", mHelper.onDrag(mStarterView, d1)); + } + + @Test + public void dispatchDragWithOffset() { + // As start, configure the 2 views to be the same location, and start view sit on top. + configureScreenLocation(mStarterView, 0, 0, VIEW_SIZE); + configureScreenLocation(mDestinationView, 0, 0, VIEW_SIZE); + mStarterView.bringToFront(); + + // No offset expected for views starting at the same location. + DragEvent d1 = mockDragEvent(DragEvent.ACTION_DRAG_LOCATION, 1f, 1f); + mStarterView.dispatchDragEvent(d1); + verifyDestination(d1, 0, 0); + + configureScreenLocation(mStarterView, 50, 0, VIEW_SIZE); + DragEvent d2 = mockDragEvent(DragEvent.ACTION_DRAG_LOCATION, 10f, 10f); + mStarterView.dispatchDragEvent(d2); + verifyDestination(d2, 50, 0); + + // Enter does not have a offset. + DragEvent d3 = mockDragEvent(DragEvent.ACTION_DRAG_EXITED, 1f, 1f); + mStarterView.dispatchDragEvent(d3); + verifyDestination(d3, 0, 0); + + // Test another set of offset. + configureScreenLocation(mDestinationView, 50, 50, VIEW_SIZE); + DragEvent d4 = mockDragEvent(DragEvent.ACTION_DROP, 10f, 10f); + mStarterView.dispatchDragEvent(d4); + verifyDestination(d4, 0, -50); + } + + @Test + public void doNotDispatch_DestinationDisabled() { + mDestinationView.setEnabled(false); + + DragEvent d1 = mockDragEvent(DragEvent.ACTION_DRAG_STARTED, 1f, 1f); + mStarterView.dispatchDragEvent(d1); + assertEquals("Should not receive dispatched view when destination is disabled.", 0, + mDragEventCallbackHelper.getCallCount()); + } + + @Test + public void doNotDispatch_DestinationNotAttached() { + mContentView.removeView(mDestinationView); + assertFalse(mDestinationView.isAttachedToWindow()); + + DragEvent d1 = mockDragEvent(DragEvent.ACTION_DRAG_STARTED, 1f, 1f); + mStarterView.dispatchDragEvent(d1); + assertEquals("Should not receive dispatched view when destination is not attached.", 0, + mDragEventCallbackHelper.getCallCount()); + } + + private void verifyDestination(DragEvent expectedEvent, int expectedDx, int expectedDy) { + assertEquals(mDragEventCallbackHelper.getCallCount(), mCordCallbackHelper.getCallCount()); + + int counts = mCordCallbackHelper.getCallCount(); + Pair<Integer, Integer> pair = mCordCallbackHelper.getPayloadByIndexBlocking(counts - 1); + DragEvent dragEvent = mDragEventCallbackHelper.getPayloadByIndexBlocking(counts - 1); + + assertEquals("DragEvent passed is different.", expectedEvent, dragEvent); + assertEquals("Forwarded X offset is different.", expectedDx, pair.first.intValue()); + assertEquals("Forwarded Y offset is different.", expectedDy, pair.second.intValue()); + } + + private static DragEvent mockDragEvent(int action, float x, float y) { + DragEvent event = Mockito.mock(DragEvent.class); + doReturn(action).when(event).getAction(); + doReturn(x).when(event).getX(); + doReturn(y).when(event).getY(); + return event; + } + + private static void configureScreenLocation(View view, int x, int y, int size) { + view.layout(x, y, x + size, y + size); + } +}
diff --git a/ui/events/ozone/evdev/input_device_factory_evdev_unittest.cc b/ui/events/ozone/evdev/input_device_factory_evdev_unittest.cc index 7008a42..ed2754a 100644 --- a/ui/events/ozone/evdev/input_device_factory_evdev_unittest.cc +++ b/ui/events/ozone/evdev/input_device_factory_evdev_unittest.cc
@@ -20,6 +20,19 @@ namespace ui { +enum DeviceForm : uint32_t { + KEYBOARD = 1 << 0, + MOUSE = 1 << 1, + POINTING_STICK = 1 << 2, + TOUCHPAD = 1 << 3, + HAPTIC_TOUCHPAD = 1 << 4, + TOUCHSCREEN = 1 << 5, + PEN = 1 << 6, + GAMEPAD = 1 << 7, + CAPS_LOCK_LED = 1 << 8, + STYLUS_SWITCH = 1 << 9, +}; + class FakeEventConverterEvdev : public EventConverterEvdev { public: explicit FakeEventConverterEvdev(int fd, @@ -31,8 +44,7 @@ uint16_t vendor_id, uint16_t product_id, uint16_t version, - bool has_mouse, - bool has_keyboard) + uint32_t device_form) : EventConverterEvdev(fd, path, id, @@ -42,21 +54,41 @@ vendor_id, product_id, version), + device_form_(device_form) {} - has_mouse_(has_mouse), - has_keyboard_(has_keyboard) {} - - bool HasMouse() const override { return has_mouse_; } - - bool HasKeyboard() const override { return has_keyboard_; } + bool HasKeyboard() const override { + return device_form_ & DeviceForm::KEYBOARD; + } + bool HasMouse() const override { return device_form_ & DeviceForm::MOUSE; } + bool HasPointingStick() const override { + return device_form_ & DeviceForm::POINTING_STICK; + } + bool HasTouchpad() const override { + return device_form_ & DeviceForm::TOUCHPAD; + } + bool HasHapticTouchpad() const override { + return device_form_ & DeviceForm::HAPTIC_TOUCHPAD; + } + bool HasTouchscreen() const override { + return device_form_ & DeviceForm::TOUCHSCREEN; + } + bool HasPen() const override { return device_form_ & DeviceForm::PEN; } + bool HasGamepad() const override { + return device_form_ & DeviceForm::GAMEPAD; + } + bool HasCapsLockLed() const override { + return device_form_ & DeviceForm::CAPS_LOCK_LED; + } + bool HasStylusSwitch() const override { + return device_form_ & DeviceForm::STYLUS_SWITCH; + } void OnFileCanReadWithoutBlocking(int fd) override {} void SetKeyFilter(bool enable_filter, std::vector<DomCode> allowed_keys) override {} private: - bool has_mouse_; - bool has_keyboard_; + uint32_t device_form_; }; class StubDeviceEventDispatcherEvdev : public DeviceEventDispatcherEvdev { @@ -149,11 +181,11 @@ scoped_feature_list_.InitAndEnableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "name", "phys_path", 1, 1, 1, false, true); - + "name", "phys_path", 1, 1, 1, DeviceForm::KEYBOARD); converters.push_back(std::move(keyboard_converter)); std::unique_ptr<InputDeviceFactoryEvdev> input_device_factory_ = @@ -173,13 +205,13 @@ TEST_F(InputDeviceFactoryEvdevTest, AttachSingularMouse) { std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "name", "phys_path", 1, 1, 1, true, false); + "name", "phys_path", 1, 1, 1, DeviceForm::MOUSE); converters.push_back(std::move(mouse_converter)); - std::unique_ptr<InputDeviceFactoryEvdev> input_device_factory_ = std::make_unique<InputDeviceFactoryEvdev>( std::move(dispatcher_), nullptr, @@ -197,16 +229,17 @@ scoped_feature_list_.InitAndEnableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("mouse_path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, "mouse_name", - "phys_path/mouse", 1, 1, 1, true, false); + "phys_path/mouse", 1, 1, 1, DeviceForm::MOUSE); std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 2, base::FilePath("keyboard_path"), 2, InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard_name", - "phys_path/keyboard", 2, 2, 2, false, true); + "phys_path/keyboard", 2, 2, 2, DeviceForm::KEYBOARD); converters.push_back(std::move(mouse_converter)); converters.push_back(std::move(keyboard_converter)); @@ -230,16 +263,17 @@ scoped_feature_list_.InitAndEnableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("mouse_path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, "mouse_name", "phys_path", 1, - 1, 1, true, false); + 1, 1, DeviceForm::MOUSE); std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 2, base::FilePath("keyboard_path"), 2, InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard_name", "phys_path", - 2, 2, 2, false, true); + 2, 2, 2, DeviceForm::KEYBOARD); converters.push_back(std::move(mouse_converter)); converters.push_back(std::move(keyboard_converter)); @@ -263,10 +297,12 @@ scoped_feature_list_.InitAndEnableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> keyboard_and_mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "name", "phys_path", 1, 1, 1, true, true); + "name", "phys_path", 1, 1, 1, + DeviceForm::MOUSE | DeviceForm::KEYBOARD); converters.push_back(std::move(keyboard_and_mouse_converter)); @@ -288,10 +324,11 @@ scoped_feature_list_.InitAndDisableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "name", "phys_path", 1, 1, 1, false, true); + "name", "phys_path", 1, 1, 1, DeviceForm::KEYBOARD); converters.push_back(std::move(keyboard_converter)); @@ -314,16 +351,17 @@ scoped_feature_list_.InitAndDisableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("mouse_path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, "mouse_name", - "phys_path/mouse", 1, 1, 1, true, false); + "phys_path/mouse", 1, 1, 1, DeviceForm::MOUSE); std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 2, base::FilePath("keyboard_path"), 2, InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard_name", - "phys_path/keyboard", 2, 2, 2, false, true); + "phys_path/keyboard", 2, 2, 2, DeviceForm::KEYBOARD); converters.push_back(std::move(mouse_converter)); converters.push_back(std::move(keyboard_converter)); @@ -347,16 +385,17 @@ scoped_feature_list_.InitAndDisableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("mouse_path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, "mouse_name", "phys_path", 1, - 1, 1, true, false); + 1, 1, DeviceForm::MOUSE); std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 2, base::FilePath("keyboard_path"), 2, InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard_name", "phys_path", - 2, 2, 2, false, true); + 2, 2, 2, DeviceForm::KEYBOARD); converters.push_back(std::move(mouse_converter)); converters.push_back(std::move(keyboard_converter)); @@ -380,10 +419,12 @@ scoped_feature_list_.InitAndDisableFeature(kEnableFakeKeyboardHeuristic); std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; + std::unique_ptr<FakeEventConverterEvdev> keyboard_and_mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, base::FilePath("path"), 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "name", "phys_path", 1, 1, 1, true, true); + "name", "phys_path", 1, 1, 1, + DeviceForm::MOUSE | DeviceForm::KEYBOARD); converters.push_back(std::move(keyboard_and_mouse_converter)); @@ -406,15 +447,16 @@ std::vector<std::unique_ptr<FakeEventConverterEvdev>> converters; base::RunLoop run_loop; base::FilePath mouse_path("mouse_path"); + std::unique_ptr<FakeEventConverterEvdev> mouse_converter = std::make_unique<FakeEventConverterEvdev>( 1, mouse_path, 1, InputDeviceType::INPUT_DEVICE_INTERNAL, - "mouse_name", "phys_path", 1, 1, 1, true, false); + "mouse_name", "phys_path", 1, 1, 1, DeviceForm::MOUSE); std::unique_ptr<FakeEventConverterEvdev> keyboard_converter = std::make_unique<FakeEventConverterEvdev>( 2, base::FilePath("keyboard_path"), 2, InputDeviceType::INPUT_DEVICE_INTERNAL, "keyboard_name", "phys_path", - 2, 2, 2, false, true); + 2, 2, 2, DeviceForm::KEYBOARD); converters.push_back(std::move(mouse_converter)); converters.push_back(std::move(keyboard_converter));
diff --git a/ui/events/ozone/features.cc b/ui/events/ozone/features.cc index fe50c9fe..5a5273e2 100644 --- a/ui/events/ozone/features.cc +++ b/ui/events/ozone/features.cc
@@ -46,7 +46,7 @@ BASE_FEATURE(kEnableFakeKeyboardHeuristic, "EnableFakeKeyboardHeuristic", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); extern const base::FeatureParam<std::string> kNeuralPalmRadiusPolynomial{ &kEnableNeuralPalmDetectionFilter, "neural_palm_radius_polynomial", ""};
diff --git a/ui/gfx/color_transform.cc b/ui/gfx/color_transform.cc index 5e8f438..4d961e6 100644 --- a/ui/gfx/color_transform.cc +++ b/ui/gfx/color_transform.cc
@@ -189,13 +189,6 @@ // Return true if this is a null transform. virtual bool IsNull() { return false; } virtual void Transform(ColorTransform::TriStim* color, size_t num) const = 0; - // In the shader, |hdr| will appear before |src|, so any helper functions that - // are created should be put in |hdr|. Any helper functions should have - // |step_index| included in the function name, to ensure that there are no - // naming conflicts. - virtual void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const = 0; virtual void AppendSkShaderSource(std::stringstream* src) const = 0; }; @@ -214,7 +207,6 @@ step->Transform(colors, num); } } - std::string GetShaderSource() const override; std::string GetSkShaderSource() const override; bool IsIdentity() const override { return steps_.empty(); } size_t NumberOfStepsForTesting() const override { return steps_.size(); } @@ -235,9 +227,6 @@ ColorTransformNull* GetNull() override { return this; } bool IsNull() override { return true; } void Transform(ColorTransform::TriStim* color, size_t num) const override {} - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override {} void AppendSkShaderSource(std::stringstream* src) const override {} }; @@ -263,32 +252,6 @@ } } - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override { - *src << " color = mat3("; - *src << matrix_.rc(0, 0) << ", " << matrix_.rc(1, 0) << ", " - << matrix_.rc(2, 0) << ","; - *src << endl; - *src << " "; - *src << matrix_.rc(0, 1) << ", " << matrix_.rc(1, 1) << ", " - << matrix_.rc(2, 1) << ","; - *src << endl; - *src << " "; - *src << matrix_.rc(0, 2) << ", " << matrix_.rc(1, 2) << ", " - << matrix_.rc(2, 2) << ")"; - *src << " * color;" << endl; - - // Only print the translational component if it isn't the identity. - if (matrix_.rc(0, 3) != 0.f || matrix_.rc(1, 3) != 0.f || - matrix_.rc(2, 3) != 0.f) { - *src << " color += vec3("; - *src << matrix_.rc(0, 3) << ", " << matrix_.rc(1, 3) << ", " - << matrix_.rc(2, 3); - *src << ");" << endl; - } - } - void AppendSkShaderSource(std::stringstream* src) const override { *src << " color = half4x4("; *src << matrix_.rc(0, 0) << ", " << matrix_.rc(1, 0) << ", " @@ -339,27 +302,6 @@ } } - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override { - *hdr << "float TransferFn" << step_index << "(float v) {" << endl; - AppendTransferShaderSource(hdr, true /* is_glsl */); - *hdr << " return v;" << endl; - *hdr << "}" << endl; - if (extended_) { - *src << " color.r = sign(color.r) * TransferFn" << step_index - << "(abs(color.r));" << endl; - *src << " color.g = sign(color.g) * TransferFn" << step_index - << "(abs(color.g));" << endl; - *src << " color.b = sign(color.b) * TransferFn" << step_index - << "(abs(color.b));" << endl; - } else { - *src << " color.r = TransferFn" << step_index << "(color.r);" << endl; - *src << " color.g = TransferFn" << step_index << "(color.g);" << endl; - *src << " color.b = TransferFn" << step_index << "(color.b);" << endl; - } - } - void AppendSkShaderSource(std::stringstream* src) const override { if (extended_) { *src << "{ half v = abs(color.r);" << endl; @@ -900,32 +842,6 @@ YUV[i] = ColorTransform::TriStim(R_Y + Y, Y, B_Y + Y); } } - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override { - *hdr << "vec3 BT2020_YUV_to_RYB_Step" << step_index << "(vec3 color) {" - << endl; - *hdr << " float Y = color.x;" << endl; - *hdr << " float U = color.y - 0.5;" << endl; - *hdr << " float V = color.z - 0.5;" << endl; - *hdr << " float B_Y = 0.0;" << endl; - *hdr << " float R_Y = 0.0;" << endl; - *hdr << " if (U <= 0.0) {" << endl; - *hdr << " B_Y = U * (-2.0 * -0.9702);" << endl; - *hdr << " } else {" << endl; - *hdr << " B_Y = U * (2.0 * 0.7910);" << endl; - *hdr << " }" << endl; - *hdr << " if (V <= 0.0) {" << endl; - *hdr << " R_Y = V * (-2.0 * -0.8591);" << endl; - *hdr << " } else {" << endl; - *hdr << " R_Y = V * (2.0 * 0.4969);" << endl; - *hdr << " }" << endl; - *hdr << " return vec3(R_Y + Y, Y, B_Y + Y);" << endl; - *hdr << "}" << endl; - - *src << " color.rgb = BT2020_YUV_to_RYB_Step" << step_index - << "(color.rgb);" << endl; - } void AppendSkShaderSource(std::stringstream* src) const override { NOTREACHED(); @@ -953,21 +869,6 @@ color[i].Scale(powf(L, gamma_minus_one_)); } } - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override { - *hdr << "vec3 ToneMapStep" << step_index << "(vec3 color) {\n" - << " vec3 result = color;\n" - << " vec3 luma_vec = vec3(" << kLr << ", " << kLg << ", " << kLb - << ");\n" - << " float L = dot(color, luma_vec);\n" - << " if (L > 0.0) {\n" - << " result *= pow(L, " << gamma_minus_one_ << ");\n" - << " }\n" - << " return result;\n" - << "}\n"; - *src << " color.rgb = ToneMapStep" << step_index << "(color.rgb);\n"; - } void AppendSkShaderSource(std::stringstream* src) const override { *src << "{\n" << " half4 luma_vec = half4(" << kLr << ", " << kLg << ", " << kLb @@ -1006,22 +907,6 @@ color[i].Scale((1.f + a_ * L) / (1.f + b_ * L)); } } - void AppendShaderSource(std::stringstream* hdr, - std::stringstream* src, - size_t step_index) const override { - *hdr << "vec3 ToneMapStep" << step_index << "(vec3 color) {\n" - << " vec3 result = color;\n" - << " vec3 luma_vec = vec3(" << kLr << ", " << kLg << ", " << kLb - << ");\n" - << " float L = dot(color, luma_vec);\n" - << " if (L > 0.0) {\n" - << " result *= (1.0 + " << a_ << "*L) / \n" - << " (1.0 + " << b_ << "*L);\n" - << " }\n" - << " return result;\n" - << "}\n"; - *src << " color.rgb = ToneMapStep" << step_index << "(color.rgb);\n"; - } void AppendSkShaderSource(std::stringstream* src) const override { *src << "{\n" << " half4 luma_vec = half4(" << kLr << ", " << kLg << ", " << kLb @@ -1232,20 +1117,6 @@ Simplify(); } -std::string ColorTransformInternal::GetShaderSource() const { - std::stringstream hdr; - std::stringstream src; - InitStringStream(&hdr); - InitStringStream(&src); - src << "vec3 DoColorConversion(vec3 color) {" << endl; - size_t step_index = 0; - for (const auto& step : steps_) - step->AppendShaderSource(&hdr, &src, step_index++); - src << " return color;" << endl; - src << "}" << endl; - return hdr.str() + src.str(); -} - std::string ColorTransformInternal::GetSkShaderSource() const { std::stringstream src; InitStringStream(&src);
diff --git a/ui/gfx/color_transform.h b/ui/gfx/color_transform.h index 62264994..109f4612 100644 --- a/ui/gfx/color_transform.h +++ b/ui/gfx/color_transform.h
@@ -61,10 +61,6 @@ // Perform transformation of colors, |colors| is both input and output. virtual void Transform(TriStim* colors, size_t num) const = 0; - // Return GLSL shader source that defines a function DoColorConversion that - // converts a vec3 according to this transform. - virtual std::string GetShaderSource() const = 0; - // Return SKSL shader sources that modifies an "inout half4 color" according // to this transform. Input and output are non-premultiplied alpha. virtual std::string GetSkShaderSource() const = 0;
diff --git a/ui/gfx/color_transform_unittest.cc b/ui/gfx/color_transform_unittest.cc index b4d97444..5c882fd 100644 --- a/ui/gfx/color_transform_unittest.cc +++ b/ui/gfx/color_transform_unittest.cc
@@ -440,79 +440,6 @@ EXPECT_EQ(t2->NumberOfStepsForTesting(), 0u); } -// This tests to make sure that we don't emit "pow" parts of a -// transfer function unless necessary. -TEST(SimpleColorSpace, ShaderSourceTrFnOptimizations) { - skcms_Matrix3x3 primaries; - gfx::ColorSpace::CreateSRGB().GetPrimaryMatrix(&primaries); - - skcms_TransferFunction fn_no_pow = { - 1.f, 2.f, 0.f, 1.f, 0.f, 0.f, 0.f, - }; - skcms_TransferFunction fn_yes_pow = { - 2.f, 2.f, 0.f, 1.f, 0.f, 0.f, 0.f, - }; - gfx::ColorSpace src; - gfx::ColorSpace dst = gfx::ColorSpace::CreateXYZD50(); - std::string shader_string; - - src = gfx::ColorSpace::CreateCustom(primaries, fn_no_pow); - shader_string = - ColorTransform::NewColorTransform(src, dst)->GetShaderSource(); - EXPECT_EQ(shader_string.find("pow("), std::string::npos); - - src = gfx::ColorSpace::CreateCustom(primaries, fn_yes_pow); - shader_string = - ColorTransform::NewColorTransform(src, dst)->GetShaderSource(); - EXPECT_NE(shader_string.find("pow("), std::string::npos); -} - -// Note: This is not actually "testing" anything -- the goal of this test is to -// to make reviewing shader code simpler by giving an example of the resulting -// shader source. This should be updated whenever shader generation is updated. -// This test produces slightly different results on Android. -TEST(SimpleColorSpace, SampleShaderSource) { - ColorSpace bt709 = ColorSpace::CreateREC709(); - ColorSpace output(ColorSpace::PrimaryID::BT2020, - ColorSpace::TransferID::GAMMA28); - std::string source = - ColorTransform::NewColorTransform(bt709, output)->GetShaderSource(); - std::string expected = - "float TransferFn1(float v) {\n" - " if (v < 4.04499359e-02)\n" - " v = 7.73993805e-02 * v;\n" - " else\n" - " v = pow(9.47867334e-01 * v + 5.21326549e-02, 2.40000010e+00);\n" - " return v;\n" - "}\n" - "float TransferFn3(float v) {\n" - " if (v < 0.00000000e+00)\n" - " v = 0.00000000e+00 * v;\n" - " else\n" - " v = pow(v, 3.57142866e-01);\n" - " return v;\n" - "}\n" - "vec3 DoColorConversion(vec3 color) {\n" - " color = mat3(1.16438353e+00, 1.16438353e+00, 1.16438353e+00,\n" - " -2.28029018e-09, -2.13248596e-01, 2.11240172e+00,\n" - " 1.79274118e+00, -5.32909274e-01, -5.96049432e-10) " - "* color;\n" - " color += vec3(-9.69429970e-01, 3.00019622e-01, -1.12926018e+00);\n" - " color.r = TransferFn1(color.r);\n" - " color.g = TransferFn1(color.g);\n" - " color.b = TransferFn1(color.b);\n" - " color = mat3(6.27404153e-01, 6.90974295e-02, 1.63914450e-02,\n" - " 3.29283088e-01, 9.19540644e-01, 8.80132765e-02,\n" - " 4.33131158e-02, 1.13623142e-02, 8.95595193e-01) " - "* color;\n" - " color.r = sign(color.r) * TransferFn3(abs(color.r));\n" - " color.g = sign(color.g) * TransferFn3(abs(color.g));\n" - " color.b = sign(color.b) * TransferFn3(abs(color.b));\n" - " return color;\n" - "}\n"; - EXPECT_EQ(source, expected); -} - // Checks that the generated SkSL fragment shaders can be parsed by // SkSL::Compiler. TEST(SimpleColorSpace, CanParseSkShaderSource) {
diff --git a/ui/gfx/geometry/linear_gradient.h b/ui/gfx/geometry/linear_gradient.h index fb414bf5..837c2dd 100644 --- a/ui/gfx/geometry/linear_gradient.h +++ b/ui/gfx/geometry/linear_gradient.h
@@ -33,7 +33,7 @@ }; static LinearGradient& GetEmpty(); - static constexpr size_t kMaxStepSize = 8; + static constexpr size_t kMaxStepSize = 6; using StepArray = std::array<Step, kMaxStepSize>; LinearGradient();
diff --git a/ui/gfx/mojom/linear_gradient.mojom b/ui/gfx/mojom/linear_gradient.mojom index 3cc6c39..48bca5f 100644 --- a/ui/gfx/mojom/linear_gradient.mojom +++ b/ui/gfx/mojom/linear_gradient.mojom
@@ -13,5 +13,5 @@ struct LinearGradient { int16 angle = 0; uint8 step_count = 0; - array<Step, 8> steps; + array<Step, 6> steps; };
diff --git a/ui/gl/BUILD.gn b/ui/gl/BUILD.gn index af5ee1d..413445b 100644 --- a/ui/gl/BUILD.gn +++ b/ui/gl/BUILD.gn
@@ -260,12 +260,6 @@ deps += [ "//third_party/libsync" ] } } - if (is_mac || use_egl) { - sources += [ - "yuv_to_rgb_converter.cc", - "yuv_to_rgb_converter.h", - ] - } if (use_ozone) { deps += [ "//ui/ozone:buildflags" ]
diff --git a/ui/gl/gl_context.cc b/ui/gl/gl_context.cc index d63c42df..cbea129 100644 --- a/ui/gl/gl_context.cc +++ b/ui/gl/gl_context.cc
@@ -147,11 +147,6 @@ return std::string(renderer ? renderer : ""); } -YUVToRGBConverter* GLContext::GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) { - return nullptr; -} - CurrentGL* GLContext::GetCurrentGL() { if (!static_bindings_initialized_) { driver_gl_ = std::make_unique<DriverGL>();
diff --git a/ui/gl/gl_context.h b/ui/gl/gl_context.h index d9aeb3eb..2ad1cc4 100644 --- a/ui/gl/gl_context.h +++ b/ui/gl/gl_context.h
@@ -24,13 +24,8 @@ #include "ui/gl/gl_workarounds.h" #include "ui/gl/gpu_preference.h" -namespace gfx { -class ColorSpace; -} // namespace gfx - namespace gl { class GLDisplayEGL; -class YUVToRGBConverter; } // namespace gl namespace gpu { @@ -223,11 +218,6 @@ // Returns the GL renderer string. The context must be current. virtual std::string GetGLRenderer(); - // Returns a helper structure to convert the YUV color space |color_space| - // to its associated full-range RGB color space. - virtual YUVToRGBConverter* GetYUVToRGBConverter( - const gfx::ColorSpace& color_space); - // Get the CurrentGL object for this context containing the driver, version // and API. CurrentGL* GetCurrentGL();
diff --git a/ui/gl/gl_context_cgl.cc b/ui/gl/gl_context_cgl.cc index ca08ad4..dd243255 100644 --- a/ui/gl/gl_context_cgl.cc +++ b/ui/gl/gl_context_cgl.cc
@@ -24,7 +24,6 @@ #include "ui/gl/gl_surface.h" #include "ui/gl/gpu_switching_manager.h" #include "ui/gl/scoped_cgl.h" -#include "ui/gl/yuv_to_rgb_converter.h" namespace gl { @@ -117,7 +116,7 @@ } void GLContextCGL::Destroy() { - if (!yuv_to_rgb_converters_.empty() || HasBackpressureFences()) { + if (HasBackpressureFences()) { // If this context is not current, bind this context's API so that the YUV // converter and GLFences can safely destruct GLContext* current_context = GetRealCurrent(); @@ -127,7 +126,6 @@ ScopedCGLSetCurrentContext scoped_set_current( static_cast<CGLContextObj>(context_)); - yuv_to_rgb_converters_.clear(); DestroyBackpressureFences(); // Rebind the current context's API if needed. @@ -187,16 +185,6 @@ return true; } -YUVToRGBConverter* GLContextCGL::GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) { - std::unique_ptr<YUVToRGBConverter>& yuv_to_rgb_converter = - yuv_to_rgb_converters_[color_space]; - if (!yuv_to_rgb_converter) - yuv_to_rgb_converter = - std::make_unique<YUVToRGBConverter>(*GetVersionInfo(), color_space); - return yuv_to_rgb_converter.get(); -} - bool GLContextCGL::MakeCurrentImpl(GLSurface* surface) { DCHECK(context_);
diff --git a/ui/gl/gl_context_cgl.h b/ui/gl/gl_context_cgl.h index 29e01edd..07edfbc 100644 --- a/ui/gl/gl_context_cgl.h +++ b/ui/gl/gl_context_cgl.h
@@ -7,8 +7,6 @@ #include <OpenGL/CGLTypes.h> -#include <memory> - #include "ui/gfx/color_space.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_export.h" @@ -34,8 +32,6 @@ void* GetHandle() override; void SetSafeToForceGpuSwitch() override; bool ForceGpuSwitchIfNeeded() override; - YUVToRGBConverter* GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) override; void SetVisibility(bool visibility) override; protected: @@ -47,8 +43,6 @@ void* context_ = nullptr; GpuPreference gpu_preference_ = GpuPreference::kLowPower; - std::map<gfx::ColorSpace, std::unique_ptr<YUVToRGBConverter>> - yuv_to_rgb_converters_; int screen_ = -1; int renderer_id_ = -1;
diff --git a/ui/gl/gl_context_egl.cc b/ui/gl/gl_context_egl.cc index e2e377da..827a28c 100644 --- a/ui/gl/gl_context_egl.cc +++ b/ui/gl/gl_context_egl.cc
@@ -19,7 +19,6 @@ #include "ui/gl/gl_fence.h" #include "ui/gl/gl_gl_api_implementation.h" #include "ui/gl/gl_surface_egl.h" -#include "ui/gl/yuv_to_rgb_converter.h" #ifndef EGL_CHROMIUM_create_context_bind_generates_resource #define EGL_CHROMIUM_create_context_bind_generates_resource 1 @@ -377,7 +376,7 @@ } void GLContextEGL::Destroy() { - ReleaseYUVToRGBConvertersAndBackpressureFences(); + ReleaseBackpressureFences(); if (context_) { if (!eglDestroyContext(gl_display_->GetDisplay(), context_)) { LOG(ERROR) << "eglDestroyContext failed with error " @@ -388,25 +387,6 @@ } } -YUVToRGBConverter* GLContextEGL::GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) { - // Make sure YUVToRGBConverter objects never get created when surfaceless EGL - // contexts aren't supported since support for surfaceless EGL contexts is - // required in order to properly release YUVToRGBConverter objects (see - // GLContextEGL::ReleaseYUVToRGBConvertersAndBackpressureFences()) - if (!gl_display_->IsEGLSurfacelessContextSupported()) { - return nullptr; - } - - std::unique_ptr<YUVToRGBConverter>& yuv_to_rgb_converter = - yuv_to_rgb_converters_[color_space]; - if (!yuv_to_rgb_converter) { - yuv_to_rgb_converter = - std::make_unique<YUVToRGBConverter>(*GetVersionInfo(), color_space); - } - return yuv_to_rgb_converter.get(); -} - void GLContextEGL::SetVisibility(bool visibility) { if (gl_display_->ext->b_EGL_ANGLE_power_preference) { // It doesn't matter whether this context was explicitly allocated @@ -423,14 +403,14 @@ return gl_display_; } -void GLContextEGL::ReleaseYUVToRGBConvertersAndBackpressureFences() { +void GLContextEGL::ReleaseBackpressureFences() { #if BUILDFLAG(IS_APPLE) bool has_backpressure_fences = HasBackpressureFences(); #else bool has_backpressure_fences = false; #endif - if (!yuv_to_rgb_converters_.empty() || has_backpressure_fences) { + if (has_backpressure_fences) { // If this context is not current, bind this context's API so that the YUV // converter can safely destruct GLContext* current_context = GetRealCurrent(); @@ -444,9 +424,6 @@ if (context_ != current_egl_context) { current_draw_surface = eglGetCurrentSurface(EGL_DRAW); current_read_surface = eglGetCurrentSurface(EGL_READ); - // This call relies on the fact that yuv_to_rgb_converters_ are only ever - // allocated in GLImageIOSurfaceEGL::CopyTexImage, which is only on - // MacOS, where surfaceless EGL contexts are always supported. if (!eglMakeCurrent(gl_display_->GetDisplay(), EGL_NO_SURFACE, EGL_NO_SURFACE, context_)) { LOG(ERROR) << "eglMakeCurrent failed with error " @@ -454,7 +431,6 @@ } } - yuv_to_rgb_converters_.clear(); #if BUILDFLAG(IS_APPLE) DestroyBackpressureFences(); #endif
diff --git a/ui/gl/gl_context_egl.h b/ui/gl/gl_context_egl.h index 32a46d8..c38806df 100644 --- a/ui/gl/gl_context_egl.h +++ b/ui/gl/gl_context_egl.h
@@ -5,8 +5,6 @@ #ifndef UI_GL_GL_CONTEXT_EGL_H_ #define UI_GL_GL_CONTEXT_EGL_H_ -#include <map> - #include "base/memory/raw_ptr.h" #include "ui/gl/gl_context.h" #include "ui/gl/gl_export.h" @@ -35,8 +33,6 @@ void* GetHandle() override; unsigned int CheckStickyGraphicsResetStatusImpl() override; void SetUnbindFboOnMakeCurrent() override; - YUVToRGBConverter* GetYUVToRGBConverter( - const gfx::ColorSpace& color_space) override; void SetVisibility(bool visibility) override; GLDisplayEGL* GetGLDisplayEGL() override; @@ -45,7 +41,7 @@ private: void Destroy(); - void ReleaseYUVToRGBConvertersAndBackpressureFences(); + void ReleaseBackpressureFences(); EGLContext context_ = nullptr; raw_ptr<GLDisplayEGL> gl_display_ = nullptr; @@ -53,8 +49,6 @@ unsigned int graphics_reset_status_ = 0; // GL_NO_ERROR; bool unbind_fbo_on_makecurrent_ = false; bool lost_ = false; - std::map<gfx::ColorSpace, std::unique_ptr<YUVToRGBConverter>> - yuv_to_rgb_converters_; }; } // namespace gl
diff --git a/ui/gl/gl_image_io_surface.h b/ui/gl/gl_image_io_surface.h index c0551468..d6e51d4 100644 --- a/ui/gl/gl_image_io_surface.h +++ b/ui/gl/gl_image_io_surface.h
@@ -46,11 +46,15 @@ // IOSurfaces coming from video decode are wrapped in a CVPixelBuffer // and may be discarded if the owning CVPixelBuffer is destroyed. This // initialization will ensure that the CVPixelBuffer be retained for the - // lifetime of the GLImage. + // lifetime of the GLImage. This will set `disable_in_use_by_window_server_` + // because the existence of the CVPixelBuffer causes IOSurfaceIsInUse to + // always return true. The color space specified in `color_space` must be + // set to the color space specified by `cv_pixel_buffer`'s attachments. bool InitializeWithCVPixelBuffer(CVPixelBufferRef cv_pixel_buffer, uint32_t io_surface_plane, gfx::GenericSharedMemoryId io_surface_id, - gfx::BufferFormat format); + gfx::BufferFormat format, + const gfx::ColorSpace& color_space); // Overridden from GLImage: gfx::Size GetSize() override; @@ -61,10 +65,6 @@ bool BindTexImageWithInternalformat(unsigned target, unsigned internalformat) override; void ReleaseTexImage(unsigned target) override {} - bool CopyTexImage(unsigned target) override; - bool CopyTexSubImage(unsigned target, - const gfx::Point& offset, - const gfx::Rect& rect) override; void SetColorSpace(const gfx::ColorSpace& color_space) override; void Flush() override {} void OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, @@ -78,15 +78,6 @@ base::ScopedCFTypeRef<IOSurfaceRef> io_surface(); base::ScopedCFTypeRef<CVPixelBufferRef> cv_pixel_buffer(); - // For IOSurfaces that need manual conversion to a GL texture before being - // sampled from, specify the color space in which to do the required YUV to - // RGB transformation. - void SetColorSpaceForYUVToRGBConversion(const gfx::ColorSpace& color_space); - - // Sets the color space of the GLImage without modifying the underlying - // IOSurface. Callers should ensure the color spaces match. - void SetColorSpaceShallow(const gfx::ColorSpace& color_space); - static unsigned GetInternalFormatForTesting(gfx::BufferFormat format); // Downcasts from |image|. Returns |nullptr| on failure. @@ -121,8 +112,6 @@ uint32_t io_surface_plane_ = kInvalidIOSurfacePlane; base::ThreadChecker thread_checker_; - // The default value of Rec. 601 is based on historical shader code. - gfx::ColorSpace color_space_for_yuv_to_rgb_ = gfx::ColorSpace::CreateREC601(); bool disable_in_use_by_window_server_ = false; };
diff --git a/ui/gl/gl_image_io_surface.mm b/ui/gl/gl_image_io_surface.mm index 04ba74c..fb727dcf 100644 --- a/ui/gl/gl_image_io_surface.mm +++ b/ui/gl/gl_image_io_surface.mm
@@ -23,7 +23,6 @@ #include "ui/gl/gl_enums.h" #include "ui/gl/gl_version_info.h" #include "ui/gl/scoped_binders.h" -#include "ui/gl/yuv_to_rgb_converter.h" #if defined(USE_EGL) #include "ui/gl/gl_image_io_surface_egl.h" @@ -219,13 +218,11 @@ io_surface_.reset(io_surface, base::scoped_policy::RETAIN); io_surface_id_ = io_surface_id; - // YUV_420_BIPLANAR and P010 are not supported by BindTexImage. CopyTexImage - // is supported by these formats as that performs conversion to RGB as part of - // the copy operation. - if (format_ != gfx::BufferFormat::YUV_420_BIPLANAR && - format_ != gfx::BufferFormat::P010) { - io_surface_plane_ = io_surface_plane; - } + // YUV_420_BIPLANAR and P010 are not supported by BindTexImage. A separate + // GLImage must be created for each of their planes. + DCHECK_NE(format_, gfx::BufferFormat::YUV_420_BIPLANAR); + DCHECK_NE(format_, gfx::BufferFormat::P010); + io_surface_plane_ = io_surface_plane; return true; } @@ -233,7 +230,8 @@ CVPixelBufferRef cv_pixel_buffer, uint32_t io_surface_plane, gfx::GenericSharedMemoryId io_surface_id, - gfx::BufferFormat format) { + gfx::BufferFormat format, + const gfx::ColorSpace& color_space) { IOSurfaceRef io_surface = CVPixelBufferGetIOSurface(cv_pixel_buffer); if (!io_surface) { LOG(ERROR) << "Can't init GLImage from CVPixelBuffer with no IOSurface"; @@ -244,6 +242,8 @@ return false; cv_pixel_buffer_.reset(cv_pixel_buffer, base::scoped_policy::RETAIN); + disable_in_use_by_window_server_ = true; + GLImage::SetColorSpace(color_space); return true; } @@ -260,7 +260,7 @@ } GLImageIOSurface::BindOrCopy GLImageIOSurface::ShouldBindOrCopy() { - return io_surface_plane_ == kInvalidIOSurfacePlane ? COPY : BIND; + return BIND; } bool GLImageIOSurface::BindTexImage(unsigned target) { @@ -312,81 +312,6 @@ return true; } -bool GLImageIOSurface::CopyTexImage(unsigned target) { - DCHECK(thread_checker_.CalledOnValidThread()); - DCHECK_EQ(COPY, ShouldBindOrCopy()); - - GLContext* gl_context = GLContext::GetCurrent(); - DCHECK(gl_context); - - YUVToRGBConverter* yuv_to_rgb_converter = - gl_context->GetYUVToRGBConverter(color_space_for_yuv_to_rgb_); - DCHECK(yuv_to_rgb_converter); - - // Note that state restoration is done explicitly instead of scoped binders to - // avoid https://crbug.com/601729. - GLint rgb_texture = 0; - GLenum target_getter = 0; - switch (target) { - case GL_TEXTURE_2D: - target_getter = GL_TEXTURE_BINDING_2D; - break; - case GL_TEXTURE_CUBE_MAP: - target_getter = GL_TEXTURE_BINDING_CUBE_MAP; - break; - case GL_TEXTURE_EXTERNAL_OES: - target_getter = GL_TEXTURE_BINDING_EXTERNAL_OES; - break; - case GL_TEXTURE_RECTANGLE_ARB: - target_getter = GL_TEXTURE_BINDING_RECTANGLE_ARB; - break; - default: - NOTIMPLEMENTED() << " Target not supported."; - return false; - } - glGetIntegerv(target_getter, &rgb_texture); - base::ScopedClosureRunner destroy_resources_runner( - base::BindOnce(base::RetainBlock(^{ - glBindTexture(target, rgb_texture); - }))); - - const auto src_type = - format_ == gfx::BufferFormat::P010 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; - - CGLContextObj cgl_context = CGLGetCurrentContext(); - { - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->y_texture()); - CGLError cgl_error = CGLTexImageIOSurface2D( - cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RED, size_.width(), - size_.height(), GL_RED, src_type, io_surface_, 0); - if (cgl_error != kCGLNoError) { - LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the Y plane. " - << cgl_error; - return false; - } - } - { - glBindTexture(GL_TEXTURE_RECTANGLE_ARB, yuv_to_rgb_converter->uv_texture()); - CGLError cgl_error = CGLTexImageIOSurface2D( - cgl_context, GL_TEXTURE_RECTANGLE_ARB, GL_RG, size_.width() / 2, - size_.height() / 2, GL_RG, src_type, io_surface_, 1); - if (cgl_error != kCGLNoError) { - LOG(ERROR) << "Error in CGLTexImageIOSurface2D for the UV plane. " - << cgl_error; - return false; - } - } - - yuv_to_rgb_converter->CopyYUV420ToRGB(target, size_, rgb_texture, src_type); - return true; -} - -bool GLImageIOSurface::CopyTexSubImage(unsigned target, - const gfx::Point& offset, - const gfx::Rect& rect) { - return false; -} - void GLImageIOSurface::OnMemoryDump(base::trace_event::ProcessMemoryDump* pmd, uint64_t process_tracing_id, const std::string& dump_name) { @@ -453,18 +378,6 @@ disable_in_use_by_window_server_ = true; } -void GLImageIOSurface::SetColorSpaceForYUVToRGBConversion( - const gfx::ColorSpace& color_space) { - DCHECK(color_space.IsValid()); - DCHECK_NE(color_space, color_space.GetAsFullRangeRGB()); - color_space_for_yuv_to_rgb_ = color_space; -} - -void GLImageIOSurface::SetColorSpaceShallow( - const gfx::ColorSpace& color_space) { - GLImage::SetColorSpace(color_space); -} - base::ScopedCFTypeRef<IOSurfaceRef> GLImageIOSurface::io_surface() { return io_surface_; }
diff --git a/ui/gl/gl_image_io_surface_egl.h b/ui/gl/gl_image_io_surface_egl.h index 7ff4b9a..e40f2e8a 100644 --- a/ui/gl/gl_image_io_surface_egl.h +++ b/ui/gl/gl_image_io_surface_egl.h
@@ -46,7 +46,6 @@ protected: ~GLImageIOSurfaceEGL() override; bool BindTexImageImpl(unsigned target, unsigned internalformat) override; - bool CopyTexImage(unsigned target) override; private: EGLAccess& GetEGLAccessForCurrentContext();
diff --git a/ui/gl/gl_image_io_surface_egl.mm b/ui/gl/gl_image_io_surface_egl.mm index 5566877..5678eaaa 100644 --- a/ui/gl/gl_image_io_surface_egl.mm +++ b/ui/gl/gl_image_io_surface_egl.mm
@@ -12,7 +12,6 @@ #include "ui/gl/gl_display.h" #include "ui/gl/gl_surface.h" #include "ui/gl/scoped_binders.h" -#include "ui/gl/yuv_to_rgb_converter.h" // Enums for the EGL_ANGLE_iosurface_client_buffer extension #define EGL_IOSURFACE_ANGLE 0x3454 @@ -273,163 +272,4 @@ return true; } -bool GLImageIOSurfaceEGL::CopyTexImage(unsigned target) { - DCHECK(thread_checker_.CalledOnValidThread()); - - EGLAccess& egl_access = GetEGLAccessForCurrentContext(); - - GLint target_gl = GLTargetFromEGLTarget(egl_access.texture_target()); - if (target_gl == GL_NONE) { - return false; - } - - if (format_ != gfx::BufferFormat::YUV_420_BIPLANAR && - format_ != gfx::BufferFormat::P010) { - LOG(ERROR) << "non-YUV buffer format passed to CopyTexImage"; - return false; - } - - GLContext* gl_context = GLContext::GetCurrent(); - DCHECK(gl_context); - - YUVToRGBConverter* yuv_to_rgb_converter = - gl_context->GetYUVToRGBConverter(color_space_for_yuv_to_rgb_); - DCHECK(yuv_to_rgb_converter); - - // Note that state restoration is done explicitly instead of scoped binders to - // avoid https://crbug.com/601729. - GLint rgb_texture = 0; - GLenum target_getter = TargetGetterFromGLTarget(target); - if (target_getter == GL_NONE) { - return false; - } - - EGLSurface y_surface = EGL_NO_SURFACE; - EGLSurface uv_surface = EGL_NO_SURFACE; - - EGLSurface* y_surface_ptr = &y_surface; - EGLSurface* uv_surface_ptr = &uv_surface; - glGetIntegerv(target_getter, &rgb_texture); - base::ScopedClosureRunner destroy_resources_runner( - base::BindOnce(base::RetainBlock(^{ - if (*y_surface_ptr != EGL_NO_SURFACE) { - EGLBoolean result = - eglReleaseTexImage(egl_access.display()->GetDisplay(), - *y_surface_ptr, EGL_BACK_BUFFER); - DCHECK_EQ(result, static_cast<EGLBoolean>(EGL_TRUE)); - result = eglDestroySurface(egl_access.display()->GetDisplay(), - *y_surface_ptr); - DCHECK_EQ(result, static_cast<EGLBoolean>(EGL_TRUE)); - } - if (*uv_surface_ptr != EGL_NO_SURFACE) { - EGLBoolean result = - eglReleaseTexImage(egl_access.display()->GetDisplay(), - *uv_surface_ptr, EGL_BACK_BUFFER); - DCHECK_EQ(result, static_cast<EGLBoolean>(EGL_TRUE)); - result = eglDestroySurface(egl_access.display()->GetDisplay(), - *uv_surface_ptr); - DCHECK_EQ(result, static_cast<EGLBoolean>(EGL_TRUE)); - } - glBindTexture(target, rgb_texture); - }))); - - glBindTexture(target_gl, yuv_to_rgb_converter->y_texture()); - if (glGetError() != GL_NO_ERROR) { - LOG(ERROR) << "Can't bind Y texture"; - return false; - } - - // Disable mipmap filtering since iosurface doesn't have mipmap. Rectangle - // textures have mipmap disabled by default but other types of texture don't. - glTexParameteri(target_gl, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(target_gl, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(target_gl, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - const EGLint texture_type = - format_ == gfx::BufferFormat::P010 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_BYTE; - - // GL_UNSIGNED_SHORT is not supported for all contexts. Use half-float - // instead. - // https://crbug.com/1282350 - const GLenum rgb_texture_type = - format_ == gfx::BufferFormat::P010 ? GL_HALF_FLOAT_OES : GL_UNSIGNED_BYTE; - - // clang-format off - const EGLint yAttribs[] = { - EGL_WIDTH, size_.width(), - EGL_HEIGHT, size_.height(), - EGL_IOSURFACE_PLANE_ANGLE, 0, - EGL_TEXTURE_TARGET, egl_access.texture_target(), - EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_RED, - EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, - EGL_TEXTURE_TYPE_ANGLE, texture_type, - EGL_NONE, EGL_NONE, - }; - // clang-format on - - y_surface = eglCreatePbufferFromClientBuffer( - egl_access.display()->GetDisplay(), EGL_IOSURFACE_ANGLE, - io_surface_.get(), egl_access.dummy_config(), yAttribs); - if (y_surface == EGL_NO_SURFACE) { - LOG(ERROR) << "eglCreatePbufferFromClientBuffer failed, EGL error is " - << eglGetError(); - return false; - } - - EGLBoolean result = eglBindTexImage(egl_access.display()->GetDisplay(), - y_surface, EGL_BACK_BUFFER); - if (result != EGL_TRUE) { - LOG(ERROR) << "eglBindTexImage failed, EGL error is " << eglGetError(); - return false; - } - - glBindTexture(target_gl, yuv_to_rgb_converter->uv_texture()); - if (glGetError() != GL_NO_ERROR) { - LOG(ERROR) << "Can't bind UV texture"; - return false; - } - - glTexParameteri(target_gl, GL_TEXTURE_MIN_FILTER, GL_LINEAR); - glTexParameteri(target_gl, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(target_gl, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - - // clang-format off - const EGLint uvAttribs[] = { - EGL_WIDTH, size_.width() / 2, - EGL_HEIGHT, size_.height() / 2, - EGL_IOSURFACE_PLANE_ANGLE, 1, - EGL_TEXTURE_TARGET, egl_access.texture_target(), - EGL_TEXTURE_INTERNAL_FORMAT_ANGLE, GL_RG, - EGL_TEXTURE_FORMAT, EGL_TEXTURE_RGBA, - EGL_TEXTURE_TYPE_ANGLE, texture_type, - EGL_NONE, EGL_NONE, - }; - // clang-format on - - uv_surface = eglCreatePbufferFromClientBuffer( - egl_access.display()->GetDisplay(), EGL_IOSURFACE_ANGLE, - io_surface_.get(), egl_access.dummy_config(), uvAttribs); - if (uv_surface == EGL_NO_SURFACE) { - LOG(ERROR) << "eglCreatePbufferFromClientBuffer failed, EGL error is " - << eglGetError(); - return false; - } - - result = eglBindTexImage(egl_access.display()->GetDisplay(), uv_surface, - EGL_BACK_BUFFER); - if (result != EGL_TRUE) { - LOG(ERROR) << "eglBindTexImage failed, EGL error is " << eglGetError(); - return false; - } - - yuv_to_rgb_converter->CopyYUV420ToRGB(target, size_, rgb_texture, - rgb_texture_type); - if (glGetError() != GL_NO_ERROR) { - LOG(ERROR) << "Failed converting from YUV to RGB"; - return false; - } - - return true; -} - } // namespace gl
diff --git a/ui/gl/gl_image_io_surface_unittest.cc b/ui/gl/gl_image_io_surface_unittest.cc index a218b171..f125b9d 100644 --- a/ui/gl/gl_image_io_surface_unittest.cc +++ b/ui/gl/gl_image_io_surface_unittest.cc
@@ -98,7 +98,6 @@ GLImageIOSurfaceTestDelegate<gfx::BufferFormat::BGRA_8888>, GLImageIOSurfaceTestDelegate<gfx::BufferFormat::BGRX_8888>, GLImageIOSurfaceTestDelegate<gfx::BufferFormat::RGBA_F16>, - GLImageIOSurfaceTestDelegate<gfx::BufferFormat::YUV_420_BIPLANAR>, GLImageIOSurfaceTestDelegate<gfx::BufferFormat::BGRA_1010102>>; INSTANTIATE_TYPED_TEST_SUITE_P(GLImageIOSurface, GLImageTest, GLImageTestTypes); @@ -125,10 +124,5 @@ GLImageBindTest, GLImageBindTestTypes); -INSTANTIATE_TYPED_TEST_SUITE_P( - GLImageIOSurface, - GLImageCopyTest, - GLImageIOSurfaceTestDelegate<gfx::BufferFormat::YUV_420_BIPLANAR>); - } // namespace } // namespace gl
diff --git a/ui/gl/yuv_to_rgb_converter.cc b/ui/gl/yuv_to_rgb_converter.cc deleted file mode 100644 index 56202efb..0000000 --- a/ui/gl/yuv_to_rgb_converter.cc +++ /dev/null
@@ -1,348 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "ui/gl/yuv_to_rgb_converter.h" - -#include "base/notreached.h" -#include "base/strings/stringize_macros.h" -#include "base/strings/stringprintf.h" -#include "ui/gfx/color_transform.h" -#include "ui/gl/gl_helper.h" -#include "ui/gl/gl_utils.h" -#include "ui/gl/gl_version_info.h" -#include "ui/gl/scoped_binders.h" - -namespace gl { -namespace { - -const char kVertexHeaderES2[] = - "precision mediump float;\n" - "#define ATTRIBUTE attribute\n" - "#define VARYING varying\n"; - -const char kVertexHeaderES3[] = - "#version 300 es\n" - "precision mediump float;\n" - "#define ATTRIBUTE in\n" - "#define VARYING out\n"; - -const char kVertexHeaderCompatiblityProfile[] = - "#version 110\n" - "#define ATTRIBUTE attribute\n" - "#define VARYING varying\n"; - -const char kVertexHeaderCoreProfile[] = - "#version 150\n" - "#define ATTRIBUTE in\n" - "#define VARYING out\n"; - -const char kFragmentHeaderES22D[] = - "precision mediump float;\n" - "#define VARYING varying\n" - "#define FRAGCOLOR gl_FragColor\n" - "#define TEX texture2D\n"; - -const char kFragmentHeaderES2Rect[] = - "#extension GL_ARB_texture_rectangle : require\n" - "precision mediump float;\n" - "#define VARYING varying\n" - "#define FRAGCOLOR gl_FragColor\n" - "#define TEX texture2DRect\n"; - -const char kFragmentHeaderES3[] = - "#version 300 es\n" - "precision mediump float;\n" - "#define VARYING in\n" - "#define TEX texture\n" - "#define FRAGCOLOR frag_color\n" - "out vec4 FRAGCOLOR;\n"; - -const char kFragmentHeaderCompatiblityProfile2D[] = - "#version 110\n" - "#define VARYING varying\n" - "#define FRAGCOLOR gl_FragColor\n" - "#define TEX texture2D\n"; - -const char kFragmentHeaderCompatiblityProfileRect[] = - "#version 110\n" - "#extension GL_ARB_texture_rectangle : require\n" - "#define VARYING varying\n" - "#define FRAGCOLOR gl_FragColor\n" - "#define TEX texture2DRect\n"; - -const char kFragmentHeaderCoreProfile[] = - "#version 150\n" - "#define VARYING in\n" - "#define TEX texture\n" - "#define FRAGCOLOR frag_color\n" - "out vec4 FRAGCOLOR;\n"; - -// clang-format off -const char kVertexShader[] = -STRINGIZE( - ATTRIBUTE vec2 a_position; - uniform vec2 a_texScale; - VARYING vec2 v_texCoord; - void main() { - gl_Position = vec4(a_position, 0.0, 1.0); - v_texCoord = (a_position + vec2(1.0, 1.0)) * 0.5 * a_texScale; - } -); - -const char kFragmentShader2D[] = -STRINGIZE( - uniform sampler2D a_y_texture; - uniform sampler2D a_uv_texture; - VARYING vec2 v_texCoord; - void main() { - vec3 yuv = vec3( - TEX(a_y_texture, v_texCoord).r, - TEX(a_uv_texture, v_texCoord).rg); - FRAGCOLOR = vec4(DoColorConversion(yuv), 1.0); - } -); - -const char kFragmentShaderRect[] = -STRINGIZE( - uniform sampler2DRect a_y_texture; - uniform sampler2DRect a_uv_texture; - VARYING vec2 v_texCoord; - void main() { - vec3 yuv = vec3( - TEX(a_y_texture, v_texCoord).r, - TEX(a_uv_texture, v_texCoord * 0.5).rg); - FRAGCOLOR = vec4(DoColorConversion(yuv), 1.0); - } -); - -// clang-format on - -} // namespace - -YUVToRGBConverter::YUVToRGBConverter(const GLVersionInfo& gl_version_info, - const gfx::ColorSpace& color_space) { - std::unique_ptr<gfx::ColorTransform> color_transform = - gfx::ColorTransform::NewColorTransform(color_space, - color_space.GetAsFullRangeRGB()); - std::string do_color_conversion = color_transform->GetShaderSource(); - - // On MacOS, the default texture target for native GpuMemoryBuffers is - // GL_TEXTURE_RECTANGLE_ARB. This is due to CGL's requirements for creating - // a GL surface. However, when ANGLE is used on top of SwiftShader or Metal, - // it's necessary to use GL_TEXTURE_2D instead. - // TODO(crbug.com/1056312): The proper behavior is to check the config - // parameter set by the EGL_ANGLE_iosurface_client_buffer extension - bool is_rect = - !gl_version_info.is_angle_swiftshader && !gl_version_info.is_angle_metal; - source_texture_target_ = (is_rect ? GL_TEXTURE_RECTANGLE_ARB : GL_TEXTURE_2D); - - const char* fragment_header = nullptr; - const char* vertex_header = nullptr; - if (gl_version_info.is_es2) { - vertex_header = kVertexHeaderES2; - fragment_header = (is_rect ? kFragmentHeaderES2Rect : kFragmentHeaderES22D); - } else if (gl_version_info.is_es3) { - vertex_header = kVertexHeaderES3; - fragment_header = kFragmentHeaderES3; - } else if (gl_version_info.is_desktop_core_profile) { - vertex_header = kVertexHeaderCoreProfile; - fragment_header = kFragmentHeaderCoreProfile; - } else { - DCHECK(!gl_version_info.is_es); - vertex_header = kVertexHeaderCompatiblityProfile; - fragment_header = (is_rect ? kFragmentHeaderCompatiblityProfileRect - : kFragmentHeaderCompatiblityProfile2D); - } - DCHECK(vertex_header && fragment_header); - - glGenFramebuffersEXT(1, &framebuffer_); - - { - // In contexts that are in WebGL compatibility mode, we need to temporarily - // enable GL_ANGLE_TEXTURE_RECTANGLE in order to compile the fragment - // shader. Furthermore, in ES2 contexts, the GL_ANGLE_webgl_compatibility - // extension is required for using GL_ANGLE_TEXTURE_RECTANGLE as an argument - // to glEnable/Disable. Therefore the GL_ANGLE_webgl_compatibility - // extension is a necessary and sufficient condition for determining whether - // GL_ANGLE_TEXTURE_RECTANGLE needs to be temporarily enabled. - ScopedEnableTextureRectangleInShaderCompiler enable( - (is_rect && g_current_gl_driver->ext.b_GL_ANGLE_webgl_compatibility) - ? g_current_gl_context - : nullptr); - vertex_buffer_ = GLHelper::SetupQuadVertexBuffer(); - vertex_shader_ = GLHelper::LoadShader( - GL_VERTEX_SHADER, - base::StringPrintf("%s\n%s", vertex_header, kVertexShader).c_str()); - fragment_shader_ = GLHelper::LoadShader( - GL_FRAGMENT_SHADER, - base::StringPrintf("%s\n%s\n%s", fragment_header, - do_color_conversion.c_str(), - (is_rect ? kFragmentShaderRect : kFragmentShader2D)) - .c_str()); - program_ = GLHelper::SetupProgram(vertex_shader_, fragment_shader_); - } - - ScopedUseProgram use_program(program_); - size_location_ = glGetUniformLocation(program_, "a_texScale"); - DCHECK_NE(-1, size_location_); - int y_sampler_location = glGetUniformLocation(program_, "a_y_texture"); - DCHECK_NE(-1, y_sampler_location); - int uv_sampler_location = glGetUniformLocation(program_, "a_uv_texture"); - DCHECK_NE(-1, uv_sampler_location); - - glGenTextures(1, &y_texture_); - glGenTextures(1, &uv_texture_); - - glUniform1i(y_sampler_location, 0); - glUniform1i(uv_sampler_location, 1); - - bool has_vertex_array_objects = - gl_version_info.is_es3 || gl_version_info.is_desktop_core_profile; - if (has_vertex_array_objects) { - glGenVertexArraysOES(1, &vertex_array_object_); - } - - has_get_tex_level_parameter_ = - !gl_version_info.is_es || gl_version_info.IsAtLeastGLES(3, 1) || - g_current_gl_driver->ext.b_GL_ANGLE_get_tex_level_parameter; - has_robust_resource_init_ = - g_current_gl_driver->ext.b_GL_ANGLE_robust_resource_initialization; - - has_sampler_objects_ = gl_version_info.IsAtLeastGLES(3, 0) || - gl_version_info.IsAtLeastGL(3, 3) || - g_current_gl_driver->ext.b_GL_ARB_sampler_objects; -} - -YUVToRGBConverter::~YUVToRGBConverter() { - glDeleteTextures(1, &y_texture_); - glDeleteTextures(1, &uv_texture_); - glDeleteProgram(program_); - glDeleteShader(vertex_shader_); - glDeleteShader(fragment_shader_); - glDeleteBuffersARB(1, &vertex_buffer_); - glDeleteFramebuffersEXT(1, &framebuffer_); - if (vertex_array_object_) { - glDeleteVertexArraysOES(1, &vertex_array_object_); - } -} - -void YUVToRGBConverter::CopyYUV420ToRGB(unsigned target, - const gfx::Size& size, - unsigned rgb_texture, - unsigned rgb_texture_type) { - GLenum source_target_getter = 0; - switch (source_texture_target_) { - case GL_TEXTURE_2D: - source_target_getter = GL_TEXTURE_BINDING_2D; - break; - case GL_TEXTURE_RECTANGLE_ARB: - source_target_getter = GL_TEXTURE_BINDING_RECTANGLE_ARB; - break; - default: - NOTIMPLEMENTED() << " Target not supported."; - return; - } - // Note that state restoration is done explicitly instead of scoped binders to - // avoid https://crbug.com/601729. - GLint old_active_texture = -1; - glGetIntegerv(GL_ACTIVE_TEXTURE, &old_active_texture); - GLint old_texture0_binding = -1; - glActiveTexture(GL_TEXTURE0); - glGetIntegerv(source_target_getter, &old_texture0_binding); - GLint old_sampler0_binding = -1; - if (has_sampler_objects_) { - glGetIntegerv(GL_SAMPLER_BINDING, &old_sampler0_binding); - glBindSampler(0, 0); - } - GLint old_texture1_binding = -1; - glActiveTexture(GL_TEXTURE1); - glGetIntegerv(source_target_getter, &old_texture1_binding); - GLint old_sampler1_binding = -1; - if (has_sampler_objects_) { - glGetIntegerv(GL_SAMPLER_BINDING, &old_sampler1_binding); - glBindSampler(1, 0); - } - - // Allocate the rgb texture. - glActiveTexture(old_active_texture); - glBindTexture(target, rgb_texture); - - bool needs_texture_init = true; - if (has_get_tex_level_parameter_) { - GLint current_internal_format = 0; - glGetTexLevelParameteriv(target, 0, GL_TEXTURE_INTERNAL_FORMAT, - ¤t_internal_format); - - GLint current_type = 0; - glGetTexLevelParameteriv(target, 0, GL_TEXTURE_RED_TYPE, ¤t_type); - - GLint current_width = 0; - glGetTexLevelParameteriv(target, 0, GL_TEXTURE_WIDTH, ¤t_width); - - GLint current_height = 0; - glGetTexLevelParameteriv(target, 0, GL_TEXTURE_HEIGHT, ¤t_height); - - if (current_internal_format == GL_RGBA && - static_cast<unsigned>(current_type) == rgb_texture_type && - current_width == size.width() && current_height == size.height()) { - needs_texture_init = false; - } - } - if (needs_texture_init) { - glTexImage2D(target, 0, GL_RGBA, size.width(), size.height(), 0, GL_RGBA, - rgb_texture_type, nullptr); - if (has_robust_resource_init_) { - // We're about to overwrite the whole texture with a draw, notify the - // driver that it doesn't need to perform robust resource init. - glTexParameteri(target, GL_RESOURCE_INITIALIZED_ANGLE, GL_TRUE); - } - } - - // Set up and issue the draw call. - glActiveTexture(GL_TEXTURE0); - glBindTexture(source_texture_target_, y_texture_); - glActiveTexture(GL_TEXTURE1); - glBindTexture(source_texture_target_, uv_texture_); - ScopedFramebufferBinder framebuffer_binder(framebuffer_); - ScopedViewport viewport(0, 0, size.width(), size.height()); - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - target, rgb_texture, 0); - DCHECK_EQ(static_cast<GLenum>(GL_FRAMEBUFFER_COMPLETE), - glCheckFramebufferStatusEXT(GL_FRAMEBUFFER)); - ScopedUseProgram use_program(program_); - if (source_texture_target_ == GL_TEXTURE_RECTANGLE_ARB) { - glUniform2f(size_location_, size.width(), size.height()); - } else { - glUniform2f(size_location_, 1, 1); - } - // User code may have set up the other vertex attributes in the - // context in unexpected ways, including setting vertex attribute - // divisors which may otherwise cause GL_INVALID_OPERATION during - // glDrawArrays. Avoid interference by binding our own VAO during - // the draw call. crbug.com/930479 - GLint old_vertex_array_object_ = 0; - if (vertex_array_object_) { - glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &old_vertex_array_object_); - glBindVertexArrayOES(vertex_array_object_); - } - GLHelper::DrawQuad(vertex_buffer_); - if (vertex_array_object_) { - glBindVertexArrayOES(old_vertex_array_object_); - } - - // Restore previous state. - glFramebufferTexture2DEXT(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, - target, 0, 0); - glActiveTexture(GL_TEXTURE0); - glBindTexture(source_texture_target_, old_texture0_binding); - glActiveTexture(GL_TEXTURE1); - glBindTexture(source_texture_target_, old_texture1_binding); - glActiveTexture(old_active_texture); - if (old_sampler0_binding > 0) - glBindSampler(0, old_sampler0_binding); - if (old_sampler1_binding > 0) - glBindSampler(1, old_sampler1_binding); -} - -} // namespace gl
diff --git a/ui/gl/yuv_to_rgb_converter.h b/ui/gl/yuv_to_rgb_converter.h deleted file mode 100644 index d3f04e242..0000000 --- a/ui/gl/yuv_to_rgb_converter.h +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_GL_YUV_TO_RGB_CONVERTER_H_ -#define UI_GL_YUV_TO_RGB_CONVERTER_H_ - -#include "ui/gfx/geometry/size.h" - -namespace gfx { -class ColorSpace; -} // namespace gfx - -namespace gl { - -struct GLVersionInfo; - -class YUVToRGBConverter { - public: - explicit YUVToRGBConverter(const GLVersionInfo& gl_version_info, - const gfx::ColorSpace& color_space); - ~YUVToRGBConverter(); - - // The input Y and UV textures should be bound to these texture objects - // prior to calling CopyYUV420ToRGB. - unsigned y_texture() const { return y_texture_; } - unsigned uv_texture() const { return uv_texture_; } - - void CopyYUV420ToRGB(unsigned target, - const gfx::Size& size, - unsigned rgb_texture, - unsigned rgb_texture_type); - - private: - unsigned framebuffer_ = 0; - unsigned vertex_shader_ = 0; - unsigned fragment_shader_ = 0; - unsigned program_ = 0; - int size_location_ = -1; - unsigned vertex_buffer_ = 0; - unsigned y_texture_ = 0; - unsigned uv_texture_ = 0; - unsigned vertex_array_object_ = 0; - unsigned source_texture_target_ = 0; - bool has_get_tex_level_parameter_ = false; - bool has_robust_resource_init_ = false; - bool has_sampler_objects_ = false; -}; - -} // namespace gl - -#endif // UI_GL_YUV_TO_RGB_CONVERTER_H_
diff --git a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc index 16b10eae..8696474b 100644 --- a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc +++ b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.cc
@@ -6,6 +6,7 @@ #include <aura-shell-client-protocol.h> #include <xdg-decoration-unstable-v1-client-protocol.h> +#include <xdg-shell-client-protocol.h> #include <xdg-shell-unstable-v6-client-protocol.h> #include "base/logging.h" @@ -98,16 +99,12 @@ } static constexpr xdg_toplevel_listener xdg_toplevel_listener = { - &ConfigureTopLevel, - &CloseTopLevel, -#if defined(XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) - // Since v4 - &ConfigureBounds, -#endif -#if defined(XDG_TOPLEVEL_WM_CAPABILITIES_SINCE_VERSION) - // Since v5 - &WmCapabilities, -#endif + &ConfigureTopLevel, + &CloseTopLevel, + // Since v4 + &ConfigureBounds, + // Since v5 + &WmCapabilities, }; if (!xdg_surface_wrapper_) @@ -341,7 +338,6 @@ surface->wayland_window_->OnCloseRequest(); } -#if defined(XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) // static void XDGToplevelWrapperImpl::ConfigureBounds(void* data, struct xdg_toplevel* xdg_toplevel, @@ -349,16 +345,13 @@ int32_t height) { NOTIMPLEMENTED_LOG_ONCE(); } -#endif -#if defined(XDG_TOPLEVEL_WM_CAPABILITIES_SINCE_VERSION) // static void XDGToplevelWrapperImpl::WmCapabilities(void* data, struct xdg_toplevel* xdg_toplevel, struct wl_array* capabilities) { NOTIMPLEMENTED_LOG_ONCE(); } -#endif void XDGToplevelWrapperImpl::SetTopLevelDecorationMode( DecorationMode requested_mode) {
diff --git a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h index 47d2e2e..ab11ae0 100644 --- a/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h +++ b/ui/ozone/platform/wayland/host/xdg_toplevel_wrapper_impl.h
@@ -5,7 +5,6 @@ #ifndef UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_TOPLEVEL_WRAPPER_IMPL_H_ #define UI_OZONE_PLATFORM_WAYLAND_HOST_XDG_TOPLEVEL_WRAPPER_IMPL_H_ -#include <xdg-shell-client-protocol.h> #include <memory> #include "base/memory/raw_ptr.h" @@ -73,19 +72,13 @@ int32_t height, struct wl_array* states); static void CloseTopLevel(void* data, struct xdg_toplevel* xdg_toplevel); - -#if defined(XDG_TOPLEVEL_CONFIGURE_BOUNDS_SINCE_VERSION) static void ConfigureBounds(void* data, struct xdg_toplevel* xdg_toplevel, int32_t width, int32_t height); -#endif - -#if defined(XDG_TOPLEVEL_WM_CAPABILITIES_SINCE_VERSION) static void WmCapabilities(void* data, struct xdg_toplevel* xdg_toplevel, struct wl_array* capabilities); -#endif // zxdg_decoration_listener static void ConfigureDecoration(
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 2ead223..6f7fff2 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -307,6 +307,14 @@ } gfx::NativeView NativeWidgetMac::GetNativeView() const { + // The immersive mode's overlay widget content view is moved to an another + // NSWindow when entering fullscreen. When the view is moved, the current + // content view will be nil. Return the cached original content view instead. + NSView* contentView = (NSView*)GetNativeWindowProperty( + views::NativeWidgetMacNSWindowHost::kImmersiveContentNSView); + if (contentView) { + return gfx::NativeView(contentView); + } // Returns a BridgedContentView, unless there is no views::RootView set. return [GetNativeWindow().GetNativeNSWindow() contentView]; }
diff --git a/ui/webui/resources/cr_components/history_clusters/clusters.html b/ui/webui/resources/cr_components/history_clusters/clusters.html index 732fb97..07d7f56 100644 --- a/ui/webui/resources/cr_components/history_clusters/clusters.html +++ b/ui/webui/resources/cr_components/history_clusters/clusters.html
@@ -6,6 +6,10 @@ overflow-y: auto; } + :host([in-side-panel_]) cr-dialog::part(dialog) { + max-width: fit-content; + } + #clusters { margin: 0 auto; max-width: var(--cluster-max-width);
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java index 2500d31..28e153c 100644 --- a/url/android/java/src/org/chromium/url/GURL.java +++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -51,6 +51,12 @@ void run(Throwable throwable); } + /** + * Exception signalling that a GURL failed to parse due to an unexpected version marker in the + * serialized input. + */ + public static class BadSerializerVersionException extends RuntimeException {} + // Right now this is only collecting reports on Canary which has a relatively small population. private static final int DEBUG_REPORT_PERCENTAGE = 10; private static ReportDebugThrowableCallback sReportCallback; @@ -292,7 +298,9 @@ } /** - * Deserialize a GURL serialized with {@link GURL#serialize()}. + * Deserialize a GURL serialized with {@link GURL#serialize()}. This will re-parse in case of + * version mismatch, which may trigger undesired native loading. {@see + * deserializeLatestVersionOnly} if you want to fail in case of version mismatch. * * This function should *never* be used on a String coming from an untrusted source. * @@ -300,30 +308,11 @@ */ public static GURL deserialize(@Nullable String gurl) { try { - if (TextUtils.isEmpty(gurl)) return emptyGURL(); + return deserializeLatestVersionOnly(gurl); + } catch (BadSerializerVersionException be) { + // Just re-parse the GURL on version changes. String[] tokens = gurl.split(Character.toString(SERIALIZER_DELIMITER)); - - // First token MUST always be the length of the serialized data. - String length = tokens[0]; - if (gurl.length() != Integer.parseInt(length) + length.length() + 1) { - throw new IllegalArgumentException("Serialized GURL had the wrong length."); - } - - // Last token MUST always be the original spec - just re-parse the GURL on version - // changes. - String spec = tokens[tokens.length - 1]; - // Special case for empty spec - it won't get its own token. - if (gurl.endsWith(Character.toString(SERIALIZER_DELIMITER))) spec = ""; - - // Second token MUST always be the version number. - int version = Integer.parseInt(tokens[1]); - if (version != SERIALIZER_VERSION) return new GURL(spec); - - boolean isValid = Boolean.parseBoolean(tokens[2]); - Parsed parsed = Parsed.deserialize(tokens, 3); - GURL result = new GURL(); - result.init(spec, isValid, parsed); - return result; + return new GURL(getSpecFromTokens(gurl, tokens)); } catch (Exception e) { // This is unexpected, maybe the storage got corrupted somehow? Log.w(TAG, "Exception while deserializing a GURL: " + gurl, e); @@ -332,6 +321,42 @@ } /** + * Deserialize a GURL serialized with {@link #serialize()}, throwing {@code + * BadSerializerException} if the serialized input has a version other than the latest. This + * function should never be used on a String coming from an untrusted source. + */ + public static GURL deserializeLatestVersionOnly(@Nullable String gurl) { + if (TextUtils.isEmpty(gurl)) return emptyGURL(); + String[] tokens = gurl.split(Character.toString(SERIALIZER_DELIMITER)); + + // First token MUST always be the length of the serialized data. + String length = tokens[0]; + if (gurl.length() != Integer.parseInt(length) + length.length() + 1) { + throw new IllegalArgumentException("Serialized GURL had the wrong length."); + } + + String spec = getSpecFromTokens(gurl, tokens); + // Second token MUST always be the version number. + int version = Integer.parseInt(tokens[1]); + if (version != SERIALIZER_VERSION) { + throw new BadSerializerVersionException(); + } + + boolean isValid = Boolean.parseBoolean(tokens[2]); + Parsed parsed = Parsed.deserialize(tokens, 3); + GURL result = new GURL(); + result.init(spec, isValid, parsed); + return result; + } + + private static String getSpecFromTokens(String gurl, String[] tokens) { + // Last token MUST always be the original spec. + // Special case for empty spec - it won't get its own token. + return gurl.endsWith(Character.toString(SERIALIZER_DELIMITER)) ? "" + : tokens[tokens.length - 1]; + } + + /** * Returns the instance of {@link Natives}. The Robolectric Shadow intercepts invocations of * this method. *
diff --git a/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java b/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java index d504487c..f01996b 100644 --- a/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java +++ b/url/android/test/java/src/org/chromium/url/JUnitTestGURLs.java
@@ -58,6 +58,7 @@ public static final String GOOGLE_URL_CAT = "http://www.google.com/cat"; public static final String GOOGLE_URL_PIG = "http://www.google.com/pig"; public static final String ABOUT_BLANK = "about:blank"; + public static final String CHROME_ABOUT = "chrome://about"; // Map of URL string to GURL serialization. /* package */ static final Map<String, String> sGURLMap; @@ -145,6 +146,8 @@ "83,1,true,0,4,0,-1,0,-1,7,14,0,-1,21,4,0,-1,0,-1,false,false,http://www.google.com/pig"); map.put(ABOUT_BLANK, "68,1,true,0,5,0,-1,0,-1,0,-1,0,-1,6,5,0,-1,0,-1,false,false,about:blank"); + map.put(CHROME_ABOUT, + "72,1,true,0,6,0,-1,0,-1,9,5,0,-1,14,1,0,-1,0,-1,false,false,chrome://about/"); sGURLMap = Collections.unmodifiableMap(map); }
diff --git a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java index c05bfe7..88ed0da 100644 --- a/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java +++ b/weblayer/browser/java/org/chromium/weblayer_private/BrowserControlsContainerView.java
@@ -221,6 +221,13 @@ 0, top); } } + + @Override + public void setCurrentDragEventOffsets(float dx, float dy) { + if (mWebContents != null) { + mWebContents.getEventForwarder().setDragDispatchingOffset(dx, dy); + } + }; }); } return mEventOffsetHandler;